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