LibreOffice Module sdext (master)  1
PresenterNotesView.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <vcl/settings.hxx>
21 #include "PresenterNotesView.hxx"
22 #include "PresenterButton.hxx"
26 #include "PresenterScrollBar.hxx"
27 #include "PresenterTextView.hxx"
28 #include <com/sun/star/accessibility/AccessibleTextType.hpp>
29 #include <com/sun/star/awt/Key.hpp>
30 #include <com/sun/star/awt/KeyModifier.hpp>
31 #include <com/sun/star/awt/PosSize.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/lang/XServiceName.hpp>
36 #include <com/sun/star/presentation/XPresentationPage.hpp>
37 #include <com/sun/star/rendering/CompositeOperation.hpp>
38 #include <com/sun/star/rendering/XSpriteCanvas.hpp>
39 #include <com/sun/star/text/XTextRange.hpp>
40 
41 using namespace ::com::sun::star;
42 using namespace ::com::sun::star::uno;
43 using namespace ::com::sun::star::drawing::framework;
44 
45 const sal_Int32 gnSpaceBelowSeparator (10);
46 const sal_Int32 gnSpaceAboveSeparator (10);
47 const double gnLineScrollFactor (1.2);
48 
49 namespace sdext::presenter {
50 
51 //===== PresenterNotesView ====================================================
52 
54  const Reference<XComponentContext>& rxComponentContext,
55  const Reference<XResourceId>& rxViewId,
56  const Reference<frame::XController>& rxController,
57  const ::rtl::Reference<PresenterController>& rpPresenterController)
59  mxViewId(rxViewId),
60  mpPresenterController(rpPresenterController),
61  maSeparatorColor(0xffffff),
62  mnSeparatorYLocation(0),
63  mnTop(0)
64 {
65  try
66  {
67  Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
68  Reference<XConfigurationController> xCC (xCM->getConfigurationController(), UNO_SET_THROW);
69  Reference<XPane> xPane (xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW);
70 
71  mxParentWindow = xPane->getWindow();
72  mxCanvas = xPane->getCanvas();
73  mpTextView = std::make_shared<PresenterTextView>(
74  rxComponentContext,
75  mxCanvas,
76  mpPresenterController->GetPaintManager()->GetInvalidator(mxParentWindow));
77 
78  const OUString sResourceURL (mxViewId->getResourceURL());
79  mpFont = std::make_shared<PresenterTheme::FontDescriptor>(
80  rpPresenterController->GetViewFont(sResourceURL));
81  maSeparatorColor = mpFont->mnColor;
82  mpTextView->SetFont(mpFont);
83 
84  CreateToolBar(rxComponentContext, rpPresenterController);
85 
87  rxComponentContext,
89  mpPresenterController->GetTheme(),
91  mxCanvas,
92  "NotesViewCloser");
93 
94  if (mxParentWindow.is())
95  {
96  mxParentWindow->addWindowListener(this);
97  mxParentWindow->addPaintListener(this);
98  mxParentWindow->addKeyListener(this);
99  mxParentWindow->setVisible(true);
100  }
101 
103  rxComponentContext,
105  mpPresenterController->GetPaintManager(),
106  [this](double f) { return this->SetTop(f); });
107  mpScrollBar->SetBackground(
108  mpPresenterController->GetViewBackground(mxViewId->getResourceURL()));
109 
110  mpScrollBar->SetCanvas(mxCanvas);
111 
112  Layout();
113  }
114  catch (RuntimeException&)
115  {
117  throw;
118  }
119 }
120 
122 {
123 }
124 
126 {
127  if (mxParentWindow.is())
128  {
129  mxParentWindow->removeWindowListener(this);
130  mxParentWindow->removePaintListener(this);
131  mxParentWindow->removeKeyListener(this);
132  mxParentWindow = nullptr;
133  }
134 
135  // Dispose tool bar.
136  {
137  Reference<XComponent> xComponent = mpToolBar;
138  mpToolBar = nullptr;
139  if (xComponent.is())
140  xComponent->dispose();
141  }
142  {
143  Reference<XComponent> xComponent (mxToolBarCanvas, UNO_QUERY);
144  mxToolBarCanvas = nullptr;
145  if (xComponent.is())
146  xComponent->dispose();
147  }
148  {
149  Reference<XComponent> xComponent = mxToolBarWindow;
150  mxToolBarWindow = nullptr;
151  if (xComponent.is())
152  xComponent->dispose();
153  }
154 
155  // Dispose close button
156  {
157  Reference<XComponent> xComponent = mpCloseButton;
158  mpCloseButton = nullptr;
159  if (xComponent.is())
160  xComponent->dispose();
161  }
162 
163  // Create the tool bar.
164 
165  mpScrollBar = nullptr;
166 
167  mxViewId = nullptr;
168 }
169 
171  const css::uno::Reference<css::uno::XComponentContext>& rxContext,
172  const ::rtl::Reference<PresenterController>& rpPresenterController)
173 {
174  if (!rpPresenterController)
175  return;
176 
177  Reference<drawing::XPresenterHelper> xPresenterHelper (
178  rpPresenterController->GetPresenterHelper());
179  if ( ! xPresenterHelper.is())
180  return;
181 
182  // Create a new window as container of the tool bar.
183  mxToolBarWindow = xPresenterHelper->createWindow(
185  false,
186  true,
187  false,
188  false);
189  mxToolBarCanvas = xPresenterHelper->createSharedCanvas (
190  Reference<rendering::XSpriteCanvas>(mxCanvas, UNO_QUERY),
192  mxCanvas,
195 
196  // Create the tool bar.
198  rxContext,
201  rpPresenterController,
203  mpToolBar->Initialize(
204  "PresenterScreenSettings/ToolBars/NotesToolBar");
205 }
206 
208 {
209  static constexpr OUStringLiteral sNotesShapeName (
210  u"com.sun.star.presentation.NotesShape");
211  static constexpr OUStringLiteral sTextShapeName (
212  u"com.sun.star.drawing.TextShape");
213 
214  if (!rxNotesPage.is())
215  return;
216 
217  // Iterate over all shapes and find the one that holds the text.
218  sal_Int32 nCount (rxNotesPage->getCount());
219  for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
220  {
221 
222  Reference<lang::XServiceName> xServiceName (
223  rxNotesPage->getByIndex(nIndex), UNO_QUERY);
224  if (xServiceName.is()
225  && xServiceName->getServiceName() == sNotesShapeName)
226  {
227  }
228  else
229  {
230  Reference<drawing::XShapeDescriptor> xShapeDescriptor (
231  rxNotesPage->getByIndex(nIndex), UNO_QUERY);
232  if (xShapeDescriptor.is())
233  {
234  OUString sType (xShapeDescriptor->getShapeType());
235  if (sType == sNotesShapeName || sType == sTextShapeName)
236  {
237  Reference<text::XTextRange> xText (
238  rxNotesPage->getByIndex(nIndex), UNO_QUERY);
239  if (xText.is())
240  {
241  mpTextView->SetText(Reference<text::XText>(xText, UNO_QUERY));
242  }
243  }
244  }
245  }
246  }
247 
248  Layout();
249 
250  if (mpScrollBar)
251  {
252  mpScrollBar->SetThumbPosition(0, false);
253  UpdateScrollBar();
254  }
255 
256  Invalidate();
257 }
258 
259 //----- lang::XEventListener -------------------------------------------------
260 
261 void SAL_CALL PresenterNotesView::disposing (const lang::EventObject& rEventObject)
262 {
263  if (rEventObject.Source == mxParentWindow)
264  mxParentWindow = nullptr;
265 }
266 
267 //----- XWindowListener -------------------------------------------------------
268 
269 void SAL_CALL PresenterNotesView::windowResized (const awt::WindowEvent&)
270 {
271  Layout();
272 }
273 
274 void SAL_CALL PresenterNotesView::windowMoved (const awt::WindowEvent&) {}
275 
276 void SAL_CALL PresenterNotesView::windowShown (const lang::EventObject&) {}
277 
278 void SAL_CALL PresenterNotesView::windowHidden (const lang::EventObject&) {}
279 
280 //----- XPaintListener --------------------------------------------------------
281 
282 void SAL_CALL PresenterNotesView::windowPaint (const awt::PaintEvent& rEvent)
283 {
284  if (rBHelper.bDisposed || rBHelper.bInDispose)
285  {
286  throw lang::DisposedException (
287  "PresenterNotesView object has already been disposed",
288  static_cast<uno::XWeak*>(this));
289  }
290 
292  return;
293 
294  ::osl::MutexGuard aSolarGuard (::osl::Mutex::getGlobalMutex());
295  Paint(rEvent.UpdateRect);
296 }
297 
298 //----- XResourceId -----------------------------------------------------------
299 
300 Reference<XResourceId> SAL_CALL PresenterNotesView::getResourceId()
301 {
302  return mxViewId;
303 }
304 
306 {
307  return false;
308 }
309 
310 //----- XDrawView -------------------------------------------------------------
311 
313 {
314  // Get the associated notes page.
315  mxCurrentNotesPage = nullptr;
316  try
317  {
318  Reference<presentation::XPresentationPage> xPresentationPage(rxSlide, UNO_QUERY);
319  if (xPresentationPage.is())
320  mxCurrentNotesPage = xPresentationPage->getNotesPage();
321  }
322  catch (RuntimeException&)
323  {
324  }
325 
327 }
328 
330 {
331  return nullptr;
332 }
333 
334 //----- XKeyListener ----------------------------------------------------------
335 
336 void SAL_CALL PresenterNotesView::keyPressed (const awt::KeyEvent& rEvent)
337 {
338  switch (rEvent.KeyCode)
339  {
340  case awt::Key::A:
341  Scroll(-gnLineScrollFactor * mpFont->mnSize);
342  break;
343 
344  case awt::Key::Y:
345  case awt::Key::Z:
346  Scroll(+gnLineScrollFactor * mpFont->mnSize);
347  break;
348 
349  case awt::Key::S:
350  ChangeFontSize(-1);
351  break;
352 
353  case awt::Key::G:
354  ChangeFontSize(+1);
355  break;
356 
357  case awt::Key::H:
358  if (mpTextView)
359  mpTextView->MoveCaret(
360  -1,
361  (rEvent.Modifiers == awt::KeyModifier::SHIFT)
362  ? css::accessibility::AccessibleTextType::CHARACTER
363  : css::accessibility::AccessibleTextType::WORD);
364  break;
365 
366  case awt::Key::L:
367  if (mpTextView)
368  mpTextView->MoveCaret(
369  +1,
370  (rEvent.Modifiers == awt::KeyModifier::SHIFT)
371  ? css::accessibility::AccessibleTextType::CHARACTER
372  : css::accessibility::AccessibleTextType::WORD);
373  break;
374  }
375 }
376 
377 void SAL_CALL PresenterNotesView::keyReleased (const awt::KeyEvent&) {}
378 
379 
381 {
382  if ( ! mxParentWindow.is())
383  return;
384  awt::Rectangle aWindowBox (mxParentWindow->getPosSize());
385  geometry::RealRectangle2D aNewTextBoundingBox (0,0,aWindowBox.Width, aWindowBox.Height);
386  // Size the tool bar and the horizontal separator above it.
387  if (mxToolBarWindow.is())
388  {
389  const geometry::RealSize2D aToolBarSize (mpToolBar->GetMinimalSize());
390  const sal_Int32 nToolBarHeight = sal_Int32(aToolBarSize.Height + 0.5);
391  mxToolBarWindow->setPosSize(0, aWindowBox.Height - nToolBarHeight,
392  sal_Int32(aToolBarSize.Width + 0.5), nToolBarHeight,
393  awt::PosSize::POSSIZE);
394  mnSeparatorYLocation = aWindowBox.Height - nToolBarHeight - gnSpaceBelowSeparator;
395  aNewTextBoundingBox.Y2 = mnSeparatorYLocation - gnSpaceAboveSeparator;
396  // Place the close button.
397  if (mpCloseButton)
398  mpCloseButton->SetCenter(geometry::RealPoint2D(
399  (aWindowBox.Width + aToolBarSize.Width) / 2,
400  aWindowBox.Height - aToolBarSize.Height/2));
401  }
402  // Check whether the vertical scroll bar is necessary.
403  if (mpScrollBar)
404  {
405  bool bShowVerticalScrollbar (false);
406  try
407  {
408  const double nTextBoxHeight (aNewTextBoundingBox.Y2 - aNewTextBoundingBox.Y1);
409  const double nHeight (mpTextView->GetTotalTextHeight());
410  if (nHeight > nTextBoxHeight)
411  {
412  bShowVerticalScrollbar = true;
414  aNewTextBoundingBox.X2 -= mpScrollBar->GetSize();
415  else
416  aNewTextBoundingBox.X1 += mpScrollBar->GetSize();
417  }
418  mpScrollBar->SetTotalSize(nHeight);
419  }
420  catch(beans::UnknownPropertyException&)
421  {
422  OSL_ASSERT(false);
423  }
425  {
426  mpScrollBar->SetVisible(bShowVerticalScrollbar);
427  mpScrollBar->SetPosSize(
428  geometry::RealRectangle2D(
429  aNewTextBoundingBox.X1 - mpScrollBar->GetSize(),
430  aNewTextBoundingBox.Y1,
431  aNewTextBoundingBox.X1,
432  aNewTextBoundingBox.Y2));
433  if( ! bShowVerticalScrollbar)
434  mpScrollBar->SetThumbPosition(0, false);
435  UpdateScrollBar();
436  }
437  else
438  {
439  mpScrollBar->SetVisible(bShowVerticalScrollbar);
440  mpScrollBar->SetPosSize(
441  geometry::RealRectangle2D(
442  aWindowBox.Width - mpScrollBar->GetSize(),
443  aNewTextBoundingBox.Y1,
444  aNewTextBoundingBox.X2 + mpScrollBar->GetSize(),
445  aNewTextBoundingBox.Y2));
446  if( ! bShowVerticalScrollbar)
447  mpScrollBar->SetThumbPosition(0, false);
448  UpdateScrollBar();
449  }
450  }
451  // Has the text area has changed it position or size?
452  if (aNewTextBoundingBox.X1 != maTextBoundingBox.X1
453  || aNewTextBoundingBox.Y1 != maTextBoundingBox.Y1
454  || aNewTextBoundingBox.X2 != maTextBoundingBox.X2
455  || aNewTextBoundingBox.Y2 != maTextBoundingBox.Y2)
456  {
457  maTextBoundingBox = aNewTextBoundingBox;
458  mpTextView->SetLocation(
459  geometry::RealPoint2D(
460  aNewTextBoundingBox.X1,
461  aNewTextBoundingBox.Y1));
462  mpTextView->SetSize(
463  geometry::RealSize2D(
464  aNewTextBoundingBox.X2 - aNewTextBoundingBox.X1,
465  aNewTextBoundingBox.Y2 - aNewTextBoundingBox.Y1));
466  }
467 }
468 
469 void PresenterNotesView::Paint (const awt::Rectangle& rUpdateBox)
470 {
471  if ( ! mxParentWindow.is())
472  return;
473  if ( ! mxCanvas.is())
474  return;
475 
476  if (!mpBackground)
477  mpBackground = mpPresenterController->GetViewBackground(mxViewId->getResourceURL());
478 
479  if (rUpdateBox.Y < maTextBoundingBox.Y2
480  && rUpdateBox.X < maTextBoundingBox.X2)
481  {
482  PaintText(rUpdateBox);
483  }
484 
485  mpTextView->Paint(rUpdateBox);
486 
487  if (rUpdateBox.Y + rUpdateBox.Height > maTextBoundingBox.Y2)
488  {
489  PaintToolBar(rUpdateBox);
490  }
491 }
492 
493 void PresenterNotesView::PaintToolBar (const awt::Rectangle& rUpdateBox)
494 {
495  awt::Rectangle aWindowBox (mxParentWindow->getPosSize());
496 
497  rendering::ViewState aViewState (
498  geometry::AffineMatrix2D(1,0,0, 0,1,0),
499  nullptr);
500  rendering::RenderState aRenderState(
501  geometry::AffineMatrix2D(1,0,0, 0,1,0),
502  nullptr,
503  Sequence<double>(4),
504  rendering::CompositeOperation::SOURCE);
505 
506  if (mpBackground)
507  {
508  // Paint the background.
509  mpPresenterController->GetCanvasHelper()->Paint(
510  mpBackground,
511  mxCanvas,
512  rUpdateBox,
513  awt::Rectangle(0,sal_Int32(maTextBoundingBox.Y2),aWindowBox.Width,aWindowBox.Height),
514  awt::Rectangle());
515  }
516 
517  // Paint the horizontal separator.
518  OSL_ASSERT(mxViewId.is());
520 
521  mxCanvas->drawLine(
522  geometry::RealPoint2D(0,mnSeparatorYLocation),
523  geometry::RealPoint2D(aWindowBox.Width,mnSeparatorYLocation),
524  aViewState,
525  aRenderState);
526 }
527 
528 void PresenterNotesView::PaintText (const awt::Rectangle& rUpdateBox)
529 {
530  const awt::Rectangle aBox (PresenterGeometryHelper::Intersection(rUpdateBox,
532 
533  if (aBox.Width <= 0 || aBox.Height <= 0)
534  return;
535 
536  if (mpBackground)
537  {
538  // Paint the background.
539  mpPresenterController->GetCanvasHelper()->Paint(
540  mpBackground,
541  mxCanvas,
542  rUpdateBox,
543  aBox,
544  awt::Rectangle());
545  }
546 
547  Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
548  if (xSpriteCanvas.is())
549  xSpriteCanvas->updateScreen(false);
550 }
551 
553 {
554  mpPresenterController->GetPaintManager()->Invalidate(
557 }
558 
559 void PresenterNotesView::Scroll (const double rnDistance)
560 {
561  try
562  {
563  mnTop += rnDistance;
564  mpTextView->SetOffset(0, mnTop);
565 
566  UpdateScrollBar();
567  Invalidate();
568  }
569  catch (beans::UnknownPropertyException&)
570  {}
571 }
572 
573 void PresenterNotesView::SetTop (const double nTop)
574 {
575  try
576  {
577  mnTop = nTop;
578  mpTextView->SetOffset(0, mnTop);
579 
580  UpdateScrollBar();
581  Invalidate();
582  }
583  catch (beans::UnknownPropertyException&)
584  {}
585 }
586 
587 void PresenterNotesView::ChangeFontSize (const sal_Int32 nSizeChange)
588 {
589  const sal_Int32 nNewSize (mpFont->mnSize + nSizeChange);
590  if (nNewSize <= 5)
591  return;
592 
593  mpFont->mnSize = nNewSize;
594  mpFont->mxFont = nullptr;
595  mpTextView->SetFont(mpFont);
596 
597  Layout();
598  UpdateScrollBar();
599  Invalidate();
600 
601  // Write the new font size to the configuration to make it persistent.
602  try
603  {
604  const OUString sStyleName (mpPresenterController->GetTheme()->GetStyleName(
605  mxViewId->getResourceURL()));
606  std::shared_ptr<PresenterConfigurationAccess> pConfiguration (
607  mpPresenterController->GetTheme()->GetNodeForViewStyle(
608  sStyleName));
609  if (pConfiguration == nullptr || !pConfiguration->IsValid())
610  return;
611 
612  pConfiguration->GoToChild("Font");
613  pConfiguration->SetProperty("Size", Any(static_cast<sal_Int32>(nNewSize+0.5)));
614  pConfiguration->CommitChanges();
615  }
616  catch (Exception&)
617  {
618  OSL_ASSERT(false);
619  }
620 }
621 
622 const std::shared_ptr<PresenterTextView>& PresenterNotesView::GetTextView() const
623 {
624  return mpTextView;
625 }
626 
628 {
629  if (!mpScrollBar)
630  return;
631 
632  try
633  {
634  mpScrollBar->SetTotalSize(mpTextView->GetTotalTextHeight());
635  }
636  catch(beans::UnknownPropertyException&)
637  {
638  OSL_ASSERT(false);
639  }
640 
641  mpScrollBar->SetLineHeight(mpFont->mnSize*1.2);
642  mpScrollBar->SetThumbPosition(mnTop, false);
643 
644  mpScrollBar->SetThumbSize(maTextBoundingBox.Y2 - maTextBoundingBox.Y1);
645  mpScrollBar->CheckValues();
646 }
647 
648 } // end of namespace ::sdext::presenter
649 
650 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
::rtl::Reference< PresenterToolBar > mpToolBar
sal_Int32 nIndex
::rtl::Reference< PresenterController > mpPresenterController
const std::shared_ptr< PresenterTextView > & GetTextView() const
void ChangeFontSize(const sal_Int32 nSizeChange)
void SetSlide(const css::uno::Reference< css::drawing::XDrawPage > &rxNotesPage)
Typically called from setCurrentSlide() with the notes page that is associated with the slide given t...
const sal_Int32 gnSpaceAboveSeparator(10)
css::uno::Reference< css::awt::XWindow > mxParentWindow
virtual void SAL_CALL windowResized(const css::awt::WindowEvent &rEvent) override
const sal_Int32 gnSpaceBelowSeparator(10)
virtual void SAL_CALL windowShown(const css::lang::EventObject &rEvent) override
virtual void SAL_CALL keyPressed(const css::awt::KeyEvent &rEvent) override
void PaintText(const css::awt::Rectangle &rUpdateBox)
virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getCurrentPage() override
int nCount
cppu::WeakComponentImplHelper< css::awt::XWindowListener, css::awt::XPaintListener, css::drawing::framework::XView, css::drawing::XDrawView, css::awt::XKeyListener > PresenterNotesViewInterfaceBase
std::mutex m_aMutex
css::uno::Reference< css::awt::XWindow > mxToolBarWindow
const double gnLineScrollFactor(1.2)
::rtl::Reference< PresenterScrollBar > mpScrollBar
virtual void SAL_CALL windowMoved(const css::awt::WindowEvent &rEvent) override
PresenterTheme::SharedFontDescriptor mpFont
void Paint(const css::awt::Rectangle &rUpdateBox)
OptionalString sType
css::uno::Reference< css::rendering::XCanvas > mxToolBarCanvas
std::shared_ptr< PresenterTextView > mpTextView
float u
unsigned char sal_Bool
static bool GetLayoutRTL()
virtual sal_Bool SAL_CALL isAnchorOnly() override
virtual void SAL_CALL disposing() override
virtual void SAL_CALL windowPaint(const css::awt::PaintEvent &rEvent) override
css::geometry::RealRectangle2D maTextBoundingBox
static css::awt::Rectangle ConvertRectangle(const css::geometry::RealRectangle2D &rBox)
Return the bounding box with integer coordinates of the given rectangle.
sal_Int32 mnTop
A simple tool bar that can display bitmapped buttons and labels.
static css::awt::Rectangle Intersection(const css::awt::Rectangle &rBox1, const css::awt::Rectangle &rBox2)
virtual void SAL_CALL setCurrentPage(const css::uno::Reference< css::drawing::XDrawPage > &rxSlide) override
rtl::Reference< PresenterController > mpPresenterController
void PaintToolBar(const css::awt::Rectangle &rUpdateBox)
css::uno::Reference< css::drawing::XDrawPage > mxCurrentNotesPage
static void SetDeviceColor(css::rendering::RenderState &rRenderState, const css::util::Color aColor)
void CreateToolBar(const css::uno::Reference< css::uno::XComponentContext > &rxContext, const ::rtl::Reference< PresenterController > &rpPresenterController)
void Scroll(const double nDistance)
virtual css::uno::Reference< css::drawing::framework::XResourceId > SAL_CALL getResourceId() override
virtual void SAL_CALL windowHidden(const css::lang::EventObject &rEvent) override
void(* f)(TrueTypeTable *)
PresenterNotesView(const css::uno::Reference< css::uno::XComponentContext > &rxContext, const css::uno::Reference< css::drawing::framework::XResourceId > &rxViewId, const css::uno::Reference< css::frame::XController > &rxController, const ::rtl::Reference< PresenterController > &rpPresenterController)
::rtl::Reference< PresenterButton > mpCloseButton
static::rtl::Reference< PresenterButton > Create(const css::uno::Reference< css::uno::XComponentContext > &rxComponentContext, const ::rtl::Reference< PresenterController > &rpPresenterController, const std::shared_ptr< PresenterTheme > &rpTheme, const css::uno::Reference< css::awt::XWindow > &rxParentWindow, const css::uno::Reference< css::rendering::XCanvas > &rxParentCanvas, const OUString &rsConfigurationName)
virtual void SAL_CALL keyReleased(const css::awt::KeyEvent &rEvent) override
css::uno::Reference< css::rendering::XCanvas > mxCanvas
css::uno::Reference< css::drawing::framework::XResourceId > mxViewId