/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2008 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: PresenterSlideShowView.cxx,v $ * * $Revision: 1.7 $ * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sdext.hxx" #include "PresenterSlideShowView.hxx" #include "PresenterCanvasHelper.hxx" #include "PresenterGeometryHelper.hxx" #include "PresenterHelper.hxx" #include "PresenterPaneContainer.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::drawing::framework; using ::rtl::OUString; #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString))) namespace sdext { namespace presenter { //===== PresenterSlideShowView ================================================ PresenterSlideShowView::PresenterSlideShowView ( const css::uno::Reference& rxContext, const css::uno::Reference& rxViewId, const css::uno::Reference& rxController, const ::rtl::Reference& rpPresenterController) : PresenterSlideShowViewInterfaceBase(m_aMutex), mxComponentContext(rxContext), mpPresenterController(rpPresenterController), mxViewId(rxViewId), mxController(rxController), mxSlideShowController(PresenterHelper::GetSlideShowController(rxController)), mxSlideShow(), mxCanvas(), mxViewCanvas(), mxPointer(), mxWindow(), mxViewWindow(), mxTopPane(), mxPresenterHelper(), mxBackgroundPolygon1(), mxBackgroundPolygon2(), mbIsViewAdded(false), mnPageAspectRatio(28.0/21.0), maBroadcaster(m_aMutex), mpBackground(), mbIsInModifyNotification(false), mbIsForcedPaintPending(false), mbIsPaintPending(true), msClickToExitPresentationText(), msClickToExitPresentationTitle(), msTitleTemplate(), mbIsEndSlideVisible(false), mxCurrentSlide() { if (mpPresenterController.get() != NULL) { mnPageAspectRatio = mpPresenterController->GetSlideAspectRatio(); mpBackground = mpPresenterController->GetViewBackground(mxViewId->getResourceURL()); } } void PresenterSlideShowView::LateInit (void) { mxSlideShow = Reference ( mxSlideShowController->getSlideShow(), UNO_QUERY_THROW); Reference xSlideShowComponent (mxSlideShow, UNO_QUERY); if (xSlideShowComponent.is()) xSlideShowComponent->addEventListener(static_cast(this)); Reference xFactory ( mxComponentContext->getServiceManager(), UNO_QUERY_THROW); mxPresenterHelper.set (xFactory->createInstanceWithContext( OUString::createFromAscii("com.sun.star.comp.Draw.PresenterHelper"), mxComponentContext), UNO_QUERY_THROW); // Use view id and controller to retrieve window and canvas from // configuration controller. Reference xCM (mxController, UNO_QUERY_THROW); Reference xCC (xCM->getConfigurationController()); if (xCC.is()) { mxTopPane.set(xCC->getResource(mxViewId->getAnchor()->getAnchor()), UNO_QUERY); Reference xPane (xCC->getResource(mxViewId->getAnchor()), UNO_QUERY_THROW); mxWindow = xPane->getWindow(); mxCanvas = xPane->getCanvas(); if (mxWindow.is()) { mxWindow->addPaintListener(this); mxWindow->addWindowListener(this); } // The window does not have to paint a background. We do // that ourself. Reference xPeer (mxWindow, UNO_QUERY); if (xPeer.is()) xPeer->setBackground(util::Color(0xff000000)); } // Create a window for the actual slide show view. It is places // centered and with maximal size inside the pane. mxViewWindow = CreateViewWindow(mxWindow); mxViewCanvas = CreateViewCanvas(mxViewWindow); if (mxViewWindow.is()) { // Register listeners at window. mxViewWindow->addPaintListener(this); mxViewWindow->addMouseListener(this); mxViewWindow->addMouseMotionListener(this); } if (mxViewWindow.is()) Resize(); if (mxWindow.is()) mxWindow->setVisible(sal_True); // Add the new slide show view to the slide show. if (mxSlideShow.is() && ! mbIsViewAdded) { mxSlideShow->addView(this); mbIsViewAdded = true; } // Read text for one past last slide. PresenterConfigurationAccess aConfiguration ( mxComponentContext, PresenterConfigurationAccess::msPresenterScreenRootName, PresenterConfigurationAccess::READ_ONLY); aConfiguration.GetConfigurationNode( A2S("Presenter/Views/CurrentSlidePreview/" "Strings/ClickToExitPresentationText/String")) >>= msClickToExitPresentationText; aConfiguration.GetConfigurationNode( A2S("Presenter/Views/CurrentSlidePreview/" "Strings/ClickToExitPresentationTitle/String")) >>= msClickToExitPresentationTitle; } PresenterSlideShowView::~PresenterSlideShowView (void) { } void PresenterSlideShowView::disposing (void) { // Tell all listeners that we are disposed. lang::EventObject aEvent; aEvent.Source = static_cast(this); ::cppu::OInterfaceContainerHelper* pIterator = maBroadcaster.getContainer(getCppuType((Reference*)NULL)); if (pIterator != NULL) pIterator->disposeAndClear(aEvent); // Do this for // XPaintListener, XModifyListener,XMouseListener,XMouseMotionListener,XWindowListener? if (mxWindow.is()) { mxWindow->removePaintListener(this); mxWindow->removeMouseListener(this); mxWindow->removeMouseMotionListener(this); mxWindow->removeWindowListener(this); mxWindow = NULL; } mxSlideShowController = NULL; mxSlideShow = NULL; if (mxViewCanvas.is()) { Reference xComponent (mxViewCanvas, UNO_QUERY); mxViewCanvas = NULL; if (xComponent.is()) xComponent->dispose(); } if (mxViewWindow.is()) { Reference xComponent (mxViewWindow, UNO_QUERY); mxViewWindow = NULL; if (xComponent.is()) xComponent->dispose(); } if (mxPointer.is()) { Reference xComponent (mxPointer, UNO_QUERY); mxPointer = NULL; if (xComponent.is()) xComponent->dispose(); } if (mxBackgroundPolygon1.is()) { Reference xComponent (mxBackgroundPolygon1, UNO_QUERY); mxBackgroundPolygon1 = NULL; if (xComponent.is()) xComponent->dispose(); } if (mxBackgroundPolygon2.is()) { Reference xComponent (mxBackgroundPolygon2, UNO_QUERY); mxBackgroundPolygon2 = NULL; if (xComponent.is()) xComponent->dispose(); } mxComponentContext = NULL; mpPresenterController = NULL; mxViewId = NULL; mxController = NULL; mxCanvas = NULL; mpBackground.reset(); msClickToExitPresentationText = OUString(); msClickToExitPresentationTitle = OUString(); msTitleTemplate = OUString(); mxCurrentSlide = NULL; } //----- XDrawView ------------------------------------------------------------- void SAL_CALL PresenterSlideShowView::setCurrentPage ( const css::uno::Reference& rxSlide) throw (css::uno::RuntimeException) { mxCurrentSlide = rxSlide; if (mpPresenterController.get() != NULL && mxSlideShowController.is() && ! mpPresenterController->GetCurrentSlide().is() && ! mxSlideShowController->isPaused()) { mbIsEndSlideVisible = true; Reference xPeer (mxViewWindow, UNO_QUERY); if (xPeer.is()) xPeer->invalidate(awt::InvalidateStyle::NOTRANSPARENT); // For the end slide we use a special title, without the (n of m) // part. Save the title template for the case that the user goes // backwards. PresenterPaneContainer::SharedPaneDescriptor pDescriptor ( mpPresenterController->GetPaneContainer()->FindViewURL(mxViewId->getResourceURL())); if (pDescriptor.get() != NULL) { msTitleTemplate = pDescriptor->msTitleTemplate; pDescriptor->msTitleTemplate = msClickToExitPresentationTitle; mpPresenterController->UpdatePaneTitles(); } } else if (mbIsEndSlideVisible) { mbIsEndSlideVisible = false; // Restore the title template. PresenterPaneContainer::SharedPaneDescriptor pDescriptor ( mpPresenterController->GetPaneContainer()->FindViewURL(mxViewId->getResourceURL())); if (pDescriptor.get() != NULL) { pDescriptor->msTitleTemplate = msTitleTemplate; pDescriptor->msTitle = OUString(); mpPresenterController->UpdatePaneTitles(); } } } css::uno::Reference SAL_CALL PresenterSlideShowView::getCurrentPage (void) throw (css::uno::RuntimeException) { return mxCurrentSlide; } //----- CachablePresenterView ------------------------------------------------- void PresenterSlideShowView::ReleaseView (void) { if (mxSlideShow.is() && mbIsViewAdded) { mxSlideShow->removeView(this); mbIsViewAdded = false; } } //----- XSlideShowView -------------------------------------------------------- Reference SAL_CALL PresenterSlideShowView::getCanvas (void) throw (RuntimeException) { ThrowIfDisposed(); return Reference(mxViewCanvas, UNO_QUERY); } void SAL_CALL PresenterSlideShowView::clear (void) throw (RuntimeException) { ThrowIfDisposed(); mbIsForcedPaintPending = false; mbIsPaintPending = false; if (mxViewCanvas.is() && mxViewWindow.is()) { // Create a polygon for the window outline. awt::Rectangle aViewWindowBox (mxViewWindow->getPosSize()); Reference xPolygon (PresenterGeometryHelper::CreatePolygon( awt::Rectangle(0,0, aViewWindowBox.Width,aViewWindowBox.Height), mxViewCanvas->getDevice())); rendering::ViewState aViewState ( geometry::AffineMatrix2D(1,0,0, 0,1,0), NULL); double aColor[3] = {0,0,0}; rendering::RenderState aRenderState( geometry::AffineMatrix2D(1,0,0, 0,1,0), NULL, Sequence(aColor,4), rendering::CompositeOperation::SOURCE); mxViewCanvas->fillPolyPolygon(xPolygon, aViewState, aRenderState); } } geometry::AffineMatrix2D SAL_CALL PresenterSlideShowView::getTransformation (void) throw (RuntimeException) { ThrowIfDisposed(); if (mxViewWindow.is()) { // When the mbIsInModifyNotification is set then a slightly modifed // version of the transformation is returned in order to get past // optimizations the avoid updates when the transformation is // unchanged (when the window size changes then due to the constant // aspect ratio the size of the preview may remain the same while // the position changes. The position, however, is repesented by // the position of the view window. This transformation is given // relative to the view window and therefore does not contain the // position.) const awt::Rectangle aWindowBox = mxViewWindow->getPosSize(); return geometry::AffineMatrix2D( aWindowBox.Width-1, 0, (mbIsInModifyNotification ? 1 : 0), 0, aWindowBox.Height-1, 0); } else { return geometry::AffineMatrix2D(1,0,0, 0,1,0); } } void SAL_CALL PresenterSlideShowView::addTransformationChangedListener( const Reference& rxListener) throw (RuntimeException) { ThrowIfDisposed(); maBroadcaster.addListener( getCppuType((Reference*)NULL), rxListener); } void SAL_CALL PresenterSlideShowView::removeTransformationChangedListener( const Reference& rxListener) throw (RuntimeException) { ThrowIfDisposed(); maBroadcaster.removeListener( getCppuType((Reference*)NULL), rxListener); } void SAL_CALL PresenterSlideShowView::addPaintListener( const Reference& rxListener) throw (RuntimeException) { ThrowIfDisposed(); maBroadcaster.addListener( getCppuType((Reference*)NULL), rxListener); } void SAL_CALL PresenterSlideShowView::removePaintListener( const Reference& rxListener) throw (RuntimeException) { ThrowIfDisposed(); maBroadcaster.removeListener( getCppuType((Reference*)NULL), rxListener); } void SAL_CALL PresenterSlideShowView::addMouseListener( const Reference& rxListener) throw (RuntimeException) { ThrowIfDisposed(); maBroadcaster.addListener( getCppuType((Reference*)NULL), rxListener); } void SAL_CALL PresenterSlideShowView::removeMouseListener( const Reference& rxListener) throw (RuntimeException) { ThrowIfDisposed(); maBroadcaster.removeListener( getCppuType((Reference*)NULL), rxListener); } void SAL_CALL PresenterSlideShowView::addMouseMotionListener( const Reference& rxListener) throw (RuntimeException) { ThrowIfDisposed(); maBroadcaster.addListener( getCppuType((Reference*)NULL), rxListener); } void SAL_CALL PresenterSlideShowView::removeMouseMotionListener( const Reference& rxListener) throw (RuntimeException) { ThrowIfDisposed(); maBroadcaster.removeListener( getCppuType((Reference*)NULL), rxListener); } void SAL_CALL PresenterSlideShowView::setMouseCursor(::sal_Int16 nPointerShape) throw (RuntimeException) { ThrowIfDisposed(); // Create a pointer when it does not yet exist. if ( ! mxPointer.is()) { Reference xFactory ( mxComponentContext, UNO_QUERY); if (xFactory.is()) mxPointer = Reference( xFactory->createInstance(OUString::createFromAscii("com.sun.star.awt.Pointer")), UNO_QUERY); } // Set the pointer to the given shape and the window(peer) to the // pointer. Reference xPeer (mxViewWindow, UNO_QUERY); if (mxPointer.is() && xPeer.is()) { mxPointer->setType(nPointerShape); xPeer->setPointer(mxPointer); } } awt::Rectangle SAL_CALL PresenterSlideShowView::getCanvasArea( ) throw (RuntimeException) { if( mxViewWindow.is() && mxTopPane.is() ) return mxPresenterHelper->getWindowExtentsRelative( mxViewWindow, mxTopPane->getWindow() ); awt::Rectangle aRectangle; aRectangle.X = aRectangle.Y = aRectangle.Width = aRectangle.Height = 0; return aRectangle; } //----- lang::XEventListener -------------------------------------------------- void SAL_CALL PresenterSlideShowView::disposing (const lang::EventObject& rEvent) throw (RuntimeException) { if (rEvent.Source == mxViewWindow) mxViewWindow = NULL; else if (rEvent.Source == mxSlideShow) mxSlideShow = NULL; } //----- XPaintListener -------------------------------------------------------- void SAL_CALL PresenterSlideShowView::windowPaint (const awt::PaintEvent& rEvent) throw (RuntimeException) { // Deactivated views must not be painted. if ( ! mbIsPresenterViewActive) return; awt::Rectangle aViewWindowBox (mxViewWindow->getPosSize()); if (aViewWindowBox.Width <= 0 || aViewWindowBox.Height <= 0) return; if (rEvent.Source == mxWindow) PaintOuterWindow(rEvent.UpdateRect); else if (mbIsEndSlideVisible) PaintEndSlide(rEvent.UpdateRect); else PaintInnerWindow(rEvent); } //----- XMouseListener -------------------------------------------------------- void SAL_CALL PresenterSlideShowView::mousePressed (const awt::MouseEvent& rEvent) throw (RuntimeException) { awt::MouseEvent aEvent (rEvent); aEvent.Source = static_cast(this); ::cppu::OInterfaceContainerHelper* pIterator = maBroadcaster.getContainer(getCppuType((Reference*)NULL)); if (pIterator != NULL) { pIterator->notifyEach(&awt::XMouseListener::mousePressed, aEvent); } // Only when the end slide is displayed we forward the mouse event to // the PresenterController so that it switches to the next slide and // ends the presentation. if (mbIsEndSlideVisible) if (mpPresenterController.get() != NULL) mpPresenterController->HandleMouseClick(rEvent); } void SAL_CALL PresenterSlideShowView::mouseReleased (const awt::MouseEvent& rEvent) throw (RuntimeException) { awt::MouseEvent aEvent (rEvent); aEvent.Source = static_cast(this); ::cppu::OInterfaceContainerHelper* pIterator = maBroadcaster.getContainer(getCppuType((Reference*)NULL)); if (pIterator != NULL) { pIterator->notifyEach(&awt::XMouseListener::mouseReleased, aEvent); } } void SAL_CALL PresenterSlideShowView::mouseEntered (const awt::MouseEvent& rEvent) throw (RuntimeException) { awt::MouseEvent aEvent (rEvent); aEvent.Source = static_cast(this); ::cppu::OInterfaceContainerHelper* pIterator = maBroadcaster.getContainer(getCppuType((Reference*)NULL)); if (pIterator != NULL) { pIterator->notifyEach(&awt::XMouseListener::mouseEntered, aEvent); } } void SAL_CALL PresenterSlideShowView::mouseExited (const awt::MouseEvent& rEvent) throw (RuntimeException) { awt::MouseEvent aEvent (rEvent); aEvent.Source = static_cast(this); ::cppu::OInterfaceContainerHelper* pIterator = maBroadcaster.getContainer(getCppuType((Reference*)NULL)); if (pIterator != NULL) { pIterator->notifyEach(&awt::XMouseListener::mouseExited, aEvent); } } //----- XMouseMotionListener -------------------------------------------------- void SAL_CALL PresenterSlideShowView::mouseDragged (const awt::MouseEvent& rEvent) throw (RuntimeException) { awt::MouseEvent aEvent (rEvent); aEvent.Source = static_cast(this); ::cppu::OInterfaceContainerHelper* pIterator = maBroadcaster.getContainer(getCppuType((Reference*)NULL)); if (pIterator != NULL) { pIterator->notifyEach(&awt::XMouseMotionListener::mouseDragged, aEvent); } } void SAL_CALL PresenterSlideShowView::mouseMoved (const awt::MouseEvent& rEvent) throw (RuntimeException) { awt::MouseEvent aEvent (rEvent); aEvent.Source = static_cast(this); ::cppu::OInterfaceContainerHelper* pIterator = maBroadcaster.getContainer(getCppuType((Reference*)NULL)); if (pIterator != NULL) { pIterator->notifyEach(&awt::XMouseMotionListener::mouseMoved, aEvent); } } //----- XWindowListener ------------------------------------------------------- void SAL_CALL PresenterSlideShowView::windowResized (const awt::WindowEvent& rEvent) throw (RuntimeException) { (void)rEvent; ThrowIfDisposed(); ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex()); Resize(); } void SAL_CALL PresenterSlideShowView::windowMoved (const awt::WindowEvent& rEvent) throw (RuntimeException) { (void)rEvent; if ( ! mbIsPaintPending) mbIsForcedPaintPending = true; } void SAL_CALL PresenterSlideShowView::windowShown (const lang::EventObject& rEvent) throw (RuntimeException) { (void)rEvent; Resize(); } void SAL_CALL PresenterSlideShowView::windowHidden (const lang::EventObject& rEvent) throw (RuntimeException) { (void)rEvent; } //----- XView ----------------------------------------------------------------- Reference SAL_CALL PresenterSlideShowView::getResourceId (void) throw(RuntimeException) { return mxViewId; } sal_Bool SAL_CALL PresenterSlideShowView::isAnchorOnly (void) throw (RuntimeException) { return false; } //----- CachablePresenterView ------------------------------------------------- void PresenterSlideShowView::ActivatePresenterView (void) { if (mxSlideShow.is() && ! mbIsViewAdded) { mxSlideShow->addView(this); mbIsViewAdded = true; } } void PresenterSlideShowView::DeactivatePresenterView (void) { if (mxSlideShow.is() && mbIsViewAdded) { mxSlideShow->removeView(this); mbIsViewAdded = false; } } //----------------------------------------------------------------------------- void PresenterSlideShowView::PaintOuterWindow (const awt::Rectangle& rRepaintBox) { if ( ! mxCanvas.is()) return; if (mpBackground.get() == NULL) return; const rendering::ViewState aViewState( geometry::AffineMatrix2D(1,0,0, 0,1,0), PresenterGeometryHelper::CreatePolygon(rRepaintBox, mxCanvas->getDevice())); rendering::RenderState aRenderState ( geometry::AffineMatrix2D(1,0,0, 0,1,0), NULL, Sequence(4), rendering::CompositeOperation::SOURCE); Reference xBackgroundBitmap (mpBackground->GetNormalBitmap()); if (xBackgroundBitmap.is()) { Sequence aTextures (1); const geometry::IntegerSize2D aBitmapSize(xBackgroundBitmap->getSize()); aTextures[0] = rendering::Texture ( geometry::AffineMatrix2D( aBitmapSize.Width,0,0, 0,aBitmapSize.Height,0), 1, 0, xBackgroundBitmap, NULL, NULL, rendering::StrokeAttributes(), rendering::TexturingMode::REPEAT, rendering::TexturingMode::REPEAT); if (mxBackgroundPolygon1.is()) mxCanvas->fillTexturedPolyPolygon( mxBackgroundPolygon1, aViewState, aRenderState, aTextures); if (mxBackgroundPolygon2.is()) mxCanvas->fillTexturedPolyPolygon( mxBackgroundPolygon2, aViewState, aRenderState, aTextures); } else { PresenterCanvasHelper::SetDeviceColor(aRenderState, mpBackground->maReplacementColor); if (mxBackgroundPolygon1.is()) mxCanvas->fillPolyPolygon(mxBackgroundPolygon1, aViewState, aRenderState); if (mxBackgroundPolygon2.is()) mxCanvas->fillPolyPolygon(mxBackgroundPolygon2, aViewState, aRenderState); } } void PresenterSlideShowView::PaintEndSlide (const awt::Rectangle& rRepaintBox) { if ( ! mxCanvas.is()) return; const rendering::ViewState aViewState( geometry::AffineMatrix2D(1,0,0, 0,1,0), PresenterGeometryHelper::CreatePolygon(rRepaintBox, mxCanvas->getDevice())); rendering::RenderState aRenderState ( geometry::AffineMatrix2D(1,0,0, 0,1,0), NULL, Sequence(4), rendering::CompositeOperation::SOURCE); PresenterCanvasHelper::SetDeviceColor(aRenderState, util::Color(0x00000000)); mxCanvas->fillPolyPolygon( PresenterGeometryHelper::CreatePolygon(mxViewWindow->getPosSize(), mxCanvas->getDevice()), aViewState, aRenderState); do { if (mpPresenterController.get() == NULL) break; ::boost::shared_ptr pTheme (mpPresenterController->GetTheme()); if (pTheme.get() == NULL) break; const OUString sViewStyle (pTheme->GetStyleName(mxViewId->getResourceURL())); PresenterTheme::SharedFontDescriptor pFont (pTheme->GetFont(sViewStyle)); if (pFont.get() == NULL) break; PresenterCanvasHelper::SetDeviceColor(aRenderState, util::Color(0x00ffffff)); aRenderState.AffineTransform.m02 = 20; aRenderState.AffineTransform.m12 = 40; const rendering::StringContext aContext ( msClickToExitPresentationText, 0, msClickToExitPresentationText.getLength()); pFont->PrepareFont(mxCanvas); mxCanvas->drawText( aContext, pFont->mxFont, aViewState, aRenderState, rendering::TextDirection::WEAK_LEFT_TO_RIGHT); } while (false); // Finally, in double buffered environments, request the changes to be // made visible. Reference mxSpriteCanvas (mxCanvas, UNO_QUERY); if (mxSpriteCanvas.is()) mxSpriteCanvas->updateScreen(sal_True); } void PresenterSlideShowView::PaintInnerWindow (const awt::PaintEvent& rEvent) { // Forward window paint to listeners. awt::PaintEvent aEvent (rEvent); aEvent.Source = static_cast(this); ::cppu::OInterfaceContainerHelper* pIterator = maBroadcaster.getContainer(getCppuType((Reference*)NULL)); if (pIterator != NULL) { pIterator->notifyEach(&awt::XPaintListener::windowPaint, aEvent); } if (mbIsForcedPaintPending) ForceRepaint(); // Finally, in double buffered environments, request the changes to be // made visible. Reference mxSpriteCanvas (mxCanvas, UNO_QUERY); if (mxSpriteCanvas.is()) mxSpriteCanvas->updateScreen(sal_True); } Reference PresenterSlideShowView::CreateViewWindow ( const Reference& rxParentWindow) const { Reference xViewWindow; try { Reference xFactory (mxComponentContext->getServiceManager()); if ( ! xFactory.is()) return xViewWindow; Reference xToolkit ( xFactory->createInstanceWithContext( OUString::createFromAscii("com.sun.star.awt.Toolkit"), mxComponentContext), UNO_QUERY_THROW); awt::WindowDescriptor aWindowDescriptor ( awt::WindowClass_CONTAINER, OUString(), Reference(rxParentWindow,UNO_QUERY_THROW), -1, // parent index not available awt::Rectangle(0,0,10,10), awt::WindowAttribute::SIZEABLE | awt::WindowAttribute::MOVEABLE | awt::WindowAttribute::NODECORATION); xViewWindow = Reference( xToolkit->createWindow(aWindowDescriptor),UNO_QUERY_THROW); // Make the background transparent. The slide show paints its own background. Reference xPeer (xViewWindow, UNO_QUERY_THROW); if (xPeer.is()) { xPeer->setBackground(0xff000000); } xViewWindow->setVisible(sal_True); } catch (RuntimeException&) { } return xViewWindow; } Reference PresenterSlideShowView::CreateViewCanvas ( const Reference& rxViewWindow) const { // Create a canvas for the view window. return mxPresenterHelper->createSharedCanvas( Reference(mxTopPane->getCanvas(), UNO_QUERY), mxTopPane->getWindow(), mxTopPane->getCanvas(), mxTopPane->getWindow(), rxViewWindow); } void PresenterSlideShowView::Resize (void) { if ( ! mxWindow.is() || ! mxViewWindow.is()) return; const awt::Rectangle aWindowBox (mxWindow->getPosSize()); awt::Rectangle aViewWindowBox; if (aWindowBox.Height > 0) { const double nWindowAspectRatio ( double(aWindowBox.Width) / double(aWindowBox.Height)); if (nWindowAspectRatio > mnPageAspectRatio) { // Slides will be painted with the full parent window height. aViewWindowBox.Width = sal_Int32(aWindowBox.Height * mnPageAspectRatio + 0.5); aViewWindowBox.Height = aWindowBox.Height; aViewWindowBox.X = (aWindowBox.Width - aViewWindowBox.Width) / 2; aViewWindowBox.Y = 0; } else { // Slides will be painted with the full parent window width. aViewWindowBox.Width = aWindowBox.Width; aViewWindowBox.Height = sal_Int32(aWindowBox.Width / mnPageAspectRatio + 0.5); aViewWindowBox.X = 0; aViewWindowBox.Y = (aWindowBox.Height - aViewWindowBox.Height) / 2; } mxViewWindow->setPosSize( aViewWindowBox.X, aViewWindowBox.Y, aViewWindowBox.Width, aViewWindowBox.Height, awt::PosSize::POSSIZE); } // Clear the background polygon so that on the next paint it is created // for the new size. CreateBackgroundPolygons(); // Due to constant aspect ratio resizing may lead a preview that changes // its position but not its size. This invalidates the back buffer and // we have to enforce a complete repaint. if ( ! mbIsPaintPending) mbIsForcedPaintPending = true; } void PresenterSlideShowView::ForceRepaint (void) { if (mxSlideShow.is() && mbIsViewAdded) { mxSlideShow->removeView(this); mxSlideShow->addView(this); } } void PresenterSlideShowView::CreateBackgroundPolygons (void) { const awt::Rectangle aWindowBox (mxWindow->getPosSize()); const awt::Rectangle aViewWindowBox (mxViewWindow->getPosSize()); if (aWindowBox.Height == aViewWindowBox.Height && aWindowBox.Width == aViewWindowBox.Width) { mxBackgroundPolygon1 = NULL; mxBackgroundPolygon2 = NULL; } else if (aWindowBox.Height == aViewWindowBox.Height) { // Paint two boxes to the left and right of the view window. mxBackgroundPolygon1 = PresenterGeometryHelper::CreatePolygon( awt::Rectangle( 0, 0, aViewWindowBox.X, aWindowBox.Height), mxCanvas->getDevice()); mxBackgroundPolygon2 = PresenterGeometryHelper::CreatePolygon( awt::Rectangle( aViewWindowBox.X + aViewWindowBox.Width, 0, aWindowBox.Width - aViewWindowBox.X - aViewWindowBox.Width, aWindowBox.Height), mxCanvas->getDevice()); } else { // Paint two boxes above and below the view window. mxBackgroundPolygon1 = PresenterGeometryHelper::CreatePolygon( awt::Rectangle( 0, 0, aWindowBox.Width, aViewWindowBox.Y), mxCanvas->getDevice()); mxBackgroundPolygon2 = PresenterGeometryHelper::CreatePolygon( awt::Rectangle( 0, aViewWindowBox.Y + aViewWindowBox.Height, aWindowBox.Width, aWindowBox.Height - aViewWindowBox.Y - aViewWindowBox.Height), mxCanvas->getDevice()); } } void PresenterSlideShowView::ThrowIfDisposed (void) throw (::com::sun::star::lang::DisposedException) { if (rBHelper.bDisposed || rBHelper.bInDispose) { throw lang::DisposedException ( OUString::createFromAscii("PresenterSlideShowView object has already been disposed"), static_cast(this)); } } } } // end of namespace ::sd::presenter