xref: /trunk/main/sdext/source/presenter/PresenterNotesView.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sdext.hxx"
26 
27 #include "PresenterNotesView.hxx"
28 #include "PresenterButton.hxx"
29 #include "PresenterCanvasHelper.hxx"
30 #include "PresenterGeometryHelper.hxx"
31 #include "PresenterPaintManager.hxx"
32 #include "PresenterScrollBar.hxx"
33 #include "PresenterTextView.hxx"
34 #include <com/sun/star/accessibility/AccessibleTextType.hpp>
35 #include <com/sun/star/awt/Key.hpp>
36 #include <com/sun/star/awt/KeyModifier.hpp>
37 #include <com/sun/star/awt/PosSize.hpp>
38 #include <com/sun/star/beans/XPropertySet.hpp>
39 #include <com/sun/star/drawing/framework/XControllerManager.hpp>
40 #include <com/sun/star/drawing/framework/XConfigurationController.hpp>
41 #include <com/sun/star/drawing/framework/XPane.hpp>
42 #include <com/sun/star/lang/XServiceName.hpp>
43 #include <com/sun/star/presentation/XPresentationPage.hpp>
44 #include <com/sun/star/rendering/CompositeOperation.hpp>
45 #include <com/sun/star/rendering/XSpriteCanvas.hpp>
46 #include <com/sun/star/text/XTextRange.hpp>
47 #include <com/sun/star/util/XChangesBatch.hpp>
48 #include <com/sun/star/container/XChild.hpp>
49 #include <boost/bind.hpp>
50 #include <set>
51 
52 using namespace ::com::sun::star;
53 using namespace ::com::sun::star::uno;
54 using namespace ::com::sun::star::drawing::framework;
55 using ::rtl::OUString;
56 
57 #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
58 
59 static const sal_Int32 gnSpaceBelowSeparator (10);
60 static const sal_Int32 gnSpaceAboveSeparator (10);
61 static const sal_Int32 gnPartHeight (128);
62 /** Maximal size of memory used for bitmaps which show the notes text.
63 */
64 static const sal_Int32 gnMaximalCacheSize (8*1024*1024);
65 static const double gnLineScrollFactor (1.2);
66 
67 namespace sdext { namespace presenter {
68 
69 //===== PresenterNotesView ====================================================
70 
PresenterNotesView(const Reference<XComponentContext> & rxComponentContext,const Reference<XResourceId> & rxViewId,const Reference<frame::XController> & rxController,const::rtl::Reference<PresenterController> & rpPresenterController)71 PresenterNotesView::PresenterNotesView (
72     const Reference<XComponentContext>& rxComponentContext,
73     const Reference<XResourceId>& rxViewId,
74     const Reference<frame::XController>& rxController,
75     const ::rtl::Reference<PresenterController>& rpPresenterController)
76     : PresenterNotesViewInterfaceBase(m_aMutex),
77       mxViewId(rxViewId),
78       mpPresenterController(rpPresenterController),
79       mxCanvas(),
80       mxCurrentNotesPage(),
81       mpScrollBar(),
82       mxToolBarWindow(),
83       mxToolBarCanvas(),
84       mpToolBar(),
85       mpCloseButton(),
86       maSeparatorColor(0xffffff),
87       mnSeparatorYLocation(0),
88       maTextBoundingBox(),
89       mpBackground(),
90       mnTop(0),
91       mpFont(),
92       mpTextView()
93 {
94     try
95     {
96         Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
97         Reference<XConfigurationController> xCC (xCM->getConfigurationController(), UNO_QUERY_THROW);
98         Reference<XPane> xPane (xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW);
99 
100         mxParentWindow = xPane->getWindow();
101         mxCanvas = xPane->getCanvas();
102         mpTextView.reset(new PresenterTextView(
103             rxComponentContext,
104             mxCanvas,
105             mpPresenterController->GetPaintManager()->GetInvalidator(mxParentWindow)));
106 
107         const OUString sResourceURL (mxViewId->getResourceURL());
108         mpFont.reset(new PresenterTheme::FontDescriptor(
109             rpPresenterController->GetViewFont(sResourceURL)));
110         maSeparatorColor = mpFont->mnColor;
111         mpTextView->SetFont(mpFont);
112 
113         CreateToolBar(rxComponentContext, rpPresenterController);
114 
115         mpCloseButton = PresenterButton::Create(
116             rxComponentContext,
117             mpPresenterController,
118             mpPresenterController->GetTheme(),
119             mxParentWindow,
120             mxCanvas,
121             A2S("NotesViewCloser"));
122 
123         if (mxParentWindow.is())
124         {
125             mxParentWindow->addWindowListener(this);
126             mxParentWindow->addPaintListener(this);
127             mxParentWindow->addKeyListener(this);
128             mxParentWindow->setVisible(sal_True);
129         }
130 
131         mpScrollBar = new PresenterVerticalScrollBar(
132             rxComponentContext,
133             mxParentWindow,
134             mpPresenterController->GetPaintManager(),
135             ::boost::bind(&PresenterNotesView::SetTop, this, _1));
136         mpScrollBar->SetBackground(
137             mpPresenterController->GetViewBackground(mxViewId->getResourceURL()));
138 
139         mpScrollBar->SetCanvas(mxCanvas);
140 
141         Layout();
142     }
143     catch (RuntimeException&)
144     {
145         PresenterNotesView::disposing();
146         throw;
147     }
148 }
149 
150 
151 
152 
~PresenterNotesView(void)153 PresenterNotesView::~PresenterNotesView (void)
154 {
155 }
156 
157 
158 
159 
disposing(void)160 void SAL_CALL PresenterNotesView::disposing (void)
161 {
162     if (mxParentWindow.is())
163     {
164         mxParentWindow->removeWindowListener(this);
165         mxParentWindow->removePaintListener(this);
166         mxParentWindow->removeKeyListener(this);
167         mxParentWindow = NULL;
168     }
169 
170     // Dispose tool bar.
171     {
172         Reference<XComponent> xComponent (static_cast<XWeak*>(mpToolBar.get()), UNO_QUERY);
173         mpToolBar = NULL;
174         if (xComponent.is())
175             xComponent->dispose();
176     }
177     {
178         Reference<XComponent> xComponent (mxToolBarCanvas, UNO_QUERY);
179         mxToolBarCanvas = NULL;
180         if (xComponent.is())
181             xComponent->dispose();
182     }
183     {
184         Reference<XComponent> xComponent (mxToolBarWindow, UNO_QUERY);
185         mxToolBarWindow = NULL;
186         if (xComponent.is())
187             xComponent->dispose();
188     }
189 
190     // Dispose close button
191     {
192         Reference<XComponent> xComponent (static_cast<XWeak*>(mpCloseButton.get()), UNO_QUERY);
193         mpCloseButton = NULL;
194         if (xComponent.is())
195             xComponent->dispose();
196     }
197 
198     // Create the tool bar.
199 
200     mpScrollBar = NULL;
201 
202     mxViewId = NULL;
203 }
204 
205 
206 
207 
CreateToolBar(const css::uno::Reference<css::uno::XComponentContext> & rxContext,const::rtl::Reference<PresenterController> & rpPresenterController)208 void PresenterNotesView::CreateToolBar (
209     const css::uno::Reference<css::uno::XComponentContext>& rxContext,
210     const ::rtl::Reference<PresenterController>& rpPresenterController)
211 {
212     if (rpPresenterController.get() == NULL)
213         return;
214 
215     Reference<drawing::XPresenterHelper> xPresenterHelper (
216         rpPresenterController->GetPresenterHelper());
217     if ( ! xPresenterHelper.is())
218         return;
219 
220     // Create a new window as container of the tool bar.
221     mxToolBarWindow = xPresenterHelper->createWindow(
222         mxParentWindow,
223         sal_False,
224         sal_True,
225         sal_False,
226         sal_False);
227     mxToolBarCanvas = xPresenterHelper->createSharedCanvas (
228         Reference<rendering::XSpriteCanvas>(mxCanvas, UNO_QUERY),
229         mxParentWindow,
230         mxCanvas,
231         mxParentWindow,
232         mxToolBarWindow);
233 
234     // Create the tool bar.
235     mpToolBar = new PresenterToolBar(
236         rxContext,
237         mxToolBarWindow,
238         mxToolBarCanvas,
239         rpPresenterController,
240         PresenterToolBar::Left);
241     mpToolBar->Initialize(
242         A2S("PresenterScreenSettings/ToolBars/NotesToolBar"));
243 }
244 
245 
246 
247 
SetSlide(const Reference<drawing::XDrawPage> & rxNotesPage)248 void PresenterNotesView::SetSlide (const Reference<drawing::XDrawPage>& rxNotesPage)
249 {
250     static const ::rtl::OUString sNotesShapeName (
251         A2S("com.sun.star.presentation.NotesShape"));
252     static const ::rtl::OUString sTextShapeName (
253         A2S("com.sun.star.drawing.TextShape"));
254 
255     Reference<container::XIndexAccess> xIndexAccess (rxNotesPage, UNO_QUERY);
256     if (xIndexAccess.is())
257     {
258         ::rtl::OUString sText;
259 
260         // Iterate over all shapes and find the one that holds the text.
261         sal_Int32 nCount (xIndexAccess->getCount());
262         for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
263         {
264 
265             Reference<lang::XServiceName> xServiceName (
266                 xIndexAccess->getByIndex(nIndex), UNO_QUERY);
267             if (xServiceName.is()
268                 && xServiceName->getServiceName().equals(sNotesShapeName))
269             {
270                 Reference<text::XTextRange> xText (xServiceName, UNO_QUERY);
271                 if (xText.is())
272                 {
273                     sText += xText->getString();
274                 }
275             }
276             else
277             {
278                 Reference<drawing::XShapeDescriptor> xShapeDescriptor (
279                     xIndexAccess->getByIndex(nIndex), UNO_QUERY);
280                 if (xShapeDescriptor.is())
281                 {
282                     ::rtl::OUString sType (xShapeDescriptor->getShapeType());
283                     if (sType.equals(sNotesShapeName) || sType.equals(sTextShapeName))
284                     {
285                         Reference<text::XTextRange> xText (
286                             xIndexAccess->getByIndex(nIndex), UNO_QUERY);
287                         if (xText.is())
288                         {
289                             sText += xText->getString();
290                             mpTextView->SetText(Reference<text::XText>(xText, UNO_QUERY));
291                         }
292                     }
293                 }
294             }
295         }
296 
297         Layout();
298 
299         if (mpScrollBar.get() != NULL)
300         {
301             mpScrollBar->SetThumbPosition(0, false);
302             UpdateScrollBar();
303         }
304 
305         Invalidate();
306     }
307 }
308 
309 
310 
311 
312 //-----  lang::XEventListener -------------------------------------------------
313 
disposing(const lang::EventObject & rEventObject)314 void SAL_CALL PresenterNotesView::disposing (const lang::EventObject& rEventObject)
315 {
316     if (rEventObject.Source == mxParentWindow)
317         mxParentWindow = NULL;
318 }
319 
320 
321 
322 
323 //----- XWindowListener -------------------------------------------------------
324 
windowResized(const awt::WindowEvent & rEvent)325 void SAL_CALL PresenterNotesView::windowResized (const awt::WindowEvent& rEvent)
326 {
327     (void)rEvent;
328     Layout();
329 }
330 
331 
332 
333 
windowMoved(const awt::WindowEvent & rEvent)334 void SAL_CALL PresenterNotesView::windowMoved (const awt::WindowEvent& rEvent)
335 {
336     (void)rEvent;
337 }
338 
339 
340 
341 
windowShown(const lang::EventObject & rEvent)342 void SAL_CALL PresenterNotesView::windowShown (const lang::EventObject& rEvent)
343 {
344     (void)rEvent;
345 }
346 
347 
348 
349 
windowHidden(const lang::EventObject & rEvent)350 void SAL_CALL PresenterNotesView::windowHidden (const lang::EventObject& rEvent)
351 {
352     (void)rEvent;
353 }
354 
355 
356 
357 
358 //----- XPaintListener --------------------------------------------------------
359 
windowPaint(const awt::PaintEvent & rEvent)360 void SAL_CALL PresenterNotesView::windowPaint (const awt::PaintEvent& rEvent)
361 {
362     ThrowIfDisposed();
363 
364     if ( ! mbIsPresenterViewActive)
365         return;
366 
367     ::osl::MutexGuard aSolarGuard (::osl::Mutex::getGlobalMutex());
368     Paint(rEvent.UpdateRect);
369 }
370 
371 
372 
373 
374 //----- XResourceId -----------------------------------------------------------
375 
getResourceId(void)376 Reference<XResourceId> SAL_CALL PresenterNotesView::getResourceId (void)
377 {
378     return mxViewId;
379 }
380 
381 
382 
383 
isAnchorOnly(void)384 sal_Bool SAL_CALL PresenterNotesView::isAnchorOnly (void)
385 {
386     return false;
387 }
388 
389 
390 
391 
392 //----- XDrawView -------------------------------------------------------------
393 
setCurrentPage(const Reference<drawing::XDrawPage> & rxSlide)394 void SAL_CALL PresenterNotesView::setCurrentPage (const Reference<drawing::XDrawPage>& rxSlide)
395 {
396     // Get the associated notes page.
397     mxCurrentNotesPage = NULL;
398     try
399     {
400         Reference<presentation::XPresentationPage> xPresentationPage(rxSlide, UNO_QUERY);
401         if (xPresentationPage.is())
402             mxCurrentNotesPage = xPresentationPage->getNotesPage();
403     }
404     catch (RuntimeException&)
405     {
406     }
407 
408     SetSlide(mxCurrentNotesPage);
409 }
410 
411 
412 
413 
getCurrentPage(void)414 Reference<drawing::XDrawPage> SAL_CALL PresenterNotesView::getCurrentPage (void)
415 {
416     return NULL;
417 }
418 
419 
420 
421 
422 //----- XKeyListener ----------------------------------------------------------
423 
keyPressed(const awt::KeyEvent & rEvent)424 void SAL_CALL PresenterNotesView::keyPressed (const awt::KeyEvent& rEvent)
425 {
426     switch (rEvent.KeyCode)
427     {
428         case awt::Key::A:
429             Scroll(-gnLineScrollFactor * mpFont->mnSize);
430             break;
431 
432         case awt::Key::Y:
433         case awt::Key::Z:
434             Scroll(+gnLineScrollFactor * mpFont->mnSize);
435             break;
436 
437         case awt::Key::S:
438             ChangeFontSize(-1);
439             break;
440 
441         case awt::Key::G:
442             ChangeFontSize(+1);
443             break;
444 
445         case awt::Key::H:
446             if (mpTextView)
447                 mpTextView->MoveCaret(
448                     -1,
449                     (rEvent.Modifiers == awt::KeyModifier::SHIFT)
450                         ? cssa::AccessibleTextType::CHARACTER
451                         : cssa::AccessibleTextType::WORD);
452             break;
453 
454         case awt::Key::L:
455             if (mpTextView)
456                 mpTextView->MoveCaret(
457                     +1,
458                     (rEvent.Modifiers == awt::KeyModifier::SHIFT)
459                         ? cssa::AccessibleTextType::CHARACTER
460                         : cssa::AccessibleTextType::WORD);
461             break;
462     }
463 }
464 
465 
466 
467 
keyReleased(const awt::KeyEvent & rEvent)468 void SAL_CALL PresenterNotesView::keyReleased (const awt::KeyEvent& rEvent)
469 {
470     (void)rEvent;
471 }
472 
473 
474 
475 
476 //-----------------------------------------------------------------------------
477 
Layout(void)478 void PresenterNotesView::Layout (void)
479 {
480     if ( ! mxParentWindow.is())
481         return;
482 
483     awt::Rectangle aWindowBox (mxParentWindow->getPosSize());
484     geometry::RealRectangle2D aNewTextBoundingBox (0,0,aWindowBox.Width, aWindowBox.Height);
485 
486     // Size the tool bar and the horizontal separator above it.
487     if (mxToolBarWindow.is())
488     {
489         const geometry::RealSize2D aToolBarSize (mpToolBar->GetMinimalSize());
490         const sal_Int32 nToolBarHeight = sal_Int32(aToolBarSize.Height + 0.5);
491         mxToolBarWindow->setPosSize(0, aWindowBox.Height - nToolBarHeight,
492             sal_Int32(aToolBarSize.Width + 0.5), nToolBarHeight,
493             awt::PosSize::POSSIZE);
494         aNewTextBoundingBox.Y2 -= nToolBarHeight;
495 
496         mnSeparatorYLocation = aWindowBox.Height - nToolBarHeight - gnSpaceBelowSeparator;
497         aNewTextBoundingBox.Y2 = mnSeparatorYLocation - gnSpaceAboveSeparator;
498 
499         // Place the close button.
500         if (mpCloseButton.get() != NULL)
501             mpCloseButton->SetCenter(geometry::RealPoint2D(
502                 (aWindowBox.Width +  aToolBarSize.Width) / 2,
503                 aWindowBox.Height - aToolBarSize.Height/2));
504     }
505 
506     // Check whether the vertical scroll bar is necessary.
507     if (mpScrollBar.get() != NULL)
508     {
509         bool bShowVerticalScrollbar (false);
510         try
511         {
512             const double nTextBoxHeight (aNewTextBoundingBox.Y2 - aNewTextBoundingBox.Y1);
513             const double nHeight (mpTextView->GetTotalTextHeight());
514             if (nHeight > nTextBoxHeight)
515             {
516                 bShowVerticalScrollbar = true;
517                 aNewTextBoundingBox.X2 -= mpScrollBar->GetSize();
518             }
519             mpScrollBar->SetTotalSize(nHeight);
520         }
521         catch(beans::UnknownPropertyException&)
522         {
523             OSL_ASSERT(false);
524         }
525 
526         mpScrollBar->SetVisible(bShowVerticalScrollbar);
527         mpScrollBar->SetPosSize(
528             geometry::RealRectangle2D(
529                 aNewTextBoundingBox.X2,
530                 aNewTextBoundingBox.X1,
531                 aNewTextBoundingBox.X2 + mpScrollBar->GetSize(),
532                 aNewTextBoundingBox.Y2));
533         if ( ! bShowVerticalScrollbar)
534             mpScrollBar->SetThumbPosition(0, false);
535 
536         UpdateScrollBar();
537     }
538 
539     // Has the text area has changed it position or size?
540     if (aNewTextBoundingBox.X1 != maTextBoundingBox.X1
541         || aNewTextBoundingBox.Y1 != maTextBoundingBox.Y1
542         || aNewTextBoundingBox.X2 != maTextBoundingBox.X2
543         || aNewTextBoundingBox.Y2 != maTextBoundingBox.Y2)
544     {
545         maTextBoundingBox = aNewTextBoundingBox;
546 
547         mpTextView->SetLocation(
548             geometry::RealPoint2D(
549                 aNewTextBoundingBox.X1,
550                 aNewTextBoundingBox.Y1));
551         mpTextView->SetSize(
552             geometry::RealSize2D(
553                 aNewTextBoundingBox.X2 - aNewTextBoundingBox.X1,
554                 aNewTextBoundingBox.Y2 - aNewTextBoundingBox.Y1));
555     }
556 }
557 
558 
559 
560 
Paint(const awt::Rectangle & rUpdateBox)561 void PresenterNotesView::Paint (const awt::Rectangle& rUpdateBox)
562 {
563     if ( ! mxParentWindow.is())
564         return;
565     if ( ! mxCanvas.is())
566         return;
567 
568     if (mpBackground.get() == NULL)
569         mpBackground = mpPresenterController->GetViewBackground(mxViewId->getResourceURL());
570 
571     if (rUpdateBox.Y < maTextBoundingBox.Y2
572         && rUpdateBox.X < maTextBoundingBox.X2)
573     {
574         PaintText(rUpdateBox);
575     }
576 
577     mpTextView->Paint(rUpdateBox);
578 
579     if (rUpdateBox.Y + rUpdateBox.Height > maTextBoundingBox.Y2)
580     {
581         PaintToolBar(rUpdateBox);
582     }
583 }
584 
585 
586 
587 
PaintToolBar(const awt::Rectangle & rUpdateBox)588 void PresenterNotesView::PaintToolBar (const awt::Rectangle& rUpdateBox)
589 {
590     awt::Rectangle aWindowBox (mxParentWindow->getPosSize());
591 
592     rendering::ViewState aViewState (
593         geometry::AffineMatrix2D(1,0,0, 0,1,0),
594         NULL);
595     rendering::RenderState aRenderState(
596         geometry::AffineMatrix2D(1,0,0, 0,1,0),
597         NULL,
598         Sequence<double>(4),
599         rendering::CompositeOperation::SOURCE);
600 
601     if (mpBackground.get() != NULL)
602     {
603         // Paint the background.
604         mpPresenterController->GetCanvasHelper()->Paint(
605             mpBackground,
606             mxCanvas,
607             rUpdateBox,
608             awt::Rectangle(0,sal_Int32(maTextBoundingBox.Y2),aWindowBox.Width,aWindowBox.Height),
609             awt::Rectangle());
610     }
611 
612     // Paint the horizontal separator.
613     OSL_ASSERT(mxViewId.is());
614     PresenterCanvasHelper::SetDeviceColor(aRenderState, maSeparatorColor);
615 
616     mxCanvas->drawLine(
617         geometry::RealPoint2D(0,mnSeparatorYLocation),
618         geometry::RealPoint2D(aWindowBox.Width,mnSeparatorYLocation),
619         aViewState,
620         aRenderState);
621 }
622 
623 
624 
625 
PaintText(const awt::Rectangle & rUpdateBox)626 void PresenterNotesView::PaintText (const awt::Rectangle& rUpdateBox)
627 {
628     const awt::Rectangle aBox (PresenterGeometryHelper::Intersection(rUpdateBox,
629             PresenterGeometryHelper::ConvertRectangle(maTextBoundingBox)));
630 
631     if (aBox.Width <= 0 || aBox.Height <= 0)
632         return;
633 
634     rendering::ViewState aViewState (
635         geometry::AffineMatrix2D(1,0,0, 0,1,0),
636         PresenterGeometryHelper::CreatePolygon(aBox, mxCanvas->getDevice()));
637     rendering::RenderState aRenderState(
638         geometry::AffineMatrix2D(1,0,0, 0,1,0),
639         NULL,
640         Sequence<double>(3),
641         rendering::CompositeOperation::SOURCE);
642 
643     if (mpBackground.get() != NULL)
644     {
645         // Paint the background.
646         mpPresenterController->GetCanvasHelper()->Paint(
647             mpBackground,
648             mxCanvas,
649             rUpdateBox,
650             aBox,
651             awt::Rectangle());
652     }
653 
654     Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
655     if (xSpriteCanvas.is())
656         xSpriteCanvas->updateScreen(sal_False);
657 }
658 
659 
660 
661 
Invalidate(void)662 void PresenterNotesView::Invalidate (void)
663 {
664     mpPresenterController->GetPaintManager()->Invalidate(
665         mxParentWindow,
666         PresenterGeometryHelper::ConvertRectangle(maTextBoundingBox));
667 }
668 
669 
670 
671 
Scroll(const double rnDistance)672 void PresenterNotesView::Scroll (const double rnDistance)
673 {
674     try
675     {
676         mnTop += rnDistance;
677         mpTextView->SetOffset(0, mnTop);
678 
679         UpdateScrollBar();
680         Invalidate();
681     }
682     catch (beans::UnknownPropertyException&)
683     {}
684 }
685 
686 
687 
688 
SetTop(const double nTop)689 void PresenterNotesView::SetTop (const double nTop)
690 {
691     try
692     {
693         mnTop = nTop;
694         mpTextView->SetOffset(0, mnTop);
695 
696         UpdateScrollBar();
697         Invalidate();
698     }
699     catch (beans::UnknownPropertyException&)
700     {}
701 }
702 
703 
704 
705 
ChangeFontSize(const sal_Int32 nSizeChange)706 void PresenterNotesView::ChangeFontSize (const sal_Int32 nSizeChange)
707 {
708     const sal_Int32 nNewSize (mpFont->mnSize + nSizeChange);
709     if (nNewSize > 5)
710     {
711         mpFont->mnSize = nNewSize;
712         mpFont->mxFont = NULL;
713         mpTextView->SetFont(mpFont);
714 
715         Layout();
716         UpdateScrollBar();
717         Invalidate();
718 
719         // Write the new font size to the configuration to make it persistent.
720         try
721         {
722             const OUString sStyleName (mpPresenterController->GetTheme()->GetStyleName(
723                 mxViewId->getResourceURL()));
724             ::boost::shared_ptr<PresenterConfigurationAccess> pConfiguration (
725                 mpPresenterController->GetTheme()->GetNodeForViewStyle(
726                     sStyleName,
727                     PresenterConfigurationAccess::READ_WRITE));
728             if (pConfiguration.get()==NULL || ! pConfiguration->IsValid())
729                 return;
730 
731             pConfiguration->GoToChild(A2S("Font"));
732             pConfiguration->SetProperty(A2S("Size"), Any((sal_Int32)(nNewSize+0.5)));
733             pConfiguration->CommitChanges();
734         }
735         catch (Exception&)
736         {
737             OSL_ASSERT(false);
738         }
739     }
740 }
741 
742 
743 
744 
GetTextView(void) const745 ::boost::shared_ptr<PresenterTextView> PresenterNotesView::GetTextView (void) const
746 {
747     return mpTextView;
748 }
749 
750 
751 
752 
UpdateScrollBar(void)753 void PresenterNotesView::UpdateScrollBar (void)
754 {
755     if (mpScrollBar.get() != NULL)
756     {
757         try
758         {
759             mpScrollBar->SetTotalSize(mpTextView->GetTotalTextHeight());
760         }
761         catch(beans::UnknownPropertyException&)
762         {
763             OSL_ASSERT(false);
764         }
765 
766         mpScrollBar->SetLineHeight(mpFont->mnSize*1.2);
767         mpScrollBar->SetThumbPosition(mnTop, false);
768 
769         mpScrollBar->SetThumbSize(maTextBoundingBox.Y2 - maTextBoundingBox.Y1);
770         mpScrollBar->CheckValues();
771     }
772 }
773 
774 
775 
776 
ThrowIfDisposed(void)777 void PresenterNotesView::ThrowIfDisposed (void)
778 {
779     if (rBHelper.bDisposed || rBHelper.bInDispose)
780     {
781         throw lang::DisposedException (
782             A2S("PresenterNotesView object has already been disposed"),
783             static_cast<uno::XWeak*>(this));
784     }
785 }
786 
787 
788 
789 
790 } } // end of namespace ::sdext::presenter
791