37#include <com/sun/star/awt/Key.hpp>
38#include <com/sun/star/awt/KeyModifier.hpp>
39#include <com/sun/star/awt/MouseButton.hpp>
40#include <com/sun/star/container/XNamed.hpp>
41#include <com/sun/star/drawing/XDrawView.hpp>
42#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
43#include <com/sun/star/drawing/framework/ResourceActivationMode.hpp>
44#include <com/sun/star/drawing/framework/ResourceId.hpp>
45#include <com/sun/star/frame/FrameSearchFlag.hpp>
46#include <com/sun/star/frame/XDispatchProvider.hpp>
47#include <com/sun/star/presentation/AnimationEffect.hpp>
48#include <com/sun/star/presentation/XPresentation.hpp>
49#include <com/sun/star/presentation/XPresentationSupplier.hpp>
50#include <com/sun/star/rendering/TextDirection.hpp>
51#include <com/sun/star/util/URLTransformer.hpp>
53#include <rtl/ustrbuf.hxx>
62 const sal_Int32 ResourceActivationEventType = 0;
63 const sal_Int32 ResourceDeactivationEventType = 1;
64 const sal_Int32 ConfigurationUpdateEndEventType = 2;
76 const css::uno::Reference<css::frame::XFrame>& rxFrame)
78 InstanceContainer::const_iterator iInstance (
maInstances.find(rxFrame));
80 return iInstance->second;
82 return ::rtl::Reference<PresenterController>();
87 const Reference<XComponentContext>& rxContext,
89 const Reference<presentation::XSlideShowController>& rxSlideShowController,
91 const Reference<XResourceId>& rxMainPaneId)
93 mxScreen(
std::move(xScreen)),
95 mxController(rxController),
96 mxSlideShowController(rxSlideShowController),
97 mxMainPaneId(rxMainPaneId),
98 mpPaneContainer(
std::move(xPaneContainer)),
99 mnCurrentSlideIndex(-1),
102 mnPendingSlideNumber(-1),
103 mbIsAccessibilityActive(false)
108 throw lang::IllegalArgumentException(
109 "missing slide show controller",
110 static_cast<XWeak*
>(
this),
121 "ResourceActivation",
122 Any(ResourceActivationEventType));
125 "ResourceDeactivation",
126 Any(ResourceDeactivationEventType));
129 "ConfigurationUpdateEnd",
130 Any(ConfigurationUpdateEndEventType));
136 xFrame->addFrameActionListener(
this);
144 Reference<lang::XMultiComponentFactory>
xFactory =
145 rxContext->getServiceManager();
149 xFactory->createInstanceWithContext(
150 "com.sun.star.drawing.PresenterHelper",
158 if (xProperties.is())
160 Reference<awt::XWindow> xWindow (
161 xProperties->getPropertyValue(
"ParentWindow"), UNO_QUERY);
163 xWindow->addKeyListener(
this);
199 xFrame->removeFrameActionListener(
this);
205 if (xWindowManagerComponent.is())
206 xWindowManagerComponent->dispose();
221 xComponent->dispose();
228 xComponent->dispose();
236 xComponent->dispose();
268 if (xIndexAccess.is() && nSlideIndex>=0)
270 if (nSlideIndex < xIndexAccess->getCount())
273 mxCurrentSlide.set( xIndexAccess->getByIndex(nSlideIndex), UNO_QUERY);
286 if (nNextSlideIndex >= 0)
288 if (xIndexAccess.is())
290 if (nNextSlideIndex < xIndexAccess->getCount())
291 mxNextSlide.set( xIndexAccess->getByIndex(nNextSlideIndex), UNO_QUERY);
306 static constexpr OUStringLiteral sCurrentSlideNumberPlaceholder (
u"CURRENT_SLIDE_NUMBER");
307 static constexpr OUStringLiteral sCurrentSlideNamePlaceholder (
u"CURRENT_SLIDE_NAME");
308 static constexpr OUStringLiteral sSlideCountPlaceholder (
u"SLIDE_COUNT");
311 OUString sSlideCount (
"---");
313 if (xIndexAccess.is())
314 sSlideCount = OUString::number(xIndexAccess->getCount());
320 OUString sCurrentSlideName;
321 Reference<container::XNamed> xNamedSlide (
mxCurrentSlide, UNO_QUERY);
322 if (xNamedSlide.is())
323 sCurrentSlideName = xNamedSlide->getName();
324 Reference<beans::XPropertySet> xSlideProperties (
mxCurrentSlide, UNO_QUERY);
325 if (xSlideProperties.is())
330 if (xSlideProperties->getPropertyValue(
"LinkDisplayName") >>=
sName)
334 if (
sName != sCurrentSlideName)
335 sCurrentSlideName =
sName;
338 catch (
const beans::UnknownPropertyException&)
346 OSL_ASSERT(rxPane !=
nullptr);
349 ? rxPane->msAccessibleTitleTemplate
350 : rxPane->msTitleTemplate);
351 if (sTemplate.isEmpty())
354 OUStringBuffer sResult;
355 sResult.ensureCapacity(sTemplate.getLength());
360 sal_Int32 nStartIndex = sTemplate.indexOf(
'%',
nIndex);
364 sResult.append(sTemplate.subView(
nIndex));
370 sResult.append(sTemplate.subView(
nIndex, nStartIndex-
nIndex));
374 const sal_Int32 nEndIndex (sTemplate.indexOf(
'%', nStartIndex+1));
375 const std::u16string_view sPlaceholder (sTemplate.subView(nStartIndex, nEndIndex-nStartIndex));
379 if (sPlaceholder == sCurrentSlideNumberPlaceholder)
380 sResult.append(sCurrentSlideNumber);
381 else if (sPlaceholder == sCurrentSlideNamePlaceholder)
382 sResult.append(sCurrentSlideName);
383 else if (sPlaceholder == sSlideCountPlaceholder)
384 sResult.append(sSlideCount);
388 rxPane->msTitle = sResult.makeStringAndClear();
389 if (rxPane->mxPane.is())
390 rxPane->mxPane->SetTitle(rxPane->msTitle);
399 Reference<drawing::XDrawView> xDrawView (rxPane->mxView, UNO_QUERY);
410 const OUString sStyleName (
mpTheme->GetStyleName(rsViewURL));
411 return mpTheme->GetBitmap(sStyleName,
"Background");
421 const OUString sStyleName (
mpTheme->GetStyleName(rsViewURL));
422 return mpTheme->GetFont(sStyleName);
437const Reference<presentation::XSlideShowController>&
475 pDescriptor->mbIsActive =
true;
477 pDescriptor->mxPaneId,
478 ResourceActivationMode_ADD);
480 ResourceId::createWithAnchor(
483 pDescriptor->mxPaneId),
484 ResourceActivationMode_REPLACE);
494 ResourceId::createWithAnchor(
497 pDescriptor->mxPaneId));
507 aURL.Complete = rsCommand;
522 Reference<frame::XDispatchProvider> xDispatchProvider (
mxController->getFrame(), UNO_QUERY);
523 if ( ! xDispatchProvider.is())
526 return xDispatchProvider->queryDispatch(
529 frame::FrameSearchFlag::SELF);
538 aURL.Complete = rsURL;
545const Reference<drawing::framework::XConfigurationController>&
558 bool bTransition =
false;
561 Reference<beans::XPropertySet> xSlidePropertySet (rxPage, UNO_QUERY);
564 sal_uInt16 aTransitionType = 0;
565 xSlidePropertySet->getPropertyValue(
"TransitionType") >>= aTransitionType;
566 if (aTransitionType > 0)
571 catch (
const beans::UnknownPropertyException&)
580 bool bCustomAnimation =
false;
583 sal_uInt32
i,
nCount = rxPage->getCount();
586 Reference<drawing::XShape> xShape(rxPage->getByIndex(
i), UNO_QUERY);
587 Reference<beans::XPropertySet> xShapePropertySet(xShape, UNO_QUERY);
588 presentation::AnimationEffect aEffect = presentation::AnimationEffect_NONE;
589 presentation::AnimationEffect aTextEffect = presentation::AnimationEffect_NONE;
592 xShapePropertySet->getPropertyValue(
"Effect") >>= aEffect;
593 xShapePropertySet->getPropertyValue(
"TextEffect") >>= aTextEffect;
595 catch (
const beans::UnknownPropertyException&)
598 if( aEffect != presentation::AnimationEffect_NONE ||
599 aTextEffect != presentation::AnimationEffect_NONE )
601 bCustomAnimation =
true;
606 return bCustomAnimation;
624 switch (rEvent.Buttons)
626 case awt::MouseButton::LEFT:
627 if (rEvent.Modifiers == awt::KeyModifier::MOD2)
633 case awt::MouseButton::RIGHT:
644 const bool bIsSlideSorterActive,
645 const bool bIsNotesViewActive,
646 const bool bIsHelpViewActive)
650 bool bActivate (
true);
651 const OUString sViewURL (rxPane->msViewURL);
654 bActivate = bIsNotesViewActive && !bIsSlideSorterActive && !bIsHelpViewActive;
658 bActivate = bIsSlideSorterActive;
663 bActivate = !bIsSlideSorterActive && ! bIsHelpViewActive;
671 bActivate = bIsHelpViewActive;
694 const ConfigurationChangeEvent& rEvent)
696 if (rBHelper.bDisposed || rBHelper.bInDispose)
698 throw lang::DisposedException (
699 "PresenterController object has already been disposed",
700 static_cast<uno::XWeak*
>(
this));
704 if ( ! (rEvent.UserData >>=
nType))
709 case ResourceActivationEventType:
714 else if (rEvent.ResourceId->isBoundTo(
mxMainPaneId,AnchorBindingMode_DIRECT))
718 Reference<XPane> xPane (rEvent.ResourceObject,UNO_QUERY);
724 else if (rEvent.ResourceId->isBoundTo(
mxMainPaneId,AnchorBindingMode_INDIRECT))
728 Reference<XView> xView (rEvent.ResourceObject,UNO_QUERY);
738 case ResourceDeactivationEventType:
739 if (rEvent.ResourceId->isBoundTo(
mxMainPaneId,AnchorBindingMode_INDIRECT))
742 Reference<XView> xView (rEvent.ResourceObject,UNO_QUERY);
759 case ConfigurationUpdateEndEventType:
772 const lang::EventObject& rEvent)
787 const frame::FrameActionEvent& rEvent)
789 if (rEvent.Action == frame::FrameAction_FRAME_ACTIVATED)
803 if ( ! rxPane->mbIsActive)
806 Reference<awt::XKeyListener> xKeyListener (rxPane->mxView, UNO_QUERY);
807 if (xKeyListener.is())
808 xKeyListener->keyPressed(rEvent);
817 switch (rEvent.KeyCode)
819 case awt::Key::ESCAPE:
820 case awt::Key::SUBTRACT:
824 Reference< XPresentationSupplier > xPS(
mxController->getModel(), UNO_QUERY );
827 Reference< XPresentation > xP( xPS->getPresentation() );
835 case awt::Key::PAGEDOWN:
838 if (rEvent.Modifiers == awt::KeyModifier::MOD2)
845 case awt::Key::RIGHT:
846 case awt::Key::SPACE:
854 case awt::Key::PAGEUP:
857 if (rEvent.Modifiers == awt::KeyModifier::MOD2)
866 case awt::Key::BACKSPACE:
885 if (rEvent.Modifiers == awt::KeyModifier::MOD1)
914 case awt::Key::COMMA:
925 case awt::Key::POINT:
948 case awt::Key::RETURN:
979 if ( ! rxPane->mbIsActive)
982 Reference<awt::XKeyListener> xKeyListener (rxPane->mxView, UNO_QUERY);
983 if (xKeyListener.is())
984 xKeyListener->keyReleased(rEvent);
991 const sal_Int32 nKey,
992 const sal_Int32 nModifiers)
1002 case awt::KeyModifier::MOD1:
1075 Reference<XPane2> xPane2 (rxPane, UNO_QUERY);
1077 xPane2->setVisible(
true);
1081 mxCanvas.set(rxPane->getCanvas(), UNO_QUERY);
1098 double nSlideAspectRatio (28.0/21.0);
1104 Reference<drawing::XDrawPagesSupplier> xSlideSupplier (
1106 Reference<drawing::XDrawPages> xSlides (xSlideSupplier->getDrawPages());
1107 if (xSlides.is() && xSlides->getCount()>0)
1109 Reference<beans::XPropertySet> xProperties(xSlides->getByIndex(0),UNO_QUERY_THROW);
1110 sal_Int32 nWidth (28000);
1111 sal_Int32 nHeight (21000);
1112 if ((xProperties->getPropertyValue(
"Width") >>= nWidth)
1113 && (xProperties->getPropertyValue(
"Height") >>= nHeight)
1116 nSlideAspectRatio = double(nWidth) / double(nHeight);
1126 return nSlideAspectRatio;
1140 mpTheme->GetFont(
"PendingSlideNumberFont"));
1145 if ( ! pFont->mxFont.is())
1149 rendering::StringContext aContext (sText, 0, sText.getLength());
1150 pFont->mxFont->createTextLayout(
1152 rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
1162 pScreen->SwitchMonitors();
1169 Reference< XPresentationSupplier > xPS(
mxController->getModel(), UNO_QUERY );
1172 Reference< XPresentation > xP( xPS->getPresentation() );
css::uno::Reference< css::uno::XComponentContext > mxComponentContext
Represents an element in the toolbar that shows the time elapsed since the presentation started.
virtual ~IPresentationTime()
Collection of functions to ease the life of a canvas user.
void SetAccessibilityActiveState(const bool bIsActive)
css::uno::Reference< css::uno::XComponentContext > mxComponentContext
virtual void SAL_CALL mouseReleased(const css::awt::MouseEvent &rEvent) override
css::uno::Reference< css::presentation::XSlideShowController > mxSlideShowController
void GetSlides(const sal_Int32 nOffset)
double GetSlideAspectRatio() const
IPresentationTime * GetPresentationTime()
const std::shared_ptr< PresenterPaintManager > & GetPaintManager() const
rtl::Reference<::sd::DrawController > mxController
void SetPresentationTime(IPresentationTime *pPresentationTime)
css::uno::Reference< css::drawing::XPresenterHelper > mxPresenterHelper
void InitializeMainPane(const css::uno::Reference< css::drawing::framework::XPane > &rxPane)
virtual void SAL_CALL notifyConfigurationChange(const css::drawing::framework::ConfigurationChangeEvent &rEvent) override
virtual void SAL_CALL keyPressed(const css::awt::KeyEvent &rEvent) override
const css::uno::Reference< css::drawing::framework::XConfigurationController > & GetConfigurationController() const
void HandleMouseClick(const css::awt::MouseEvent &rEvent)
css::uno::Reference< css::drawing::XDrawPage > mxCurrentSlide
void ShowView(const OUString &rsViewURL)
const css::uno::Reference< css::drawing::XDrawPage > & GetCurrentSlide() const
const ::rtl::Reference< PresenterWindowManager > & GetWindowManager() const
css::uno::Reference< css::rendering::XSpriteCanvas > mxCanvas
css::uno::Reference< css::frame::XDispatch > GetDispatch(const css::util::URL &rURL) const
virtual void SAL_CALL frameAction(const css::frame::FrameActionEvent &rEvent) override
void DispatchUnoCommand(const OUString &rsCommand) const
virtual void SAL_CALL keyReleased(const css::awt::KeyEvent &rEvent) override
void UpdatePendingSlideNumber(const sal_Int32 nPendingSlideNumber)
const ::rtl::Reference< PresenterPaneBorderPainter > & GetPaneBorderPainter() const
virtual void SAL_CALL mouseExited(const css::awt::MouseEvent &rEvent) override
std::shared_ptr< PresenterCanvasHelper > mpCanvasHelper
virtual void SAL_CALL disposing() override
IPresentationTime * mpPresentationTime
static bool HasTransition(css::uno::Reference< css::drawing::XDrawPage > const &rxPage)
const std::shared_ptr< PresenterCanvasHelper > & GetCanvasHelper() const
static bool HasCustomAnimation(css::uno::Reference< css::drawing::XDrawPage > const &rxPage)
const rtl::Reference< PresenterPaneContainer > & GetPaneContainer() const
PresenterTheme::SharedFontDescriptor GetViewFont(const OUString &rsViewURL) const
sal_Int32 mnCurrentSlideIndex
css::uno::Reference< css::awt::XWindow > mxMainWindow
virtual void SAL_CALL mousePressed(const css::awt::MouseEvent &rEvent) override
sal_Int32 mnPendingSlideNumber
static ::rtl::Reference< PresenterController > Instance(const css::uno::Reference< css::frame::XFrame > &rxFrame)
const css::uno::Reference< css::drawing::XPresenterHelper > & GetPresenterHelper() const
std::shared_ptr< PresenterPaintManager > mpPaintManager
void LoadTheme(const css::uno::Reference< css::drawing::framework::XPane > &rxPane)
css::uno::Reference< css::util::XURLTransformer > mxUrlTransformer
void HandleNumericKeyPress(const sal_Int32 nKey, const sal_Int32 nModifiers)
This method is called when the user pressed one of the numerical keys.
bool mbIsAccessibilityActive
void HideView(const OUString &rsViewURL)
rtl::Reference< PresenterPaneContainer > mpPaneContainer
SharedBitmapDescriptor GetViewBackground(const OUString &rsViewURL) const
bool IsAccessibilityActive() const
std::shared_ptr< PresenterTheme > mpTheme
const css::uno::Reference< css::presentation::XSlideShowController > & GetSlideShowController() const
const std::shared_ptr< PresenterTheme > & GetTheme() const
static InstanceContainer maInstances
::std::map< css::uno::Reference< css::frame::XFrame >, rtl::Reference< PresenterController > > InstanceContainer
css::uno::Reference< css::drawing::framework::XResourceId > mxMainPaneId
css::uno::Reference< css::drawing::XDrawPage > mxNextSlide
virtual ~PresenterController() override
virtual void SAL_CALL mouseEntered(const css::awt::MouseEvent &rEvent) override
unotools::WeakReference< PresenterScreen > mxScreen
void UpdateCurrentSlide(const sal_Int32 nOffset)
::rtl::Reference< PresenterPaneBorderPainter > mpPaneBorderPainter
css::util::URL CreateURLFromString(const OUString &rsURL) const
::rtl::Reference< PresenterAccessible > mpAccessibleObject
css::uno::Reference< css::drawing::framework::XConfigurationController > mxConfigurationController
void RequestViews(const bool bIsSlideSorterActive, const bool bIsNotesViewActive, const bool bIsHelpViewActive)
Request activation or deactivation of (some of) the views according to the given parameters.
::rtl::Reference< PresenterWindowManager > mpWindowManager
PresenterController(unotools::WeakReference< PresenterScreen > xScreen, const css::uno::Reference< css::uno::XComponentContext > &rxContext, const rtl::Reference<::sd::DrawController > &rxController, const css::uno::Reference< css::presentation::XSlideShowController > &rxSlideShowController, rtl::Reference< PresenterPaneContainer > xPaneContainer, const css::uno::Reference< css::drawing::framework::XResourceId > &rxMainPaneId)
Check periodically the slide show controller and the frame::XController whether the current slide has...
This class is responsible for painting window borders of PresenterPane objects.
std::shared_ptr< PaneDescriptor > SharedPaneDescriptor
std::shared_ptr< FontDescriptor > SharedFontDescriptor
static constexpr OUStringLiteral msCurrentSlidePreviewViewURL
static constexpr OUStringLiteral msToolBarViewURL
static constexpr OUStringLiteral msNotesViewURL
static constexpr OUStringLiteral msSlideSorterURL
static constexpr OUStringLiteral msNextSlidePreviewViewURL
static constexpr OUStringLiteral msHelpViewURL
A simple manager of the positions of the panes of the presenter screen.
Reference< XDispatch > xDispatch
Reference< XSingleServiceFactory > xFactory
std::shared_ptr< T > make_shared(Args &&... args)
::cppu::WeakComponentImplHelper< css::drawing::framework::XConfigurationChangeListener, css::frame::XFrameActionListener, css::awt::XKeyListener, css::awt::XMouseListener > PresenterControllerInterfaceBase
std::shared_ptr< PresenterBitmapContainer::BitmapDescriptor > SharedBitmapDescriptor
Reference< XFrame > xFrame