xref: /trunk/main/sd/source/ui/slideshow/showwin.cxx (revision 5b1900111deff329a5580f97b99b67a25168e53d)
1*5b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5b190011SAndrew Rist  * distributed with this work for additional information
6*5b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5b190011SAndrew Rist  * "License"); you may not use this file except in compliance
9*5b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*5b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*5b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5b190011SAndrew Rist  * software distributed under the License is distributed on an
15*5b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
17*5b190011SAndrew Rist  * specific language governing permissions and limitations
18*5b190011SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*5b190011SAndrew Rist  *************************************************************/
21*5b190011SAndrew Rist 
22*5b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <com/sun/star/awt/Key.hpp>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "showwindow.hxx"
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <unotools/syslocale.hxx>
32cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include "res_bmp.hrc"
36cdf0e10cSrcweir #include "slideshow.hxx"
37cdf0e10cSrcweir #include "ViewShellBase.hxx"
38cdf0e10cSrcweir #include "slideshow.hxx"
39cdf0e10cSrcweir #include "sdresid.hxx"
40cdf0e10cSrcweir #include "helpids.h"
41cdf0e10cSrcweir #include "strings.hrc"
42cdf0e10cSrcweir #include <vcl/virdev.hxx>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir using namespace ::com::sun::star;
45cdf0e10cSrcweir 
46cdf0e10cSrcweir namespace sd {
47cdf0e10cSrcweir 
48cdf0e10cSrcweir static const sal_uLong HIDE_MOUSE_TIMEOUT = 10000;
49cdf0e10cSrcweir static const sal_uLong SHOW_MOUSE_TIMEOUT = 1000;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir // =============================================================================
52cdf0e10cSrcweir 
53cdf0e10cSrcweir ShowWindow::ShowWindow( const ::rtl::Reference< SlideshowImpl >& xController, ::Window* pParent )
54cdf0e10cSrcweir : ::sd::Window( pParent )
55cdf0e10cSrcweir , mnPauseTimeout( SLIDE_NO_TIMEOUT )
56cdf0e10cSrcweir , mnRestartPageIndex( PAGE_NO_END )
57cdf0e10cSrcweir , meShowWindowMode(SHOWWINDOWMODE_NORMAL)
58cdf0e10cSrcweir , mbShowNavigatorAfterSpecialMode( sal_False )
59cdf0e10cSrcweir , mbMouseAutoHide(true)
60cdf0e10cSrcweir , mbMouseCursorHidden(false)
61cdf0e10cSrcweir , mnFirstMouseMove(0)
62cdf0e10cSrcweir , mxController( xController )
63cdf0e10cSrcweir {
64cdf0e10cSrcweir     SetOutDevViewType( OUTDEV_VIEWTYPE_SLIDESHOW );
65cdf0e10cSrcweir 
66cdf0e10cSrcweir     // Do never mirror the preview window.  This explicitly includes right
67cdf0e10cSrcweir     // to left writing environments.
68cdf0e10cSrcweir     EnableRTL (sal_False);
69cdf0e10cSrcweir 
70cdf0e10cSrcweir     MapMode aMap(GetMapMode());
71cdf0e10cSrcweir     aMap.SetMapUnit(MAP_100TH_MM);
72cdf0e10cSrcweir     SetMapMode(aMap);
73cdf0e10cSrcweir 
74cdf0e10cSrcweir     // HelpId setzen
75cdf0e10cSrcweir     SetHelpId( HID_SD_WIN_PRESENTATION );
76cdf0e10cSrcweir     SetUniqueId( HID_SD_WIN_PRESENTATION );
77cdf0e10cSrcweir 
78cdf0e10cSrcweir     maPauseTimer.SetTimeoutHdl( LINK( this, ShowWindow, PauseTimeoutHdl ) );
79cdf0e10cSrcweir     maPauseTimer.SetTimeout( 1000 );
80cdf0e10cSrcweir     maMouseTimer.SetTimeoutHdl( LINK( this, ShowWindow, MouseTimeoutHdl ) );
81cdf0e10cSrcweir     maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT );
82cdf0e10cSrcweir 
83cdf0e10cSrcweir     maShowBackground = Wallpaper( Color( COL_BLACK ) );
84cdf0e10cSrcweir //  SetBackground( Wallpaper( Color( COL_BLACK ) ) );
85cdf0e10cSrcweir     SetBackground(); // avoids that VCL paints any background!
86cdf0e10cSrcweir     GetParent()->Show();
87cdf0e10cSrcweir     AddEventListener( LINK( this, ShowWindow, EventHdl ) );
88cdf0e10cSrcweir }
89cdf0e10cSrcweir 
90cdf0e10cSrcweir ShowWindow::~ShowWindow(void)
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     maPauseTimer.Stop();
93cdf0e10cSrcweir     maMouseTimer.Stop();
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
96cdf0e10cSrcweir /*************************************************************************
97cdf0e10cSrcweir |*
98cdf0e10cSrcweir |* Keyboard event
99cdf0e10cSrcweir |*
100cdf0e10cSrcweir \************************************************************************/
101cdf0e10cSrcweir 
102cdf0e10cSrcweir void ShowWindow::KeyInput(const KeyEvent& rKEvt)
103cdf0e10cSrcweir {
104cdf0e10cSrcweir     sal_Bool bReturn = sal_False;
105cdf0e10cSrcweir 
106cdf0e10cSrcweir     if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode )
107cdf0e10cSrcweir     {
108cdf0e10cSrcweir         TerminateShow();
109cdf0e10cSrcweir         bReturn = true;
110cdf0e10cSrcweir     }
111cdf0e10cSrcweir     else if( SHOWWINDOWMODE_END == meShowWindowMode )
112cdf0e10cSrcweir     {
113cdf0e10cSrcweir         const int nKeyCode = rKEvt.GetKeyCode().GetCode();
114cdf0e10cSrcweir         switch( nKeyCode )
115cdf0e10cSrcweir         {
116cdf0e10cSrcweir         case KEY_PAGEUP:
117cdf0e10cSrcweir         case KEY_LEFT:
118cdf0e10cSrcweir         case KEY_UP:
119cdf0e10cSrcweir         case KEY_P:
120cdf0e10cSrcweir         case KEY_HOME:
121cdf0e10cSrcweir         case KEY_END:
122cdf0e10cSrcweir         case awt::Key::CONTEXTMENU:
123cdf0e10cSrcweir             // these keys will be handled by the slide show even
124cdf0e10cSrcweir             // while in end mode
125cdf0e10cSrcweir             break;
126cdf0e10cSrcweir         default:
127cdf0e10cSrcweir             TerminateShow();
128cdf0e10cSrcweir             bReturn = true;
129cdf0e10cSrcweir         }
130cdf0e10cSrcweir     }
131cdf0e10cSrcweir     else if( SHOWWINDOWMODE_BLANK == meShowWindowMode )
132cdf0e10cSrcweir     {
133cdf0e10cSrcweir         RestartShow();
134cdf0e10cSrcweir         bReturn = true;
135cdf0e10cSrcweir     }
136cdf0e10cSrcweir     else if( SHOWWINDOWMODE_PAUSE == meShowWindowMode )
137cdf0e10cSrcweir     {
138cdf0e10cSrcweir         const int nKeyCode = rKEvt.GetKeyCode().GetCode();
139cdf0e10cSrcweir         switch( nKeyCode )
140cdf0e10cSrcweir         {
141cdf0e10cSrcweir         case KEY_ESCAPE:
142cdf0e10cSrcweir             TerminateShow();
143cdf0e10cSrcweir             bReturn = true;
144cdf0e10cSrcweir             break;
145cdf0e10cSrcweir         case KEY_PAGEUP:
146cdf0e10cSrcweir         case KEY_RIGHT:
147cdf0e10cSrcweir         case KEY_UP:
148cdf0e10cSrcweir         case KEY_P:
149cdf0e10cSrcweir         case KEY_HOME:
150cdf0e10cSrcweir         case KEY_END:
151cdf0e10cSrcweir         case awt::Key::CONTEXTMENU:
152cdf0e10cSrcweir             // these keys will be handled by the slide show even
153cdf0e10cSrcweir             // while in end mode
154cdf0e10cSrcweir             break;
155cdf0e10cSrcweir         default:
156cdf0e10cSrcweir             RestartShow();
157cdf0e10cSrcweir             bReturn = true;
158cdf0e10cSrcweir             break;
159cdf0e10cSrcweir         }
160cdf0e10cSrcweir     }
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     if( !bReturn )
163cdf0e10cSrcweir     {
164cdf0e10cSrcweir         if( mxController.is() )
165cdf0e10cSrcweir             bReturn = mxController->keyInput(rKEvt);
166cdf0e10cSrcweir 
167cdf0e10cSrcweir         if( !bReturn )
168cdf0e10cSrcweir         {
169cdf0e10cSrcweir             if( mpViewShell )
170cdf0e10cSrcweir             {
171cdf0e10cSrcweir                 mpViewShell->KeyInput(rKEvt,this);
172cdf0e10cSrcweir             }
173cdf0e10cSrcweir             else
174cdf0e10cSrcweir             {
175cdf0e10cSrcweir                 Window::KeyInput(rKEvt);
176cdf0e10cSrcweir             }
177cdf0e10cSrcweir         }
178cdf0e10cSrcweir     }
179cdf0e10cSrcweir 
180cdf0e10cSrcweir     if( mpViewShell )
181cdf0e10cSrcweir         mpViewShell->SetActiveWindow( this );
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir /*************************************************************************
185cdf0e10cSrcweir |*
186cdf0e10cSrcweir |* MouseButtonDown event
187cdf0e10cSrcweir |*
188cdf0e10cSrcweir \************************************************************************/
189cdf0e10cSrcweir 
190cdf0e10cSrcweir void ShowWindow::MouseButtonDown(const MouseEvent& /*rMEvt*/)
191cdf0e10cSrcweir {
192cdf0e10cSrcweir     if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode )
193cdf0e10cSrcweir     {
194cdf0e10cSrcweir         TerminateShow();
195cdf0e10cSrcweir     }
196cdf0e10cSrcweir     else if( mpViewShell )
197cdf0e10cSrcweir     {
198cdf0e10cSrcweir         mpViewShell->SetActiveWindow( this );
199cdf0e10cSrcweir     }
200cdf0e10cSrcweir }
201cdf0e10cSrcweir 
202cdf0e10cSrcweir /*************************************************************************
203cdf0e10cSrcweir |*
204cdf0e10cSrcweir |* MouseMove event
205cdf0e10cSrcweir |*
206cdf0e10cSrcweir \************************************************************************/
207cdf0e10cSrcweir 
208cdf0e10cSrcweir void ShowWindow::MouseMove(const MouseEvent& /*rMEvt*/)
209cdf0e10cSrcweir {
210cdf0e10cSrcweir     if( mbMouseAutoHide )
211cdf0e10cSrcweir     {
212cdf0e10cSrcweir         if( mbMouseCursorHidden )
213cdf0e10cSrcweir         {
214cdf0e10cSrcweir             if( mnFirstMouseMove )
215cdf0e10cSrcweir             {
216cdf0e10cSrcweir                 // if this is not the first mouse move while hidden, see if
217cdf0e10cSrcweir                 // enough time has pasted to show mouse pointer again
218cdf0e10cSrcweir                 sal_uLong nTime = Time::GetSystemTicks();
219cdf0e10cSrcweir                 if( (nTime - mnFirstMouseMove) >= SHOW_MOUSE_TIMEOUT )
220cdf0e10cSrcweir                 {
221cdf0e10cSrcweir                     ShowPointer( sal_True );
222cdf0e10cSrcweir                     mnFirstMouseMove = 0;
223cdf0e10cSrcweir                     mbMouseCursorHidden = false;
224cdf0e10cSrcweir                     maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT );
225cdf0e10cSrcweir                     maMouseTimer.Start();
226cdf0e10cSrcweir                 }
227cdf0e10cSrcweir             }
228cdf0e10cSrcweir             else
229cdf0e10cSrcweir             {
230cdf0e10cSrcweir                 // if this is the first mouse move, note current
231cdf0e10cSrcweir                 // time and start idle timer to cancel show mouse pointer
232cdf0e10cSrcweir                 // again if not enough mouse movement is measured
233cdf0e10cSrcweir                 mnFirstMouseMove = Time::GetSystemTicks();
234cdf0e10cSrcweir                 maMouseTimer.SetTimeout( 2*SHOW_MOUSE_TIMEOUT );
235cdf0e10cSrcweir                 maMouseTimer.Start();
236cdf0e10cSrcweir             }
237cdf0e10cSrcweir         }
238cdf0e10cSrcweir         else
239cdf0e10cSrcweir         {
240cdf0e10cSrcweir             // current mousemove restarts the idle timer to hide the mouse
241cdf0e10cSrcweir             maMouseTimer.Start();
242cdf0e10cSrcweir         }
243cdf0e10cSrcweir     }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir     if( mpViewShell )
246cdf0e10cSrcweir         mpViewShell->SetActiveWindow( this );
247cdf0e10cSrcweir }
248cdf0e10cSrcweir 
249cdf0e10cSrcweir /*************************************************************************
250cdf0e10cSrcweir |*
251cdf0e10cSrcweir |* MouseButtonUp event
252cdf0e10cSrcweir |*
253cdf0e10cSrcweir \************************************************************************/
254cdf0e10cSrcweir 
255cdf0e10cSrcweir void ShowWindow::MouseButtonUp(const MouseEvent& rMEvt)
256cdf0e10cSrcweir {
257cdf0e10cSrcweir     if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode )
258cdf0e10cSrcweir     {
259cdf0e10cSrcweir         TerminateShow();
260cdf0e10cSrcweir     }
261cdf0e10cSrcweir     else if( (SHOWWINDOWMODE_END == meShowWindowMode) && !rMEvt.IsRight() )
262cdf0e10cSrcweir     {
263cdf0e10cSrcweir         TerminateShow();
264cdf0e10cSrcweir     }
265cdf0e10cSrcweir     else if( (( SHOWWINDOWMODE_BLANK == meShowWindowMode ) || ( SHOWWINDOWMODE_PAUSE == meShowWindowMode ))
266cdf0e10cSrcweir              && !rMEvt.IsRight() )
267cdf0e10cSrcweir     {
268cdf0e10cSrcweir         RestartShow();
269cdf0e10cSrcweir     }
270cdf0e10cSrcweir     else
271cdf0e10cSrcweir     {
272cdf0e10cSrcweir         if( mxController.is() )
273cdf0e10cSrcweir             mxController->mouseButtonUp( rMEvt );
274cdf0e10cSrcweir     }
275cdf0e10cSrcweir }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir /*************************************************************************
278cdf0e10cSrcweir |*
279cdf0e10cSrcweir |* Paint-Event: wenn FuSlideShow noch erreichbar ist, weiterleiten
280cdf0e10cSrcweir |*
281cdf0e10cSrcweir \************************************************************************/
282cdf0e10cSrcweir 
283cdf0e10cSrcweir void ShowWindow::Paint(const Rectangle& rRect)
284cdf0e10cSrcweir {
285cdf0e10cSrcweir     if( (meShowWindowMode == SHOWWINDOWMODE_NORMAL) || (meShowWindowMode == SHOWWINDOWMODE_PREVIEW) )
286cdf0e10cSrcweir     {
287cdf0e10cSrcweir /*
288cdf0e10cSrcweir         Region aOldClipRegion( GetClipRegion() );
289cdf0e10cSrcweir 
290cdf0e10cSrcweir         Region aClipRegion( rRect );
291cdf0e10cSrcweir         aClipRegion.Exclude( maPresArea );
292cdf0e10cSrcweir         SetClipRegion( aClipRegion );
293cdf0e10cSrcweir 
294cdf0e10cSrcweir         DrawWallpaper( rRect, maShowBackground );
295cdf0e10cSrcweir 
296cdf0e10cSrcweir         SetClipRegion( aOldClipRegion );
297cdf0e10cSrcweir */
298cdf0e10cSrcweir         if( mxController.is() )
299cdf0e10cSrcweir         {
300cdf0e10cSrcweir             mxController->paint(rRect);
301cdf0e10cSrcweir         }
302cdf0e10cSrcweir         else if(mpViewShell )
303cdf0e10cSrcweir         {
304cdf0e10cSrcweir             mpViewShell->Paint(rRect, this);
305cdf0e10cSrcweir         }
306cdf0e10cSrcweir     }
307cdf0e10cSrcweir     else
308cdf0e10cSrcweir     {
309cdf0e10cSrcweir         DrawWallpaper( rRect, maShowBackground );
310cdf0e10cSrcweir 
311cdf0e10cSrcweir         if( SHOWWINDOWMODE_END == meShowWindowMode )
312cdf0e10cSrcweir         {
313cdf0e10cSrcweir             DrawEndScene();
314cdf0e10cSrcweir         }
315cdf0e10cSrcweir         else if( SHOWWINDOWMODE_PAUSE == meShowWindowMode )
316cdf0e10cSrcweir         {
317cdf0e10cSrcweir             DrawPauseScene( sal_False );
318cdf0e10cSrcweir         }
319cdf0e10cSrcweir         else if( SHOWWINDOWMODE_BLANK == meShowWindowMode )
320cdf0e10cSrcweir         {
321cdf0e10cSrcweir             DrawBlankScene();
322cdf0e10cSrcweir         }
323cdf0e10cSrcweir     }
324cdf0e10cSrcweir }
325cdf0e10cSrcweir 
326cdf0e10cSrcweir /*************************************************************************
327cdf0e10cSrcweir |*
328cdf0e10cSrcweir |* Notify
329cdf0e10cSrcweir |*
330cdf0e10cSrcweir \************************************************************************/
331cdf0e10cSrcweir 
332cdf0e10cSrcweir long ShowWindow::Notify(NotifyEvent& rNEvt)
333cdf0e10cSrcweir {
334cdf0e10cSrcweir     long nOK = sal_False;
335cdf0e10cSrcweir /*
336cdf0e10cSrcweir     if( mpViewShell && rNEvt.GetType() == EVENT_GETFOCUS )
337cdf0e10cSrcweir     {
338cdf0e10cSrcweir         NotifyEvent aNEvt(EVENT_GETFOCUS, this);
339cdf0e10cSrcweir         nOK = mpViewShell->GetViewFrame()->GetWindow().Notify(aNEvt);
340cdf0e10cSrcweir     }
341cdf0e10cSrcweir */
342cdf0e10cSrcweir     if (!nOK)
343cdf0e10cSrcweir         nOK = Window::Notify(rNEvt);
344cdf0e10cSrcweir 
345cdf0e10cSrcweir     return nOK;
346cdf0e10cSrcweir }
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 
349cdf0e10cSrcweir // -----------------------------------------------------------------------------
350cdf0e10cSrcweir 
351cdf0e10cSrcweir void ShowWindow::GetFocus()
352cdf0e10cSrcweir {
353cdf0e10cSrcweir     // Basisklasse
354cdf0e10cSrcweir     Window::GetFocus();
355cdf0e10cSrcweir /*
356cdf0e10cSrcweir     if( mpViewShell )
357cdf0e10cSrcweir     {
358cdf0e10cSrcweir         NotifyEvent aNEvt(EVENT_GETFOCUS, this);
359cdf0e10cSrcweir         mpViewShell->GetViewFrame()->GetWindow().Notify(aNEvt);
360cdf0e10cSrcweir     }
361cdf0e10cSrcweir */
362cdf0e10cSrcweir }
363cdf0e10cSrcweir 
364cdf0e10cSrcweir // -----------------------------------------------------------------------------
365cdf0e10cSrcweir 
366cdf0e10cSrcweir void ShowWindow::LoseFocus()
367cdf0e10cSrcweir {
368cdf0e10cSrcweir     Window::LoseFocus();
369cdf0e10cSrcweir 
370cdf0e10cSrcweir     if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode)
371cdf0e10cSrcweir         TerminateShow();
372cdf0e10cSrcweir }
373cdf0e10cSrcweir 
374cdf0e10cSrcweir // -----------------------------------------------------------------------------
375cdf0e10cSrcweir 
376cdf0e10cSrcweir void ShowWindow::Resize()
377cdf0e10cSrcweir {
378cdf0e10cSrcweir     ::sd::Window::Resize();
379cdf0e10cSrcweir }
380cdf0e10cSrcweir 
381cdf0e10cSrcweir // -----------------------------------------------------------------------------
382cdf0e10cSrcweir 
383cdf0e10cSrcweir void ShowWindow::Move()
384cdf0e10cSrcweir {
385cdf0e10cSrcweir     ::sd::Window::Move();
386cdf0e10cSrcweir }
387cdf0e10cSrcweir 
388cdf0e10cSrcweir // -----------------------------------------------------------------------------
389cdf0e10cSrcweir 
390cdf0e10cSrcweir sal_Bool ShowWindow::SetEndMode()
391cdf0e10cSrcweir {
392cdf0e10cSrcweir     if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() )
393cdf0e10cSrcweir     {
394cdf0e10cSrcweir         DeleteWindowFromPaintView();
395cdf0e10cSrcweir         meShowWindowMode = SHOWWINDOWMODE_END;
396cdf0e10cSrcweir //      maShowBackground = GetBackground();
397cdf0e10cSrcweir //      SetBackground( Wallpaper( Color( COL_BLACK ) ) );
398cdf0e10cSrcweir         maShowBackground = Wallpaper( Color( COL_BLACK ) );
399cdf0e10cSrcweir 
400cdf0e10cSrcweir         // hide navigator if it is visible
401cdf0e10cSrcweir         if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) )
402cdf0e10cSrcweir         {
403cdf0e10cSrcweir             mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, sal_False );
404cdf0e10cSrcweir             mbShowNavigatorAfterSpecialMode = sal_True;
405cdf0e10cSrcweir         }
406cdf0e10cSrcweir 
407cdf0e10cSrcweir         Invalidate();
408cdf0e10cSrcweir     }
409cdf0e10cSrcweir 
410cdf0e10cSrcweir     return( SHOWWINDOWMODE_END == meShowWindowMode );
411cdf0e10cSrcweir }
412cdf0e10cSrcweir 
413cdf0e10cSrcweir // -----------------------------------------------------------------------------
414cdf0e10cSrcweir 
415cdf0e10cSrcweir sal_Bool ShowWindow::SetPauseMode( sal_Int32 nPageIndexToRestart, sal_Int32 nTimeout, Graphic* pLogo )
416cdf0e10cSrcweir {
417cdf0e10cSrcweir     rtl::Reference< SlideShow > xSlideShow;
418cdf0e10cSrcweir 
419cdf0e10cSrcweir     if( mpViewShell )
420cdf0e10cSrcweir         xSlideShow = SlideShow::GetSlideShow( mpViewShell->GetViewShellBase() );
421cdf0e10cSrcweir 
422cdf0e10cSrcweir     if( xSlideShow.is() && !nTimeout )
423cdf0e10cSrcweir     {
424cdf0e10cSrcweir         xSlideShow->jumpToPageIndex( nPageIndexToRestart );
425cdf0e10cSrcweir     }
426cdf0e10cSrcweir     else if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() )
427cdf0e10cSrcweir     {
428cdf0e10cSrcweir         DeleteWindowFromPaintView();
429cdf0e10cSrcweir         mnPauseTimeout = nTimeout;
430cdf0e10cSrcweir         mnRestartPageIndex = nPageIndexToRestart;
431cdf0e10cSrcweir         meShowWindowMode = SHOWWINDOWMODE_PAUSE;
432cdf0e10cSrcweir //      maShowBackground = GetBackground();
433cdf0e10cSrcweir //      SetBackground( Wallpaper( Color( COL_BLACK ) ) );
434cdf0e10cSrcweir         maShowBackground = Wallpaper( Color( COL_BLACK ) );
435cdf0e10cSrcweir 
436cdf0e10cSrcweir         // hide navigator if it is visible
437cdf0e10cSrcweir         if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) )
438cdf0e10cSrcweir         {
439cdf0e10cSrcweir             mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, sal_False );
440cdf0e10cSrcweir             mbShowNavigatorAfterSpecialMode = sal_True;
441cdf0e10cSrcweir         }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir         if( pLogo )
444cdf0e10cSrcweir             maLogo = *pLogo;
445cdf0e10cSrcweir 
446cdf0e10cSrcweir         Invalidate();
447cdf0e10cSrcweir 
448cdf0e10cSrcweir         if( SLIDE_NO_TIMEOUT != mnPauseTimeout )
449cdf0e10cSrcweir             maPauseTimer.Start();
450cdf0e10cSrcweir     }
451cdf0e10cSrcweir 
452cdf0e10cSrcweir     return( SHOWWINDOWMODE_PAUSE == meShowWindowMode );
453cdf0e10cSrcweir }
454cdf0e10cSrcweir 
455cdf0e10cSrcweir // -----------------------------------------------------------------------------
456cdf0e10cSrcweir 
457cdf0e10cSrcweir sal_Bool ShowWindow::SetBlankMode( sal_Int32 nPageIndexToRestart, const Color& rBlankColor )
458cdf0e10cSrcweir {
459cdf0e10cSrcweir     if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() )
460cdf0e10cSrcweir     {
461cdf0e10cSrcweir         DeleteWindowFromPaintView();
462cdf0e10cSrcweir         mnRestartPageIndex = nPageIndexToRestart;
463cdf0e10cSrcweir         meShowWindowMode = SHOWWINDOWMODE_BLANK;
464cdf0e10cSrcweir //      maShowBackground = GetBackground();
465cdf0e10cSrcweir //      SetBackground( Wallpaper( rBlankColor ) );
466cdf0e10cSrcweir         maShowBackground = Wallpaper( rBlankColor );
467cdf0e10cSrcweir 
468cdf0e10cSrcweir         // hide navigator if it is visible
469cdf0e10cSrcweir         if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) )
470cdf0e10cSrcweir         {
471cdf0e10cSrcweir             mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, sal_False );
472cdf0e10cSrcweir             mbShowNavigatorAfterSpecialMode = sal_True;
473cdf0e10cSrcweir         }
474cdf0e10cSrcweir 
475cdf0e10cSrcweir         Invalidate();
476cdf0e10cSrcweir     }
477cdf0e10cSrcweir 
478cdf0e10cSrcweir     return( SHOWWINDOWMODE_BLANK == meShowWindowMode );
479cdf0e10cSrcweir }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir // -----------------------------------------------------------------------------
482cdf0e10cSrcweir 
483cdf0e10cSrcweir void ShowWindow::SetPreviewMode()
484cdf0e10cSrcweir {
485cdf0e10cSrcweir     meShowWindowMode = SHOWWINDOWMODE_PREVIEW;
486cdf0e10cSrcweir }
487cdf0e10cSrcweir 
488cdf0e10cSrcweir // -----------------------------------------------------------------------------
489cdf0e10cSrcweir 
490cdf0e10cSrcweir void ShowWindow::TerminateShow()
491cdf0e10cSrcweir {
492cdf0e10cSrcweir     maLogo.Clear();
493cdf0e10cSrcweir     maPauseTimer.Stop();
494cdf0e10cSrcweir     maMouseTimer.Stop();
495cdf0e10cSrcweir     Erase();
496cdf0e10cSrcweir //  SetBackground( maShowBackground );
497cdf0e10cSrcweir     maShowBackground = Wallpaper( Color( COL_BLACK ) );
498cdf0e10cSrcweir     meShowWindowMode = SHOWWINDOWMODE_NORMAL;
499cdf0e10cSrcweir     mnPauseTimeout = SLIDE_NO_TIMEOUT;
500cdf0e10cSrcweir 
501cdf0e10cSrcweir     if( mpViewShell )
502cdf0e10cSrcweir     {
503cdf0e10cSrcweir         // show navigator?
504cdf0e10cSrcweir         if( mbShowNavigatorAfterSpecialMode )
505cdf0e10cSrcweir         {
506cdf0e10cSrcweir             mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, sal_True );
507cdf0e10cSrcweir             mbShowNavigatorAfterSpecialMode = sal_False;
508cdf0e10cSrcweir         }
509cdf0e10cSrcweir     }
510cdf0e10cSrcweir 
511cdf0e10cSrcweir     if( mxController.is() )
512cdf0e10cSrcweir         mxController->endPresentation();
513cdf0e10cSrcweir 
514cdf0e10cSrcweir     mnRestartPageIndex = PAGE_NO_END;
515cdf0e10cSrcweir }
516cdf0e10cSrcweir 
517cdf0e10cSrcweir // -----------------------------------------------------------------------------
518cdf0e10cSrcweir 
519cdf0e10cSrcweir void ShowWindow::RestartShow()
520cdf0e10cSrcweir {
521cdf0e10cSrcweir     RestartShow( mnRestartPageIndex );
522cdf0e10cSrcweir }
523cdf0e10cSrcweir 
524cdf0e10cSrcweir // -----------------------------------------------------------------------------
525cdf0e10cSrcweir 
526cdf0e10cSrcweir void ShowWindow::RestartShow( sal_Int32 nPageIndexToRestart )
527cdf0e10cSrcweir 
528cdf0e10cSrcweir {
529cdf0e10cSrcweir     ShowWindowMode eOldShowWindowMode = meShowWindowMode;
530cdf0e10cSrcweir 
531cdf0e10cSrcweir     maLogo.Clear();
532cdf0e10cSrcweir     maPauseTimer.Stop();
533cdf0e10cSrcweir     Erase();
534cdf0e10cSrcweir //  SetBackground( maShowBackground );
535cdf0e10cSrcweir     maShowBackground = Wallpaper( Color( COL_BLACK ) );
536cdf0e10cSrcweir     meShowWindowMode = SHOWWINDOWMODE_NORMAL;
537cdf0e10cSrcweir     mnPauseTimeout = SLIDE_NO_TIMEOUT;
538cdf0e10cSrcweir 
539cdf0e10cSrcweir     if( mpViewShell )
540cdf0e10cSrcweir     {
541cdf0e10cSrcweir         rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( mpViewShell->GetViewShellBase() ) );
542cdf0e10cSrcweir 
543cdf0e10cSrcweir         if( xSlideShow.is() )
544cdf0e10cSrcweir         {
545cdf0e10cSrcweir             AddWindowToPaintView();
546cdf0e10cSrcweir 
547cdf0e10cSrcweir             if( SHOWWINDOWMODE_BLANK == eOldShowWindowMode )
548cdf0e10cSrcweir             {
549cdf0e10cSrcweir                 xSlideShow->pause(false);
550cdf0e10cSrcweir                 Invalidate();
551cdf0e10cSrcweir             }
552cdf0e10cSrcweir             else
553cdf0e10cSrcweir             {
554cdf0e10cSrcweir                 xSlideShow->jumpToPageIndex( nPageIndexToRestart );
555cdf0e10cSrcweir             }
556cdf0e10cSrcweir         }
557cdf0e10cSrcweir     }
558cdf0e10cSrcweir 
559cdf0e10cSrcweir     mnRestartPageIndex = PAGE_NO_END;
560cdf0e10cSrcweir 
561cdf0e10cSrcweir     // show navigator?
562cdf0e10cSrcweir     if( mbShowNavigatorAfterSpecialMode )
563cdf0e10cSrcweir     {
564cdf0e10cSrcweir         mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, sal_True );
565cdf0e10cSrcweir         mbShowNavigatorAfterSpecialMode = sal_False;
566cdf0e10cSrcweir     }
567cdf0e10cSrcweir }
568cdf0e10cSrcweir 
569cdf0e10cSrcweir // -----------------------------------------------------------------------------
570cdf0e10cSrcweir 
571cdf0e10cSrcweir void ShowWindow::DrawPauseScene( sal_Bool bTimeoutOnly )
572cdf0e10cSrcweir {
573cdf0e10cSrcweir     const MapMode&  rMap = GetMapMode();
574cdf0e10cSrcweir     const Point     aOutOrg( PixelToLogic( Point() ) );
575cdf0e10cSrcweir     const Size      aOutSize( GetOutputSize() );
576cdf0e10cSrcweir     const Size      aTextSize( LogicToLogic( Size( 0, 14 ), MAP_POINT, rMap ) );
577cdf0e10cSrcweir     const Size      aOffset( LogicToLogic( Size( 1000, 1000 ), MAP_100TH_MM, rMap ) );
578cdf0e10cSrcweir     String          aText( SdResId( STR_PRES_PAUSE ) );
579cdf0e10cSrcweir     sal_Bool            bDrawn = sal_False;
580cdf0e10cSrcweir 
581cdf0e10cSrcweir     Font            aFont( GetSettings().GetStyleSettings().GetMenuFont() );
582cdf0e10cSrcweir     const Font      aOldFont( GetFont() );
583cdf0e10cSrcweir 
584cdf0e10cSrcweir     aFont.SetSize( aTextSize );
585cdf0e10cSrcweir     aFont.SetColor( COL_WHITE );
586cdf0e10cSrcweir     aFont.SetCharSet( aOldFont.GetCharSet() );
587cdf0e10cSrcweir     aFont.SetLanguage( aOldFont.GetLanguage() );
588cdf0e10cSrcweir 
589cdf0e10cSrcweir     if( !bTimeoutOnly && ( maLogo.GetType() != GRAPHIC_NONE ) )
590cdf0e10cSrcweir     {
591cdf0e10cSrcweir         Size aGrfSize;
592cdf0e10cSrcweir 
593cdf0e10cSrcweir         if( maLogo.GetPrefMapMode() == MAP_PIXEL )
594cdf0e10cSrcweir             aGrfSize = PixelToLogic( maLogo.GetPrefSize() );
595cdf0e10cSrcweir         else
596cdf0e10cSrcweir             aGrfSize = LogicToLogic( maLogo.GetPrefSize(), maLogo.GetPrefMapMode(), rMap );
597cdf0e10cSrcweir 
598cdf0e10cSrcweir         const Point aGrfPos( Max( aOutOrg.X() + aOutSize.Width() - aGrfSize.Width() - aOffset.Width(), aOutOrg.X() ),
599cdf0e10cSrcweir                              Max( aOutOrg.Y() + aOutSize.Height() - aGrfSize.Height() - aOffset.Height(), aOutOrg.Y() ) );
600cdf0e10cSrcweir 
601cdf0e10cSrcweir         if( maLogo.IsAnimated() )
602cdf0e10cSrcweir             maLogo.StartAnimation( this, aGrfPos, aGrfSize, (long) this );
603cdf0e10cSrcweir         else
604cdf0e10cSrcweir             maLogo.Draw( this, aGrfPos, aGrfSize );
605cdf0e10cSrcweir     }
606cdf0e10cSrcweir 
607cdf0e10cSrcweir     if( SLIDE_NO_TIMEOUT != mnPauseTimeout )
608cdf0e10cSrcweir     {
609cdf0e10cSrcweir         MapMode         aVMap( rMap );
610cdf0e10cSrcweir         VirtualDevice   aVDev( *this );
611cdf0e10cSrcweir 
612cdf0e10cSrcweir         aVMap.SetOrigin( Point() );
613cdf0e10cSrcweir         aVDev.SetMapMode( aVMap );
614cdf0e10cSrcweir         aVDev.SetBackground( Wallpaper( Color( COL_BLACK ) ) );
615cdf0e10cSrcweir 
616cdf0e10cSrcweir         // set font first, to determine real output height
617cdf0e10cSrcweir         aVDev.SetFont( aFont );
618cdf0e10cSrcweir 
619cdf0e10cSrcweir         const Size aVDevSize( aOutSize.Width(), aVDev.GetTextHeight() );
620cdf0e10cSrcweir 
621cdf0e10cSrcweir         if( aVDev.SetOutputSize( aVDevSize ) )
622cdf0e10cSrcweir         {
623cdf0e10cSrcweir             // Note: if performance gets an issue here, we can use NumberFormatter directly
624cdf0e10cSrcweir             SvtSysLocale                aSysLocale;
625cdf0e10cSrcweir             const LocaleDataWrapper&    aLocaleData = aSysLocale.GetLocaleData();
626cdf0e10cSrcweir 
627cdf0e10cSrcweir             aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " ( " ));
628cdf0e10cSrcweir             aText += aLocaleData.getDuration( Time( 0, 0, mnPauseTimeout ) );
629cdf0e10cSrcweir             aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " )" ));
630cdf0e10cSrcweir             aVDev.DrawText( Point( aOffset.Width(), 0 ), aText );
631cdf0e10cSrcweir             DrawOutDev( Point( aOutOrg.X(), aOffset.Height() ), aVDevSize, Point(), aVDevSize, aVDev );
632cdf0e10cSrcweir             bDrawn = sal_True;
633cdf0e10cSrcweir         }
634cdf0e10cSrcweir     }
635cdf0e10cSrcweir 
636cdf0e10cSrcweir     if( !bDrawn )
637cdf0e10cSrcweir     {
638cdf0e10cSrcweir         SetFont( aFont );
639cdf0e10cSrcweir         DrawText( Point( aOutOrg.X() + aOffset.Width(), aOutOrg.Y() + aOffset.Height() ), aText );
640cdf0e10cSrcweir         SetFont( aOldFont );
641cdf0e10cSrcweir     }
642cdf0e10cSrcweir }
643cdf0e10cSrcweir 
644cdf0e10cSrcweir // -----------------------------------------------------------------------------
645cdf0e10cSrcweir 
646cdf0e10cSrcweir void ShowWindow::DrawEndScene()
647cdf0e10cSrcweir {
648cdf0e10cSrcweir     const Font      aOldFont( GetFont() );
649cdf0e10cSrcweir     Font            aFont( GetSettings().GetStyleSettings().GetMenuFont() );
650cdf0e10cSrcweir 
651cdf0e10cSrcweir     const Point     aOutOrg( PixelToLogic( Point() ) );
652cdf0e10cSrcweir     const Size      aTextSize( LogicToLogic( Size( 0, 14 ), MAP_POINT, GetMapMode() ) );
653cdf0e10cSrcweir     const String    aText( SdResId( STR_PRES_SOFTEND ) );
654cdf0e10cSrcweir 
655cdf0e10cSrcweir     aFont.SetSize( aTextSize );
656cdf0e10cSrcweir     aFont.SetColor( COL_WHITE );
657cdf0e10cSrcweir     aFont.SetCharSet( aOldFont.GetCharSet() );
658cdf0e10cSrcweir     aFont.SetLanguage( aOldFont.GetLanguage() );
659cdf0e10cSrcweir     SetFont( aFont );
660cdf0e10cSrcweir     DrawText( Point( aOutOrg.X() + aTextSize.Height(), aOutOrg.Y() + aTextSize.Height() ), aText );
661cdf0e10cSrcweir     SetFont( aOldFont );
662cdf0e10cSrcweir }
663cdf0e10cSrcweir 
664cdf0e10cSrcweir // -----------------------------------------------------------------------------
665cdf0e10cSrcweir 
666cdf0e10cSrcweir void ShowWindow::DrawBlankScene()
667cdf0e10cSrcweir {
668cdf0e10cSrcweir     // just blank through background color => nothing to be done here
669cdf0e10cSrcweir }
670cdf0e10cSrcweir 
671cdf0e10cSrcweir // -----------------------------------------------------------------------------
672cdf0e10cSrcweir 
673cdf0e10cSrcweir IMPL_LINK( ShowWindow, PauseTimeoutHdl, Timer*, pTimer )
674cdf0e10cSrcweir {
675cdf0e10cSrcweir     if( !( --mnPauseTimeout ) )
676cdf0e10cSrcweir         RestartShow();
677cdf0e10cSrcweir     else
678cdf0e10cSrcweir     {
679cdf0e10cSrcweir         DrawPauseScene( sal_True );
680cdf0e10cSrcweir         pTimer->Start();
681cdf0e10cSrcweir     }
682cdf0e10cSrcweir 
683cdf0e10cSrcweir     return 0L;
684cdf0e10cSrcweir }
685cdf0e10cSrcweir 
686cdf0e10cSrcweir IMPL_LINK( ShowWindow, MouseTimeoutHdl, Timer*, EMPTYARG )
687cdf0e10cSrcweir {
688cdf0e10cSrcweir     if( mbMouseCursorHidden )
689cdf0e10cSrcweir     {
690cdf0e10cSrcweir         // not enough mouse movements since first recording so
691cdf0e10cSrcweir         // cancle show mouse pointer for now
692cdf0e10cSrcweir         mnFirstMouseMove = 0;
693cdf0e10cSrcweir     }
694cdf0e10cSrcweir     else
695cdf0e10cSrcweir     {
696cdf0e10cSrcweir         // mouse has been idle to long, hide pointer
697cdf0e10cSrcweir         ShowPointer( sal_False );
698cdf0e10cSrcweir         mbMouseCursorHidden = true;
699cdf0e10cSrcweir     }
700cdf0e10cSrcweir     return 0L;
701cdf0e10cSrcweir }
702cdf0e10cSrcweir 
703cdf0e10cSrcweir IMPL_LINK( ShowWindow, EventHdl, VclWindowEvent*, pEvent )
704cdf0e10cSrcweir {
705cdf0e10cSrcweir     if( mbMouseAutoHide )
706cdf0e10cSrcweir     {
707cdf0e10cSrcweir         if (pEvent->GetId() == VCLEVENT_WINDOW_SHOW)
708cdf0e10cSrcweir         {
709cdf0e10cSrcweir             maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT );
710cdf0e10cSrcweir             maMouseTimer.Start();
711cdf0e10cSrcweir         }
712cdf0e10cSrcweir     }
713cdf0e10cSrcweir     return 0L;
714cdf0e10cSrcweir }
715cdf0e10cSrcweir 
716cdf0e10cSrcweir void ShowWindow::SetPresentationArea( const Rectangle& rPresArea )
717cdf0e10cSrcweir {
718cdf0e10cSrcweir     maPresArea = rPresArea;
719cdf0e10cSrcweir }
720cdf0e10cSrcweir 
721cdf0e10cSrcweir void ShowWindow::DeleteWindowFromPaintView()
722cdf0e10cSrcweir {
723cdf0e10cSrcweir     if( mpViewShell->GetView() )
724cdf0e10cSrcweir         mpViewShell->GetView()->DeleteWindowFromPaintView( this );
725cdf0e10cSrcweir 
726cdf0e10cSrcweir     sal_uInt16 nChild = GetChildCount();
727cdf0e10cSrcweir     while( nChild-- )
728cdf0e10cSrcweir         GetChild( nChild )->Show( sal_False );
729cdf0e10cSrcweir }
730cdf0e10cSrcweir 
731cdf0e10cSrcweir void ShowWindow::AddWindowToPaintView()
732cdf0e10cSrcweir {
733cdf0e10cSrcweir     if( mpViewShell->GetView() )
734cdf0e10cSrcweir         mpViewShell->GetView()->AddWindowToPaintView( this );
735cdf0e10cSrcweir 
736cdf0e10cSrcweir     sal_uInt16 nChild = GetChildCount();
737cdf0e10cSrcweir     while( nChild-- )
738cdf0e10cSrcweir         GetChild( nChild )->Show( sal_True );
739cdf0e10cSrcweir }
740cdf0e10cSrcweir 
741cdf0e10cSrcweir } // end of namespace sd
742