xref: /trunk/main/vcl/source/window/dockwin.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3) !
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_vcl.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <tools/time.hxx>
32*cdf0e10cSrcweir #include <tools/rc.h>
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #include <vcl/event.hxx>
35*cdf0e10cSrcweir #include <vcl/floatwin.hxx>
36*cdf0e10cSrcweir #include <vcl/dockwin.hxx>
37*cdf0e10cSrcweir #include <vcl/svapp.hxx>
38*cdf0e10cSrcweir #include <vcl/timer.hxx>
39*cdf0e10cSrcweir #include <vcl/unowrap.hxx>
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir #include <svdata.hxx>
42*cdf0e10cSrcweir #include <window.h>
43*cdf0e10cSrcweir #include <brdwin.hxx>
44*cdf0e10cSrcweir #include <salframe.hxx>
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir // =======================================================================
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir #define DOCKWIN_FLOATSTYLES         (WB_SIZEABLE | WB_MOVEABLE | WB_CLOSEABLE | WB_STANDALONE | WB_PINABLE | WB_ROLLABLE )
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir // =======================================================================
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir // -----------------------------------------------------------------------
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir class DockingWindow::ImplData
57*cdf0e10cSrcweir {
58*cdf0e10cSrcweir public:
59*cdf0e10cSrcweir     ImplData();
60*cdf0e10cSrcweir     ~ImplData();
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir     Window*         mpParent;
63*cdf0e10cSrcweir     Size            maMaxOutSize;
64*cdf0e10cSrcweir };
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir DockingWindow::ImplData::ImplData()
67*cdf0e10cSrcweir {
68*cdf0e10cSrcweir     mpParent = NULL;
69*cdf0e10cSrcweir     maMaxOutSize = Size( SHRT_MAX, SHRT_MAX );
70*cdf0e10cSrcweir }
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir DockingWindow::ImplData::~ImplData()
73*cdf0e10cSrcweir {
74*cdf0e10cSrcweir }
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir // -----------------------------------------------------------------------
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir class ImplDockFloatWin : public FloatingWindow
79*cdf0e10cSrcweir {
80*cdf0e10cSrcweir private:
81*cdf0e10cSrcweir     DockingWindow*  mpDockWin;
82*cdf0e10cSrcweir     sal_uLong           mnLastTicks;
83*cdf0e10cSrcweir     Timer           maDockTimer;
84*cdf0e10cSrcweir     Point           maDockPos;
85*cdf0e10cSrcweir     Rectangle       maDockRect;
86*cdf0e10cSrcweir     sal_Bool            mbInMove;
87*cdf0e10cSrcweir     sal_uLong           mnLastUserEvent;
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir     DECL_LINK( DockingHdl, ImplDockFloatWin* );
90*cdf0e10cSrcweir     DECL_LINK( DockTimerHdl, ImplDockFloatWin* );
91*cdf0e10cSrcweir public:
92*cdf0e10cSrcweir     ImplDockFloatWin( Window* pParent, WinBits nWinBits,
93*cdf0e10cSrcweir                       DockingWindow* pDockingWin );
94*cdf0e10cSrcweir     ~ImplDockFloatWin();
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir     virtual void    Move();
97*cdf0e10cSrcweir     virtual void    Resize();
98*cdf0e10cSrcweir     virtual void    TitleButtonClick( sal_uInt16 nButton );
99*cdf0e10cSrcweir     virtual void    Pin();
100*cdf0e10cSrcweir     virtual void    Roll();
101*cdf0e10cSrcweir     virtual void    PopupModeEnd();
102*cdf0e10cSrcweir     virtual void    Resizing( Size& rSize );
103*cdf0e10cSrcweir     virtual sal_Bool    Close();
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir     sal_uLong GetLastTicks() const { return mnLastTicks; }
106*cdf0e10cSrcweir };
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir ImplDockFloatWin::ImplDockFloatWin( Window* pParent, WinBits nWinBits,
110*cdf0e10cSrcweir                                     DockingWindow* pDockingWin ) :
111*cdf0e10cSrcweir         FloatingWindow( pParent, nWinBits ),
112*cdf0e10cSrcweir         mpDockWin( pDockingWin ),
113*cdf0e10cSrcweir         mnLastTicks( Time::GetSystemTicks() ),
114*cdf0e10cSrcweir         mbInMove( sal_False ),
115*cdf0e10cSrcweir         mnLastUserEvent( 0 )
116*cdf0e10cSrcweir {
117*cdf0e10cSrcweir     // Daten vom DockingWindow uebernehmen
118*cdf0e10cSrcweir     if ( pDockingWin )
119*cdf0e10cSrcweir     {
120*cdf0e10cSrcweir         SetSettings( pDockingWin->GetSettings() );
121*cdf0e10cSrcweir         Enable( pDockingWin->IsEnabled(), sal_False );
122*cdf0e10cSrcweir         EnableInput( pDockingWin->IsInputEnabled(), sal_False );
123*cdf0e10cSrcweir         AlwaysEnableInput( pDockingWin->IsAlwaysEnableInput(), sal_False );
124*cdf0e10cSrcweir         EnableAlwaysOnTop( pDockingWin->IsAlwaysOnTopEnabled() );
125*cdf0e10cSrcweir         SetActivateMode( pDockingWin->GetActivateMode() );
126*cdf0e10cSrcweir     }
127*cdf0e10cSrcweir 
128*cdf0e10cSrcweir     SetBackground();
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir     maDockTimer.SetTimeoutHdl( LINK( this, ImplDockFloatWin, DockTimerHdl ) );
131*cdf0e10cSrcweir     maDockTimer.SetTimeout( 50 );
132*cdf0e10cSrcweir }
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir // -----------------------------------------------------------------------
135*cdf0e10cSrcweir 
136*cdf0e10cSrcweir ImplDockFloatWin::~ImplDockFloatWin()
137*cdf0e10cSrcweir {
138*cdf0e10cSrcweir     if( mnLastUserEvent )
139*cdf0e10cSrcweir         Application::RemoveUserEvent( mnLastUserEvent );
140*cdf0e10cSrcweir }
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir // -----------------------------------------------------------------------
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir IMPL_LINK( ImplDockFloatWin, DockTimerHdl, ImplDockFloatWin*, EMPTYARG )
145*cdf0e10cSrcweir {
146*cdf0e10cSrcweir     DBG_ASSERT( mpDockWin->IsFloatingMode(), "docktimer called but not floating" );
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir     maDockTimer.Stop();
149*cdf0e10cSrcweir     PointerState aState = GetPointerState();
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir     if( aState.mnState & KEY_MOD1 )
152*cdf0e10cSrcweir     {
153*cdf0e10cSrcweir         // i43499 CTRL disables docking now
154*cdf0e10cSrcweir         mpDockWin->GetParent()->ImplGetFrameWindow()->HideTracking();
155*cdf0e10cSrcweir         mpDockWin->EndDocking( maDockRect, sal_True );
156*cdf0e10cSrcweir         if( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) )
157*cdf0e10cSrcweir             maDockTimer.Start();
158*cdf0e10cSrcweir     }
159*cdf0e10cSrcweir     else if( ! ( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) )
160*cdf0e10cSrcweir     {
161*cdf0e10cSrcweir         mpDockWin->GetParent()->ImplGetFrameWindow()->HideTracking();
162*cdf0e10cSrcweir         mpDockWin->EndDocking( maDockRect, sal_False );
163*cdf0e10cSrcweir     }
164*cdf0e10cSrcweir     else
165*cdf0e10cSrcweir     {
166*cdf0e10cSrcweir         mpDockWin->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, SHOWTRACK_BIG | SHOWTRACK_WINDOW );
167*cdf0e10cSrcweir         maDockTimer.Start();
168*cdf0e10cSrcweir     }
169*cdf0e10cSrcweir 
170*cdf0e10cSrcweir     return 0;
171*cdf0e10cSrcweir }
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir IMPL_LINK( ImplDockFloatWin, DockingHdl, ImplDockFloatWin*, EMPTYARG )
174*cdf0e10cSrcweir {
175*cdf0e10cSrcweir     PointerState aState = mpDockWin->GetParent()->GetPointerState();
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir     mnLastUserEvent = 0;
178*cdf0e10cSrcweir     if( mpDockWin->IsDockable()                             &&
179*cdf0e10cSrcweir         (Time::GetSystemTicks() - mnLastTicks > 500)        &&
180*cdf0e10cSrcweir         ( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) &&
181*cdf0e10cSrcweir         !(aState.mnState & KEY_MOD1) )  // i43499 CTRL disables docking now
182*cdf0e10cSrcweir     {
183*cdf0e10cSrcweir         maDockPos = Point( mpDockWin->GetParent()->AbsoluteScreenToOutputPixel( OutputToAbsoluteScreenPixel( Point() ) ) );
184*cdf0e10cSrcweir         maDockPos = mpDockWin->GetParent()->OutputToScreenPixel( maDockPos );  // sfx expects screen coordinates
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir         if( ! mpDockWin->IsDocking() )
187*cdf0e10cSrcweir             mpDockWin->StartDocking();
188*cdf0e10cSrcweir         maDockRect = Rectangle( maDockPos, mpDockWin->GetSizePixel() );
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir         // mouse pos also in screen pixels
191*cdf0e10cSrcweir         Point aMousePos = mpDockWin->GetParent()->OutputToScreenPixel( aState.maPos );
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir         sal_Bool bFloatMode = mpDockWin->Docking( aMousePos, maDockRect );
194*cdf0e10cSrcweir         if( ! bFloatMode )
195*cdf0e10cSrcweir         {
196*cdf0e10cSrcweir             mpDockWin->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, SHOWTRACK_OBJECT | SHOWTRACK_WINDOW );
197*cdf0e10cSrcweir             DockTimerHdl( this );
198*cdf0e10cSrcweir         }
199*cdf0e10cSrcweir         else
200*cdf0e10cSrcweir         {
201*cdf0e10cSrcweir             mpDockWin->GetParent()->ImplGetFrameWindow()->HideTracking();
202*cdf0e10cSrcweir             maDockTimer.Stop();
203*cdf0e10cSrcweir             mpDockWin->EndDocking( maDockRect, sal_True );
204*cdf0e10cSrcweir         }
205*cdf0e10cSrcweir     }
206*cdf0e10cSrcweir     mbInMove = sal_False;
207*cdf0e10cSrcweir     return 0;
208*cdf0e10cSrcweir }
209*cdf0e10cSrcweir // -----------------------------------------------------------------------
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir void ImplDockFloatWin::Move()
212*cdf0e10cSrcweir {
213*cdf0e10cSrcweir     if( mbInMove )
214*cdf0e10cSrcweir         return;
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir     mbInMove = sal_True;
217*cdf0e10cSrcweir     FloatingWindow::Move();
218*cdf0e10cSrcweir     mpDockWin->Move();
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir     /*
221*cdf0e10cSrcweir      *  note: the window should only dock if
222*cdf0e10cSrcweir      *  the user releases all mouse buttons. The real problem here
223*cdf0e10cSrcweir      *  is that we don't get mouse events (at least not on X)
224*cdf0e10cSrcweir      *  if the mouse is on the decoration. So we have to start an
225*cdf0e10cSrcweir      *  awkward timer based process that polls the modifier/buttons
226*cdf0e10cSrcweir      *  to see whether they are in the right condition shortly after the
227*cdf0e10cSrcweir      *  last Move message.
228*cdf0e10cSrcweir      */
229*cdf0e10cSrcweir     if( ! mnLastUserEvent )
230*cdf0e10cSrcweir         mnLastUserEvent = Application::PostUserEvent( LINK( this, ImplDockFloatWin, DockingHdl ) );
231*cdf0e10cSrcweir }
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir // -----------------------------------------------------------------------
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir void ImplDockFloatWin::Resize()
236*cdf0e10cSrcweir {
237*cdf0e10cSrcweir     FloatingWindow::Resize();
238*cdf0e10cSrcweir     Size aSize( GetSizePixel() );
239*cdf0e10cSrcweir     mpDockWin->ImplPosSizeWindow( 0, 0, aSize.Width(), aSize.Height(), WINDOW_POSSIZE_POSSIZE );
240*cdf0e10cSrcweir }
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir // -----------------------------------------------------------------------
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir void ImplDockFloatWin::TitleButtonClick( sal_uInt16 nButton )
245*cdf0e10cSrcweir {
246*cdf0e10cSrcweir     FloatingWindow::TitleButtonClick( nButton );
247*cdf0e10cSrcweir     mpDockWin->TitleButtonClick( nButton );
248*cdf0e10cSrcweir }
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir // -----------------------------------------------------------------------
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir void ImplDockFloatWin::Pin()
253*cdf0e10cSrcweir {
254*cdf0e10cSrcweir     FloatingWindow::Pin();
255*cdf0e10cSrcweir     mpDockWin->Pin();
256*cdf0e10cSrcweir }
257*cdf0e10cSrcweir 
258*cdf0e10cSrcweir // -----------------------------------------------------------------------
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir void ImplDockFloatWin::Roll()
261*cdf0e10cSrcweir {
262*cdf0e10cSrcweir     FloatingWindow::Roll();
263*cdf0e10cSrcweir     mpDockWin->Roll();
264*cdf0e10cSrcweir }
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir // -----------------------------------------------------------------------
267*cdf0e10cSrcweir 
268*cdf0e10cSrcweir void ImplDockFloatWin::PopupModeEnd()
269*cdf0e10cSrcweir {
270*cdf0e10cSrcweir     FloatingWindow::PopupModeEnd();
271*cdf0e10cSrcweir     mpDockWin->PopupModeEnd();
272*cdf0e10cSrcweir }
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir // -----------------------------------------------------------------------
275*cdf0e10cSrcweir 
276*cdf0e10cSrcweir void ImplDockFloatWin::Resizing( Size& rSize )
277*cdf0e10cSrcweir {
278*cdf0e10cSrcweir     FloatingWindow::Resizing( rSize );
279*cdf0e10cSrcweir     mpDockWin->Resizing( rSize );
280*cdf0e10cSrcweir }
281*cdf0e10cSrcweir 
282*cdf0e10cSrcweir // -----------------------------------------------------------------------
283*cdf0e10cSrcweir 
284*cdf0e10cSrcweir sal_Bool ImplDockFloatWin::Close()
285*cdf0e10cSrcweir {
286*cdf0e10cSrcweir     return mpDockWin->Close();
287*cdf0e10cSrcweir }
288*cdf0e10cSrcweir 
289*cdf0e10cSrcweir // =======================================================================
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir sal_Bool DockingWindow::ImplStartDocking( const Point& rPos )
292*cdf0e10cSrcweir {
293*cdf0e10cSrcweir     if ( !mbDockable )
294*cdf0e10cSrcweir         return sal_False;
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir     maMouseOff      = rPos;
297*cdf0e10cSrcweir     maMouseStart    = maMouseOff;
298*cdf0e10cSrcweir     mbDocking       = sal_True;
299*cdf0e10cSrcweir     mbLastFloatMode = IsFloatingMode();
300*cdf0e10cSrcweir     mbStartFloat    = mbLastFloatMode;
301*cdf0e10cSrcweir 
302*cdf0e10cSrcweir     // FloatingBorder berechnen
303*cdf0e10cSrcweir     FloatingWindow* pWin;
304*cdf0e10cSrcweir     if ( mpFloatWin )
305*cdf0e10cSrcweir         pWin = mpFloatWin;
306*cdf0e10cSrcweir     else
307*cdf0e10cSrcweir         pWin = new ImplDockFloatWin( mpImplData->mpParent, mnFloatBits, NULL );
308*cdf0e10cSrcweir     pWin->GetBorder( mnDockLeft, mnDockTop, mnDockRight, mnDockBottom );
309*cdf0e10cSrcweir     if ( !mpFloatWin )
310*cdf0e10cSrcweir         delete pWin;
311*cdf0e10cSrcweir 
312*cdf0e10cSrcweir     Point   aPos    = ImplOutputToFrame( Point() );
313*cdf0e10cSrcweir     Size    aSize   = Window::GetOutputSizePixel();
314*cdf0e10cSrcweir     mnTrackX        = aPos.X();
315*cdf0e10cSrcweir     mnTrackY        = aPos.Y();
316*cdf0e10cSrcweir     mnTrackWidth    = aSize.Width();
317*cdf0e10cSrcweir     mnTrackHeight   = aSize.Height();
318*cdf0e10cSrcweir 
319*cdf0e10cSrcweir     if ( mbLastFloatMode )
320*cdf0e10cSrcweir     {
321*cdf0e10cSrcweir         maMouseOff.X()  += mnDockLeft;
322*cdf0e10cSrcweir         maMouseOff.Y()  += mnDockTop;
323*cdf0e10cSrcweir         mnTrackX        -= mnDockLeft;
324*cdf0e10cSrcweir         mnTrackY        -= mnDockTop;
325*cdf0e10cSrcweir         mnTrackWidth    += mnDockLeft+mnDockRight;
326*cdf0e10cSrcweir         mnTrackHeight   += mnDockTop+mnDockBottom;
327*cdf0e10cSrcweir     }
328*cdf0e10cSrcweir 
329*cdf0e10cSrcweir     if ( GetSettings().GetStyleSettings().GetDragFullOptions() & DRAGFULL_OPTION_DOCKING &&
330*cdf0e10cSrcweir         !( mnFloatBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ) ) // no full drag when migrating to system window
331*cdf0e10cSrcweir         mbDragFull = sal_True;
332*cdf0e10cSrcweir     else
333*cdf0e10cSrcweir     {
334*cdf0e10cSrcweir         StartDocking();
335*cdf0e10cSrcweir         mbDragFull = sal_False;
336*cdf0e10cSrcweir         ImplUpdateAll();
337*cdf0e10cSrcweir         ImplGetFrameWindow()->ImplUpdateAll();
338*cdf0e10cSrcweir     }
339*cdf0e10cSrcweir 
340*cdf0e10cSrcweir     StartTracking( STARTTRACK_KEYMOD );
341*cdf0e10cSrcweir     return sal_True;
342*cdf0e10cSrcweir }
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir // =======================================================================
345*cdf0e10cSrcweir 
346*cdf0e10cSrcweir void DockingWindow::ImplInitDockingWindowData()
347*cdf0e10cSrcweir {
348*cdf0e10cSrcweir     mpImplData              = new ImplData;
349*cdf0e10cSrcweir     mpWindowImpl->mbDockWin               = sal_True;
350*cdf0e10cSrcweir 
351*cdf0e10cSrcweir     mpFloatWin              = NULL;
352*cdf0e10cSrcweir     mbDockCanceled          = sal_False;
353*cdf0e10cSrcweir     mbDockPrevented         = sal_False;
354*cdf0e10cSrcweir     mbFloatPrevented        = sal_False;
355*cdf0e10cSrcweir     mbDocking               = sal_False;
356*cdf0e10cSrcweir     mbPined                 = sal_False;
357*cdf0e10cSrcweir     mbRollUp                = sal_False;
358*cdf0e10cSrcweir     mbDockBtn               = sal_False;
359*cdf0e10cSrcweir     mbHideBtn               = sal_False;
360*cdf0e10cSrcweir }
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir // -----------------------------------------------------------------------
363*cdf0e10cSrcweir 
364*cdf0e10cSrcweir void DockingWindow::ImplInit( Window* pParent, WinBits nStyle )
365*cdf0e10cSrcweir {
366*cdf0e10cSrcweir     if ( !(nStyle & WB_NODIALOGCONTROL) )
367*cdf0e10cSrcweir         nStyle |= WB_DIALOGCONTROL;
368*cdf0e10cSrcweir 
369*cdf0e10cSrcweir     mpImplData->mpParent    = pParent;
370*cdf0e10cSrcweir     mbDockable              = (nStyle & WB_DOCKABLE) != 0;
371*cdf0e10cSrcweir     mnFloatBits             = WB_BORDER | (nStyle & DOCKWIN_FLOATSTYLES);
372*cdf0e10cSrcweir     nStyle                 &= ~(DOCKWIN_FLOATSTYLES | WB_BORDER);
373*cdf0e10cSrcweir     if ( nStyle & WB_DOCKBORDER )
374*cdf0e10cSrcweir         nStyle |= WB_BORDER;
375*cdf0e10cSrcweir 
376*cdf0e10cSrcweir     Window::ImplInit( pParent, nStyle, NULL );
377*cdf0e10cSrcweir 
378*cdf0e10cSrcweir     ImplInitSettings();
379*cdf0e10cSrcweir }
380*cdf0e10cSrcweir 
381*cdf0e10cSrcweir // -----------------------------------------------------------------------
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir void DockingWindow::ImplInitSettings()
384*cdf0e10cSrcweir {
385*cdf0e10cSrcweir     // Hack, damit man auch DockingWindows ohne Hintergrund bauen kann
386*cdf0e10cSrcweir     // und noch nicht alles umgestellt ist
387*cdf0e10cSrcweir     if ( IsBackground() )
388*cdf0e10cSrcweir     {
389*cdf0e10cSrcweir         const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
390*cdf0e10cSrcweir 
391*cdf0e10cSrcweir         Color aColor;
392*cdf0e10cSrcweir         if ( IsControlBackground() )
393*cdf0e10cSrcweir             aColor = GetControlBackground();
394*cdf0e10cSrcweir         else if ( Window::GetStyle() & WB_3DLOOK )
395*cdf0e10cSrcweir             aColor = rStyleSettings.GetFaceColor();
396*cdf0e10cSrcweir         else
397*cdf0e10cSrcweir             aColor = rStyleSettings.GetWindowColor();
398*cdf0e10cSrcweir         SetBackground( aColor );
399*cdf0e10cSrcweir     }
400*cdf0e10cSrcweir }
401*cdf0e10cSrcweir 
402*cdf0e10cSrcweir // -----------------------------------------------------------------------
403*cdf0e10cSrcweir 
404*cdf0e10cSrcweir void DockingWindow::ImplLoadRes( const ResId& rResId )
405*cdf0e10cSrcweir {
406*cdf0e10cSrcweir     Window::ImplLoadRes( rResId );
407*cdf0e10cSrcweir 
408*cdf0e10cSrcweir     sal_uLong  nMask = ReadLongRes();
409*cdf0e10cSrcweir 
410*cdf0e10cSrcweir     if ( (RSC_DOCKINGWINDOW_XYMAPMODE | RSC_DOCKINGWINDOW_X |
411*cdf0e10cSrcweir           RSC_DOCKINGWINDOW_Y) & nMask )
412*cdf0e10cSrcweir     {
413*cdf0e10cSrcweir         // Groessenangabe aus der Resource verwenden
414*cdf0e10cSrcweir         Point   aPos;
415*cdf0e10cSrcweir         MapUnit ePosMap = MAP_PIXEL;
416*cdf0e10cSrcweir 
417*cdf0e10cSrcweir         if ( RSC_DOCKINGWINDOW_XYMAPMODE & nMask )
418*cdf0e10cSrcweir             ePosMap = (MapUnit)ReadLongRes();
419*cdf0e10cSrcweir 
420*cdf0e10cSrcweir         if ( RSC_DOCKINGWINDOW_X & nMask )
421*cdf0e10cSrcweir         {
422*cdf0e10cSrcweir             aPos.X() = ReadShortRes();
423*cdf0e10cSrcweir             aPos.X() = ImplLogicUnitToPixelX( aPos.X(), ePosMap );
424*cdf0e10cSrcweir         }
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir         if ( RSC_DOCKINGWINDOW_Y & nMask )
427*cdf0e10cSrcweir         {
428*cdf0e10cSrcweir             aPos.Y() = ReadShortRes();
429*cdf0e10cSrcweir             aPos.Y() = ImplLogicUnitToPixelY( aPos.Y(), ePosMap );
430*cdf0e10cSrcweir         }
431*cdf0e10cSrcweir 
432*cdf0e10cSrcweir         SetFloatingPos( aPos );
433*cdf0e10cSrcweir     }
434*cdf0e10cSrcweir 
435*cdf0e10cSrcweir     if ( nMask & RSC_DOCKINGWINDOW_FLOATING )
436*cdf0e10cSrcweir     {
437*cdf0e10cSrcweir         if ( (sal_Bool)ReadShortRes() )
438*cdf0e10cSrcweir             SetFloatingMode( sal_True );
439*cdf0e10cSrcweir     }
440*cdf0e10cSrcweir }
441*cdf0e10cSrcweir 
442*cdf0e10cSrcweir // -----------------------------------------------------------------------
443*cdf0e10cSrcweir 
444*cdf0e10cSrcweir DockingWindow::DockingWindow( WindowType nType ) :
445*cdf0e10cSrcweir     Window( nType )
446*cdf0e10cSrcweir {
447*cdf0e10cSrcweir     ImplInitDockingWindowData();
448*cdf0e10cSrcweir }
449*cdf0e10cSrcweir 
450*cdf0e10cSrcweir // -----------------------------------------------------------------------
451*cdf0e10cSrcweir 
452*cdf0e10cSrcweir DockingWindow::DockingWindow( Window* pParent, WinBits nStyle ) :
453*cdf0e10cSrcweir     Window( WINDOW_DOCKINGWINDOW )
454*cdf0e10cSrcweir {
455*cdf0e10cSrcweir     ImplInitDockingWindowData();
456*cdf0e10cSrcweir     ImplInit( pParent, nStyle );
457*cdf0e10cSrcweir }
458*cdf0e10cSrcweir 
459*cdf0e10cSrcweir // -----------------------------------------------------------------------
460*cdf0e10cSrcweir 
461*cdf0e10cSrcweir DockingWindow::DockingWindow( Window* pParent, const ResId& rResId ) :
462*cdf0e10cSrcweir     Window( WINDOW_DOCKINGWINDOW )
463*cdf0e10cSrcweir {
464*cdf0e10cSrcweir     ImplInitDockingWindowData();
465*cdf0e10cSrcweir     rResId.SetRT( RSC_DOCKINGWINDOW );
466*cdf0e10cSrcweir     WinBits nStyle = ImplInitRes( rResId );
467*cdf0e10cSrcweir     ImplInit( pParent, nStyle );
468*cdf0e10cSrcweir     ImplLoadRes( rResId );
469*cdf0e10cSrcweir 
470*cdf0e10cSrcweir     if ( !(nStyle & WB_HIDE) )
471*cdf0e10cSrcweir         Show();
472*cdf0e10cSrcweir }
473*cdf0e10cSrcweir 
474*cdf0e10cSrcweir // -----------------------------------------------------------------------
475*cdf0e10cSrcweir 
476*cdf0e10cSrcweir DockingWindow::~DockingWindow()
477*cdf0e10cSrcweir {
478*cdf0e10cSrcweir     if ( IsFloatingMode() )
479*cdf0e10cSrcweir     {
480*cdf0e10cSrcweir         Show( sal_False, SHOW_NOFOCUSCHANGE );
481*cdf0e10cSrcweir         SetFloatingMode( sal_False );
482*cdf0e10cSrcweir     }
483*cdf0e10cSrcweir     delete mpImplData;
484*cdf0e10cSrcweir }
485*cdf0e10cSrcweir 
486*cdf0e10cSrcweir // -----------------------------------------------------------------------
487*cdf0e10cSrcweir 
488*cdf0e10cSrcweir void DockingWindow::Tracking( const TrackingEvent& rTEvt )
489*cdf0e10cSrcweir {
490*cdf0e10cSrcweir     if( GetDockingManager()->IsDockable( this ) )   // new docking interface
491*cdf0e10cSrcweir         return Window::Tracking( rTEvt );
492*cdf0e10cSrcweir 
493*cdf0e10cSrcweir     if ( mbDocking )
494*cdf0e10cSrcweir     {
495*cdf0e10cSrcweir         if ( rTEvt.IsTrackingEnded() )
496*cdf0e10cSrcweir         {
497*cdf0e10cSrcweir             mbDocking = sal_False;
498*cdf0e10cSrcweir             if ( mbDragFull )
499*cdf0e10cSrcweir             {
500*cdf0e10cSrcweir                 // Bei Abbruch alten Zustand wieder herstellen
501*cdf0e10cSrcweir                 if ( rTEvt.IsTrackingCanceled() )
502*cdf0e10cSrcweir                 {
503*cdf0e10cSrcweir                     StartDocking();
504*cdf0e10cSrcweir                     Rectangle aRect( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) );
505*cdf0e10cSrcweir                     EndDocking( aRect, mbStartFloat );
506*cdf0e10cSrcweir                 }
507*cdf0e10cSrcweir             }
508*cdf0e10cSrcweir             else
509*cdf0e10cSrcweir             {
510*cdf0e10cSrcweir                 HideTracking();
511*cdf0e10cSrcweir                 if ( rTEvt.IsTrackingCanceled() )
512*cdf0e10cSrcweir                 {
513*cdf0e10cSrcweir                     mbDockCanceled = sal_True;
514*cdf0e10cSrcweir                     EndDocking( Rectangle( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ), mbLastFloatMode );
515*cdf0e10cSrcweir                     mbDockCanceled = sal_False;
516*cdf0e10cSrcweir                 }
517*cdf0e10cSrcweir                 else
518*cdf0e10cSrcweir                     EndDocking( Rectangle( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ), mbLastFloatMode );
519*cdf0e10cSrcweir             }
520*cdf0e10cSrcweir         }
521*cdf0e10cSrcweir         // Docking nur bei nicht synthetischen MouseEvents
522*cdf0e10cSrcweir         else if ( !rTEvt.GetMouseEvent().IsSynthetic() || rTEvt.GetMouseEvent().IsModifierChanged() )
523*cdf0e10cSrcweir         {
524*cdf0e10cSrcweir             Point   aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
525*cdf0e10cSrcweir             Point   aFrameMousePos = ImplOutputToFrame( aMousePos );
526*cdf0e10cSrcweir             Size    aFrameSize = mpWindowImpl->mpFrameWindow->GetOutputSizePixel();
527*cdf0e10cSrcweir             if ( aFrameMousePos.X() < 0 )
528*cdf0e10cSrcweir                 aFrameMousePos.X() = 0;
529*cdf0e10cSrcweir             if ( aFrameMousePos.Y() < 0 )
530*cdf0e10cSrcweir                 aFrameMousePos.Y() = 0;
531*cdf0e10cSrcweir             if ( aFrameMousePos.X() > aFrameSize.Width()-1 )
532*cdf0e10cSrcweir                 aFrameMousePos.X() = aFrameSize.Width()-1;
533*cdf0e10cSrcweir             if ( aFrameMousePos.Y() > aFrameSize.Height()-1 )
534*cdf0e10cSrcweir                 aFrameMousePos.Y() = aFrameSize.Height()-1;
535*cdf0e10cSrcweir             aMousePos = ImplFrameToOutput( aFrameMousePos );
536*cdf0e10cSrcweir             aMousePos.X() -= maMouseOff.X();
537*cdf0e10cSrcweir             aMousePos.Y() -= maMouseOff.Y();
538*cdf0e10cSrcweir             Point aFramePos = ImplOutputToFrame( aMousePos );
539*cdf0e10cSrcweir             Rectangle aTrackRect( aFramePos, Size( mnTrackWidth, mnTrackHeight ) );
540*cdf0e10cSrcweir             Rectangle aCompRect = aTrackRect;
541*cdf0e10cSrcweir             aFramePos.X()    += maMouseOff.X();
542*cdf0e10cSrcweir             aFramePos.Y()    += maMouseOff.Y();
543*cdf0e10cSrcweir             if ( mbDragFull )
544*cdf0e10cSrcweir                 StartDocking();
545*cdf0e10cSrcweir             sal_Bool bFloatMode = Docking( aFramePos, aTrackRect );
546*cdf0e10cSrcweir             mbDockPrevented = sal_False;
547*cdf0e10cSrcweir             mbFloatPrevented = sal_False;
548*cdf0e10cSrcweir             if ( mbLastFloatMode != bFloatMode )
549*cdf0e10cSrcweir             {
550*cdf0e10cSrcweir                 if ( bFloatMode )
551*cdf0e10cSrcweir                 {
552*cdf0e10cSrcweir                     aTrackRect.Left()   -= mnDockLeft;
553*cdf0e10cSrcweir                     aTrackRect.Top()    -= mnDockTop;
554*cdf0e10cSrcweir                     aTrackRect.Right()  += mnDockRight;
555*cdf0e10cSrcweir                     aTrackRect.Bottom() += mnDockBottom;
556*cdf0e10cSrcweir                 }
557*cdf0e10cSrcweir                 else
558*cdf0e10cSrcweir                 {
559*cdf0e10cSrcweir                     if ( aCompRect == aTrackRect )
560*cdf0e10cSrcweir                     {
561*cdf0e10cSrcweir                         aTrackRect.Left()   += mnDockLeft;
562*cdf0e10cSrcweir                         aTrackRect.Top()    += mnDockTop;
563*cdf0e10cSrcweir                         aTrackRect.Right()  -= mnDockRight;
564*cdf0e10cSrcweir                         aTrackRect.Bottom() -= mnDockBottom;
565*cdf0e10cSrcweir                     }
566*cdf0e10cSrcweir                 }
567*cdf0e10cSrcweir                 mbLastFloatMode = bFloatMode;
568*cdf0e10cSrcweir             }
569*cdf0e10cSrcweir             if ( mbDragFull )
570*cdf0e10cSrcweir             {
571*cdf0e10cSrcweir                 Point aPos;
572*cdf0e10cSrcweir                 Point aOldPos = OutputToScreenPixel( aPos );
573*cdf0e10cSrcweir                 EndDocking( aTrackRect, mbLastFloatMode );
574*cdf0e10cSrcweir                 // Wenn der Status bzw. die Position sich
575*cdf0e10cSrcweir                 // geaendert hat, dann neu ausgeben
576*cdf0e10cSrcweir                 if ( aOldPos != OutputToScreenPixel( aPos ) )
577*cdf0e10cSrcweir                 {
578*cdf0e10cSrcweir                     ImplUpdateAll();
579*cdf0e10cSrcweir                     ImplGetFrameWindow()->ImplUpdateAll();
580*cdf0e10cSrcweir                 }
581*cdf0e10cSrcweir //                EndDocking( aTrackRect, mbLastFloatMode );
582*cdf0e10cSrcweir             }
583*cdf0e10cSrcweir             else
584*cdf0e10cSrcweir             {
585*cdf0e10cSrcweir                 sal_uInt16 nTrackStyle;
586*cdf0e10cSrcweir                 if ( bFloatMode )
587*cdf0e10cSrcweir                     nTrackStyle = SHOWTRACK_BIG;
588*cdf0e10cSrcweir                 else
589*cdf0e10cSrcweir                     nTrackStyle = SHOWTRACK_OBJECT;
590*cdf0e10cSrcweir                 Rectangle aShowTrackRect = aTrackRect;
591*cdf0e10cSrcweir                 aShowTrackRect.SetPos( ImplFrameToOutput( aShowTrackRect.TopLeft() ) );
592*cdf0e10cSrcweir                 ShowTracking( aShowTrackRect, nTrackStyle );
593*cdf0e10cSrcweir 
594*cdf0e10cSrcweir                 // Maus-Offset neu berechnen, da Rechteck veraendert werden
595*cdf0e10cSrcweir                 // konnte
596*cdf0e10cSrcweir                 maMouseOff.X()  = aFramePos.X() - aTrackRect.Left();
597*cdf0e10cSrcweir                 maMouseOff.Y()  = aFramePos.Y() - aTrackRect.Top();
598*cdf0e10cSrcweir             }
599*cdf0e10cSrcweir 
600*cdf0e10cSrcweir             mnTrackX        = aTrackRect.Left();
601*cdf0e10cSrcweir             mnTrackY        = aTrackRect.Top();
602*cdf0e10cSrcweir             mnTrackWidth    = aTrackRect.GetWidth();
603*cdf0e10cSrcweir             mnTrackHeight   = aTrackRect.GetHeight();
604*cdf0e10cSrcweir         }
605*cdf0e10cSrcweir     }
606*cdf0e10cSrcweir }
607*cdf0e10cSrcweir 
608*cdf0e10cSrcweir // -----------------------------------------------------------------------
609*cdf0e10cSrcweir 
610*cdf0e10cSrcweir long DockingWindow::Notify( NotifyEvent& rNEvt )
611*cdf0e10cSrcweir {
612*cdf0e10cSrcweir     if( GetDockingManager()->IsDockable( this ) )   // new docking interface
613*cdf0e10cSrcweir         return Window::Notify( rNEvt );
614*cdf0e10cSrcweir 
615*cdf0e10cSrcweir     if ( mbDockable )
616*cdf0e10cSrcweir     {
617*cdf0e10cSrcweir         if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN )
618*cdf0e10cSrcweir         {
619*cdf0e10cSrcweir             const MouseEvent* pMEvt = rNEvt.GetMouseEvent();
620*cdf0e10cSrcweir             if ( pMEvt->IsLeft() )
621*cdf0e10cSrcweir             {
622*cdf0e10cSrcweir                 if ( pMEvt->IsMod1() && (pMEvt->GetClicks() == 2) )
623*cdf0e10cSrcweir                 {
624*cdf0e10cSrcweir                     SetFloatingMode( !IsFloatingMode() );
625*cdf0e10cSrcweir                     return sal_True;
626*cdf0e10cSrcweir                 }
627*cdf0e10cSrcweir                 else if ( pMEvt->GetClicks() == 1 )
628*cdf0e10cSrcweir                 {
629*cdf0e10cSrcweir                     // check if window is floating standalone (IsFloating())
630*cdf0e10cSrcweir                     // or only partially floating and still docked with one border
631*cdf0e10cSrcweir                     // ( !mpWindowImpl->mbFrame)
632*cdf0e10cSrcweir                     if( ! IsFloatingMode() || ! mpFloatWin->mpWindowImpl->mbFrame )
633*cdf0e10cSrcweir                     {
634*cdf0e10cSrcweir                         Point   aPos = pMEvt->GetPosPixel();
635*cdf0e10cSrcweir                         Window* pWindow = rNEvt.GetWindow();
636*cdf0e10cSrcweir                         if ( pWindow != this )
637*cdf0e10cSrcweir                         {
638*cdf0e10cSrcweir                             aPos = pWindow->OutputToScreenPixel( aPos );
639*cdf0e10cSrcweir                             aPos = ScreenToOutputPixel( aPos );
640*cdf0e10cSrcweir                         }
641*cdf0e10cSrcweir                         ImplStartDocking( aPos );
642*cdf0e10cSrcweir                     }
643*cdf0e10cSrcweir                     return sal_True;
644*cdf0e10cSrcweir                 }
645*cdf0e10cSrcweir             }
646*cdf0e10cSrcweir         }
647*cdf0e10cSrcweir         else if( rNEvt.GetType() == EVENT_KEYINPUT )
648*cdf0e10cSrcweir         {
649*cdf0e10cSrcweir             const KeyCode& rKey = rNEvt.GetKeyEvent()->GetKeyCode();
650*cdf0e10cSrcweir             if( rKey.GetCode() == KEY_F10 && rKey.GetModifier() &&
651*cdf0e10cSrcweir                 rKey.IsShift() && rKey.IsMod1() )
652*cdf0e10cSrcweir             {
653*cdf0e10cSrcweir                 SetFloatingMode( !IsFloatingMode() );
654*cdf0e10cSrcweir                 return sal_True;
655*cdf0e10cSrcweir             }
656*cdf0e10cSrcweir         }
657*cdf0e10cSrcweir     }
658*cdf0e10cSrcweir 
659*cdf0e10cSrcweir     return Window::Notify( rNEvt );
660*cdf0e10cSrcweir }
661*cdf0e10cSrcweir 
662*cdf0e10cSrcweir // -----------------------------------------------------------------------
663*cdf0e10cSrcweir 
664*cdf0e10cSrcweir void DockingWindow::StartDocking()
665*cdf0e10cSrcweir {
666*cdf0e10cSrcweir     mbDocking = sal_True;
667*cdf0e10cSrcweir }
668*cdf0e10cSrcweir 
669*cdf0e10cSrcweir // -----------------------------------------------------------------------
670*cdf0e10cSrcweir 
671*cdf0e10cSrcweir sal_Bool DockingWindow::Docking( const Point&, Rectangle& )
672*cdf0e10cSrcweir {
673*cdf0e10cSrcweir     return IsFloatingMode();
674*cdf0e10cSrcweir }
675*cdf0e10cSrcweir 
676*cdf0e10cSrcweir // -----------------------------------------------------------------------
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir void DockingWindow::EndDocking( const Rectangle& rRect, sal_Bool bFloatMode )
679*cdf0e10cSrcweir {
680*cdf0e10cSrcweir     if ( !IsDockingCanceled() )
681*cdf0e10cSrcweir     {
682*cdf0e10cSrcweir         sal_Bool bShow = sal_False;
683*cdf0e10cSrcweir         if ( bFloatMode != IsFloatingMode() )
684*cdf0e10cSrcweir         {
685*cdf0e10cSrcweir             Show( sal_False, SHOW_NOFOCUSCHANGE );
686*cdf0e10cSrcweir             SetFloatingMode( bFloatMode );
687*cdf0e10cSrcweir             bShow = sal_True;
688*cdf0e10cSrcweir             if ( bFloatMode && mpFloatWin )
689*cdf0e10cSrcweir                 mpFloatWin->SetPosSizePixel( rRect.TopLeft(), rRect.GetSize() );
690*cdf0e10cSrcweir         }
691*cdf0e10cSrcweir         if ( !bFloatMode )
692*cdf0e10cSrcweir         {
693*cdf0e10cSrcweir             Point aPos = rRect.TopLeft();
694*cdf0e10cSrcweir             aPos = GetParent()->ScreenToOutputPixel( aPos );
695*cdf0e10cSrcweir             Window::SetPosSizePixel( aPos, rRect.GetSize() );
696*cdf0e10cSrcweir         }
697*cdf0e10cSrcweir 
698*cdf0e10cSrcweir         if ( bShow )
699*cdf0e10cSrcweir             Show();
700*cdf0e10cSrcweir     }
701*cdf0e10cSrcweir     mbDocking = sal_False;
702*cdf0e10cSrcweir }
703*cdf0e10cSrcweir 
704*cdf0e10cSrcweir // -----------------------------------------------------------------------
705*cdf0e10cSrcweir 
706*cdf0e10cSrcweir sal_Bool DockingWindow::PrepareToggleFloatingMode()
707*cdf0e10cSrcweir {
708*cdf0e10cSrcweir     return sal_True;
709*cdf0e10cSrcweir }
710*cdf0e10cSrcweir 
711*cdf0e10cSrcweir // -----------------------------------------------------------------------
712*cdf0e10cSrcweir 
713*cdf0e10cSrcweir sal_Bool DockingWindow::Close()
714*cdf0e10cSrcweir {
715*cdf0e10cSrcweir     ImplDelData aDelData;
716*cdf0e10cSrcweir     ImplAddDel( &aDelData );
717*cdf0e10cSrcweir     ImplCallEventListeners( VCLEVENT_WINDOW_CLOSE );
718*cdf0e10cSrcweir     if ( aDelData.IsDelete() )
719*cdf0e10cSrcweir         return sal_False;
720*cdf0e10cSrcweir     ImplRemoveDel( &aDelData );
721*cdf0e10cSrcweir 
722*cdf0e10cSrcweir     if ( mpWindowImpl->mxWindowPeer.is() && IsCreatedWithToolkit() )
723*cdf0e10cSrcweir         return sal_False;
724*cdf0e10cSrcweir 
725*cdf0e10cSrcweir     Show( sal_False, SHOW_NOFOCUSCHANGE );
726*cdf0e10cSrcweir     return sal_True;
727*cdf0e10cSrcweir }
728*cdf0e10cSrcweir 
729*cdf0e10cSrcweir // -----------------------------------------------------------------------
730*cdf0e10cSrcweir 
731*cdf0e10cSrcweir void DockingWindow::ToggleFloatingMode()
732*cdf0e10cSrcweir {
733*cdf0e10cSrcweir }
734*cdf0e10cSrcweir 
735*cdf0e10cSrcweir // -----------------------------------------------------------------------
736*cdf0e10cSrcweir 
737*cdf0e10cSrcweir void DockingWindow::TitleButtonClick( sal_uInt16 )
738*cdf0e10cSrcweir {
739*cdf0e10cSrcweir }
740*cdf0e10cSrcweir 
741*cdf0e10cSrcweir // -----------------------------------------------------------------------
742*cdf0e10cSrcweir 
743*cdf0e10cSrcweir void DockingWindow::Pin()
744*cdf0e10cSrcweir {
745*cdf0e10cSrcweir }
746*cdf0e10cSrcweir 
747*cdf0e10cSrcweir // -----------------------------------------------------------------------
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir void DockingWindow::Roll()
750*cdf0e10cSrcweir {
751*cdf0e10cSrcweir }
752*cdf0e10cSrcweir 
753*cdf0e10cSrcweir // -----------------------------------------------------------------------
754*cdf0e10cSrcweir 
755*cdf0e10cSrcweir void DockingWindow::PopupModeEnd()
756*cdf0e10cSrcweir {
757*cdf0e10cSrcweir }
758*cdf0e10cSrcweir 
759*cdf0e10cSrcweir // -----------------------------------------------------------------------
760*cdf0e10cSrcweir 
761*cdf0e10cSrcweir void DockingWindow::Resizing( Size& )
762*cdf0e10cSrcweir {
763*cdf0e10cSrcweir }
764*cdf0e10cSrcweir 
765*cdf0e10cSrcweir // -----------------------------------------------------------------------
766*cdf0e10cSrcweir 
767*cdf0e10cSrcweir void DockingWindow::StateChanged( StateChangedType nType )
768*cdf0e10cSrcweir {
769*cdf0e10cSrcweir     if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
770*cdf0e10cSrcweir     {
771*cdf0e10cSrcweir         ImplInitSettings();
772*cdf0e10cSrcweir         Invalidate();
773*cdf0e10cSrcweir     }
774*cdf0e10cSrcweir 
775*cdf0e10cSrcweir     Window::StateChanged( nType );
776*cdf0e10cSrcweir }
777*cdf0e10cSrcweir 
778*cdf0e10cSrcweir // -----------------------------------------------------------------------
779*cdf0e10cSrcweir 
780*cdf0e10cSrcweir void DockingWindow::DataChanged( const DataChangedEvent& rDCEvt )
781*cdf0e10cSrcweir {
782*cdf0e10cSrcweir     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
783*cdf0e10cSrcweir          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
784*cdf0e10cSrcweir     {
785*cdf0e10cSrcweir         ImplInitSettings();
786*cdf0e10cSrcweir         Invalidate();
787*cdf0e10cSrcweir     }
788*cdf0e10cSrcweir     else
789*cdf0e10cSrcweir         Window::DataChanged( rDCEvt );
790*cdf0e10cSrcweir }
791*cdf0e10cSrcweir 
792*cdf0e10cSrcweir // -----------------------------------------------------------------------
793*cdf0e10cSrcweir 
794*cdf0e10cSrcweir void DockingWindow::ShowTitleButton( sal_uInt16 nButton, sal_Bool bVisible )
795*cdf0e10cSrcweir {
796*cdf0e10cSrcweir     if ( mpFloatWin )
797*cdf0e10cSrcweir         mpFloatWin->ShowTitleButton( nButton, bVisible );
798*cdf0e10cSrcweir     else
799*cdf0e10cSrcweir     {
800*cdf0e10cSrcweir         if ( nButton == TITLE_BUTTON_DOCKING )
801*cdf0e10cSrcweir             mbDockBtn = bVisible;
802*cdf0e10cSrcweir         else /* if ( nButton == TITLE_BUTTON_HIDE ) */
803*cdf0e10cSrcweir             mbHideBtn = bVisible;
804*cdf0e10cSrcweir     }
805*cdf0e10cSrcweir }
806*cdf0e10cSrcweir 
807*cdf0e10cSrcweir // -----------------------------------------------------------------------
808*cdf0e10cSrcweir 
809*cdf0e10cSrcweir sal_Bool DockingWindow::IsTitleButtonVisible( sal_uInt16 nButton ) const
810*cdf0e10cSrcweir {
811*cdf0e10cSrcweir     if ( mpFloatWin )
812*cdf0e10cSrcweir         return mpFloatWin->IsTitleButtonVisible( nButton );
813*cdf0e10cSrcweir     else
814*cdf0e10cSrcweir     {
815*cdf0e10cSrcweir         if ( nButton == TITLE_BUTTON_DOCKING )
816*cdf0e10cSrcweir             return mbDockBtn;
817*cdf0e10cSrcweir         else /* if ( nButton == TITLE_BUTTON_HIDE ) */
818*cdf0e10cSrcweir             return mbHideBtn;
819*cdf0e10cSrcweir     }
820*cdf0e10cSrcweir }
821*cdf0e10cSrcweir 
822*cdf0e10cSrcweir // -----------------------------------------------------------------------
823*cdf0e10cSrcweir 
824*cdf0e10cSrcweir void DockingWindow::SetFloatingMode( sal_Bool bFloatMode )
825*cdf0e10cSrcweir {
826*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
827*cdf0e10cSrcweir     if( pWrapper )
828*cdf0e10cSrcweir     {
829*cdf0e10cSrcweir         pWrapper->SetFloatingMode( bFloatMode );
830*cdf0e10cSrcweir         return;
831*cdf0e10cSrcweir     }
832*cdf0e10cSrcweir     if ( IsFloatingMode() != bFloatMode )
833*cdf0e10cSrcweir     {
834*cdf0e10cSrcweir         if ( PrepareToggleFloatingMode() ) // changes to floating mode can be vetoed
835*cdf0e10cSrcweir         {
836*cdf0e10cSrcweir             sal_Bool bVisible = IsVisible();
837*cdf0e10cSrcweir 
838*cdf0e10cSrcweir             if ( bFloatMode )
839*cdf0e10cSrcweir             {
840*cdf0e10cSrcweir                 Show( sal_False, SHOW_NOFOCUSCHANGE );
841*cdf0e10cSrcweir 
842*cdf0e10cSrcweir                 maDockPos = Window::GetPosPixel();
843*cdf0e10cSrcweir 
844*cdf0e10cSrcweir                 Window* pRealParent = mpWindowImpl->mpRealParent;
845*cdf0e10cSrcweir                 mpOldBorderWin = mpWindowImpl->mpBorderWindow;
846*cdf0e10cSrcweir 
847*cdf0e10cSrcweir                 ImplDockFloatWin* pWin =
848*cdf0e10cSrcweir                     new ImplDockFloatWin(
849*cdf0e10cSrcweir                                          mpImplData->mpParent,
850*cdf0e10cSrcweir                                          mnFloatBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ?  mnFloatBits | WB_SYSTEMWINDOW : mnFloatBits,
851*cdf0e10cSrcweir                                          this );
852*cdf0e10cSrcweir                 mpFloatWin      = pWin;
853*cdf0e10cSrcweir                 mpWindowImpl->mpBorderWindow  = NULL;
854*cdf0e10cSrcweir                 mpWindowImpl->mnLeftBorder    = 0;
855*cdf0e10cSrcweir                 mpWindowImpl->mnTopBorder     = 0;
856*cdf0e10cSrcweir                 mpWindowImpl->mnRightBorder   = 0;
857*cdf0e10cSrcweir                 mpWindowImpl->mnBottomBorder  = 0;
858*cdf0e10cSrcweir                 // Falls Parent zerstoert wird, muessen wir auch vom
859*cdf0e10cSrcweir                 // BorderWindow den Parent umsetzen
860*cdf0e10cSrcweir                 if ( mpOldBorderWin )
861*cdf0e10cSrcweir                     mpOldBorderWin->SetParent( pWin );
862*cdf0e10cSrcweir                 SetParent( pWin );
863*cdf0e10cSrcweir                 SetPosPixel( Point() );
864*cdf0e10cSrcweir                 mpWindowImpl->mpBorderWindow = pWin;
865*cdf0e10cSrcweir                 pWin->mpWindowImpl->mpClientWindow = this;
866*cdf0e10cSrcweir                 mpWindowImpl->mpRealParent = pRealParent;
867*cdf0e10cSrcweir                 pWin->SetText( Window::GetText() );
868*cdf0e10cSrcweir                 pWin->SetOutputSizePixel( Window::GetSizePixel() );
869*cdf0e10cSrcweir                 pWin->SetPosPixel( maFloatPos );
870*cdf0e10cSrcweir                 // DockingDaten ans FloatingWindow weiterreichen
871*cdf0e10cSrcweir                 pWin->ShowTitleButton( TITLE_BUTTON_DOCKING, mbDockBtn );
872*cdf0e10cSrcweir                 pWin->ShowTitleButton( TITLE_BUTTON_HIDE, mbHideBtn );
873*cdf0e10cSrcweir                 pWin->SetPin( mbPined );
874*cdf0e10cSrcweir                 if ( mbRollUp )
875*cdf0e10cSrcweir                     pWin->RollUp();
876*cdf0e10cSrcweir                 else
877*cdf0e10cSrcweir                     pWin->RollDown();
878*cdf0e10cSrcweir                 pWin->SetRollUpOutputSizePixel( maRollUpOutSize );
879*cdf0e10cSrcweir                 pWin->SetMinOutputSizePixel( maMinOutSize );
880*cdf0e10cSrcweir                 pWin->SetMaxOutputSizePixel( mpImplData->maMaxOutSize );
881*cdf0e10cSrcweir 
882*cdf0e10cSrcweir                 ToggleFloatingMode();
883*cdf0e10cSrcweir 
884*cdf0e10cSrcweir                 if ( bVisible )
885*cdf0e10cSrcweir                     Show();
886*cdf0e10cSrcweir             }
887*cdf0e10cSrcweir             else
888*cdf0e10cSrcweir             {
889*cdf0e10cSrcweir                 Show( sal_False, SHOW_NOFOCUSCHANGE );
890*cdf0e10cSrcweir 
891*cdf0e10cSrcweir                 // FloatingDaten wird im FloatingWindow speichern
892*cdf0e10cSrcweir                 maFloatPos      = mpFloatWin->GetPosPixel();
893*cdf0e10cSrcweir                 mbDockBtn       = mpFloatWin->IsTitleButtonVisible( TITLE_BUTTON_DOCKING );
894*cdf0e10cSrcweir                 mbHideBtn       = mpFloatWin->IsTitleButtonVisible( TITLE_BUTTON_HIDE );
895*cdf0e10cSrcweir                 mbPined         = mpFloatWin->IsPined();
896*cdf0e10cSrcweir                 mbRollUp        = mpFloatWin->IsRollUp();
897*cdf0e10cSrcweir                 maRollUpOutSize = mpFloatWin->GetRollUpOutputSizePixel();
898*cdf0e10cSrcweir                 maMinOutSize    = mpFloatWin->GetMinOutputSizePixel();
899*cdf0e10cSrcweir                 mpImplData->maMaxOutSize = mpFloatWin->GetMaxOutputSizePixel();
900*cdf0e10cSrcweir 
901*cdf0e10cSrcweir                 Window* pRealParent = mpWindowImpl->mpRealParent;
902*cdf0e10cSrcweir                 mpWindowImpl->mpBorderWindow = NULL;
903*cdf0e10cSrcweir                 if ( mpOldBorderWin )
904*cdf0e10cSrcweir                 {
905*cdf0e10cSrcweir                     SetParent( mpOldBorderWin );
906*cdf0e10cSrcweir                     ((ImplBorderWindow*)mpOldBorderWin)->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder );
907*cdf0e10cSrcweir                     mpOldBorderWin->Resize();
908*cdf0e10cSrcweir                 }
909*cdf0e10cSrcweir                 mpWindowImpl->mpBorderWindow = mpOldBorderWin;
910*cdf0e10cSrcweir                 SetParent( pRealParent );
911*cdf0e10cSrcweir                 mpWindowImpl->mpRealParent = pRealParent;
912*cdf0e10cSrcweir                 delete static_cast<ImplDockFloatWin*>(mpFloatWin);
913*cdf0e10cSrcweir                 mpFloatWin = NULL;
914*cdf0e10cSrcweir                 SetPosPixel( maDockPos );
915*cdf0e10cSrcweir 
916*cdf0e10cSrcweir                 ToggleFloatingMode();
917*cdf0e10cSrcweir 
918*cdf0e10cSrcweir                 if ( bVisible )
919*cdf0e10cSrcweir                     Show();
920*cdf0e10cSrcweir             }
921*cdf0e10cSrcweir         }
922*cdf0e10cSrcweir     }
923*cdf0e10cSrcweir }
924*cdf0e10cSrcweir 
925*cdf0e10cSrcweir // -----------------------------------------------------------------------
926*cdf0e10cSrcweir 
927*cdf0e10cSrcweir void DockingWindow::SetFloatStyle( WinBits nStyle )
928*cdf0e10cSrcweir {
929*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
930*cdf0e10cSrcweir     if( pWrapper )
931*cdf0e10cSrcweir     {
932*cdf0e10cSrcweir         pWrapper->SetFloatStyle( nStyle );
933*cdf0e10cSrcweir         return;
934*cdf0e10cSrcweir     }
935*cdf0e10cSrcweir 
936*cdf0e10cSrcweir     mnFloatBits = nStyle;
937*cdf0e10cSrcweir }
938*cdf0e10cSrcweir 
939*cdf0e10cSrcweir // -----------------------------------------------------------------------
940*cdf0e10cSrcweir 
941*cdf0e10cSrcweir WinBits DockingWindow::GetFloatStyle() const
942*cdf0e10cSrcweir {
943*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
944*cdf0e10cSrcweir     if( pWrapper )
945*cdf0e10cSrcweir     {
946*cdf0e10cSrcweir         return pWrapper->GetFloatStyle();
947*cdf0e10cSrcweir     }
948*cdf0e10cSrcweir 
949*cdf0e10cSrcweir     return mnFloatBits;
950*cdf0e10cSrcweir }
951*cdf0e10cSrcweir 
952*cdf0e10cSrcweir // -----------------------------------------------------------------------
953*cdf0e10cSrcweir 
954*cdf0e10cSrcweir void DockingWindow::SetTabStop()
955*cdf0e10cSrcweir {
956*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
957*cdf0e10cSrcweir     if( pWrapper )
958*cdf0e10cSrcweir     {
959*cdf0e10cSrcweir         pWrapper->SetTabStop();
960*cdf0e10cSrcweir         return;
961*cdf0e10cSrcweir     }
962*cdf0e10cSrcweir 
963*cdf0e10cSrcweir     mpWindowImpl->mnStyle |= WB_GROUP | WB_TABSTOP;
964*cdf0e10cSrcweir }
965*cdf0e10cSrcweir 
966*cdf0e10cSrcweir // -----------------------------------------------------------------------
967*cdf0e10cSrcweir 
968*cdf0e10cSrcweir void DockingWindow::SetPosSizePixel( long nX, long nY,
969*cdf0e10cSrcweir                                      long nWidth, long nHeight,
970*cdf0e10cSrcweir                                      sal_uInt16 nFlags )
971*cdf0e10cSrcweir {
972*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
973*cdf0e10cSrcweir     if( pWrapper )
974*cdf0e10cSrcweir     {
975*cdf0e10cSrcweir         if ( pWrapper->mpFloatWin )
976*cdf0e10cSrcweir             pWrapper->mpFloatWin->SetPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
977*cdf0e10cSrcweir         else
978*cdf0e10cSrcweir             Window::SetPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
979*cdf0e10cSrcweir         return;
980*cdf0e10cSrcweir     }
981*cdf0e10cSrcweir 
982*cdf0e10cSrcweir     if ( mpFloatWin )
983*cdf0e10cSrcweir         mpFloatWin->SetPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
984*cdf0e10cSrcweir     else
985*cdf0e10cSrcweir         Window::SetPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
986*cdf0e10cSrcweir }
987*cdf0e10cSrcweir 
988*cdf0e10cSrcweir // -----------------------------------------------------------------------
989*cdf0e10cSrcweir 
990*cdf0e10cSrcweir Point DockingWindow::GetPosPixel() const
991*cdf0e10cSrcweir {
992*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
993*cdf0e10cSrcweir     if( pWrapper )
994*cdf0e10cSrcweir     {
995*cdf0e10cSrcweir         if ( pWrapper->mpFloatWin )
996*cdf0e10cSrcweir             return pWrapper->mpFloatWin->GetPosPixel();
997*cdf0e10cSrcweir         else
998*cdf0e10cSrcweir             return Window::GetPosPixel();
999*cdf0e10cSrcweir     }
1000*cdf0e10cSrcweir 
1001*cdf0e10cSrcweir     if ( mpFloatWin )
1002*cdf0e10cSrcweir         return mpFloatWin->GetPosPixel();
1003*cdf0e10cSrcweir     else
1004*cdf0e10cSrcweir         return Window::GetPosPixel();
1005*cdf0e10cSrcweir }
1006*cdf0e10cSrcweir 
1007*cdf0e10cSrcweir // -----------------------------------------------------------------------
1008*cdf0e10cSrcweir 
1009*cdf0e10cSrcweir Size DockingWindow::GetSizePixel() const
1010*cdf0e10cSrcweir {
1011*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
1012*cdf0e10cSrcweir     if( pWrapper )
1013*cdf0e10cSrcweir     {
1014*cdf0e10cSrcweir         if ( pWrapper->mpFloatWin )
1015*cdf0e10cSrcweir             return pWrapper->mpFloatWin->GetSizePixel();
1016*cdf0e10cSrcweir         else
1017*cdf0e10cSrcweir             return Window::GetSizePixel();
1018*cdf0e10cSrcweir     }
1019*cdf0e10cSrcweir 
1020*cdf0e10cSrcweir     if ( mpFloatWin )
1021*cdf0e10cSrcweir         return mpFloatWin->GetSizePixel();
1022*cdf0e10cSrcweir     else
1023*cdf0e10cSrcweir         return Window::GetSizePixel();
1024*cdf0e10cSrcweir }
1025*cdf0e10cSrcweir 
1026*cdf0e10cSrcweir // -----------------------------------------------------------------------
1027*cdf0e10cSrcweir 
1028*cdf0e10cSrcweir void DockingWindow::SetOutputSizePixel( const Size& rNewSize )
1029*cdf0e10cSrcweir {
1030*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
1031*cdf0e10cSrcweir     if( pWrapper )
1032*cdf0e10cSrcweir     {
1033*cdf0e10cSrcweir         if ( pWrapper->mpFloatWin )
1034*cdf0e10cSrcweir             pWrapper->mpFloatWin->SetOutputSizePixel( rNewSize );
1035*cdf0e10cSrcweir         else
1036*cdf0e10cSrcweir             Window::SetOutputSizePixel( rNewSize );
1037*cdf0e10cSrcweir         return;
1038*cdf0e10cSrcweir     }
1039*cdf0e10cSrcweir 
1040*cdf0e10cSrcweir     if ( mpFloatWin )
1041*cdf0e10cSrcweir         mpFloatWin->SetOutputSizePixel( rNewSize );
1042*cdf0e10cSrcweir     else
1043*cdf0e10cSrcweir         Window::SetOutputSizePixel( rNewSize );
1044*cdf0e10cSrcweir }
1045*cdf0e10cSrcweir 
1046*cdf0e10cSrcweir // -----------------------------------------------------------------------
1047*cdf0e10cSrcweir 
1048*cdf0e10cSrcweir Size DockingWindow::GetOutputSizePixel() const
1049*cdf0e10cSrcweir {
1050*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
1051*cdf0e10cSrcweir     if( pWrapper )
1052*cdf0e10cSrcweir     {
1053*cdf0e10cSrcweir         if ( pWrapper->mpFloatWin )
1054*cdf0e10cSrcweir             return pWrapper->mpFloatWin->GetOutputSizePixel();
1055*cdf0e10cSrcweir         else
1056*cdf0e10cSrcweir             return Window::GetOutputSizePixel();
1057*cdf0e10cSrcweir     }
1058*cdf0e10cSrcweir 
1059*cdf0e10cSrcweir     if ( mpFloatWin )
1060*cdf0e10cSrcweir         return mpFloatWin->GetOutputSizePixel();
1061*cdf0e10cSrcweir     else
1062*cdf0e10cSrcweir         return Window::GetOutputSizePixel();
1063*cdf0e10cSrcweir }
1064*cdf0e10cSrcweir 
1065*cdf0e10cSrcweir Point DockingWindow::GetFloatingPos() const
1066*cdf0e10cSrcweir {
1067*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
1068*cdf0e10cSrcweir     if( pWrapper )
1069*cdf0e10cSrcweir     {
1070*cdf0e10cSrcweir         if ( pWrapper->mpFloatWin )
1071*cdf0e10cSrcweir         {
1072*cdf0e10cSrcweir             WindowStateData aData;
1073*cdf0e10cSrcweir             aData.SetMask( WINDOWSTATE_MASK_POS );
1074*cdf0e10cSrcweir             pWrapper->mpFloatWin->GetWindowStateData( aData );
1075*cdf0e10cSrcweir             Point aPos( aData.GetX(), aData.GetY() );
1076*cdf0e10cSrcweir             aPos = pWrapper->mpFloatWin->GetParent()->ImplGetFrameWindow()->AbsoluteScreenToOutputPixel( aPos );
1077*cdf0e10cSrcweir             return aPos;
1078*cdf0e10cSrcweir         }
1079*cdf0e10cSrcweir         else
1080*cdf0e10cSrcweir             return maFloatPos;
1081*cdf0e10cSrcweir     }
1082*cdf0e10cSrcweir 
1083*cdf0e10cSrcweir     if ( mpFloatWin )
1084*cdf0e10cSrcweir     {
1085*cdf0e10cSrcweir         WindowStateData aData;
1086*cdf0e10cSrcweir         aData.SetMask( WINDOWSTATE_MASK_POS );
1087*cdf0e10cSrcweir         mpFloatWin->GetWindowStateData( aData );
1088*cdf0e10cSrcweir         Point aPos( aData.GetX(), aData.GetY() );
1089*cdf0e10cSrcweir         aPos = mpFloatWin->GetParent()->ImplGetFrameWindow()->AbsoluteScreenToOutputPixel( aPos );
1090*cdf0e10cSrcweir         return aPos;
1091*cdf0e10cSrcweir     }
1092*cdf0e10cSrcweir     else
1093*cdf0e10cSrcweir         return maFloatPos;
1094*cdf0e10cSrcweir }
1095*cdf0e10cSrcweir 
1096*cdf0e10cSrcweir sal_Bool DockingWindow::IsFloatingMode() const
1097*cdf0e10cSrcweir {
1098*cdf0e10cSrcweir     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
1099*cdf0e10cSrcweir     if( pWrapper )
1100*cdf0e10cSrcweir         return pWrapper->IsFloatingMode();
1101*cdf0e10cSrcweir     else
1102*cdf0e10cSrcweir         return (mpFloatWin != NULL);
1103*cdf0e10cSrcweir }
1104*cdf0e10cSrcweir 
1105*cdf0e10cSrcweir void DockingWindow::SetMaxOutputSizePixel( const Size& rSize )
1106*cdf0e10cSrcweir {
1107*cdf0e10cSrcweir     if ( mpFloatWin )
1108*cdf0e10cSrcweir         mpFloatWin->SetMaxOutputSizePixel( rSize );
1109*cdf0e10cSrcweir     mpImplData->maMaxOutSize = rSize;
1110*cdf0e10cSrcweir }
1111*cdf0e10cSrcweir 
1112*cdf0e10cSrcweir const Size& DockingWindow::GetMaxOutputSizePixel() const
1113*cdf0e10cSrcweir {
1114*cdf0e10cSrcweir     if ( mpFloatWin )
1115*cdf0e10cSrcweir         return mpFloatWin->GetMaxOutputSizePixel();
1116*cdf0e10cSrcweir     return mpImplData->maMaxOutSize;
1117*cdf0e10cSrcweir }
1118