1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sd.hxx" 30*cdf0e10cSrcweir #include <slideshowviewimpl.hxx> 31*cdf0e10cSrcweir #include <slideshowimpl.hxx> 32*cdf0e10cSrcweir #include <vos/mutex.hxx> 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx> 37*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx> 38*cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrixtools.hxx> 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir #include <cppcanvas/vclfactory.hxx> 41*cdf0e10cSrcweir #include <cppcanvas/basegfxfactory.hxx> 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY; 45*cdf0e10cSrcweir using ::com::sun::star::uno::XInterface; 46*cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 47*cdf0e10cSrcweir using ::com::sun::star::uno::WeakReference; 48*cdf0e10cSrcweir using ::com::sun::star::uno::RuntimeException; 49*cdf0e10cSrcweir using ::com::sun::star::lang::XComponent; 50*cdf0e10cSrcweir using ::com::sun::star::uno::Exception; 51*cdf0e10cSrcweir using ::com::sun::star::presentation::XSlideShow; 52*cdf0e10cSrcweir using ::com::sun::star::presentation::XSlideShowView; 53*cdf0e10cSrcweir using ::com::sun::star::presentation::XShapeEventListener; 54*cdf0e10cSrcweir using ::com::sun::star::presentation::XSlideShowListener; 55*cdf0e10cSrcweir using ::comphelper::ImplementationReference; 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir using ::rtl::OUString; 58*cdf0e10cSrcweir using namespace ::com::sun::star; 59*cdf0e10cSrcweir using namespace ::com::sun::star; 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir namespace sd 62*cdf0e10cSrcweir { 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 65*cdf0e10cSrcweir // SlideShowViewListeners 66*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir SlideShowViewListeners::SlideShowViewListeners( ::osl::Mutex& rMutex ) 69*cdf0e10cSrcweir : mrMutex( rMutex ) 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir } 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir void SlideShowViewListeners::addListener( const Reference< util::XModifyListener >& _rxListener ) 74*cdf0e10cSrcweir { 75*cdf0e10cSrcweir ::osl::MutexGuard aGuard( mrMutex ); 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir WeakReference< util::XModifyListener > xWeak( _rxListener ); 78*cdf0e10cSrcweir if( std::find( maListeners.begin(), maListeners.end(), xWeak ) == maListeners.end() ) 79*cdf0e10cSrcweir maListeners.push_back( xWeak ); 80*cdf0e10cSrcweir } 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir void SlideShowViewListeners::removeListener( const Reference< util::XModifyListener >& _rxListener ) 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir ::osl::MutexGuard aGuard( mrMutex ); 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir WeakReference< util::XModifyListener > xWeak( _rxListener ); 87*cdf0e10cSrcweir ViewListenerVector::iterator aIter( std::find( maListeners.begin(), maListeners.end(), xWeak ) ); 88*cdf0e10cSrcweir if( aIter != maListeners.end() ) 89*cdf0e10cSrcweir maListeners.erase( aIter ); 90*cdf0e10cSrcweir } 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir bool SlideShowViewListeners::notify( const lang::EventObject& _rEvent ) throw( com::sun::star::uno::Exception ) 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir ::osl::MutexGuard aGuard( mrMutex ); 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir ViewListenerVector::iterator aIter( maListeners.begin() ); 97*cdf0e10cSrcweir while( aIter != maListeners.end() ) 98*cdf0e10cSrcweir { 99*cdf0e10cSrcweir Reference< util::XModifyListener > xListener( (*aIter) ); 100*cdf0e10cSrcweir if( xListener.is() ) 101*cdf0e10cSrcweir { 102*cdf0e10cSrcweir xListener->modified( _rEvent ); 103*cdf0e10cSrcweir aIter++; 104*cdf0e10cSrcweir } 105*cdf0e10cSrcweir else 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir aIter = maListeners.erase( aIter ); 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir } 110*cdf0e10cSrcweir return true; 111*cdf0e10cSrcweir } 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir void SlideShowViewListeners::disposing( const lang::EventObject& _rEventSource ) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir ::osl::MutexGuard aGuard( mrMutex ); 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir ViewListenerVector::iterator aIter( maListeners.begin() ); 118*cdf0e10cSrcweir while( aIter != maListeners.end() ) 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir Reference< util::XModifyListener > xListener( (*aIter++) ); 121*cdf0e10cSrcweir if( xListener.is() ) 122*cdf0e10cSrcweir xListener->disposing( _rEventSource ); 123*cdf0e10cSrcweir } 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir maListeners.clear(); 126*cdf0e10cSrcweir } 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 129*cdf0e10cSrcweir // SlideShowViewPaintListeners 130*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir SlideShowViewPaintListeners::SlideShowViewPaintListeners( ::osl::Mutex& rMutex ) 133*cdf0e10cSrcweir : SlideShowViewPaintListeners_Base( rMutex ) 134*cdf0e10cSrcweir { 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir bool SlideShowViewPaintListeners::implTypedNotify( const Reference< awt::XPaintListener >& rListener, 138*cdf0e10cSrcweir const awt::PaintEvent& rEvent ) throw( uno::Exception ) 139*cdf0e10cSrcweir { 140*cdf0e10cSrcweir rListener->windowPaint( rEvent ); 141*cdf0e10cSrcweir return true; // continue calling listeners 142*cdf0e10cSrcweir } 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 145*cdf0e10cSrcweir // SlideShowViewMouseListeners 146*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir SlideShowViewMouseListeners::SlideShowViewMouseListeners( ::osl::Mutex& rMutex ) : 149*cdf0e10cSrcweir SlideShowViewMouseListeners_Base( rMutex ) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir } 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir bool SlideShowViewMouseListeners::implTypedNotify( const Reference< awt::XMouseListener >& rListener, 154*cdf0e10cSrcweir const WrappedMouseEvent& rEvent ) throw( uno::Exception ) 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir switch( rEvent.meType ) 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir case WrappedMouseEvent::PRESSED: 159*cdf0e10cSrcweir rListener->mousePressed( rEvent.maEvent ); 160*cdf0e10cSrcweir break; 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir case WrappedMouseEvent::RELEASED: 163*cdf0e10cSrcweir rListener->mouseReleased( rEvent.maEvent ); 164*cdf0e10cSrcweir break; 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir case WrappedMouseEvent::ENTERED: 167*cdf0e10cSrcweir rListener->mouseEntered( rEvent.maEvent ); 168*cdf0e10cSrcweir break; 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir case WrappedMouseEvent::EXITED: 171*cdf0e10cSrcweir rListener->mouseExited( rEvent.maEvent ); 172*cdf0e10cSrcweir break; 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir return true; // continue calling listeners 176*cdf0e10cSrcweir } 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 179*cdf0e10cSrcweir // SlideShowViewMouseMotionListeners 180*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir SlideShowViewMouseMotionListeners::SlideShowViewMouseMotionListeners( ::osl::Mutex& rMutex ) : 183*cdf0e10cSrcweir SlideShowViewMouseMotionListeners_Base( rMutex ) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir } 186*cdf0e10cSrcweir 187*cdf0e10cSrcweir bool SlideShowViewMouseMotionListeners::implTypedNotify( const Reference< awt::XMouseMotionListener >& rListener, 188*cdf0e10cSrcweir const WrappedMouseMotionEvent& rEvent ) throw( uno::Exception ) 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir switch( rEvent.meType ) 191*cdf0e10cSrcweir { 192*cdf0e10cSrcweir case WrappedMouseMotionEvent::DRAGGED: 193*cdf0e10cSrcweir rListener->mouseDragged( rEvent.maEvent ); 194*cdf0e10cSrcweir break; 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir case WrappedMouseMotionEvent::MOVED: 197*cdf0e10cSrcweir rListener->mouseMoved( rEvent.maEvent ); 198*cdf0e10cSrcweir break; 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir return true; // continue calling listeners 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 205*cdf0e10cSrcweir // SlideShowView 206*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir SlideShowView::SlideShowView( ShowWindow& rOutputWindow, 209*cdf0e10cSrcweir SdDrawDocument* pDoc, 210*cdf0e10cSrcweir AnimationMode eAnimationMode, 211*cdf0e10cSrcweir SlideshowImpl* pSlideShow, 212*cdf0e10cSrcweir bool bFullScreen ) 213*cdf0e10cSrcweir : SlideShowView_Base( m_aMutex ), 214*cdf0e10cSrcweir mpCanvas( ::cppcanvas::VCLFactory::getInstance().createSpriteCanvas( rOutputWindow ) ), 215*cdf0e10cSrcweir mxWindow( VCLUnoHelper::GetInterface( &rOutputWindow ), uno::UNO_QUERY_THROW ), 216*cdf0e10cSrcweir mxWindowPeer( mxWindow, uno::UNO_QUERY_THROW ), 217*cdf0e10cSrcweir mxPointer(), 218*cdf0e10cSrcweir mpSlideShow( pSlideShow ), 219*cdf0e10cSrcweir mrOutputWindow( rOutputWindow ), 220*cdf0e10cSrcweir mpViewListeners( new SlideShowViewListeners( m_aMutex ) ), 221*cdf0e10cSrcweir mpPaintListeners( new SlideShowViewPaintListeners( m_aMutex ) ), 222*cdf0e10cSrcweir mpMouseListeners( new SlideShowViewMouseListeners( m_aMutex ) ), 223*cdf0e10cSrcweir mpMouseMotionListeners( new SlideShowViewMouseMotionListeners( m_aMutex ) ), 224*cdf0e10cSrcweir mpDoc( pDoc ), 225*cdf0e10cSrcweir mbIsMouseMotionListener( false ), 226*cdf0e10cSrcweir meAnimationMode( eAnimationMode ), 227*cdf0e10cSrcweir mbFirstPaint( true ), 228*cdf0e10cSrcweir mbFullScreen( bFullScreen ), 229*cdf0e10cSrcweir mbMousePressedEaten( false ) 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir init(); 232*cdf0e10cSrcweir } 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir /// Dispose all internal references 235*cdf0e10cSrcweir void SAL_CALL SlideShowView::dispose() throw (RuntimeException) 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir mpSlideShow = 0; 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir // deregister listeners 242*cdf0e10cSrcweir if( mxWindow.is() ) 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir mxWindow->removeWindowListener( this ); 245*cdf0e10cSrcweir mxWindow->removeMouseListener( this ); 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir if( mbIsMouseMotionListener ) 248*cdf0e10cSrcweir mxWindow->removeMouseMotionListener( this ); 249*cdf0e10cSrcweir } 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir mpCanvas.reset(); 252*cdf0e10cSrcweir mxWindow.clear(); 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir // clear all listener containers 255*cdf0e10cSrcweir disposing( lang::EventObject() ); 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir // call base 258*cdf0e10cSrcweir WeakComponentImplHelperBase::dispose(); 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir 261*cdf0e10cSrcweir /// Disposing our broadcaster 262*cdf0e10cSrcweir void SAL_CALL SlideShowView::disposing( const lang::EventObject& ) throw(RuntimeException) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 265*cdf0e10cSrcweir 266*cdf0e10cSrcweir // notify all listeners that _we_ are going down (send a disposing()), 267*cdf0e10cSrcweir // then delete listener containers: 268*cdf0e10cSrcweir lang::EventObject const evt( static_cast<OWeakObject *>(this) ); 269*cdf0e10cSrcweir if (mpViewListeners.get() != 0) { 270*cdf0e10cSrcweir mpViewListeners->disposing( evt ); 271*cdf0e10cSrcweir mpViewListeners.reset(); 272*cdf0e10cSrcweir } 273*cdf0e10cSrcweir if (mpPaintListeners.get() != 0) { 274*cdf0e10cSrcweir mpPaintListeners->disposing( evt ); 275*cdf0e10cSrcweir mpPaintListeners.reset(); 276*cdf0e10cSrcweir } 277*cdf0e10cSrcweir if (mpMouseListeners.get() != 0) { 278*cdf0e10cSrcweir mpMouseListeners->disposing( evt ); 279*cdf0e10cSrcweir mpMouseListeners.reset(); 280*cdf0e10cSrcweir } 281*cdf0e10cSrcweir if (mpMouseMotionListeners.get() != 0) { 282*cdf0e10cSrcweir mpMouseMotionListeners->disposing( evt ); 283*cdf0e10cSrcweir mpMouseMotionListeners.reset(); 284*cdf0e10cSrcweir } 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir 287*cdf0e10cSrcweir void SAL_CALL SlideShowView::paint( const awt::PaintEvent& e ) throw (RuntimeException) 288*cdf0e10cSrcweir { 289*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( m_aMutex ); 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir if( mbFirstPaint ) 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir mbFirstPaint = false; 294*cdf0e10cSrcweir SlideshowImpl* pSlideShow = mpSlideShow; 295*cdf0e10cSrcweir aGuard.clear(); 296*cdf0e10cSrcweir if( pSlideShow ) 297*cdf0e10cSrcweir pSlideShow->onFirstPaint(); 298*cdf0e10cSrcweir } 299*cdf0e10cSrcweir else 300*cdf0e10cSrcweir { 301*cdf0e10cSrcweir // Change event source, to enable listeners to match event 302*cdf0e10cSrcweir // with view 303*cdf0e10cSrcweir awt::PaintEvent aEvent( e ); 304*cdf0e10cSrcweir aEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); 305*cdf0e10cSrcweir mpPaintListeners->notify( aEvent ); 306*cdf0e10cSrcweir updateimpl( aGuard, mpSlideShow ); // warning: clears guard! 307*cdf0e10cSrcweir } 308*cdf0e10cSrcweir } 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir // XSlideShowView methods 311*cdf0e10cSrcweir Reference< rendering::XSpriteCanvas > SAL_CALL SlideShowView::getCanvas( ) throw (RuntimeException) 312*cdf0e10cSrcweir { 313*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir return mpCanvas.get() ? mpCanvas->getUNOSpriteCanvas() : Reference< rendering::XSpriteCanvas >(); 316*cdf0e10cSrcweir } 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir void SAL_CALL SlideShowView::clear() throw (::com::sun::star::uno::RuntimeException) 319*cdf0e10cSrcweir { 320*cdf0e10cSrcweir // paint background in black 321*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 322*cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir // fill the bounds rectangle in black 325*cdf0e10cSrcweir // ---------------------------------- 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir const Size aWindowSize( mrOutputWindow.GetSizePixel() ); 328*cdf0e10cSrcweir 329*cdf0e10cSrcweir ::basegfx::B2DPolygon aPoly( ::basegfx::tools::createPolygonFromRect( 330*cdf0e10cSrcweir ::basegfx::B2DRectangle(0.0,0.0, 331*cdf0e10cSrcweir aWindowSize.Width(), 332*cdf0e10cSrcweir aWindowSize.Height() ) ) ); 333*cdf0e10cSrcweir ::cppcanvas::PolyPolygonSharedPtr pPolyPoly( 334*cdf0e10cSrcweir ::cppcanvas::BaseGfxFactory::getInstance().createPolyPolygon( mpCanvas, aPoly ) ); 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir if( pPolyPoly.get() ) 337*cdf0e10cSrcweir { 338*cdf0e10cSrcweir pPolyPoly->setRGBAFillColor( 0x000000FFU ); 339*cdf0e10cSrcweir pPolyPoly->draw(); 340*cdf0e10cSrcweir } 341*cdf0e10cSrcweir } 342*cdf0e10cSrcweir 343*cdf0e10cSrcweir geometry::AffineMatrix2D SAL_CALL SlideShowView::getTransformation( ) throw (RuntimeException) 344*cdf0e10cSrcweir { 345*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 346*cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir const Size& rTmpSize( mrOutputWindow.GetSizePixel() ); 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir if (rTmpSize.Width()<=0 || rTmpSize.Height()<=0) 351*cdf0e10cSrcweir { 352*cdf0e10cSrcweir return geometry::AffineMatrix2D (1,0,0,0,1,0); 353*cdf0e10cSrcweir } 354*cdf0e10cSrcweir 355*cdf0e10cSrcweir // Reduce available width by one, as the slides might actually 356*cdf0e10cSrcweir // render one pixel wider and higher as aPageSize below specifies 357*cdf0e10cSrcweir // (when shapes of page size have visible border lines) 358*cdf0e10cSrcweir const Size aWindowSize( rTmpSize.Width()-1, 359*cdf0e10cSrcweir rTmpSize.Height()-1 ); 360*cdf0e10cSrcweir Size aOutputSize( aWindowSize ); 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir if( meAnimationMode != ANIMATIONMODE_SHOW ) 363*cdf0e10cSrcweir { 364*cdf0e10cSrcweir aOutputSize.Width() = (long)( aOutputSize.Width() / 1.03 ); 365*cdf0e10cSrcweir aOutputSize.Height() = (long)( aOutputSize.Height() / 1.03 ); 366*cdf0e10cSrcweir } 367*cdf0e10cSrcweir 368*cdf0e10cSrcweir SdPage* pP = mpDoc->GetSdPage( 0, PK_STANDARD ); 369*cdf0e10cSrcweir Size aPageSize( pP->GetSize() ); 370*cdf0e10cSrcweir 371*cdf0e10cSrcweir const double page_ratio = (double)aPageSize.Width() / (double)aPageSize.Height(); 372*cdf0e10cSrcweir const double output_ratio = (double)aOutputSize.Width() / (double)aOutputSize.Height(); 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir if( page_ratio > output_ratio ) 375*cdf0e10cSrcweir { 376*cdf0e10cSrcweir aOutputSize.Height() = ( aOutputSize.Width() * aPageSize.Height() ) / aPageSize.Width(); 377*cdf0e10cSrcweir } 378*cdf0e10cSrcweir else if( page_ratio < output_ratio ) 379*cdf0e10cSrcweir { 380*cdf0e10cSrcweir aOutputSize.Width() = ( aOutputSize.Height() * aPageSize.Width() ) / aPageSize.Height(); 381*cdf0e10cSrcweir } 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir Point aOutputOffset( ( aWindowSize.Width() - aOutputSize.Width() ) >> 1, 384*cdf0e10cSrcweir ( aWindowSize.Height() - aOutputSize.Height() ) >> 1 ); 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir maPresentationArea = Rectangle( aOutputOffset, aOutputSize ); 387*cdf0e10cSrcweir mrOutputWindow.SetPresentationArea( maPresentationArea ); 388*cdf0e10cSrcweir 389*cdf0e10cSrcweir // scale presentation into available window rect (minus 10%); center in the window 390*cdf0e10cSrcweir const basegfx::B2DHomMatrix aMatrix(basegfx::tools::createScaleTranslateB2DHomMatrix( 391*cdf0e10cSrcweir aOutputSize.Width(), aOutputSize.Height(), aOutputOffset.X(), aOutputOffset.Y())); 392*cdf0e10cSrcweir 393*cdf0e10cSrcweir geometry::AffineMatrix2D aRes; 394*cdf0e10cSrcweir 395*cdf0e10cSrcweir return ::basegfx::unotools::affineMatrixFromHomMatrix( aRes, aMatrix ); 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir void SAL_CALL SlideShowView::addTransformationChangedListener( const Reference< util::XModifyListener >& xListener ) throw (RuntimeException) 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 401*cdf0e10cSrcweir 402*cdf0e10cSrcweir if( mpViewListeners.get() ) 403*cdf0e10cSrcweir mpViewListeners->addListener( xListener ); 404*cdf0e10cSrcweir } 405*cdf0e10cSrcweir 406*cdf0e10cSrcweir void SAL_CALL SlideShowView::removeTransformationChangedListener( const Reference< util::XModifyListener >& xListener ) throw (RuntimeException) 407*cdf0e10cSrcweir { 408*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir if( mpViewListeners.get() ) 411*cdf0e10cSrcweir mpViewListeners->removeListener( xListener ); 412*cdf0e10cSrcweir } 413*cdf0e10cSrcweir 414*cdf0e10cSrcweir void SAL_CALL SlideShowView::addPaintListener( const Reference< awt::XPaintListener >& xListener ) throw (RuntimeException) 415*cdf0e10cSrcweir { 416*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 417*cdf0e10cSrcweir 418*cdf0e10cSrcweir if( mpPaintListeners.get() ) 419*cdf0e10cSrcweir mpPaintListeners->addTypedListener( xListener ); 420*cdf0e10cSrcweir } 421*cdf0e10cSrcweir 422*cdf0e10cSrcweir void SAL_CALL SlideShowView::removePaintListener( const Reference< awt::XPaintListener >& xListener ) throw (RuntimeException) 423*cdf0e10cSrcweir { 424*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir if( mpPaintListeners.get() ) 427*cdf0e10cSrcweir mpPaintListeners->removeTypedListener( xListener ); 428*cdf0e10cSrcweir } 429*cdf0e10cSrcweir 430*cdf0e10cSrcweir void SAL_CALL SlideShowView::addMouseListener( const Reference< awt::XMouseListener >& xListener ) throw (RuntimeException) 431*cdf0e10cSrcweir { 432*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 433*cdf0e10cSrcweir 434*cdf0e10cSrcweir if( mpMouseListeners.get() ) 435*cdf0e10cSrcweir mpMouseListeners->addTypedListener( xListener ); 436*cdf0e10cSrcweir } 437*cdf0e10cSrcweir 438*cdf0e10cSrcweir void SAL_CALL SlideShowView::removeMouseListener( const Reference< awt::XMouseListener >& xListener ) throw (RuntimeException) 439*cdf0e10cSrcweir { 440*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 441*cdf0e10cSrcweir 442*cdf0e10cSrcweir if( mpMouseListeners.get() ) 443*cdf0e10cSrcweir mpMouseListeners->removeTypedListener( xListener ); 444*cdf0e10cSrcweir } 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir void SAL_CALL SlideShowView::addMouseMotionListener( const Reference< awt::XMouseMotionListener >& xListener ) throw (RuntimeException) 447*cdf0e10cSrcweir { 448*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir if( !mbIsMouseMotionListener && mxWindow.is() ) 451*cdf0e10cSrcweir { 452*cdf0e10cSrcweir // delay motion event registration, until we really 453*cdf0e10cSrcweir // need it 454*cdf0e10cSrcweir mbIsMouseMotionListener = true; 455*cdf0e10cSrcweir mxWindow->addMouseMotionListener( this ); 456*cdf0e10cSrcweir } 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir if( mpMouseMotionListeners.get() ) 459*cdf0e10cSrcweir mpMouseMotionListeners->addTypedListener( xListener ); 460*cdf0e10cSrcweir } 461*cdf0e10cSrcweir 462*cdf0e10cSrcweir void SAL_CALL SlideShowView::removeMouseMotionListener( const Reference< awt::XMouseMotionListener >& xListener ) throw (RuntimeException) 463*cdf0e10cSrcweir { 464*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 465*cdf0e10cSrcweir 466*cdf0e10cSrcweir if( mpMouseMotionListeners.get() ) 467*cdf0e10cSrcweir mpMouseMotionListeners->removeTypedListener( xListener ); 468*cdf0e10cSrcweir 469*cdf0e10cSrcweir // TODO(P1): Might be nice to deregister for mouse motion 470*cdf0e10cSrcweir // events, when the last listener is gone. 471*cdf0e10cSrcweir } 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir void SAL_CALL SlideShowView::setMouseCursor( sal_Int16 nPointerShape ) throw (RuntimeException) 474*cdf0e10cSrcweir { 475*cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex ); 476*cdf0e10cSrcweir 477*cdf0e10cSrcweir // forward to window 478*cdf0e10cSrcweir if( mxPointer.is() ) 479*cdf0e10cSrcweir mxPointer->setType( nPointerShape ); 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir if( mxWindowPeer.is() ) 482*cdf0e10cSrcweir mxWindowPeer->setPointer( mxPointer ); 483*cdf0e10cSrcweir } 484*cdf0e10cSrcweir 485*cdf0e10cSrcweir awt::Rectangle SAL_CALL SlideShowView::getCanvasArea( ) throw (RuntimeException) 486*cdf0e10cSrcweir { 487*cdf0e10cSrcweir awt::Rectangle aRectangle; 488*cdf0e10cSrcweir 489*cdf0e10cSrcweir if( mxWindow.is() ) 490*cdf0e10cSrcweir return mxWindow->getPosSize(); 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir aRectangle.X = aRectangle.Y = aRectangle.Width = aRectangle.Height = 0; 493*cdf0e10cSrcweir 494*cdf0e10cSrcweir return aRectangle; 495*cdf0e10cSrcweir } 496*cdf0e10cSrcweir 497*cdf0e10cSrcweir void SlideShowView::updateimpl( ::osl::ClearableMutexGuard& rGuard, SlideshowImpl* pSlideShow ) 498*cdf0e10cSrcweir { 499*cdf0e10cSrcweir if( pSlideShow ) 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir ::rtl::Reference< SlideshowImpl > aSLGuard( pSlideShow ); 502*cdf0e10cSrcweir rGuard.clear(); 503*cdf0e10cSrcweir pSlideShow->startUpdateTimer(); 504*cdf0e10cSrcweir } 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir 507*cdf0e10cSrcweir // XWindowListener methods 508*cdf0e10cSrcweir void SAL_CALL SlideShowView::windowResized( const awt::WindowEvent& e ) throw (RuntimeException) 509*cdf0e10cSrcweir { 510*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( m_aMutex ); 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir if( mpViewListeners.get() ) 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir // Change event source, to enable listeners to match event 515*cdf0e10cSrcweir // with view 516*cdf0e10cSrcweir awt::WindowEvent aEvent( e ); 517*cdf0e10cSrcweir aEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); 518*cdf0e10cSrcweir 519*cdf0e10cSrcweir mpViewListeners->notify( aEvent ); 520*cdf0e10cSrcweir updateimpl( aGuard, mpSlideShow ); // warning: clears guard! 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir } 523*cdf0e10cSrcweir 524*cdf0e10cSrcweir void SAL_CALL SlideShowView::windowMoved( const awt::WindowEvent& ) throw (RuntimeException) 525*cdf0e10cSrcweir { 526*cdf0e10cSrcweir // ignored 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir void SAL_CALL SlideShowView::windowShown( const lang::EventObject& ) throw (RuntimeException) 530*cdf0e10cSrcweir { 531*cdf0e10cSrcweir // ignored 532*cdf0e10cSrcweir } 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir void SAL_CALL SlideShowView::windowHidden( const lang::EventObject& ) throw (RuntimeException) 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir // ignored 537*cdf0e10cSrcweir } 538*cdf0e10cSrcweir 539*cdf0e10cSrcweir // XMouseListener implementation 540*cdf0e10cSrcweir void SAL_CALL SlideShowView::mousePressed( const awt::MouseEvent& e ) throw (uno::RuntimeException) 541*cdf0e10cSrcweir { 542*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( m_aMutex ); 543*cdf0e10cSrcweir if( mpSlideShow && mpSlideShow->isInputFreezed() ) 544*cdf0e10cSrcweir { 545*cdf0e10cSrcweir mbMousePressedEaten = true; 546*cdf0e10cSrcweir } 547*cdf0e10cSrcweir else 548*cdf0e10cSrcweir { 549*cdf0e10cSrcweir mbMousePressedEaten = false; 550*cdf0e10cSrcweir 551*cdf0e10cSrcweir // Change event source, to enable listeners to match event 552*cdf0e10cSrcweir // with view 553*cdf0e10cSrcweir WrappedMouseEvent aEvent; 554*cdf0e10cSrcweir aEvent.meType = WrappedMouseEvent::PRESSED; 555*cdf0e10cSrcweir aEvent.maEvent = e; 556*cdf0e10cSrcweir aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir if( mpMouseListeners.get() ) 559*cdf0e10cSrcweir mpMouseListeners->notify( aEvent ); 560*cdf0e10cSrcweir updateimpl( aGuard, mpSlideShow ); // warning: clears guard! 561*cdf0e10cSrcweir } 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir 564*cdf0e10cSrcweir void SAL_CALL SlideShowView::mouseReleased( const awt::MouseEvent& e ) throw (uno::RuntimeException) 565*cdf0e10cSrcweir { 566*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( m_aMutex ); 567*cdf0e10cSrcweir if( mbMousePressedEaten ) 568*cdf0e10cSrcweir { 569*cdf0e10cSrcweir // if mouse button down was ignored, also ignore mouse button up 570*cdf0e10cSrcweir mbMousePressedEaten = false; 571*cdf0e10cSrcweir } 572*cdf0e10cSrcweir else if( mpSlideShow && !mpSlideShow->isInputFreezed() ) 573*cdf0e10cSrcweir { 574*cdf0e10cSrcweir // Change event source, to enable listeners to match event 575*cdf0e10cSrcweir // with view 576*cdf0e10cSrcweir WrappedMouseEvent aEvent; 577*cdf0e10cSrcweir aEvent.meType = WrappedMouseEvent::RELEASED; 578*cdf0e10cSrcweir aEvent.maEvent = e; 579*cdf0e10cSrcweir aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); 580*cdf0e10cSrcweir 581*cdf0e10cSrcweir if( mpMouseListeners.get() ) 582*cdf0e10cSrcweir mpMouseListeners->notify( aEvent ); 583*cdf0e10cSrcweir updateimpl( aGuard, mpSlideShow ); // warning: clears guard! 584*cdf0e10cSrcweir } 585*cdf0e10cSrcweir } 586*cdf0e10cSrcweir 587*cdf0e10cSrcweir void SAL_CALL SlideShowView::mouseEntered( const awt::MouseEvent& e ) throw (uno::RuntimeException) 588*cdf0e10cSrcweir { 589*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( m_aMutex ); 590*cdf0e10cSrcweir 591*cdf0e10cSrcweir // Change event source, to enable listeners to match event 592*cdf0e10cSrcweir // with view 593*cdf0e10cSrcweir WrappedMouseEvent aEvent; 594*cdf0e10cSrcweir aEvent.meType = WrappedMouseEvent::ENTERED; 595*cdf0e10cSrcweir aEvent.maEvent = e; 596*cdf0e10cSrcweir aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); 597*cdf0e10cSrcweir 598*cdf0e10cSrcweir if( mpMouseListeners.get() ) 599*cdf0e10cSrcweir mpMouseListeners->notify( aEvent ); 600*cdf0e10cSrcweir updateimpl( aGuard, mpSlideShow ); // warning: clears guard! 601*cdf0e10cSrcweir } 602*cdf0e10cSrcweir 603*cdf0e10cSrcweir void SAL_CALL SlideShowView::mouseExited( const awt::MouseEvent& e ) throw (uno::RuntimeException) 604*cdf0e10cSrcweir { 605*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( m_aMutex ); 606*cdf0e10cSrcweir 607*cdf0e10cSrcweir // Change event source, to enable listeners to match event 608*cdf0e10cSrcweir // with view 609*cdf0e10cSrcweir WrappedMouseEvent aEvent; 610*cdf0e10cSrcweir aEvent.meType = WrappedMouseEvent::EXITED; 611*cdf0e10cSrcweir aEvent.maEvent = e; 612*cdf0e10cSrcweir aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); 613*cdf0e10cSrcweir 614*cdf0e10cSrcweir if( mpMouseListeners.get() ) 615*cdf0e10cSrcweir mpMouseListeners->notify( aEvent ); 616*cdf0e10cSrcweir updateimpl( aGuard, mpSlideShow ); // warning: clears guard! 617*cdf0e10cSrcweir } 618*cdf0e10cSrcweir 619*cdf0e10cSrcweir // XMouseMotionListener implementation 620*cdf0e10cSrcweir void SAL_CALL SlideShowView::mouseDragged( const awt::MouseEvent& e ) throw (uno::RuntimeException) 621*cdf0e10cSrcweir { 622*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( m_aMutex ); 623*cdf0e10cSrcweir 624*cdf0e10cSrcweir // Change event source, to enable listeners to match event 625*cdf0e10cSrcweir // with view 626*cdf0e10cSrcweir WrappedMouseMotionEvent aEvent; 627*cdf0e10cSrcweir aEvent.meType = WrappedMouseMotionEvent::DRAGGED; 628*cdf0e10cSrcweir aEvent.maEvent = e; 629*cdf0e10cSrcweir aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); 630*cdf0e10cSrcweir 631*cdf0e10cSrcweir if( mpMouseMotionListeners.get() ) 632*cdf0e10cSrcweir mpMouseMotionListeners->notify( aEvent ); 633*cdf0e10cSrcweir updateimpl( aGuard, mpSlideShow ); // warning: clears guard! 634*cdf0e10cSrcweir } 635*cdf0e10cSrcweir 636*cdf0e10cSrcweir void SAL_CALL SlideShowView::mouseMoved( const awt::MouseEvent& e ) throw (uno::RuntimeException) 637*cdf0e10cSrcweir { 638*cdf0e10cSrcweir ::osl::ClearableMutexGuard aGuard( m_aMutex ); 639*cdf0e10cSrcweir 640*cdf0e10cSrcweir // Change event source, to enable listeners to match event 641*cdf0e10cSrcweir // with view 642*cdf0e10cSrcweir WrappedMouseMotionEvent aEvent; 643*cdf0e10cSrcweir aEvent.meType = WrappedMouseMotionEvent::MOVED; 644*cdf0e10cSrcweir aEvent.maEvent = e; 645*cdf0e10cSrcweir aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this ); 646*cdf0e10cSrcweir 647*cdf0e10cSrcweir if( mpMouseMotionListeners.get() ) 648*cdf0e10cSrcweir mpMouseMotionListeners->notify( aEvent ); 649*cdf0e10cSrcweir updateimpl( aGuard, mpSlideShow ); // warning: clears guard! 650*cdf0e10cSrcweir } 651*cdf0e10cSrcweir 652*cdf0e10cSrcweir void SlideShowView::init() 653*cdf0e10cSrcweir { 654*cdf0e10cSrcweir mxWindow->addWindowListener( this ); 655*cdf0e10cSrcweir mxWindow->addMouseListener( this ); 656*cdf0e10cSrcweir 657*cdf0e10cSrcweir Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory(), 658*cdf0e10cSrcweir uno::UNO_QUERY_THROW ); 659*cdf0e10cSrcweir 660*cdf0e10cSrcweir if( xFactory.is() ) 661*cdf0e10cSrcweir mxPointer.set( xFactory->createInstance( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.Pointer")) ), 662*cdf0e10cSrcweir uno::UNO_QUERY ); 663*cdf0e10cSrcweir 664*cdf0e10cSrcweir getTransformation(); 665*cdf0e10cSrcweir 666*cdf0e10cSrcweir // #i48939# only switch on kind of hacky scroll optimisation, when 667*cdf0e10cSrcweir // running fullscreen. this minimizes the probability that other 668*cdf0e10cSrcweir // windows partially cover the show. 669*cdf0e10cSrcweir if( mbFullScreen ) 670*cdf0e10cSrcweir { 671*cdf0e10cSrcweir try 672*cdf0e10cSrcweir { 673*cdf0e10cSrcweir Reference< beans::XPropertySet > xCanvasProps( getCanvas(), 674*cdf0e10cSrcweir uno::UNO_QUERY_THROW ); 675*cdf0e10cSrcweir xCanvasProps->setPropertyValue( 676*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UnsafeScrolling")), 677*cdf0e10cSrcweir uno::makeAny( true ) ); 678*cdf0e10cSrcweir } 679*cdf0e10cSrcweir catch( uno::Exception& ) 680*cdf0e10cSrcweir { 681*cdf0e10cSrcweir } 682*cdf0e10cSrcweir } 683*cdf0e10cSrcweir } 684*cdf0e10cSrcweir 685*cdf0e10cSrcweir } // namespace ::sd 686