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 10cdf0e10cSrcweir * 119f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 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. 19cdf0e10cSrcweir * 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 62cdf0e10cSrcweir DockingWindow::ImplData::ImplData() 63cdf0e10cSrcweir { 64cdf0e10cSrcweir mpParent = NULL; 65cdf0e10cSrcweir maMaxOutSize = Size( SHRT_MAX, SHRT_MAX ); 66cdf0e10cSrcweir } 67cdf0e10cSrcweir 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 101cdf0e10cSrcweir sal_uLong GetLastTicks() const { return mnLastTicks; } 102cdf0e10cSrcweir }; 103cdf0e10cSrcweir 104cdf0e10cSrcweir 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 132cdf0e10cSrcweir ImplDockFloatWin::~ImplDockFloatWin() 133cdf0e10cSrcweir { 134cdf0e10cSrcweir if( mnLastUserEvent ) 135cdf0e10cSrcweir Application::RemoveUserEvent( mnLastUserEvent ); 136cdf0e10cSrcweir } 137cdf0e10cSrcweir 138cdf0e10cSrcweir // ----------------------------------------------------------------------- 139cdf0e10cSrcweir 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 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 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 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 240cdf0e10cSrcweir void ImplDockFloatWin::TitleButtonClick( sal_uInt16 nButton ) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir FloatingWindow::TitleButtonClick( nButton ); 243cdf0e10cSrcweir mpDockWin->TitleButtonClick( nButton ); 244cdf0e10cSrcweir } 245cdf0e10cSrcweir 246cdf0e10cSrcweir // ----------------------------------------------------------------------- 247cdf0e10cSrcweir 248cdf0e10cSrcweir void ImplDockFloatWin::Pin() 249cdf0e10cSrcweir { 250cdf0e10cSrcweir FloatingWindow::Pin(); 251cdf0e10cSrcweir mpDockWin->Pin(); 252cdf0e10cSrcweir } 253cdf0e10cSrcweir 254cdf0e10cSrcweir // ----------------------------------------------------------------------- 255cdf0e10cSrcweir 256cdf0e10cSrcweir void ImplDockFloatWin::Roll() 257cdf0e10cSrcweir { 258cdf0e10cSrcweir FloatingWindow::Roll(); 259cdf0e10cSrcweir mpDockWin->Roll(); 260cdf0e10cSrcweir } 261cdf0e10cSrcweir 262cdf0e10cSrcweir // ----------------------------------------------------------------------- 263cdf0e10cSrcweir 264cdf0e10cSrcweir void ImplDockFloatWin::PopupModeEnd() 265cdf0e10cSrcweir { 266cdf0e10cSrcweir FloatingWindow::PopupModeEnd(); 267cdf0e10cSrcweir mpDockWin->PopupModeEnd(); 268cdf0e10cSrcweir } 269cdf0e10cSrcweir 270cdf0e10cSrcweir // ----------------------------------------------------------------------- 271cdf0e10cSrcweir 272cdf0e10cSrcweir void ImplDockFloatWin::Resizing( Size& rSize ) 273cdf0e10cSrcweir { 274cdf0e10cSrcweir FloatingWindow::Resizing( rSize ); 275cdf0e10cSrcweir mpDockWin->Resizing( rSize ); 276cdf0e10cSrcweir } 277cdf0e10cSrcweir 278cdf0e10cSrcweir // ----------------------------------------------------------------------- 279cdf0e10cSrcweir 280cdf0e10cSrcweir sal_Bool ImplDockFloatWin::Close() 281cdf0e10cSrcweir { 282cdf0e10cSrcweir return mpDockWin->Close(); 283cdf0e10cSrcweir } 284cdf0e10cSrcweir 285cdf0e10cSrcweir // ======================================================================= 286cdf0e10cSrcweir 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 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 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 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 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 440cdf0e10cSrcweir DockingWindow::DockingWindow( WindowType nType ) : 441cdf0e10cSrcweir Window( nType ) 442cdf0e10cSrcweir { 443cdf0e10cSrcweir ImplInitDockingWindowData(); 444cdf0e10cSrcweir } 445cdf0e10cSrcweir 446cdf0e10cSrcweir // ----------------------------------------------------------------------- 447cdf0e10cSrcweir 448cdf0e10cSrcweir DockingWindow::DockingWindow( Window* pParent, WinBits nStyle ) : 449cdf0e10cSrcweir Window( WINDOW_DOCKINGWINDOW ) 450cdf0e10cSrcweir { 451cdf0e10cSrcweir ImplInitDockingWindowData(); 452cdf0e10cSrcweir ImplInit( pParent, nStyle ); 453cdf0e10cSrcweir } 454cdf0e10cSrcweir 455cdf0e10cSrcweir // ----------------------------------------------------------------------- 456cdf0e10cSrcweir 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 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 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 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 660cdf0e10cSrcweir void DockingWindow::StartDocking() 661cdf0e10cSrcweir { 662cdf0e10cSrcweir mbDocking = sal_True; 663cdf0e10cSrcweir } 664cdf0e10cSrcweir 665cdf0e10cSrcweir // ----------------------------------------------------------------------- 666cdf0e10cSrcweir 667cdf0e10cSrcweir sal_Bool DockingWindow::Docking( const Point&, Rectangle& ) 668cdf0e10cSrcweir { 669cdf0e10cSrcweir return IsFloatingMode(); 670cdf0e10cSrcweir } 671cdf0e10cSrcweir 672cdf0e10cSrcweir // ----------------------------------------------------------------------- 673cdf0e10cSrcweir 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 702cdf0e10cSrcweir sal_Bool DockingWindow::PrepareToggleFloatingMode() 703cdf0e10cSrcweir { 704cdf0e10cSrcweir return sal_True; 705cdf0e10cSrcweir } 706cdf0e10cSrcweir 707cdf0e10cSrcweir // ----------------------------------------------------------------------- 708cdf0e10cSrcweir 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 727cdf0e10cSrcweir void DockingWindow::ToggleFloatingMode() 728cdf0e10cSrcweir { 729cdf0e10cSrcweir } 730cdf0e10cSrcweir 731cdf0e10cSrcweir // ----------------------------------------------------------------------- 732cdf0e10cSrcweir 733cdf0e10cSrcweir void DockingWindow::TitleButtonClick( sal_uInt16 ) 734cdf0e10cSrcweir { 735cdf0e10cSrcweir } 736cdf0e10cSrcweir 737cdf0e10cSrcweir // ----------------------------------------------------------------------- 738cdf0e10cSrcweir 739cdf0e10cSrcweir void DockingWindow::Pin() 740cdf0e10cSrcweir { 741cdf0e10cSrcweir } 742cdf0e10cSrcweir 743cdf0e10cSrcweir // ----------------------------------------------------------------------- 744cdf0e10cSrcweir 745cdf0e10cSrcweir void DockingWindow::Roll() 746cdf0e10cSrcweir { 747cdf0e10cSrcweir } 748cdf0e10cSrcweir 749cdf0e10cSrcweir // ----------------------------------------------------------------------- 750cdf0e10cSrcweir 751cdf0e10cSrcweir void DockingWindow::PopupModeEnd() 752cdf0e10cSrcweir { 753cdf0e10cSrcweir } 754cdf0e10cSrcweir 755cdf0e10cSrcweir // ----------------------------------------------------------------------- 756cdf0e10cSrcweir 757cdf0e10cSrcweir void DockingWindow::Resizing( Size& ) 758cdf0e10cSrcweir { 759cdf0e10cSrcweir } 760cdf0e10cSrcweir 761cdf0e10cSrcweir // ----------------------------------------------------------------------- 762cdf0e10cSrcweir 763cdf0e10cSrcweir void DockingWindow::StateChanged( StateChangedType nType ) 764cdf0e10cSrcweir { 765087aa071SAndre Fischer switch(nType) 766cdf0e10cSrcweir { 767087aa071SAndre Fischer case STATE_CHANGE_CONTROLBACKGROUND: 768cdf0e10cSrcweir ImplInitSettings(); 769cdf0e10cSrcweir 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 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 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 814cdf0e10cSrcweir 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 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 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 951cdf0e10cSrcweir 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 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 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 1000cdf0e10cSrcweir 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 1019cdf0e10cSrcweir 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 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 1058cdf0e10cSrcweir 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 1075cdf0e10cSrcweir 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 1106cdf0e10cSrcweir 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 1115cdf0e10cSrcweir void DockingWindow::SetMaxOutputSizePixel( const Size& rSize ) 1116cdf0e10cSrcweir { 1117cdf0e10cSrcweir if ( mpFloatWin ) 1118cdf0e10cSrcweir mpFloatWin->SetMaxOutputSizePixel( rSize ); 1119cdf0e10cSrcweir mpImplData->maMaxOutSize = rSize; 1120cdf0e10cSrcweir } 1121cdf0e10cSrcweir 1122cdf0e10cSrcweir const Size& DockingWindow::GetMaxOutputSizePixel() const 1123cdf0e10cSrcweir { 1124cdf0e10cSrcweir if ( mpFloatWin ) 1125cdf0e10cSrcweir return mpFloatWin->GetMaxOutputSizePixel(); 1126cdf0e10cSrcweir return mpImplData->maMaxOutSize; 1127cdf0e10cSrcweir } 1128