33#include <com/sun/star/awt/XWindowPeer.hpp>
34#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
35#include <com/sun/star/drawing/framework/XPane.hpp>
36#include <com/sun/star/geometry/AffineMatrix2D.hpp>
37#include <com/sun/star/rendering/CompositeOperation.hpp>
38#include <com/sun/star/rendering/RenderState.hpp>
39#include <com/sun/star/rendering/TextDirection.hpp>
40#include <com/sun/star/rendering/ViewState.hpp>
41#include <com/sun/star/rendering/XSpriteCanvas.hpp>
42#include <com/sun/star/util/Color.hpp>
43#include <rtl/ustrbuf.hxx>
63 void SetText (
const OUString& rsText);
64 const OUString& GetText()
const;
68 const Reference<rendering::XCanvas>& rxCanvas,
69 const rendering::ViewState& rViewState,
70 const awt::Rectangle& rBoundingBox);
72 geometry::RealRectangle2D GetBoundingBox (
73 const Reference<rendering::XCanvas>& rxCanvas);
84 ElementMode(
const ElementMode&) =
delete;
85 ElementMode& operator=(
const ElementMode&) =
delete;
91 void ReadElementMode (
92 const Reference<beans::XPropertySet>& rxProperties,
93 const OUString& rsModeName,
94 std::shared_ptr<ElementMode>
const & rpDefaultMode,
97 typedef std::shared_ptr<ElementMode> SharedElementMode;
108 css::uno::Reference<css::rendering::XCanvas>
mxCanvas;
114 typedef cppu::WeakComponentImplHelper<
115 css::document::XEventListener,
116 css::frame::XStatusListener
117 > ElementInterfaceBase;
121 public ElementInterfaceBase
125 Element(
const Element&) =
delete;
126 Element& operator=(
const Element&) =
delete;
128 virtual void SAL_CALL disposing()
override;
130 virtual void SetModes (
131 const SharedElementMode& rpNormalMode,
132 const SharedElementMode& rpMouseOverMode,
133 const SharedElementMode& rpSelectedMode,
134 const SharedElementMode& rpDisabledMode,
135 const SharedElementMode& rpMouseOverSelectedMode);
136 void CurrentSlideHasChanged();
137 void SetLocation (
const awt::Point& rLocation);
138 void SetSize (
const geometry::RealSize2D& rSize);
140 const Reference<rendering::XCanvas>& rxCanvas,
141 const rendering::ViewState& rViewState) = 0;
142 awt::Size
const & GetBoundingSize (
143 const Reference<rendering::XCanvas>& rxCanvas);
144 awt::Rectangle GetBoundingBox()
const;
145 virtual bool SetState (
const bool bIsOver,
const bool bIsPressed);
146 void Invalidate (
const bool bSynchronous);
147 bool IsOutside (
const awt::Rectangle& rBox);
148 virtual bool IsFilling()
const;
153 virtual void SAL_CALL disposing (
const css::lang::EventObject& rEvent)
override;
157 virtual void SAL_CALL notifyEvent (
const css::document::EventObject& rEvent)
override;
161 virtual void SAL_CALL statusChanged (
const css::frame::FeatureStateEvent& rEvent)
override;
177 virtual awt::Size CreateBoundingSize (
178 const Reference<rendering::XCanvas>& rxCanvas) = 0;
188 :
public ::std::vector<rtl::Reference<Element> >
196 class Button :
public Element
199 static ::rtl::Reference<Element>
Create (
200 const ::rtl::Reference<PresenterToolBar>& rpToolBar);
202 virtual void SAL_CALL disposing()
override;
205 const Reference<rendering::XCanvas>& rxCanvas,
206 const rendering::ViewState& rViewState)
override;
210 virtual void SAL_CALL disposing (
const css::lang::EventObject& rEvent)
override;
213 virtual awt::Size CreateBoundingSize (
214 const Reference<rendering::XCanvas>& rxCanvas)
override;
219 Button (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
222 const Reference<rendering::XCanvas>& rxCanvas,
223 const sal_Int32 nTextHeight,
224 const rendering::ViewState& rViewState);
230 class Label :
public Element
233 explicit Label (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
235 void SetText (
const OUString& rsText);
237 const Reference<rendering::XCanvas>& rxCanvas,
238 const rendering::ViewState& rViewState)
override;
239 virtual bool SetState (
const bool bIsOver,
const bool bIsPressed)
override;
242 virtual awt::Size CreateBoundingSize (
243 const Reference<rendering::XCanvas>& rxCanvas)
override;
251 static OUString FormatTime (
const oslDateTime& rTime);
254 class TimeLabel :
public Label
257 void ConnectToTimer();
258 virtual void TimeHasChanged (
const oslDateTime& rCurrentTime) = 0;
260 explicit TimeLabel(const ::rtl::Reference<PresenterToolBar>& rpToolBar);
261 using Element::disposing;
262 virtual void SAL_CALL disposing()
override;
264 class Listener :
public PresenterClockTimer::Listener
269 virtual ~Listener() {}
270 virtual void TimeHasChanged (
const oslDateTime& rCurrentTime)
override
278 class CurrentTimeLabel :
public TimeLabel
281 static ::rtl::Reference<Element>
Create (
282 const ::rtl::Reference<PresenterToolBar>& rpToolBar);
283 virtual void SetModes (
284 const SharedElementMode& rpNormalMode,
285 const SharedElementMode& rpMouseOverMode,
286 const SharedElementMode& rpSelectedMode,
287 const SharedElementMode& rpDisabledMode,
288 const SharedElementMode& rpMouseOverSelectedMode)
override;
290 CurrentTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
291 virtual ~CurrentTimeLabel()
override;
292 virtual void TimeHasChanged (
const oslDateTime& rCurrentTime)
override;
295 class PresentationTimeLabel :
public TimeLabel,
public IPresentationTime
298 static ::rtl::Reference<Element>
Create (
299 const ::rtl::Reference<PresenterToolBar>& rpToolBar);
300 virtual void SetModes (
301 const SharedElementMode& rpNormalMode,
302 const SharedElementMode& rpMouseOverMode,
303 const SharedElementMode& rpSelectedMode,
304 const SharedElementMode& rpDisabledMode,
305 const SharedElementMode& rpMouseOverSelectedMode)
override;
306 virtual void restart()
override;
307 virtual bool isPaused()
override;
308 virtual void setPauseStatus(
const bool pauseStatus)
override;
309 const TimeValue& getPauseTimeValue()
const;
310 void setPauseTimeValue(
const TimeValue pauseTime);
314 PresentationTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
316 virtual ~PresentationTimeLabel()
override;
317 virtual void TimeHasChanged (
const oslDateTime& rCurrentTime)
override;
320 class VerticalSeparator :
public Element
323 explicit VerticalSeparator (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
325 const Reference<rendering::XCanvas>& rxCanvas,
326 const rendering::ViewState& rViewState)
override;
327 virtual bool IsFilling()
const override;
330 virtual awt::Size CreateBoundingSize (
331 const Reference<rendering::XCanvas>& rxCanvas)
override;
334 class HorizontalSeparator :
public Element
337 explicit HorizontalSeparator (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
339 const Reference<rendering::XCanvas>& rxCanvas,
340 const rendering::ViewState& rViewState)
override;
341 virtual bool IsFilling()
const override;
344 virtual awt::Size CreateBoundingSize (
345 const Reference<rendering::XCanvas>& rxCanvas)
override;
352 const Reference<XComponentContext>& rxContext,
353 css::uno::Reference<css::awt::XWindow> xWindow,
354 css::uno::Reference<css::rendering::XCanvas> xCanvas,
356 const Anchor eAnchor)
359 mxWindow(
std::move(xWindow)),
362 mbIsLayoutPending(false),
367void PresenterToolBar::Initialize (
368 const OUString& rsConfigurationPath)
372 CreateControls(rsConfigurationPath);
376 mxWindow->addWindowListener(
this);
377 mxWindow->addPaintListener(
this);
378 mxWindow->addMouseListener(
this);
379 mxWindow->addMouseMotionListener(
this);
381 Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY);
383 xPeer->setBackground(util::Color(0xff000000));
385 mxWindow->setVisible(
true);
390 mbIsLayoutPending =
true;
394 mpCurrentContainerPart.reset();
395 maElementContainer.clear();
400PresenterToolBar::~PresenterToolBar()
404void SAL_CALL PresenterToolBar::disposing()
408 mxWindow->removeWindowListener(
this);
409 mxWindow->removePaintListener(
this);
410 mxWindow->removeMouseListener(
this);
411 mxWindow->removeMouseMotionListener(
this);
416 for (
const auto& rxPart : maElementContainer)
418 OSL_ASSERT(rxPart !=
nullptr);
423 Reference<lang::XComponent> xComponent = pElement;
425 xComponent->dispose();
430 mpCurrentContainerPart.reset();
431 maElementContainer.clear();
434void PresenterToolBar::InvalidateArea (
435 const awt::Rectangle& rRepaintBox,
436 const bool bSynchronous)
441 xManager->Invalidate(
447void PresenterToolBar::RequestLayout()
449 mbIsLayoutPending =
true;
455 xManager->Invalidate(mxWindow);
458geometry::RealSize2D
const & PresenterToolBar::GetMinimalSize()
460 if (mbIsLayoutPending)
462 return maMinimalSize;
465const ::rtl::Reference<PresenterController>& PresenterToolBar::GetPresenterController()
const
470const Reference<XComponentContext>& PresenterToolBar::GetComponentContext()
const
477void SAL_CALL PresenterToolBar::disposing (
const lang::EventObject& rEventObject)
479 if (rEventObject.Source == mxWindow)
485void SAL_CALL PresenterToolBar::windowResized (
const awt::WindowEvent&)
487 mbIsLayoutPending =
true;
490void SAL_CALL PresenterToolBar::windowMoved (
const awt::WindowEvent&) {}
492void SAL_CALL PresenterToolBar::windowShown (
const lang::EventObject&)
494 mbIsLayoutPending =
true;
497void SAL_CALL PresenterToolBar::windowHidden (
const lang::EventObject&) {}
500void SAL_CALL PresenterToolBar::windowPaint (
const css::awt::PaintEvent& rEvent)
505 if ( ! mbIsPresenterViewActive)
508 const rendering::ViewState aViewState (
509 geometry::AffineMatrix2D(1,0,0, 0,1,0),
510 PresenterGeometryHelper::CreatePolygon(rEvent.UpdateRect,
mxCanvas->getDevice()));
512 if (mbIsLayoutPending)
515 Paint(rEvent.UpdateRect, aViewState);
518 Reference<rendering::XSpriteCanvas> xSpriteCanvas (
mxCanvas, UNO_QUERY);
519 if (xSpriteCanvas.is())
520 xSpriteCanvas->updateScreen(
false);
524void SAL_CALL PresenterToolBar::mousePressed (
const css::awt::MouseEvent& rEvent)
527 CheckMouseOver(rEvent,
true,
true);
530void SAL_CALL PresenterToolBar::mouseReleased (
const css::awt::MouseEvent& rEvent)
533 CheckMouseOver(rEvent,
true);
536void SAL_CALL PresenterToolBar::mouseEntered (
const css::awt::MouseEvent& rEvent)
539 CheckMouseOver(rEvent,
true);
542void SAL_CALL PresenterToolBar::mouseExited (
const css::awt::MouseEvent& rEvent)
545 CheckMouseOver(rEvent,
false);
550void SAL_CALL PresenterToolBar::mouseMoved (
const css::awt::MouseEvent& rEvent)
553 CheckMouseOver(rEvent,
true);
556void SAL_CALL PresenterToolBar::mouseDragged (
const css::awt::MouseEvent&)
563void SAL_CALL PresenterToolBar::setCurrentPage (
const Reference<drawing::XDrawPage>& rxSlide)
565 if (rxSlide != mxCurrentSlide)
567 mxCurrentSlide = rxSlide;
572Reference<drawing::XDrawPage> SAL_CALL PresenterToolBar::getCurrentPage()
574 return mxCurrentSlide;
578void PresenterToolBar::CreateControls (
579 const OUString& rsConfigurationPath)
581 if ( ! mxWindow.is())
587 "/org.openoffice.Office.PresenterScreen/",
588 PresenterConfigurationAccess::READ_ONLY);
590 mpCurrentContainerPart = std::make_shared<ElementContainerPart>();
591 maElementContainer.clear();
592 maElementContainer.push_back(mpCurrentContainerPart);
594 Reference<container::XHierarchicalNameAccess> xToolBarNode (
597 if (!xToolBarNode.is())
600 Reference<container::XNameAccess> xEntries (
601 PresenterConfigurationAccess::GetConfigurationNode(xToolBarNode,
"Entries"),
610 PresenterConfigurationAccess::ForAll(
612 [
this, &aContext] (OUString
const&, uno::Reference<beans::XPropertySet>
const& xProps)
614 return this->ProcessEntry(xProps, aContext);
619void PresenterToolBar::ProcessEntry (
620 const Reference<beans::XPropertySet>& rxProperties,
623 if ( ! rxProperties.is())
628 if ( ! (PresenterConfigurationAccess::GetProperty(rxProperties,
"Type") >>=
sType))
632 SharedElementMode pNormalMode = std::make_shared<ElementMode>();
633 SharedElementMode pMouseOverMode = std::make_shared<ElementMode>();
634 SharedElementMode pSelectedMode = std::make_shared<ElementMode>();
635 SharedElementMode pDisabledMode = std::make_shared<ElementMode>();
636 SharedElementMode pMouseOverSelectedMode = std::make_shared<ElementMode>();
637 pNormalMode->ReadElementMode(rxProperties,
"Normal", pNormalMode, rContext);
638 pMouseOverMode->ReadElementMode(rxProperties,
"MouseOver", pNormalMode, rContext);
639 pSelectedMode->ReadElementMode(rxProperties,
"Selected", pNormalMode, rContext);
640 pDisabledMode->ReadElementMode(rxProperties,
"Disabled", pNormalMode, rContext);
641 pMouseOverSelectedMode->ReadElementMode(rxProperties,
"MouseOverSelected", pSelectedMode, rContext);
645 if (
sType ==
"Button" )
646 pElement = Button::Create(
this);
647 else if (
sType ==
"CurrentTimeLabel" )
648 pElement = CurrentTimeLabel::Create(
this);
649 else if (
sType ==
"PresentationTimeLabel" )
650 pElement = PresentationTimeLabel::Create(
this);
651 else if (
sType ==
"VerticalSeparator" )
652 pElement.set(
new VerticalSeparator(
this));
653 else if (
sType ==
"HorizontalSeparator" )
654 pElement.set(
new HorizontalSeparator(
this));
655 else if (
sType ==
"Label" )
656 pElement.set(
new Label(
this));
657 else if (
sType ==
"ChangeOrientation" )
659 mpCurrentContainerPart = std::make_shared<ElementContainerPart>();
660 maElementContainer.push_back(mpCurrentContainerPart);
665 pElement->SetModes( pNormalMode, pMouseOverMode, pSelectedMode, pDisabledMode, pMouseOverSelectedMode);
666 pElement->UpdateState();
667 if (mpCurrentContainerPart)
668 mpCurrentContainerPart->push_back(pElement);
672void PresenterToolBar::Layout (
673 const Reference<rendering::XCanvas>& rxCanvas)
675 if (maElementContainer.empty())
678 mbIsLayoutPending =
false;
680 const awt::Rectangle aWindowBox (mxWindow->getPosSize());
681 ::std::vector<geometry::RealSize2D> aPartSizes (maElementContainer.size());
682 geometry::RealSize2D aTotalSize (0,0);
683 bool bIsHorizontal (
true);
685 double nTotalHorizontalGap (0);
686 sal_Int32 nGapCount (0);
687 for (
const auto& rxPart : maElementContainer)
689 geometry::RealSize2D aSize (CalculatePartSize(rxCanvas, rxPart, bIsHorizontal));
692 aPartSizes[
nIndex] = aSize;
695 if (rxPart->size()>1 && bIsHorizontal)
697 nTotalHorizontalGap += (rxPart->size() - 1) *
gnGapSize;
698 nGapCount += rxPart->size() - 1;
702 bIsHorizontal = !bIsHorizontal;
704 aTotalSize.Width += aSize.Width;
706 aTotalSize.Height = ::std::max(aTotalSize.Height, aSize.Height);
710 if (maElementContainer.size() > 1)
712 nTotalHorizontalGap += (maElementContainer.size() - 1) *
gnGapSize;
713 nGapCount += maElementContainer.size()-1;
721 maMinimalSize = aTotalSize;
722 maMinimalSize.Width += nTotalHorizontalGap;
725 double nGapWidth (0);
728 if (aTotalSize.Width + nTotalHorizontalGap > aWindowBox.Width)
729 nTotalHorizontalGap = aWindowBox.Width - aTotalSize.Width;
730 nGapWidth = nTotalHorizontalGap / nGapCount;
737 case Left : nX = 0;
break;
738 case Center: nX = (aWindowBox.Width - aTotalSize.Width - nTotalHorizontalGap) / 2;
break;
742 double nY ((aWindowBox.Height - aTotalSize.Height) / 2);
743 bIsHorizontal =
true;
749 for (
const auto& rxPart : maElementContainer)
751 geometry::RealRectangle2D aBoundingBox(
753 nX+aPartSizes[
nIndex].
Width, nY+aTotalSize.Height);
756 if (rxPart->size() > 1 && bIsHorizontal)
757 aBoundingBox.X2 += (rxPart->size() - 1) * nGapWidth;
759 LayoutPart(rxCanvas, rxPart, aBoundingBox, aPartSizes[
nIndex], bIsHorizontal);
760 bIsHorizontal = !bIsHorizontal;
761 nX += aBoundingBox.X2 - aBoundingBox.X1 + nGapWidth;
766 ElementContainer::iterator iPart;
767 ElementContainer::iterator iBegin (maElementContainer.begin());
768 for (iPart=maElementContainer.end()-1,
nIndex=2; iPart!=iBegin-1; --iPart, --
nIndex)
770 geometry::RealRectangle2D aBoundingBox(
772 nX+aPartSizes[
nIndex].
Width, nY+aTotalSize.Height);
775 if ((*iPart)->size() > 1)
777 aBoundingBox.X2 += ((*iPart)->size()-1) * nGapWidth;
779 LayoutPart(rxCanvas, *iPart, aBoundingBox, aPartSizes[
nIndex], bIsHorizontal);
780 bIsHorizontal = !bIsHorizontal;
781 nX += aBoundingBox.X2 - aBoundingBox.X1 + nGapWidth;
789 xManager->Invalidate(mxWindow);
792geometry::RealSize2D PresenterToolBar::CalculatePartSize (
793 const Reference<rendering::XCanvas>& rxCanvas,
795 const bool bIsHorizontal)
797 geometry::RealSize2D aTotalSize (0,0);
802 for (
const auto& rxElement : *rpPart)
807 const awt::Size aBSize (rxElement->GetBoundingSize(rxCanvas));
810 aTotalSize.Width += aBSize.Width;
811 if (aBSize.Height > aTotalSize.Height)
812 aTotalSize.Height = aBSize.Height;
816 aTotalSize.Height += aBSize.Height;
817 if (aBSize.Width > aTotalSize.Width)
818 aTotalSize.Width = aBSize.Width;
825void PresenterToolBar::LayoutPart (
826 const Reference<rendering::XCanvas>& rxCanvas,
828 const geometry::RealRectangle2D& rBoundingBox,
829 const geometry::RealSize2D& rPartSize,
830 const bool bIsHorizontal)
833 if (rpPart->size() > 1)
836 nGap = (rBoundingBox.X2 - rBoundingBox.X1 - rPartSize.Width) / (rpPart->size()-1);
838 nGap = (rBoundingBox.Y2 - rBoundingBox.Y1 - rPartSize.Height) / (rpPart->size()-1);
842 double nX (rBoundingBox.X1);
843 double nY (rBoundingBox.Y1);
847 for (
auto& rxElement : *rpPart)
852 const awt::Size aElementSize (rxElement->GetBoundingSize(rxCanvas));
855 if (rxElement->IsFilling())
857 nY = rBoundingBox.Y1;
858 rxElement->SetSize(geometry::RealSize2D(aElementSize.Width, rBoundingBox.Y2 - rBoundingBox.Y1));
861 nY = rBoundingBox.Y1 + (rBoundingBox.Y2-rBoundingBox.Y1 - aElementSize.Height) / 2;
862 rxElement->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
863 nX += aElementSize.Width + nGap;
867 if (rxElement->IsFilling())
869 nX = rBoundingBox.X1;
870 rxElement->SetSize(geometry::RealSize2D(rBoundingBox.X2 - rBoundingBox.X1, aElementSize.Height));
873 nX = rBoundingBox.X1 + (rBoundingBox.X2-rBoundingBox.X1 - aElementSize.Width) / 2;
874 rxElement->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
875 nY += aElementSize.Height + nGap;
880 ElementContainerPart::const_iterator iElement;
881 ElementContainerPart::const_iterator iBegin (rpPart->begin());
883 for (iElement=rpPart->end()-1; iElement!=iBegin-1; --iElement)
885 if (iElement->get() ==
nullptr)
888 const awt::Size aElementSize ((*iElement)->GetBoundingSize(rxCanvas));
891 if ((*iElement)->IsFilling())
893 nY = rBoundingBox.Y1;
894 (*iElement)->SetSize(geometry::RealSize2D(aElementSize.Width, rBoundingBox.Y2 - rBoundingBox.Y1));
897 nY = rBoundingBox.Y1 + (rBoundingBox.Y2-rBoundingBox.Y1 - aElementSize.Height) / 2;
898 (*iElement)->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
899 nX += aElementSize.Width + nGap;
904 if (iElement==iBegin){
907 else if (iElement==iBegin+2){
910 const awt::Size aNewElementSize ((*iElement)->GetBoundingSize(rxCanvas));
911 if ((*iElement)->IsFilling())
913 nX = rBoundingBox.X1;
914 (*iElement)->SetSize(geometry::RealSize2D(rBoundingBox.X2 - rBoundingBox.X1, aNewElementSize.Height));
917 nX = rBoundingBox.X1 + (rBoundingBox.X2-rBoundingBox.X1 - aNewElementSize.Width) / 2;
918 (*iElement)->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
919 nY += aNewElementSize.Height + nGap;
922 if (iElement==iBegin)
924 else if (iElement==iBegin+2)
931void PresenterToolBar::Paint (
932 const awt::Rectangle& rUpdateBox,
933 const rendering::ViewState& rViewState)
937 for (
const auto& rxPart : maElementContainer)
939 for (
auto& rxElement : *rxPart)
943 if ( ! rxElement->IsOutside(rUpdateBox))
944 rxElement->Paint(
mxCanvas, rViewState);
950void PresenterToolBar::UpdateSlideNumber()
952 if( mxSlideShowController.is() )
954 for (
const auto& rxPart : maElementContainer)
956 for (
auto& rxElement : *rxPart)
959 rxElement->CurrentSlideHasChanged();
965void PresenterToolBar::CheckMouseOver (
966 const css::awt::MouseEvent& rEvent,
967 const bool bOverWindow,
968 const bool bMouseDown)
970 css::awt::MouseEvent rTemp =rEvent;
972 awt::Rectangle aWindowBox = mxWindow->getPosSize();
973 rTemp.X=aWindowBox.Width-rTemp.X;
975 for (
const auto& rxPart : maElementContainer)
977 for (
auto& rxElement : *rxPart)
982 awt::Rectangle aBox (rxElement->GetBoundingBox());
983 const bool bIsOver = bOverWindow
985 && aBox.Width+aBox.X-1 >= rTemp.X
987 && aBox.Height+aBox.Y-1 >= rTemp.Y;
990 bIsOver && rTemp.Buttons!=0 && bMouseDown && rTemp.ClickCount>0);
995void PresenterToolBar::ThrowIfDisposed()
const
997 if (rBHelper.bDisposed || rBHelper.bInDispose)
999 throw lang::DisposedException (
1000 "PresenterToolBar has already been disposed",
1001 const_cast<uno::XWeak*
>(
static_cast<const uno::XWeak*
>(
this)));
1007PresenterToolBarView::PresenterToolBarView (
1008 const Reference<XComponentContext>& rxContext,
1009 const Reference<XResourceId>& rxViewId,
1011 const ::rtl::Reference<PresenterController>& rpPresenterController)
1018 Reference<XConfigurationController> xCC(rxController->getConfigurationController(),UNO_SET_THROW);
1019 mxPane.set(xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW);
1028 rpPresenterController,
1030 mpToolBar->Initialize(
"PresenterScreenSettings/ToolBars/ToolBar");
1036 Reference<awt::XWindowPeer> xPeer (
mxWindow, UNO_QUERY);
1038 xPeer->setBackground(util::Color(0xff000000));
1056 Reference<lang::XComponent> xComponent =
mpToolBar;
1058 if (xComponent.is())
1059 xComponent->dispose();
1063 mxWindow->removePaintListener(
this);
1081 awt::Rectangle aWindowBox (
mxWindow->getPosSize());
1086 awt::Rectangle(0,0,aWindowBox.Width, aWindowBox.Height),
1094 if (rEventObject.Source ==
mxWindow)
1114 Reference<drawing::XDrawView> xToolBar =
mpToolBar;
1116 xToolBar->setCurrentPage(rxSlide);
1139 OSL_ASSERT(
mpToolBar->GetPresenterController().is());
1140 OSL_ASSERT(
mpToolBar->GetPresenterController()->GetWindowManager().is());
1144void Element::SetModes (
1145 const SharedElementMode& rpNormalMode,
1146 const SharedElementMode& rpMouseOverMode,
1147 const SharedElementMode& rpSelectedMode,
1148 const SharedElementMode& rpDisabledMode,
1149 const SharedElementMode& rpMouseOverSelectedMode)
1159void Element::disposing()
1163awt::Size
const & Element::GetBoundingSize (
1164 const Reference<rendering::XCanvas>& rxCanvas)
1166 maSize = CreateBoundingSize(rxCanvas);
1170awt::Rectangle Element::GetBoundingBox()
const
1175void Element::CurrentSlideHasChanged()
1180void Element::SetLocation (
const awt::Point& rLocation)
1185void Element::SetSize (
const geometry::RealSize2D& rSize)
1187 maSize = awt::Size(sal_Int32(0.5+rSize.Width), sal_Int32(0.5+rSize.Height));
1190bool Element::SetState (
1192 const bool bIsPressed)
1195 bool bClicked (
mbIsPressed && bIsOver && ! bIsPressed);
1219 if (
mpMode->msAction.isEmpty())
1225 if (!
mpToolBar->GetPresenterController())
1228 mpToolBar->GetPresenterController()->DispatchUnoCommand(
mpMode->msAction);
1243void Element::Invalidate (
const bool bSynchronous)
1246 mpToolBar->InvalidateArea(GetBoundingBox(), bSynchronous);
1249bool Element::IsOutside (
const awt::Rectangle& rBox)
1264bool Element::IsFilling()
const
1269void Element::UpdateState()
1272 OSL_ASSERT(
mpToolBar->GetPresenterController());
1277 util::URL
aURL (
mpToolBar->GetPresenterController()->CreateURLFromString(
mpMode->msAction));
1278 Reference<frame::XDispatch>
xDispatch (
mpToolBar->GetPresenterController()->GetDispatch(aURL));
1281 xDispatch->addStatusListener(
this, aURL);
1282 xDispatch->removeStatusListener(
this, aURL);
1288void SAL_CALL Element::disposing (
const css::lang::EventObject&) {}
1292void SAL_CALL Element::notifyEvent (
const css::document::EventObject&)
1299void SAL_CALL Element::statusChanged (
const css::frame::FeatureStateEvent& rEvent)
1303 rEvent.State >>= bIsSelected;
1320ElementMode::ElementMode()
1324void ElementMode::ReadElementMode (
1325 const Reference<beans::XPropertySet>& rxElementProperties,
1326 const OUString& rsModeName,
1327 std::shared_ptr<ElementMode>
const & rpDefaultMode,
1332 Reference<container::XHierarchicalNameAccess> xNode (
1335 Reference<beans::XPropertySet> xProperties (
1337 if (!xProperties.is() && rpDefaultMode !=
nullptr)
1341 mpIcon = rpDefaultMode->mpIcon;
1342 msAction = rpDefaultMode->msAction;
1343 maText = rpDefaultMode->maText;
1348 if (rpDefaultMode !=
nullptr)
1349 msAction = rpDefaultMode->msAction;
1352 OUString sText(rpDefaultMode !=
nullptr ? rpDefaultMode->maText.GetText() : OUString());
1354 Reference<container::XHierarchicalNameAccess> xFontNode (
1357 xFontNode, rpDefaultMode !=
nullptr ? rpDefaultMode->maText.GetFont()
1362 Reference<container::XHierarchicalNameAccess> xIconNode (
1381 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1384 pElement->Initialize();
1389 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1390 : Element(rpToolBar),
1394 OSL_ASSERT(
mpToolBar->GetPresenterController().is());
1395 OSL_ASSERT(
mpToolBar->GetPresenterController()->GetWindowManager().is());
1398void Button::Initialize()
1400 mpToolBar->GetPresenterController()->GetWindowManager()->AddLayoutListener(
this);
1404void Button::disposing()
1409 OSL_ASSERT(
mpToolBar->GetPresenterController().is());
1410 OSL_ASSERT(
mpToolBar->GetPresenterController()->GetWindowManager().is());
1413 mpToolBar->GetPresenterController()->GetWindowManager()->RemoveLayoutListener(
this);
1415 Element::disposing();
1419 const Reference<rendering::XCanvas>& rxCanvas,
1420 const rendering::ViewState& rViewState)
1422 OSL_ASSERT(rxCanvas.is());
1430 geometry::RealRectangle2D aTextBBox (
mpMode->maText.GetBoundingBox(rxCanvas));
1431 sal_Int32 nTextHeight (sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.Y2 - aTextBBox.Y1));
1433 PaintIcon(rxCanvas, nTextHeight, rViewState);
1434 mpMode->maText.Paint(rxCanvas, rViewState, GetBoundingBox());
1437awt::Size Button::CreateBoundingSize (
1438 const Reference<rendering::XCanvas>& rxCanvas)
1443 geometry::RealRectangle2D aTextBBox (
mpMode->maText.GetBoundingBox(rxCanvas));
1448 geometry::RealRectangle2D aTextBBoxNormal (
mpNormal->maText.GetBoundingBox(rxCanvas));
1449 geometry::RealRectangle2D aTextBBoxMouseOver (
mpMouseOver->maText.GetBoundingBox(rxCanvas));
1450 geometry::RealRectangle2D aTextBBoxSelected (
mpSelected->maText.GetBoundingBox(rxCanvas));
1451 geometry::RealRectangle2D aTextBBoxDisabled (
mpDisabled->maText.GetBoundingBox(rxCanvas));
1452 geometry::RealRectangle2D aTextBBoxMouseOverSelected (
mpMouseOverSelected->maText.GetBoundingBox(rxCanvas));
1453 std::vector<sal_Int32> widths
1455 sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxNormal.X2 - aTextBBoxNormal.X1),
1456 sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxMouseOver.X2 - aTextBBoxMouseOver.X1),
1457 sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxSelected.X2 - aTextBBoxSelected.X1),
1458 sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxDisabled.X2 - aTextBBoxDisabled.X1),
1459 sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxMouseOverSelected.X2 - aTextBBoxMouseOverSelected.X1)
1462 sal_Int32 nTextHeight (sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.Y2 - aTextBBox.Y1));
1463 Reference<rendering::XBitmap> xBitmap;
1465 xBitmap =
mpMode->mpIcon->GetNormalBitmap();
1468 const sal_Int32 nGap (5);
1469 geometry::IntegerSize2D aSize (xBitmap->getSize());
1471 ::std::max(aSize.Width, *std::max_element(widths.begin(), widths.end())),
1472 aSize.Height + nGap + nTextHeight);
1476 return awt::Size(*std::max_element(widths.begin(), widths.end()), nTextHeight);
1480void Button::PaintIcon (
1481 const Reference<rendering::XCanvas>& rxCanvas,
1482 const sal_Int32 nTextHeight,
1483 const rendering::ViewState& rViewState)
1488 Reference<rendering::XBitmap> xBitmap (
mpMode->mpIcon->GetBitmap(GetMode()));
1495 + (
maSize.Width-xBitmap->getSize().Width) / 2);
1497 + (
maSize.Height - nTextHeight - xBitmap->getSize().Height) / 2);
1498 const rendering::RenderState aRenderState(
1499 geometry::AffineMatrix2D(1,0,nX, 0,1,nY),
1501 Sequence<double>(4),
1502 rendering::CompositeOperation::OVER);
1503 rxCanvas->drawBitmap(xBitmap, rViewState, aRenderState);
1507 + (
maSize.Width+xBitmap->getSize().Width) / 2);
1509 + (
maSize.Height - nTextHeight - xBitmap->getSize().Height) / 2);
1510 const rendering::RenderState aRenderState(
1511 geometry::AffineMatrix2D(-1,0,nX, 0,1,nY),
1513 Sequence<double>(4),
1514 rendering::CompositeOperation::OVER);
1515 rxCanvas->drawBitmap(xBitmap, rViewState, aRenderState);
1533void SAL_CALL Button::disposing (
const css::lang::EventObject& rEvent)
1536 Element::disposing(rEvent);
1545Label::Label (const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1546 : Element(rpToolBar)
1550awt::Size Label::CreateBoundingSize (
1551 const Reference<rendering::XCanvas>& rxCanvas)
1554 return awt::Size(0,0);
1556 geometry::RealRectangle2D aTextBBox (
mpMode->maText.GetBoundingBox(rxCanvas));
1558 sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.X2 - aTextBBox.X1),
1559 sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.Y2 - aTextBBox.Y1));
1562void Label::SetText (
const OUString& rsText)
1568 const bool bRequestLayout (
mpMode->maText.GetText().getLength() != rsText.getLength());
1570 mpMode->maText.SetText(rsText);
1581 const Reference<rendering::XCanvas>& rxCanvas,
1582 const rendering::ViewState& rViewState)
1584 OSL_ASSERT(rxCanvas.is());
1588 mpMode->maText.Paint(rxCanvas, rViewState, GetBoundingBox());
1591bool Label::SetState (
const bool,
const bool)
1594 return Element::SetState(
false,
false);
1615void Text::SetText (
const OUString& rsText)
1620const OUString& Text::GetText()
const
1631 const Reference<rendering::XCanvas>& rxCanvas,
1632 const rendering::ViewState& rViewState,
1633 const awt::Rectangle& rBoundingBox)
1635 OSL_ASSERT(rxCanvas.is());
1642 if ( !
mpFont->mxFont.is())
1643 mpFont->PrepareFont(rxCanvas);
1644 if ( !
mpFont->mxFont.is())
1647 rendering::StringContext aContext (
msText, 0,
msText.getLength());
1649 Reference<rendering::XTextLayout> xLayout (
1650 mpFont->mxFont->createTextLayout(
1652 rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
1654 geometry::RealRectangle2D aBox (xLayout->queryTextBounds());
1655 const double nTextWidth = aBox.X2 - aBox.X1;
1656 const double nY = rBoundingBox.Y + rBoundingBox.Height - aBox.Y2;
1657 const double nX = rBoundingBox.X + (rBoundingBox.Width - nTextWidth)/2;
1659 rendering::RenderState aRenderState(
1660 geometry::AffineMatrix2D(1,0,nX, 0,1,nY),
1662 Sequence<double>(4),
1663 rendering::CompositeOperation::SOURCE);
1665 rxCanvas->drawTextLayout(
1671geometry::RealRectangle2D Text::GetBoundingBox (
const Reference<rendering::XCanvas>& rxCanvas)
1675 if ( !
mpFont->mxFont.is())
1676 mpFont->PrepareFont(rxCanvas);
1679 rendering::StringContext aContext (
msText, 0,
msText.getLength());
1680 Reference<rendering::XTextLayout> xLayout (
1681 mpFont->mxFont->createTextLayout(
1683 rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
1685 return xLayout->queryTextBounds();
1688 return geometry::RealRectangle2D(0,0,0,0);
1693OUString TimeFormatter::FormatTime (
const oslDateTime& rTime)
1695 OUStringBuffer sText;
1697 const sal_Int32 nHours (sal::static_int_cast<sal_Int32>(rTime.Hours));
1698 const sal_Int32 nMinutes (sal::static_int_cast<sal_Int32>(rTime.Minutes));
1699 const sal_Int32 nSeconds(sal::static_int_cast<sal_Int32>(rTime.Seconds));
1701 sText.append(OUString::number(nHours) +
":");
1704 const OUString sMinutes (OUString::number(nMinutes));
1705 if (sMinutes.getLength() == 1)
1707 sText.append(sMinutes);
1711 const OUString sSeconds (OUString::number(nSeconds));
1712 if (sSeconds.getLength() == 1)
1714 sText.append(sSeconds);
1715 return sText.makeStringAndClear();
1720TimeLabel::TimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1725void SAL_CALL TimeLabel::disposing()
1731void TimeLabel::ConnectToTimer()
1733 mpListener = std::make_shared<Listener>(
this);
1740 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1743 pElement->ConnectToTimer();
1747CurrentTimeLabel::~CurrentTimeLabel()
1751CurrentTimeLabel::CurrentTimeLabel (
1752 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1753 : TimeLabel(rpToolBar)
1757void CurrentTimeLabel::TimeHasChanged (
const oslDateTime& rCurrentTime)
1759 SetText(TimeFormatter::FormatTime(rCurrentTime));
1763void CurrentTimeLabel::SetModes (
1764 const SharedElementMode& rpNormalMode,
1765 const SharedElementMode& rpMouseOverMode,
1766 const SharedElementMode& rpSelectedMode,
1767 const SharedElementMode& rpDisabledMode,
1768 const SharedElementMode& rpMouseOverSelectedMode)
1770 TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode);
1777 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1780 pElement->ConnectToTimer();
1784PresentationTimeLabel::~PresentationTimeLabel()
1786 mpToolBar->GetPresenterController()->SetPresentationTime(
nullptr);
1789PresentationTimeLabel::PresentationTimeLabel (
1790 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1791 : TimeLabel(rpToolBar),
1795 setPauseStatus(
false);
1796 TimeValue pauseTime(0,0);
1797 setPauseTimeValue(pauseTime);
1798 mpToolBar->GetPresenterController()->SetPresentationTime(
this);
1801void PresentationTimeLabel::restart()
1803 TimeValue pauseTime(0, 0);
1804 setPauseTimeValue(pauseTime);
1809bool PresentationTimeLabel::isPaused()
1814void PresentationTimeLabel::setPauseStatus(
const bool pauseStatus)
1819const TimeValue& PresentationTimeLabel::getPauseTimeValue()
const
1824void PresentationTimeLabel::setPauseTimeValue(
const TimeValue pauseTime)
1830void PresentationTimeLabel::TimeHasChanged (
const oslDateTime& rCurrentTime)
1832 TimeValue aCurrentTimeValue;
1833 if (!osl_getTimeValueFromDateTime(&rCurrentTime, &aCurrentTimeValue))
1852 TimeValue pauseTime = getPauseTimeValue();
1853 if(pauseTime.Seconds != 0 || pauseTime.Nanosec != 0)
1855 TimeValue incrementValue(0, 0);
1856 incrementValue.Seconds = aCurrentTimeValue.Seconds - pauseTime.Seconds;
1857 if(pauseTime.Nanosec > aCurrentTimeValue.Nanosec)
1859 incrementValue.Nanosec = 1000000000 + aCurrentTimeValue.Nanosec - pauseTime.Nanosec;
1863 incrementValue.Nanosec = aCurrentTimeValue.Nanosec - pauseTime.Nanosec;
1874 TimeValue pauseTime_(0, 0);
1875 setPauseTimeValue(pauseTime_);
1880 TimeValue pauseTime = getPauseTimeValue();
1881 if(pauseTime.Seconds == 0 && pauseTime.Nanosec == 0)
1883 setPauseTimeValue(aCurrentTimeValue);
1887 TimeValue aElapsedTimeValue;
1888 aElapsedTimeValue.Seconds = aCurrentTimeValue.Seconds -
maStartTimeValue.Seconds;
1889 aElapsedTimeValue.Nanosec = aCurrentTimeValue.Nanosec -
maStartTimeValue.Nanosec;
1891 oslDateTime aElapsedDateTime;
1892 if (osl_getDateTimeFromTimeValue(&aElapsedTimeValue, &aElapsedDateTime) && !isPaused())
1894 SetText(TimeFormatter::FormatTime(aElapsedDateTime));
1899void PresentationTimeLabel::SetModes (
1900 const SharedElementMode& rpNormalMode,
1901 const SharedElementMode& rpMouseOverMode,
1902 const SharedElementMode& rpSelectedMode,
1903 const SharedElementMode& rpDisabledMode,
1904 const SharedElementMode& rpMouseOverSelectedMode)
1906 TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode);
1908 oslDateTime aStartDateTime;
1911 SetText(TimeFormatter::FormatTime(aStartDateTime));
1917VerticalSeparator::VerticalSeparator (
1918 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1919 : Element(rpToolBar)
1923void VerticalSeparator::Paint (
1924 const Reference<rendering::XCanvas>& rxCanvas,
1925 const rendering::ViewState& rViewState)
1927 OSL_ASSERT(rxCanvas.is());
1929 awt::Rectangle aBBox (GetBoundingBox());
1931 rendering::RenderState aRenderState(
1932 geometry::AffineMatrix2D(1,0,aBBox.X, 0,1,aBBox.Y),
1934 Sequence<double>(4),
1935 rendering::CompositeOperation::OVER);
1943 Reference<rendering::XBitmap> xBitmap(
mpToolBar->GetPresenterController()->GetPresenterHelper()->loadBitmap(
"bitmaps/Separator.png", rxCanvas));
1947 rxCanvas->drawBitmap(
1953awt::Size VerticalSeparator::CreateBoundingSize (
1954 const Reference<rendering::XCanvas>&)
1956 return awt::Size(1,20);
1959bool VerticalSeparator::IsFilling()
const
1966HorizontalSeparator::HorizontalSeparator (
1967 const ::rtl::Reference<PresenterToolBar>& rpToolBar)
1968 : Element(rpToolBar)
1972void HorizontalSeparator::Paint (
1973 const Reference<rendering::XCanvas>& rxCanvas,
1974 const rendering::ViewState& rViewState)
1976 OSL_ASSERT(rxCanvas.is());
1978 awt::Rectangle aBBox (GetBoundingBox());
1980 rendering::RenderState aRenderState(
1981 geometry::AffineMatrix2D(1,0,0, 0,1,0),
1983 Sequence<double>(4),
1984 rendering::CompositeOperation::OVER);
1992 rxCanvas->fillPolyPolygon(
1998awt::Size HorizontalSeparator::CreateBoundingSize (
1999 const Reference<rendering::XCanvas>&)
2001 return awt::Size(20,1);
2004bool HorizontalSeparator::IsFilling()
const
rtl::Reference< PresenterController > mpPresenterController
css::uno::Reference< css::uno::XComponentContext > mxComponentContext
Reference< rendering::XCanvas > mxCanvas
static bool GetLayoutRTL()
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)
static void SetDeviceColor(css::rendering::RenderState &rRenderState, const css::util::Color aColor)
static oslDateTime GetCurrentTime()
static ::rtl::Reference< PresenterClockTimer > Instance(const css::uno::Reference< css::uno::XComponentContext > &rxContext)
This class gives access to the configuration.
css::uno::Any GetConfigurationNode(const OUString &rsPathToNode)
Return a configuration node below the root of the called object.
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)
static css::uno::Reference< css::rendering::XPolyPolygon2D > CreatePolygon(const css::awt::Rectangle &rBox, const css::uno::Reference< css::rendering::XGraphicDevice > &rxDevice)
std::shared_ptr< FontDescriptor > SharedFontDescriptor
static SharedFontDescriptor ReadFont(const css::uno::Reference< css::container::XHierarchicalNameAccess > &rxNode, const SharedFontDescriptor &rDefaultFount)
Context & operator=(const Context &)=delete
Context(const Context &)=delete
Reference< drawing::XPresenterHelper > mxPresenterHelper
css::uno::Reference< css::rendering::XCanvas > mxCanvas
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect)
Reference< XDispatch > xDispatch
virtual void SetText(const OUString &rStr) override
const sal_Int32 gnGapSize(20)
cppu::WeakComponentImplHelper< css::awt::XPaintListener, css::drawing::framework::XView, css::drawing::XDrawView > PresenterToolBarViewInterfaceBase
cppu::WeakComponentImplHelper< css::awt::XWindowListener, css::awt::XPaintListener, css::awt::XMouseListener, css::awt::XMouseMotionListener, css::drawing::XDrawView > PresenterToolBarInterfaceBase
std::shared_ptr< PresenterBitmapContainer::BitmapDescriptor > SharedBitmapDescriptor
vcl::Font GetFont(vcl::Font const &rFont, DrawModeFlags nDrawMode, StyleSettings const &rStyleSettings)