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