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