/************************************************************************* * * 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: showwin.cxx,v $ * $Revision: 1.16 $ * * 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_sd.hxx" #include #include "showwindow.hxx" #include #include #include "res_bmp.hrc" #include "slideshow.hxx" #include "ViewShellBase.hxx" #include "slideshow.hxx" #include "sdresid.hxx" #include "helpids.h" #include "strings.hrc" #include using namespace ::com::sun::star; namespace sd { static const ULONG HIDE_MOUSE_TIMEOUT = 10000; static const ULONG SHOW_MOUSE_TIMEOUT = 1000; // ============================================================================= ShowWindow::ShowWindow( const ::rtl::Reference< SlideshowImpl >& xController, ::Window* pParent ) : ::sd::Window( pParent ) , mnPauseTimeout( SLIDE_NO_TIMEOUT ) , mnRestartPageIndex( PAGE_NO_END ) , meShowWindowMode(SHOWWINDOWMODE_NORMAL) , mbShowNavigatorAfterSpecialMode( FALSE ) , mbMouseAutoHide(true) , mbMouseCursorHidden(false) , mnFirstMouseMove(0) , mxController( xController ) { SetOutDevViewType( OUTDEV_VIEWTYPE_SLIDESHOW ); // Do never mirror the preview window. This explicitly includes right // to left writing environments. EnableRTL (FALSE); MapMode aMap(GetMapMode()); aMap.SetMapUnit(MAP_100TH_MM); SetMapMode(aMap); // HelpId setzen SetHelpId( HID_SD_WIN_PRESENTATION ); SetUniqueId( HID_SD_WIN_PRESENTATION ); maPauseTimer.SetTimeoutHdl( LINK( this, ShowWindow, PauseTimeoutHdl ) ); maPauseTimer.SetTimeout( 1000 ); maMouseTimer.SetTimeoutHdl( LINK( this, ShowWindow, MouseTimeoutHdl ) ); maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT ); maShowBackground = Wallpaper( Color( COL_BLACK ) ); // SetBackground( Wallpaper( Color( COL_BLACK ) ) ); SetBackground(); // avoids that VCL paints any background! GetParent()->Show(); AddEventListener( LINK( this, ShowWindow, EventHdl ) ); } ShowWindow::~ShowWindow(void) { maPauseTimer.Stop(); maMouseTimer.Stop(); } /************************************************************************* |* |* Keyboard event |* \************************************************************************/ void ShowWindow::KeyInput(const KeyEvent& rKEvt) { BOOL bReturn = FALSE; if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode ) { TerminateShow(); bReturn = true; } else if( SHOWWINDOWMODE_END == meShowWindowMode ) { const int nKeyCode = rKEvt.GetKeyCode().GetCode(); switch( nKeyCode ) { case KEY_PAGEUP: case KEY_LEFT: case KEY_UP: case KEY_P: case KEY_HOME: case KEY_END: case awt::Key::CONTEXTMENU: // these keys will be handled by the slide show even // while in end mode break; default: TerminateShow(); bReturn = true; } } else if( SHOWWINDOWMODE_BLANK == meShowWindowMode ) { RestartShow(); bReturn = true; } else if( SHOWWINDOWMODE_PAUSE == meShowWindowMode ) { const int nKeyCode = rKEvt.GetKeyCode().GetCode(); switch( nKeyCode ) { case KEY_ESCAPE: TerminateShow(); bReturn = true; break; case KEY_PAGEUP: case KEY_RIGHT: case KEY_UP: case KEY_P: case KEY_HOME: case KEY_END: case awt::Key::CONTEXTMENU: // these keys will be handled by the slide show even // while in end mode break; default: RestartShow(); bReturn = true; break; } } if( !bReturn ) { if( mxController.is() ) bReturn = mxController->keyInput(rKEvt); if( !bReturn ) { if( mpViewShell ) { mpViewShell->KeyInput(rKEvt,this); } else { Window::KeyInput(rKEvt); } } } if( mpViewShell ) mpViewShell->SetActiveWindow( this ); } /************************************************************************* |* |* MouseButtonDown event |* \************************************************************************/ void ShowWindow::MouseButtonDown(const MouseEvent& /*rMEvt*/) { if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode ) { TerminateShow(); } else if( mpViewShell ) { mpViewShell->SetActiveWindow( this ); } } /************************************************************************* |* |* MouseMove event |* \************************************************************************/ void ShowWindow::MouseMove(const MouseEvent& /*rMEvt*/) { if( mbMouseAutoHide ) { if( mbMouseCursorHidden ) { if( mnFirstMouseMove ) { // if this is not the first mouse move while hidden, see if // enough time has pasted to show mouse pointer again ULONG nTime = Time::GetSystemTicks(); if( (nTime - mnFirstMouseMove) >= SHOW_MOUSE_TIMEOUT ) { ShowPointer( TRUE ); mnFirstMouseMove = 0; mbMouseCursorHidden = false; maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT ); maMouseTimer.Start(); } } else { // if this is the first mouse move, note current // time and start idle timer to cancel show mouse pointer // again if not enough mouse movement is measured mnFirstMouseMove = Time::GetSystemTicks(); maMouseTimer.SetTimeout( 2*SHOW_MOUSE_TIMEOUT ); maMouseTimer.Start(); } } else { // current mousemove restarts the idle timer to hide the mouse maMouseTimer.Start(); } } if( mpViewShell ) mpViewShell->SetActiveWindow( this ); } /************************************************************************* |* |* MouseButtonUp event |* \************************************************************************/ void ShowWindow::MouseButtonUp(const MouseEvent& rMEvt) { if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode ) { TerminateShow(); } else if( (SHOWWINDOWMODE_END == meShowWindowMode) && !rMEvt.IsRight() ) { TerminateShow(); } else if( (( SHOWWINDOWMODE_BLANK == meShowWindowMode ) || ( SHOWWINDOWMODE_PAUSE == meShowWindowMode )) && !rMEvt.IsRight() ) { RestartShow(); } else { if( mxController.is() ) mxController->mouseButtonUp( rMEvt ); } } /************************************************************************* |* |* Paint-Event: wenn FuSlideShow noch erreichbar ist, weiterleiten |* \************************************************************************/ void ShowWindow::Paint(const Rectangle& rRect) { if( (meShowWindowMode == SHOWWINDOWMODE_NORMAL) || (meShowWindowMode == SHOWWINDOWMODE_PREVIEW) ) { /* Region aOldClipRegion( GetClipRegion() ); Region aClipRegion( rRect ); aClipRegion.Exclude( maPresArea ); SetClipRegion( aClipRegion ); DrawWallpaper( rRect, maShowBackground ); SetClipRegion( aOldClipRegion ); */ if( mxController.is() ) { mxController->paint(rRect); } else if(mpViewShell ) { mpViewShell->Paint(rRect, this); } } else { DrawWallpaper( rRect, maShowBackground ); if( SHOWWINDOWMODE_END == meShowWindowMode ) { DrawEndScene(); } else if( SHOWWINDOWMODE_PAUSE == meShowWindowMode ) { DrawPauseScene( FALSE ); } else if( SHOWWINDOWMODE_BLANK == meShowWindowMode ) { DrawBlankScene(); } } } /************************************************************************* |* |* Notify |* \************************************************************************/ long ShowWindow::Notify(NotifyEvent& rNEvt) { long nOK = FALSE; /* if( mpViewShell && rNEvt.GetType() == EVENT_GETFOCUS ) { NotifyEvent aNEvt(EVENT_GETFOCUS, this); nOK = mpViewShell->GetViewFrame()->GetWindow().Notify(aNEvt); } */ if (!nOK) nOK = Window::Notify(rNEvt); return nOK; } // ----------------------------------------------------------------------------- void ShowWindow::GetFocus() { // Basisklasse Window::GetFocus(); /* if( mpViewShell ) { NotifyEvent aNEvt(EVENT_GETFOCUS, this); mpViewShell->GetViewFrame()->GetWindow().Notify(aNEvt); } */ } // ----------------------------------------------------------------------------- void ShowWindow::LoseFocus() { Window::LoseFocus(); if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode) TerminateShow(); } // ----------------------------------------------------------------------------- void ShowWindow::Resize() { ::sd::Window::Resize(); } // ----------------------------------------------------------------------------- void ShowWindow::Move() { ::sd::Window::Move(); } // ----------------------------------------------------------------------------- BOOL ShowWindow::SetEndMode() { if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() ) { DeleteWindowFromPaintView(); meShowWindowMode = SHOWWINDOWMODE_END; // maShowBackground = GetBackground(); // SetBackground( Wallpaper( Color( COL_BLACK ) ) ); maShowBackground = Wallpaper( Color( COL_BLACK ) ); // hide navigator if it is visible if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) ) { mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, FALSE ); mbShowNavigatorAfterSpecialMode = TRUE; } Invalidate(); } return( SHOWWINDOWMODE_END == meShowWindowMode ); } // ----------------------------------------------------------------------------- BOOL ShowWindow::SetPauseMode( sal_Int32 nPageIndexToRestart, sal_Int32 nTimeout, Graphic* pLogo ) { rtl::Reference< SlideShow > xSlideShow; if( mpViewShell ) xSlideShow = SlideShow::GetSlideShow( mpViewShell->GetViewShellBase() ); if( xSlideShow.is() && !nTimeout ) { xSlideShow->jumpToPageIndex( nPageIndexToRestart ); } else if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() ) { DeleteWindowFromPaintView(); mnPauseTimeout = nTimeout; mnRestartPageIndex = nPageIndexToRestart; meShowWindowMode = SHOWWINDOWMODE_PAUSE; // maShowBackground = GetBackground(); // SetBackground( Wallpaper( Color( COL_BLACK ) ) ); maShowBackground = Wallpaper( Color( COL_BLACK ) ); // hide navigator if it is visible if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) ) { mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, FALSE ); mbShowNavigatorAfterSpecialMode = TRUE; } if( pLogo ) maLogo = *pLogo; Invalidate(); if( SLIDE_NO_TIMEOUT != mnPauseTimeout ) maPauseTimer.Start(); } return( SHOWWINDOWMODE_PAUSE == meShowWindowMode ); } // ----------------------------------------------------------------------------- BOOL ShowWindow::SetBlankMode( sal_Int32 nPageIndexToRestart, const Color& rBlankColor ) { if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() ) { DeleteWindowFromPaintView(); mnRestartPageIndex = nPageIndexToRestart; meShowWindowMode = SHOWWINDOWMODE_BLANK; // maShowBackground = GetBackground(); // SetBackground( Wallpaper( rBlankColor ) ); maShowBackground = Wallpaper( rBlankColor ); // hide navigator if it is visible if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) ) { mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, FALSE ); mbShowNavigatorAfterSpecialMode = TRUE; } Invalidate(); } return( SHOWWINDOWMODE_BLANK == meShowWindowMode ); } // ----------------------------------------------------------------------------- void ShowWindow::SetPreviewMode() { meShowWindowMode = SHOWWINDOWMODE_PREVIEW; } // ----------------------------------------------------------------------------- void ShowWindow::TerminateShow() { maLogo.Clear(); maPauseTimer.Stop(); maMouseTimer.Stop(); Erase(); // SetBackground( maShowBackground ); maShowBackground = Wallpaper( Color( COL_BLACK ) ); meShowWindowMode = SHOWWINDOWMODE_NORMAL; mnPauseTimeout = SLIDE_NO_TIMEOUT; if( mpViewShell ) { // show navigator? if( mbShowNavigatorAfterSpecialMode ) { mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, TRUE ); mbShowNavigatorAfterSpecialMode = FALSE; } } if( mxController.is() ) mxController->endPresentation(); mnRestartPageIndex = PAGE_NO_END; } // ----------------------------------------------------------------------------- void ShowWindow::RestartShow() { RestartShow( mnRestartPageIndex ); } // ----------------------------------------------------------------------------- void ShowWindow::RestartShow( sal_Int32 nPageIndexToRestart ) { ShowWindowMode eOldShowWindowMode = meShowWindowMode; maLogo.Clear(); maPauseTimer.Stop(); Erase(); // SetBackground( maShowBackground ); maShowBackground = Wallpaper( Color( COL_BLACK ) ); meShowWindowMode = SHOWWINDOWMODE_NORMAL; mnPauseTimeout = SLIDE_NO_TIMEOUT; if( mpViewShell ) { rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( mpViewShell->GetViewShellBase() ) ); if( xSlideShow.is() ) { AddWindowToPaintView(); if( SHOWWINDOWMODE_BLANK == eOldShowWindowMode ) { xSlideShow->pause(false); Invalidate(); } else { xSlideShow->jumpToPageIndex( nPageIndexToRestart ); } } } mnRestartPageIndex = PAGE_NO_END; // show navigator? if( mbShowNavigatorAfterSpecialMode ) { mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, TRUE ); mbShowNavigatorAfterSpecialMode = FALSE; } } // ----------------------------------------------------------------------------- void ShowWindow::DrawPauseScene( BOOL bTimeoutOnly ) { const MapMode& rMap = GetMapMode(); const Point aOutOrg( PixelToLogic( Point() ) ); const Size aOutSize( GetOutputSize() ); const Size aTextSize( LogicToLogic( Size( 0, 14 ), MAP_POINT, rMap ) ); const Size aOffset( LogicToLogic( Size( 1000, 1000 ), MAP_100TH_MM, rMap ) ); String aText( SdResId( STR_PRES_PAUSE ) ); BOOL bDrawn = FALSE; Font aFont( GetSettings().GetStyleSettings().GetMenuFont() ); const Font aOldFont( GetFont() ); aFont.SetSize( aTextSize ); aFont.SetColor( COL_WHITE ); aFont.SetCharSet( aOldFont.GetCharSet() ); aFont.SetLanguage( aOldFont.GetLanguage() ); if( !bTimeoutOnly && ( maLogo.GetType() != GRAPHIC_NONE ) ) { Size aGrfSize; if( maLogo.GetPrefMapMode() == MAP_PIXEL ) aGrfSize = PixelToLogic( maLogo.GetPrefSize() ); else aGrfSize = LogicToLogic( maLogo.GetPrefSize(), maLogo.GetPrefMapMode(), rMap ); const Point aGrfPos( Max( aOutOrg.X() + aOutSize.Width() - aGrfSize.Width() - aOffset.Width(), aOutOrg.X() ), Max( aOutOrg.Y() + aOutSize.Height() - aGrfSize.Height() - aOffset.Height(), aOutOrg.Y() ) ); if( maLogo.IsAnimated() ) maLogo.StartAnimation( this, aGrfPos, aGrfSize, (long) this ); else maLogo.Draw( this, aGrfPos, aGrfSize ); } if( SLIDE_NO_TIMEOUT != mnPauseTimeout ) { MapMode aVMap( rMap ); VirtualDevice aVDev( *this ); aVMap.SetOrigin( Point() ); aVDev.SetMapMode( aVMap ); aVDev.SetBackground( Wallpaper( Color( COL_BLACK ) ) ); // set font first, to determine real output height aVDev.SetFont( aFont ); const Size aVDevSize( aOutSize.Width(), aVDev.GetTextHeight() ); if( aVDev.SetOutputSize( aVDevSize ) ) { // Note: if performance gets an issue here, we can use NumberFormatter directly SvtSysLocale aSysLocale; const LocaleDataWrapper& aLocaleData = aSysLocale.GetLocaleData(); aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " ( " )); aText += aLocaleData.getDuration( Time( 0, 0, mnPauseTimeout ) ); aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " )" )); aVDev.DrawText( Point( aOffset.Width(), 0 ), aText ); DrawOutDev( Point( aOutOrg.X(), aOffset.Height() ), aVDevSize, Point(), aVDevSize, aVDev ); bDrawn = TRUE; } } if( !bDrawn ) { SetFont( aFont ); DrawText( Point( aOutOrg.X() + aOffset.Width(), aOutOrg.Y() + aOffset.Height() ), aText ); SetFont( aOldFont ); } } // ----------------------------------------------------------------------------- void ShowWindow::DrawEndScene() { const Font aOldFont( GetFont() ); Font aFont( GetSettings().GetStyleSettings().GetMenuFont() ); const Point aOutOrg( PixelToLogic( Point() ) ); const Size aTextSize( LogicToLogic( Size( 0, 14 ), MAP_POINT, GetMapMode() ) ); const String aText( SdResId( STR_PRES_SOFTEND ) ); aFont.SetSize( aTextSize ); aFont.SetColor( COL_WHITE ); aFont.SetCharSet( aOldFont.GetCharSet() ); aFont.SetLanguage( aOldFont.GetLanguage() ); SetFont( aFont ); DrawText( Point( aOutOrg.X() + aTextSize.Height(), aOutOrg.Y() + aTextSize.Height() ), aText ); SetFont( aOldFont ); } // ----------------------------------------------------------------------------- void ShowWindow::DrawBlankScene() { // just blank through background color => nothing to be done here } // ----------------------------------------------------------------------------- IMPL_LINK( ShowWindow, PauseTimeoutHdl, Timer*, pTimer ) { if( !( --mnPauseTimeout ) ) RestartShow(); else { DrawPauseScene( TRUE ); pTimer->Start(); } return 0L; } IMPL_LINK( ShowWindow, MouseTimeoutHdl, Timer*, EMPTYARG ) { if( mbMouseCursorHidden ) { // not enough mouse movements since first recording so // cancle show mouse pointer for now mnFirstMouseMove = 0; } else { // mouse has been idle to long, hide pointer ShowPointer( FALSE ); mbMouseCursorHidden = true; } return 0L; } IMPL_LINK( ShowWindow, EventHdl, VclWindowEvent*, pEvent ) { if( mbMouseAutoHide ) { if (pEvent->GetId() == VCLEVENT_WINDOW_SHOW) { maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT ); maMouseTimer.Start(); } } return 0L; } void ShowWindow::SetPresentationArea( const Rectangle& rPresArea ) { maPresArea = rPresArea; } void ShowWindow::DeleteWindowFromPaintView() { if( mpViewShell->GetView() ) mpViewShell->GetView()->DeleteWindowFromPaintView( this ); USHORT nChild = GetChildCount(); while( nChild-- ) GetChild( nChild )->Show( FALSE ); } void ShowWindow::AddWindowToPaintView() { if( mpViewShell->GetView() ) mpViewShell->GetView()->AddWindowToPaintView( this ); USHORT nChild = GetChildCount(); while( nChild-- ) GetChild( nChild )->Show( TRUE ); } } // end of namespace sd