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