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