31 #include <com/sun/star/awt/XWindowPeer.hpp>
32 #include <com/sun/star/drawing/framework/XControllerManager.hpp>
33 #include <com/sun/star/drawing/framework/XConfigurationController.hpp>
34 #include <com/sun/star/drawing/framework/XPane.hpp>
35 #include <com/sun/star/geometry/AffineMatrix2D.hpp>
36 #include <com/sun/star/rendering/CompositeOperation.hpp>
37 #include <com/sun/star/rendering/RenderState.hpp>
38 #include <com/sun/star/rendering/TextDirection.hpp>
39 #include <com/sun/star/rendering/ViewState.hpp>
40 #include <com/sun/star/rendering/XSpriteCanvas.hpp>
41 #include <com/sun/star/util/Color.hpp>
42 #include <rtl/ustrbuf.hxx>
59 const OUString& rsText,
62 void SetText (
const OUString& rsText);
63 const OUString& GetText()
const;
67 const Reference<rendering::XCanvas>& rxCanvas,
68 const rendering::ViewState& rViewState,
69 const awt::Rectangle& rBoundingBox);
71 geometry::RealRectangle2D GetBoundingBox (
72 const Reference<rendering::XCanvas>& rxCanvas);
83 ElementMode(
const ElementMode&) =
delete;
84 ElementMode& operator=(
const ElementMode&) =
delete;
90 void ReadElementMode (
92 const OUString& rsModeName,
93 std::shared_ptr<ElementMode>
const & rpDefaultMode,
96 typedef std::shared_ptr<ElementMode> SharedElementMode;
107 css::uno::Reference<css::rendering::XCanvas>
mxCanvas;
113 typedef cppu::WeakComponentImplHelper<
114 css::document::XEventListener,
115 css::frame::XStatusListener
116 > ElementInterfaceBase;
120 public ElementInterfaceBase
123 explicit Element (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
124 Element(
const Element&) =
delete;
125 Element& operator=(
const Element&) =
delete;
127 virtual void SAL_CALL disposing()
override;
129 virtual void SetModes (
130 const SharedElementMode& rpNormalMode,
131 const SharedElementMode& rpMouseOverMode,
132 const SharedElementMode& rpSelectedMode,
133 const SharedElementMode& rpDisabledMode,
134 const SharedElementMode& rpMouseOverSelectedMode);
135 void CurrentSlideHasChanged();
136 void SetLocation (
const awt::Point& rLocation);
137 void SetSize (
const geometry::RealSize2D& rSize);
139 const Reference<rendering::XCanvas>& rxCanvas,
140 const rendering::ViewState& rViewState) = 0;
141 awt::Size
const & GetBoundingSize (
142 const Reference<rendering::XCanvas>& rxCanvas);
143 awt::Rectangle GetBoundingBox()
const;
144 virtual bool SetState (
const bool bIsOver,
const bool bIsPressed);
145 void Invalidate (
const bool bSynchronous);
146 bool IsOutside (
const awt::Rectangle& rBox);
147 virtual bool IsFilling()
const;
152 virtual void SAL_CALL disposing (
const css::lang::EventObject& rEvent)
override;
156 virtual void SAL_CALL notifyEvent (
const css::document::EventObject& rEvent)
override;
160 virtual void SAL_CALL statusChanged (
const css::frame::FeatureStateEvent& rEvent)
override;
176 virtual awt::Size CreateBoundingSize (
177 const Reference<rendering::XCanvas>& rxCanvas) = 0;
187 :
public ::std::vector<rtl::Reference<Element> >
195 class Button :
public Element
198 static ::rtl::Reference<Element>
Create (
199 const ::rtl::Reference<PresenterToolBar>& rpToolBar);
201 virtual void SAL_CALL disposing()
override;
204 const Reference<rendering::XCanvas>& rxCanvas,
205 const rendering::ViewState& rViewState)
override;
209 virtual void SAL_CALL disposing (
const css::lang::EventObject& rEvent)
override;
212 virtual awt::Size CreateBoundingSize (
213 const Reference<rendering::XCanvas>& rxCanvas)
override;
218 Button (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
221 const Reference<rendering::XCanvas>& rxCanvas,
222 const sal_Int32 nTextHeight,
223 const rendering::ViewState& rViewState);
229 class Label :
public Element
232 explicit Label (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
234 void SetText (
const OUString& rsText);
236 const Reference<rendering::XCanvas>& rxCanvas,
237 const rendering::ViewState& rViewState)
override;
238 virtual bool SetState (
const bool bIsOver,
const bool bIsPressed)
override;
241 virtual awt::Size CreateBoundingSize (
242 const Reference<rendering::XCanvas>& rxCanvas)
override;
250 static OUString FormatTime (
const oslDateTime& rTime);
253 class TimeLabel :
public Label
256 void ConnectToTimer();
257 virtual void TimeHasChanged (
const oslDateTime& rCurrentTime) = 0;
259 explicit TimeLabel(const ::rtl::Reference<PresenterToolBar>& rpToolBar);
260 using Element::disposing;
261 virtual void SAL_CALL disposing()
override;
263 class Listener :
public PresenterClockTimer::Listener
266 explicit Listener (const ::rtl::Reference<TimeLabel>& rxLabel)
268 virtual ~Listener() {}
269 virtual void TimeHasChanged (
const oslDateTime& rCurrentTime)
override
277 class CurrentTimeLabel :
public TimeLabel
280 static ::rtl::Reference<Element>
Create (
281 const ::rtl::Reference<PresenterToolBar>& rpToolBar);
282 virtual void SetModes (
283 const SharedElementMode& rpNormalMode,
284 const SharedElementMode& rpMouseOverMode,
285 const SharedElementMode& rpSelectedMode,
286 const SharedElementMode& rpDisabledMode,
287 const SharedElementMode& rpMouseOverSelectedMode)
override;
289 CurrentTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
290 virtual ~CurrentTimeLabel()
override;
291 virtual void TimeHasChanged (
const oslDateTime& rCurrentTime)
override;
294 class PresentationTimeLabel :
public TimeLabel,
public IPresentationTime
297 static ::rtl::Reference<Element>
Create (
298 const ::rtl::Reference<PresenterToolBar>& rpToolBar);
299 virtual void SetModes (
300 const SharedElementMode& rpNormalMode,
301 const SharedElementMode& rpMouseOverMode,
302 const SharedElementMode& rpSelectedMode,
303 const SharedElementMode& rpDisabledMode,
304 const SharedElementMode& rpMouseOverSelectedMode)
override;
305 virtual void restart()
override;
306 virtual bool isPaused()
override;
307 virtual void setPauseStatus(
const bool pauseStatus)
override;
308 TimeValue getPauseTimeValue()
const;
309 void setPauseTimeValue(
const TimeValue pauseTime);
313 PresentationTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
315 virtual ~PresentationTimeLabel()
override;
316 virtual void TimeHasChanged (
const oslDateTime& rCurrentTime)
override;
319 class VerticalSeparator :
public Element
322 explicit VerticalSeparator (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
324 const Reference<rendering::XCanvas>& rxCanvas,
325 const rendering::ViewState& rViewState)
override;
326 virtual bool IsFilling()
const override;
329 virtual awt::Size CreateBoundingSize (
330 const Reference<rendering::XCanvas>& rxCanvas)
override;
333 class HorizontalSeparator :
public Element
336 explicit HorizontalSeparator (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
338 const Reference<rendering::XCanvas>& rxCanvas,
339 const rendering::ViewState& rViewState)
override;
340 virtual bool IsFilling()
const override;
343 virtual awt::Size CreateBoundingSize (
344 const Reference<rendering::XCanvas>& rxCanvas)
override;
352 const css::uno::Reference<css::awt::XWindow>& rxWindow,
353 const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
354 const ::rtl::Reference<PresenterController>& rpPresenterController,
355 const Anchor eAnchor)
358 maElementContainer(),
359 mpCurrentContainerPart(),
362 mxSlideShowController(),
365 mbIsLayoutPending(false),
371 void PresenterToolBar::Initialize (
372 const OUString& rsConfigurationPath)
376 CreateControls(rsConfigurationPath);
380 mxWindow->addWindowListener(
this);
381 mxWindow->addPaintListener(
this);
382 mxWindow->addMouseListener(
this);
383 mxWindow->addMouseMotionListener(
this);
385 Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY);
387 xPeer->setBackground(util::Color(0xff000000));
389 mxWindow->setVisible(
true);
394 mbIsLayoutPending =
true;
398 mpCurrentContainerPart.reset();
399 maElementContainer.clear();
404 PresenterToolBar::~PresenterToolBar()
408 void SAL_CALL PresenterToolBar::disposing()
412 mxWindow->removeWindowListener(
this);
413 mxWindow->removePaintListener(
this);
414 mxWindow->removeMouseListener(
this);
415 mxWindow->removeMouseMotionListener(
this);
420 for (
const auto& rxPart : maElementContainer)
422 OSL_ASSERT(rxPart !=
nullptr);
428 static_cast<XWeak*>(pElement.get()), UNO_QUERY);
430 xComponent->dispose();
435 mpCurrentContainerPart.reset();
436 maElementContainer.clear();
439 void PresenterToolBar::InvalidateArea (
440 const awt::Rectangle& rRepaintBox,
441 const bool bSynchronous)
446 xManager->Invalidate(
452 void PresenterToolBar::RequestLayout()
454 mbIsLayoutPending =
true;
460 xManager->Invalidate(mxWindow);
463 geometry::RealSize2D
const & PresenterToolBar::GetMinimalSize()
465 if (mbIsLayoutPending)
467 return maMinimalSize;
470 const ::rtl::Reference<PresenterController>& PresenterToolBar::GetPresenterController()
const
482 void SAL_CALL PresenterToolBar::disposing (
const lang::EventObject& rEventObject)
484 if (rEventObject.Source == mxWindow)
490 void SAL_CALL PresenterToolBar::windowResized (
const awt::WindowEvent&)
492 mbIsLayoutPending =
true;
495 void SAL_CALL PresenterToolBar::windowMoved (
const awt::WindowEvent&) {}
497 void SAL_CALL PresenterToolBar::windowShown (
const lang::EventObject&)
499 mbIsLayoutPending =
true;
502 void SAL_CALL PresenterToolBar::windowHidden (
const lang::EventObject&) {}
505 void SAL_CALL PresenterToolBar::windowPaint (
const css::awt::PaintEvent& rEvent)
510 if ( ! mbIsPresenterViewActive)
513 const rendering::ViewState aViewState (
514 geometry::AffineMatrix2D(1,0,0, 0,1,0),
515 PresenterGeometryHelper::CreatePolygon(rEvent.UpdateRect,
mxCanvas->getDevice()));
517 if (mbIsLayoutPending)
520 Paint(rEvent.UpdateRect, aViewState);
523 Reference<rendering::XSpriteCanvas> xSpriteCanvas (
mxCanvas, UNO_QUERY);
524 if (xSpriteCanvas.is())
525 xSpriteCanvas->updateScreen(
false);
529 void SAL_CALL PresenterToolBar::mousePressed (
const css::awt::MouseEvent& rEvent)
532 CheckMouseOver(rEvent,
true,
true);
535 void SAL_CALL PresenterToolBar::mouseReleased (
const css::awt::MouseEvent& rEvent)
538 CheckMouseOver(rEvent,
true);
541 void SAL_CALL PresenterToolBar::mouseEntered (
const css::awt::MouseEvent& rEvent)
544 CheckMouseOver(rEvent,
true);
547 void SAL_CALL PresenterToolBar::mouseExited (
const css::awt::MouseEvent& rEvent)
550 CheckMouseOver(rEvent,
false);
555 void SAL_CALL PresenterToolBar::mouseMoved (
const css::awt::MouseEvent& rEvent)
558 CheckMouseOver(rEvent,
true);
561 void SAL_CALL PresenterToolBar::mouseDragged (
const css::awt::MouseEvent&)
570 if (rxSlide != mxCurrentSlide)
572 mxCurrentSlide = rxSlide;
579 return mxCurrentSlide;
583 void PresenterToolBar::CreateControls (
584 const OUString& rsConfigurationPath)
586 if ( ! mxWindow.is())
592 "/org.openoffice.Office.PresenterScreen/",
593 PresenterConfigurationAccess::READ_ONLY);
595 mpCurrentContainerPart = std::make_shared<ElementContainerPart>();
596 maElementContainer.clear();
597 maElementContainer.push_back(mpCurrentContainerPart);
599 Reference<container::XHierarchicalNameAccess> xToolBarNode (
602 if (!xToolBarNode.is())
606 PresenterConfigurationAccess::GetConfigurationNode(xToolBarNode,
"Entries"),
615 PresenterConfigurationAccess::ForAll(
617 [
this, &aContext] (OUString
const&, uno::Reference<beans::XPropertySet>
const& xProps)
619 return this->ProcessEntry(xProps, aContext);
624 void PresenterToolBar::ProcessEntry (
628 if ( ! rxProperties.is())
633 if ( ! (PresenterConfigurationAccess::GetProperty(rxProperties,
"Type") >>= sType))
637 SharedElementMode pNormalMode = std::make_shared<ElementMode>();
638 SharedElementMode pMouseOverMode = std::make_shared<ElementMode>();
639 SharedElementMode pSelectedMode = std::make_shared<ElementMode>();
640 SharedElementMode pDisabledMode = std::make_shared<ElementMode>();
641 SharedElementMode pMouseOverSelectedMode = std::make_shared<ElementMode>();
642 pNormalMode->ReadElementMode(rxProperties,
"Normal", pNormalMode, rContext);
643 pMouseOverMode->ReadElementMode(rxProperties,
"MouseOver", pNormalMode, rContext);
644 pSelectedMode->ReadElementMode(rxProperties,
"Selected", pNormalMode, rContext);
645 pDisabledMode->ReadElementMode(rxProperties,
"Disabled", pNormalMode, rContext);
646 pMouseOverSelectedMode->ReadElementMode(rxProperties,
"MouseOverSelected", pSelectedMode, rContext);
650 if ( sType ==
"Button" )
651 pElement = Button::Create(
this);
652 else if ( sType ==
"CurrentTimeLabel" )
653 pElement = CurrentTimeLabel::Create(
this);
654 else if ( sType ==
"PresentationTimeLabel" )
655 pElement = PresentationTimeLabel::Create(
this);
656 else if ( sType ==
"VerticalSeparator" )
657 pElement.set(
new VerticalSeparator(
this));
658 else if ( sType ==
"HorizontalSeparator" )
659 pElement.set(
new HorizontalSeparator(
this));
660 else if ( sType ==
"Label" )
661 pElement.set(
new Label(
this));
662 else if ( sType ==
"ChangeOrientation" )
664 mpCurrentContainerPart = std::make_shared<ElementContainerPart>();
665 maElementContainer.push_back(mpCurrentContainerPart);
670 pElement->SetModes( pNormalMode, pMouseOverMode, pSelectedMode, pDisabledMode, pMouseOverSelectedMode);
671 pElement->UpdateState();
672 if (mpCurrentContainerPart)
673 mpCurrentContainerPart->push_back(pElement);
677 void PresenterToolBar::Layout (
678 const Reference<rendering::XCanvas>& rxCanvas)
680 if (maElementContainer.empty())
683 mbIsLayoutPending =
false;
685 const awt::Rectangle aWindowBox (mxWindow->getPosSize());
686 ::std::vector<geometry::RealSize2D> aPartSizes (maElementContainer.size());
687 geometry::RealSize2D aTotalSize (0,0);
688 bool bIsHorizontal (
true);
690 double nTotalHorizontalGap (0);
691 sal_Int32 nGapCount (0);
692 for (
const auto& rxPart : maElementContainer)
694 geometry::RealSize2D aSize (CalculatePartSize(rxCanvas, rxPart, bIsHorizontal));
697 aPartSizes[nIndex] = aSize;
700 if (rxPart->size()>1 && bIsHorizontal)
702 nTotalHorizontalGap += (rxPart->size() - 1) *
gnGapSize;
703 nGapCount += rxPart->size() - 1;
707 bIsHorizontal = !bIsHorizontal;
709 aTotalSize.Width += aSize.Width;
711 aTotalSize.Height = ::std::max(aTotalSize.Height, aSize.Height);
715 if (maElementContainer.size() > 1)
717 nTotalHorizontalGap += (maElementContainer.size() - 1) *
gnGapSize;
718 nGapCount += maElementContainer.size()-1;
726 maMinimalSize = aTotalSize;
727 maMinimalSize.Width += nTotalHorizontalGap;
730 double nGapWidth (0);
733 if (aTotalSize.Width + nTotalHorizontalGap > aWindowBox.Width)
734 nTotalHorizontalGap = aWindowBox.Width - aTotalSize.Width;
735 nGapWidth = nTotalHorizontalGap / nGapCount;
742 case Left : nX = 0;
break;
743 case Center: nX = (aWindowBox.Width - aTotalSize.Width - nTotalHorizontalGap) / 2;
break;
747 double nY ((aWindowBox.Height - aTotalSize.Height) / 2);
748 bIsHorizontal =
true;
754 for (
const auto& rxPart : maElementContainer)
756 geometry::RealRectangle2D aBoundingBox(
758 nX+aPartSizes[nIndex].
Width, nY+aTotalSize.Height);
761 if (rxPart->size() > 1 && bIsHorizontal)
762 aBoundingBox.X2 += (rxPart->size() - 1) * nGapWidth;
764 LayoutPart(rxCanvas, rxPart, aBoundingBox, aPartSizes[nIndex], bIsHorizontal);
765 bIsHorizontal = !bIsHorizontal;
766 nX += aBoundingBox.X2 - aBoundingBox.X1 + nGapWidth;
771 ElementContainer::iterator iPart;
772 ElementContainer::iterator iBegin (maElementContainer.begin());
773 for (iPart=maElementContainer.end()-1, nIndex=2; iPart!=iBegin-1; --iPart, --nIndex)
775 geometry::RealRectangle2D aBoundingBox(
777 nX+aPartSizes[nIndex].
Width, nY+aTotalSize.Height);
780 if ((*iPart)->size() > 1)
782 aBoundingBox.X2 += ((*iPart)->size()-1) * nGapWidth;
784 LayoutPart(rxCanvas, *iPart, aBoundingBox, aPartSizes[nIndex], bIsHorizontal);
785 bIsHorizontal = !bIsHorizontal;
786 nX += aBoundingBox.X2 - aBoundingBox.X1 + nGapWidth;
794 xManager->Invalidate(mxWindow);
797 geometry::RealSize2D PresenterToolBar::CalculatePartSize (
798 const Reference<rendering::XCanvas>& rxCanvas,
800 const bool bIsHorizontal)
802 geometry::RealSize2D aTotalSize (0,0);
807 for (
const auto& rxElement : *rpPart)
812 const awt::Size aBSize (rxElement->GetBoundingSize(rxCanvas));
815 aTotalSize.Width += aBSize.Width;
816 if (aBSize.Height > aTotalSize.Height)
817 aTotalSize.Height = aBSize.Height;
821 aTotalSize.Height += aBSize.Height;
822 if (aBSize.Width > aTotalSize.Width)
823 aTotalSize.Width = aBSize.Width;
830 void PresenterToolBar::LayoutPart (
831 const Reference<rendering::XCanvas>& rxCanvas,
833 const geometry::RealRectangle2D& rBoundingBox,
834 const geometry::RealSize2D& rPartSize,
835 const bool bIsHorizontal)
838 if (rpPart->size() > 1)
841 nGap = (rBoundingBox.X2 - rBoundingBox.X1 - rPartSize.Width) / (rpPart->size()-1);
843 nGap = (rBoundingBox.Y2 - rBoundingBox.Y1 - rPartSize.Height) / (rpPart->size()-1);
847 double nX (rBoundingBox.X1);
848 double nY (rBoundingBox.Y1);
852 for (
auto& rxElement : *rpPart)
857 const awt::Size aElementSize (rxElement->GetBoundingSize(rxCanvas));
860 if (rxElement->IsFilling())
862 nY = rBoundingBox.Y1;
863 rxElement->SetSize(geometry::RealSize2D(aElementSize.Width, rBoundingBox.Y2 - rBoundingBox.Y1));
866 nY = rBoundingBox.Y1 + (rBoundingBox.Y2-rBoundingBox.Y1 - aElementSize.Height) / 2;
867 rxElement->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
868 nX += aElementSize.Width + nGap;
872 if (rxElement->IsFilling())
874 nX = rBoundingBox.X1;
875 rxElement->SetSize(geometry::RealSize2D(rBoundingBox.X2 - rBoundingBox.X1, aElementSize.Height));
878 nX = rBoundingBox.X1 + (rBoundingBox.X2-rBoundingBox.X1 - aElementSize.Width) / 2;
879 rxElement->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
880 nY += aElementSize.Height + nGap;
885 ElementContainerPart::const_iterator iElement;
886 ElementContainerPart::const_iterator iBegin (rpPart->begin());
888 for (iElement=rpPart->end()-1; iElement!=iBegin-1; --iElement)
890 if (iElement->get() ==
nullptr)
893 const awt::Size aElementSize ((*iElement)->GetBoundingSize(rxCanvas));
896 if ((*iElement)->IsFilling())
898 nY = rBoundingBox.Y1;
899 (*iElement)->SetSize(geometry::RealSize2D(aElementSize.Width, rBoundingBox.Y2 - rBoundingBox.Y1));
902 nY = rBoundingBox.Y1 + (rBoundingBox.Y2-rBoundingBox.Y1 - aElementSize.Height) / 2;
903 (*iElement)->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
904 nX += aElementSize.Width + nGap;
909 if (iElement==iBegin){
912 else if (iElement==iBegin+2){
915 const awt::Size aNewElementSize ((*iElement)->GetBoundingSize(rxCanvas));
916 if ((*iElement)->IsFilling())
918 nX = rBoundingBox.X1;
919 (*iElement)->SetSize(geometry::RealSize2D(rBoundingBox.X2 - rBoundingBox.X1, aNewElementSize.Height));
922 nX = rBoundingBox.X1 + (rBoundingBox.X2-rBoundingBox.X1 - aNewElementSize.Width) / 2;
923 (*iElement)->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
924 nY += aNewElementSize.Height + nGap;
927 if (iElement==iBegin)
929 else if (iElement==iBegin+2)
936 void PresenterToolBar::Paint (
937 const awt::Rectangle& rUpdateBox,
938 const rendering::ViewState& rViewState)
942 for (
const auto& rxPart : maElementContainer)
944 for (
auto& rxElement : *rxPart)
948 if ( ! rxElement->IsOutside(rUpdateBox))
949 rxElement->Paint(
mxCanvas, rViewState);
955 void PresenterToolBar::UpdateSlideNumber()
957 if( mxSlideShowController.is() )
959 for (
const auto& rxPart : maElementContainer)
961 for (
auto& rxElement : *rxPart)
964 rxElement->CurrentSlideHasChanged();
970 void PresenterToolBar::CheckMouseOver (
971 const css::awt::MouseEvent& rEvent,
972 const bool bOverWindow,
973 const bool bMouseDown)
975 css::awt::MouseEvent rTemp =rEvent;
977 awt::Rectangle aWindowBox = mxWindow->getPosSize();
978 rTemp.X=aWindowBox.Width-rTemp.X;
980 for (
const auto& rxPart : maElementContainer)
982 for (
auto& rxElement : *rxPart)
987 awt::Rectangle aBox (rxElement->GetBoundingBox());
988 const bool bIsOver = bOverWindow
990 && aBox.Width+aBox.X-1 >= rTemp.X
992 && aBox.Height+aBox.Y-1 >= rTemp.Y;
995 bIsOver && rTemp.Buttons!=0 && bMouseDown && rTemp.ClickCount>0);
1000 void PresenterToolBar::ThrowIfDisposed()
const
1002 if (rBHelper.bDisposed || rBHelper.bInDispose)
1004 throw lang::DisposedException (
1005 "PresenterToolBar has already been disposed",
1006 const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(
this)));
1012 PresenterToolBarView::PresenterToolBarView (
1014 const Reference<XResourceId>& rxViewId,
1015 const Reference<frame::XController>& rxController,
1016 const ::rtl::Reference<PresenterController>& rpPresenterController)
1027 Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
1028 Reference<XConfigurationController> xCC(xCM->getConfigurationController(),UNO_SET_THROW);
1029 mxPane.set(xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW);
1038 rpPresenterController,
1040 mpToolBar->Initialize(
"PresenterScreenSettings/ToolBars/ToolBar");
1046 Reference<awt::XWindowPeer> xPeer (
mxWindow, UNO_QUERY);
1048 xPeer->setBackground(util::Color(0xff000000));
1068 if (xComponent.is())
1069 xComponent->dispose();
1073 mxWindow->removePaintListener(
this);
1091 awt::Rectangle aWindowBox (
mxWindow->getPosSize());
1096 awt::Rectangle(0,0,aWindowBox.Width, aWindowBox.Height),
1104 if (rEventObject.Source ==
mxWindow)
1124 Reference<drawing::XDrawView> xToolBar (static_cast<XWeak*>(
mpToolBar.get()), UNO_QUERY);
1126 xToolBar->setCurrentPage(rxSlide);
1139 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1157 OSL_ASSERT(
mpToolBar->GetPresenterController().is());
1158 OSL_ASSERT(
mpToolBar->GetPresenterController()->GetWindowManager().is());
1162 void Element::SetModes (
1163 const SharedElementMode& rpNormalMode,
1164 const SharedElementMode& rpMouseOverMode,
1165 const SharedElementMode& rpSelectedMode,
1166 const SharedElementMode& rpDisabledMode,
1167 const SharedElementMode& rpMouseOverSelectedMode)
1177 void Element::disposing()
1181 awt::Size
const & Element::GetBoundingSize (
1182 const Reference<rendering::XCanvas>& rxCanvas)
1184 maSize = CreateBoundingSize(rxCanvas);
1188 awt::Rectangle Element::GetBoundingBox()
const
1193 void Element::CurrentSlideHasChanged()
1198 void Element::SetLocation (
const awt::Point& rLocation)
1203 void Element::SetSize (
const geometry::RealSize2D& rSize)
1205 maSize = awt::Size(sal_Int32(0.5+rSize.Width), sal_Int32(0.5+rSize.Height));
1208 bool Element::SetState (
1210 const bool bIsPressed)
1213 bool bClicked (
mbIsPressed && bIsOver && ! bIsPressed);
1237 if (
mpMode->msAction.isEmpty())
1243 if (!
mpToolBar->GetPresenterController())
1246 mpToolBar->GetPresenterController()->DispatchUnoCommand(
mpMode->msAction);
1261 void Element::Invalidate (
const bool bSynchronous)
1264 mpToolBar->InvalidateArea(GetBoundingBox(), bSynchronous);
1267 bool Element::IsOutside (
const awt::Rectangle& rBox)
1282 bool Element::IsFilling()
const
1287 void Element::UpdateState()
1290 OSL_ASSERT(
mpToolBar->GetPresenterController());
1295 util::URL
aURL (
mpToolBar->GetPresenterController()->CreateURLFromString(
mpMode->msAction));
1299 xDispatch->addStatusListener(
this, aURL);
1300 xDispatch->removeStatusListener(
this, aURL);
1306 void SAL_CALL Element::disposing (
const css::lang::EventObject&) {}
1310 void SAL_CALL Element::notifyEvent (
const css::document::EventObject&)
1317 void SAL_CALL Element::statusChanged (
const css::frame::FeatureStateEvent& rEvent)
1321 rEvent.State >>= bIsSelected;
1338 ElementMode::ElementMode()
1345 void ElementMode::ReadElementMode (
1347 const OUString& rsModeName,
1348 std::shared_ptr<ElementMode>
const & rpDefaultMode,
1353 Reference<container::XHierarchicalNameAccess> xNode (
1358 if (!xProperties.is() && rpDefaultMode !=
nullptr)
1362 mpIcon = rpDefaultMode->mpIcon;
1363 msAction = rpDefaultMode->msAction;
1364 maText = rpDefaultMode->maText;
1369 if (rpDefaultMode !=
nullptr)
1370 msAction = rpDefaultMode->msAction;
1373 OUString sText(rpDefaultMode !=
nullptr ? rpDefaultMode->maText.GetText() : OUString());
1375 Reference<container::XHierarchicalNameAccess> xFontNode (
1378 xFontNode, rpDefaultMode !=
nullptr ? rpDefaultMode->maText.GetFont()
1383 Reference<container::XHierarchicalNameAccess> xIconNode (
1402 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1405 pElement->Initialize();
1410 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1411 : Element(rpToolBar),
1415 OSL_ASSERT(
mpToolBar->GetPresenterController().is());
1416 OSL_ASSERT(
mpToolBar->GetPresenterController()->GetWindowManager().is());
1419 void Button::Initialize()
1421 mpToolBar->GetPresenterController()->GetWindowManager()->AddLayoutListener(
this);
1425 void Button::disposing()
1430 OSL_ASSERT(
mpToolBar->GetPresenterController().is());
1431 OSL_ASSERT(
mpToolBar->GetPresenterController()->GetWindowManager().is());
1434 mpToolBar->GetPresenterController()->GetWindowManager()->RemoveLayoutListener(
this);
1436 Element::disposing();
1440 const Reference<rendering::XCanvas>& rxCanvas,
1441 const rendering::ViewState& rViewState)
1443 OSL_ASSERT(rxCanvas.is());
1451 geometry::RealRectangle2D aTextBBox (
mpMode->maText.GetBoundingBox(rxCanvas));
1452 sal_Int32 nTextHeight (sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.Y2 - aTextBBox.Y1));
1454 PaintIcon(rxCanvas, nTextHeight, rViewState);
1455 mpMode->maText.Paint(rxCanvas, rViewState, GetBoundingBox());
1458 awt::Size Button::CreateBoundingSize (
1459 const Reference<rendering::XCanvas>& rxCanvas)
1464 geometry::RealRectangle2D aTextBBox (
mpMode->maText.GetBoundingBox(rxCanvas));
1469 geometry::RealRectangle2D aTextBBoxNormal (
mpNormal->maText.GetBoundingBox(rxCanvas));
1470 geometry::RealRectangle2D aTextBBoxMouseOver (
mpMouseOver->maText.GetBoundingBox(rxCanvas));
1471 geometry::RealRectangle2D aTextBBoxSelected (
mpSelected->maText.GetBoundingBox(rxCanvas));
1472 geometry::RealRectangle2D aTextBBoxDisabled (
mpDisabled->maText.GetBoundingBox(rxCanvas));
1473 geometry::RealRectangle2D aTextBBoxMouseOverSelected (
mpMouseOverSelected->maText.GetBoundingBox(rxCanvas));
1474 std::vector<sal_Int32> widths;
1475 widths.push_back(sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxNormal.X2 - aTextBBoxNormal.X1));
1476 widths.push_back(sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxMouseOver.X2 - aTextBBoxMouseOver.X1));
1477 widths.push_back(sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxSelected.X2 - aTextBBoxSelected.X1));
1478 widths.push_back(sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxDisabled.X2 - aTextBBoxDisabled.X1));
1479 widths.push_back(sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxMouseOverSelected.X2 - aTextBBoxMouseOverSelected.X1));
1481 sal_Int32 nTextHeight (sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.Y2 - aTextBBox.Y1));
1482 Reference<rendering::XBitmap> xBitmap;
1484 xBitmap =
mpMode->mpIcon->GetNormalBitmap();
1487 const sal_Int32 nGap (5);
1488 geometry::IntegerSize2D aSize (xBitmap->getSize());
1490 ::std::max(aSize.Width, *std::max_element(widths.begin(), widths.end())),
1491 aSize.Height + nGap + nTextHeight);
1495 return awt::Size(*std::max_element(widths.begin(), widths.end()), nTextHeight);
1499 void Button::PaintIcon (
1500 const Reference<rendering::XCanvas>& rxCanvas,
1501 const sal_Int32 nTextHeight,
1502 const rendering::ViewState& rViewState)
1507 Reference<rendering::XBitmap> xBitmap (
mpMode->mpIcon->GetBitmap(GetMode()));
1514 + (
maSize.Width-xBitmap->getSize().Width) / 2);
1516 + (
maSize.Height - nTextHeight - xBitmap->getSize().Height) / 2);
1517 const rendering::RenderState aRenderState(
1518 geometry::AffineMatrix2D(1,0,nX, 0,1,nY),
1520 Sequence<double>(4),
1521 rendering::CompositeOperation::OVER);
1522 rxCanvas->drawBitmap(xBitmap, rViewState, aRenderState);
1526 + (
maSize.Width+xBitmap->getSize().Width) / 2);
1528 + (
maSize.Height - nTextHeight - xBitmap->getSize().Height) / 2);
1529 const rendering::RenderState aRenderState(
1530 geometry::AffineMatrix2D(-1,0,nX, 0,1,nY),
1532 Sequence<double>(4),
1533 rendering::CompositeOperation::OVER);
1534 rxCanvas->drawBitmap(xBitmap, rViewState, aRenderState);
1552 void SAL_CALL Button::disposing (
const css::lang::EventObject& rEvent)
1554 mbIsListenerRegistered =
false;
1555 Element::disposing(rEvent);
1564 Label::Label (const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1565 : Element(rpToolBar)
1569 awt::Size Label::CreateBoundingSize (
1570 const Reference<rendering::XCanvas>& rxCanvas)
1573 return awt::Size(0,0);
1575 geometry::RealRectangle2D aTextBBox (
mpMode->maText.GetBoundingBox(rxCanvas));
1577 sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.X2 - aTextBBox.X1),
1578 sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.Y2 - aTextBBox.Y1));
1581 void Label::SetText (
const OUString& rsText)
1587 const bool bRequestLayout (
mpMode->maText.GetText().getLength() != rsText.getLength());
1589 mpMode->maText.SetText(rsText);
1600 const Reference<rendering::XCanvas>& rxCanvas,
1601 const rendering::ViewState& rViewState)
1603 OSL_ASSERT(rxCanvas.is());
1607 mpMode->maText.Paint(rxCanvas, rViewState, GetBoundingBox());
1610 bool Label::SetState (
const bool,
const bool)
1613 return Element::SetState(
false,
false);
1629 const OUString& rsText,
1636 void Text::SetText (
const OUString& rsText)
1641 const OUString& Text::GetText()
const
1652 const Reference<rendering::XCanvas>& rxCanvas,
1653 const rendering::ViewState& rViewState,
1654 const awt::Rectangle& rBoundingBox)
1656 OSL_ASSERT(rxCanvas.is());
1663 if ( !
mpFont->mxFont.is())
1664 mpFont->PrepareFont(rxCanvas);
1665 if ( !
mpFont->mxFont.is())
1668 rendering::StringContext aContext (
msText, 0,
msText.getLength());
1670 Reference<rendering::XTextLayout> xLayout (
1671 mpFont->mxFont->createTextLayout(
1673 rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
1675 geometry::RealRectangle2D aBox (xLayout->queryTextBounds());
1676 const double nTextWidth = aBox.X2 - aBox.X1;
1677 const double nY = rBoundingBox.Y + rBoundingBox.Height - aBox.Y2;
1678 const double nX = rBoundingBox.X + (rBoundingBox.Width - nTextWidth)/2;
1680 rendering::RenderState aRenderState(
1681 geometry::AffineMatrix2D(1,0,nX, 0,1,nY),
1683 Sequence<double>(4),
1684 rendering::CompositeOperation::SOURCE);
1686 rxCanvas->drawTextLayout(
1692 geometry::RealRectangle2D Text::GetBoundingBox (
const Reference<rendering::XCanvas>& rxCanvas)
1696 if ( !
mpFont->mxFont.is())
1697 mpFont->PrepareFont(rxCanvas);
1700 rendering::StringContext aContext (
msText, 0,
msText.getLength());
1701 Reference<rendering::XTextLayout> xLayout (
1702 mpFont->mxFont->createTextLayout(
1704 rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
1706 return xLayout->queryTextBounds();
1709 return geometry::RealRectangle2D(0,0,0,0);
1714 OUString TimeFormatter::FormatTime (
const oslDateTime& rTime)
1716 OUStringBuffer sText;
1718 const sal_Int32 nHours (sal::static_int_cast<sal_Int32>(rTime.Hours));
1719 const sal_Int32 nMinutes (sal::static_int_cast<sal_Int32>(rTime.Minutes));
1720 const sal_Int32 nSeconds(sal::static_int_cast<sal_Int32>(rTime.Seconds));
1722 sText.append(OUString::number(nHours));
1727 const OUString sMinutes (OUString::number(nMinutes));
1728 if (sMinutes.getLength() == 1)
1730 sText.append(sMinutes);
1734 const OUString sSeconds (OUString::number(nSeconds));
1735 if (sSeconds.getLength() == 1)
1737 sText.append(sSeconds);
1738 return sText.makeStringAndClear();
1743 TimeLabel::TimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1749 void SAL_CALL TimeLabel::disposing()
1755 void TimeLabel::ConnectToTimer()
1757 mpListener = std::make_shared<Listener>(
this);
1764 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1767 pElement->ConnectToTimer();
1771 CurrentTimeLabel::~CurrentTimeLabel()
1775 CurrentTimeLabel::CurrentTimeLabel (
1776 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1777 : TimeLabel(rpToolBar)
1781 void CurrentTimeLabel::TimeHasChanged (
const oslDateTime& rCurrentTime)
1783 SetText(TimeFormatter::FormatTime(rCurrentTime));
1787 void CurrentTimeLabel::SetModes (
1788 const SharedElementMode& rpNormalMode,
1789 const SharedElementMode& rpMouseOverMode,
1790 const SharedElementMode& rpSelectedMode,
1791 const SharedElementMode& rpDisabledMode,
1792 const SharedElementMode& rpMouseOverSelectedMode)
1794 TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode);
1801 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1804 pElement->ConnectToTimer();
1808 PresentationTimeLabel::~PresentationTimeLabel()
1810 mpToolBar->GetPresenterController()->SetPresentationTime(
nullptr);
1813 PresentationTimeLabel::PresentationTimeLabel (
1814 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1815 : TimeLabel(rpToolBar),
1819 setPauseStatus(
false);
1820 TimeValue pauseTime(0,0);
1821 setPauseTimeValue(pauseTime);
1822 mpToolBar->GetPresenterController()->SetPresentationTime(
this);
1825 void PresentationTimeLabel::restart()
1827 TimeValue pauseTime(0, 0);
1828 setPauseTimeValue(pauseTime);
1833 bool PresentationTimeLabel::isPaused()
1838 void PresentationTimeLabel::setPauseStatus(
const bool pauseStatus)
1843 TimeValue PresentationTimeLabel::getPauseTimeValue()
const
1848 void PresentationTimeLabel::setPauseTimeValue(
const TimeValue pauseTime)
1854 void PresentationTimeLabel::TimeHasChanged (
const oslDateTime& rCurrentTime)
1856 TimeValue aCurrentTimeValue;
1857 if (!osl_getTimeValueFromDateTime(&rCurrentTime, &aCurrentTimeValue))
1876 TimeValue pauseTime = getPauseTimeValue();
1877 if(pauseTime.Seconds != 0 || pauseTime.Nanosec != 0)
1879 TimeValue incrementValue(0, 0);
1880 incrementValue.Seconds = aCurrentTimeValue.Seconds - pauseTime.Seconds;
1881 if(pauseTime.Nanosec > aCurrentTimeValue.Nanosec)
1883 incrementValue.Nanosec = 1000000000 + aCurrentTimeValue.Nanosec - pauseTime.Nanosec;
1887 incrementValue.Nanosec = aCurrentTimeValue.Nanosec - pauseTime.Nanosec;
1898 TimeValue pauseTime_(0, 0);
1899 setPauseTimeValue(pauseTime_);
1904 TimeValue pauseTime = getPauseTimeValue();
1905 if(pauseTime.Seconds == 0 && pauseTime.Nanosec == 0)
1907 setPauseTimeValue(aCurrentTimeValue);
1911 TimeValue aElapsedTimeValue;
1912 aElapsedTimeValue.Seconds = aCurrentTimeValue.Seconds -
maStartTimeValue.Seconds;
1913 aElapsedTimeValue.Nanosec = aCurrentTimeValue.Nanosec -
maStartTimeValue.Nanosec;
1915 oslDateTime aElapsedDateTime;
1916 if (osl_getDateTimeFromTimeValue(&aElapsedTimeValue, &aElapsedDateTime) && !isPaused())
1918 SetText(TimeFormatter::FormatTime(aElapsedDateTime));
1923 void PresentationTimeLabel::SetModes (
1924 const SharedElementMode& rpNormalMode,
1925 const SharedElementMode& rpMouseOverMode,
1926 const SharedElementMode& rpSelectedMode,
1927 const SharedElementMode& rpDisabledMode,
1928 const SharedElementMode& rpMouseOverSelectedMode)
1930 TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode);
1932 oslDateTime aStartDateTime;
1935 SetText(TimeFormatter::FormatTime(aStartDateTime));
1941 VerticalSeparator::VerticalSeparator (
1942 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1943 : Element(rpToolBar)
1947 void VerticalSeparator::Paint (
1948 const Reference<rendering::XCanvas>& rxCanvas,
1949 const rendering::ViewState& rViewState)
1951 OSL_ASSERT(rxCanvas.is());
1953 awt::Rectangle aBBox (GetBoundingBox());
1955 rendering::RenderState aRenderState(
1956 geometry::AffineMatrix2D(1,0,aBBox.X, 0,1,aBBox.Y),
1958 Sequence<double>(4),
1959 rendering::CompositeOperation::OVER);
1967 Reference<rendering::XBitmap> xBitmap(
mpToolBar->GetPresenterController()->GetPresenterHelper()->loadBitmap(
"bitmaps/Separator.png", rxCanvas));
1971 rxCanvas->drawBitmap(
1977 awt::Size VerticalSeparator::CreateBoundingSize (
1978 const Reference<rendering::XCanvas>&)
1980 return awt::Size(1,20);
1983 bool VerticalSeparator::IsFilling()
const
1990 HorizontalSeparator::HorizontalSeparator (
1991 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1992 : Element(rpToolBar)
1996 void HorizontalSeparator::Paint (
1997 const Reference<rendering::XCanvas>& rxCanvas,
1998 const rendering::ViewState& rViewState)
2000 OSL_ASSERT(rxCanvas.is());
2002 awt::Rectangle aBBox (GetBoundingBox());
2004 rendering::RenderState aRenderState(
2005 geometry::AffineMatrix2D(1,0,0, 0,1,0),
2007 Sequence<double>(4),
2008 rendering::CompositeOperation::OVER);
2016 rxCanvas->fillPolyPolygon(
2022 awt::Size HorizontalSeparator::CreateBoundingSize (
2023 const Reference<rendering::XCanvas>&)
2025 return awt::Size(20,1);
2028 bool HorizontalSeparator::IsFilling()
const
Reference< rendering::XCanvas > mxCanvas
std::shared_ptr< FontDescriptor > SharedFontDescriptor
static css::uno::Any GetProperty(const css::uno::Reference< css::beans::XPropertySet > &rxProperties, const OUString &rsKey)
This method wraps a call to getPropertyValue() and returns an empty Any instead of throwing an except...
static css::uno::Reference< css::beans::XPropertySet > GetNodeProperties(const css::uno::Reference< css::container::XHierarchicalNameAccess > &rxNode, const OUString &rsPathToNode)
std::shared_ptr< PresenterBitmapContainer::BitmapDescriptor > SharedBitmapDescriptor
This class gives access to the configuration.
static::rtl::Reference< PresenterClockTimer > Instance(const css::uno::Reference< css::uno::XComponentContext > &rxContext)
Reference< drawing::XPresenterHelper > mxPresenterHelper
css::uno::Reference< css::uno::XComponentContext > mxComponentContext
static SharedFontDescriptor ReadFont(const css::uno::Reference< css::container::XHierarchicalNameAccess > &rxNode, const SharedFontDescriptor &rDefaultFount)
const sal_Int32 gnGapSize(20)
css::uno::Any GetConfigurationNode(const OUString &rsPathToNode)
Return a configuration node below the root of the called object.
static bool GetLayoutRTL()
static css::uno::Reference< css::rendering::XPolyPolygon2D > CreatePolygon(const css::awt::Rectangle &rBox, const css::uno::Reference< css::rendering::XGraphicDevice > &rxDevice)
Context & operator=(const Context &)=delete
Reference< XDispatch > xDispatch
static oslDateTime GetCurrentTime()
rtl::Reference< PresenterController > mpPresenterController
css::uno::Reference< css::rendering::XCanvas > mxCanvas
static std::shared_ptr< BitmapDescriptor > LoadBitmap(const css::uno::Reference< css::container::XHierarchicalNameAccess > &rxNode, const OUString &rsPathToBitmapNode, const css::uno::Reference< css::drawing::XPresenterHelper > &rxPresenterHelper, const css::uno::Reference< css::rendering::XCanvas > &rxCanvas, const std::shared_ptr< BitmapDescriptor > &rpDefaultBitmap)
cppu::WeakComponentImplHelper< css::awt::XWindowListener, css::awt::XPaintListener, css::awt::XMouseListener, css::awt::XMouseMotionListener, css::drawing::XDrawView > PresenterToolBarInterfaceBase
static void SetDeviceColor(css::rendering::RenderState &rRenderState, const css::util::Color aColor)
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect)
cppu::WeakComponentImplHelper< css::awt::XPaintListener, css::drawing::framework::XView, css::drawing::XDrawView > PresenterToolBarViewInterfaceBase