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