|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_vcl.hxx" | 
|  |  | 
|  | #include <tools/time.hxx> | 
|  | #include <tools/rc.h> | 
|  |  | 
|  | #include <vcl/event.hxx> | 
|  | #include <vcl/floatwin.hxx> | 
|  | #include <vcl/dockwin.hxx> | 
|  | #include <vcl/svapp.hxx> | 
|  | #include <vcl/timer.hxx> | 
|  | #include <vcl/unowrap.hxx> | 
|  |  | 
|  | #include <svdata.hxx> | 
|  | #include <window.h> | 
|  | #include <brdwin.hxx> | 
|  | #include <salframe.hxx> | 
|  |  | 
|  |  | 
|  |  | 
|  | // ======================================================================= | 
|  |  | 
|  | #define DOCKWIN_FLOATSTYLES         (WB_SIZEABLE | WB_MOVEABLE | WB_CLOSEABLE | WB_STANDALONE | WB_PINABLE | WB_ROLLABLE ) | 
|  |  | 
|  | // ======================================================================= | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | class DockingWindow::ImplData | 
|  | { | 
|  | public: | 
|  | ImplData(); | 
|  | ~ImplData(); | 
|  |  | 
|  | Window* 		mpParent; | 
|  | Size			maMaxOutSize; | 
|  | }; | 
|  |  | 
|  | DockingWindow::ImplData::ImplData() | 
|  | { | 
|  | mpParent = NULL; | 
|  | maMaxOutSize = Size( SHRT_MAX, SHRT_MAX ); | 
|  | } | 
|  |  | 
|  | DockingWindow::ImplData::~ImplData() | 
|  | { | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | class ImplDockFloatWin : public FloatingWindow | 
|  | { | 
|  | private: | 
|  | DockingWindow*  mpDockWin; | 
|  | sal_uLong			mnLastTicks; | 
|  | Timer			maDockTimer; | 
|  | Point			maDockPos; | 
|  | Rectangle		maDockRect; | 
|  | sal_Bool            mbInMove; | 
|  | sal_uLong			mnLastUserEvent; | 
|  |  | 
|  | DECL_LINK( DockingHdl, ImplDockFloatWin* ); | 
|  | DECL_LINK( DockTimerHdl, ImplDockFloatWin* ); | 
|  | public: | 
|  | ImplDockFloatWin( Window* pParent, WinBits nWinBits, | 
|  | DockingWindow* pDockingWin ); | 
|  | ~ImplDockFloatWin(); | 
|  |  | 
|  | virtual void	Move(); | 
|  | virtual void	Resize(); | 
|  | virtual void	TitleButtonClick( sal_uInt16 nButton ); | 
|  | virtual void	Pin(); | 
|  | virtual void	Roll(); | 
|  | virtual void	PopupModeEnd(); | 
|  | virtual void	Resizing( Size& rSize ); | 
|  | virtual sal_Bool	Close(); | 
|  |  | 
|  | sal_uLong GetLastTicks() const { return mnLastTicks; } | 
|  | }; | 
|  |  | 
|  |  | 
|  | ImplDockFloatWin::ImplDockFloatWin( Window* pParent, WinBits nWinBits, | 
|  | DockingWindow* pDockingWin ) : | 
|  | FloatingWindow( pParent, nWinBits ), | 
|  | mpDockWin( pDockingWin ), | 
|  | mnLastTicks( Time::GetSystemTicks() ), | 
|  | mbInMove( sal_False ), | 
|  | mnLastUserEvent( 0 ) | 
|  | { | 
|  | // Daten vom DockingWindow uebernehmen | 
|  | if ( pDockingWin ) | 
|  | { | 
|  | SetSettings( pDockingWin->GetSettings() ); | 
|  | Enable( pDockingWin->IsEnabled(), sal_False ); | 
|  | EnableInput( pDockingWin->IsInputEnabled(), sal_False ); | 
|  | AlwaysEnableInput( pDockingWin->IsAlwaysEnableInput(), sal_False ); | 
|  | EnableAlwaysOnTop( pDockingWin->IsAlwaysOnTopEnabled() ); | 
|  | SetActivateMode( pDockingWin->GetActivateMode() ); | 
|  | } | 
|  |  | 
|  | SetBackground(); | 
|  |  | 
|  | maDockTimer.SetTimeoutHdl( LINK( this, ImplDockFloatWin, DockTimerHdl ) ); | 
|  | maDockTimer.SetTimeout( 50 ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | ImplDockFloatWin::~ImplDockFloatWin() | 
|  | { | 
|  | if( mnLastUserEvent ) | 
|  | Application::RemoveUserEvent( mnLastUserEvent ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | IMPL_LINK( ImplDockFloatWin, DockTimerHdl, ImplDockFloatWin*, EMPTYARG ) | 
|  | { | 
|  | DBG_ASSERT( mpDockWin->IsFloatingMode(), "docktimer called but not floating" ); | 
|  |  | 
|  | maDockTimer.Stop(); | 
|  | PointerState aState = GetPointerState(); | 
|  |  | 
|  | if( aState.mnState & KEY_MOD1 ) | 
|  | { | 
|  | // i43499 CTRL disables docking now | 
|  | mpDockWin->GetParent()->ImplGetFrameWindow()->HideTracking(); | 
|  | mpDockWin->EndDocking( maDockRect, sal_True ); | 
|  | if( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) | 
|  | maDockTimer.Start(); | 
|  | } | 
|  | else if( ! ( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) ) | 
|  | { | 
|  | mpDockWin->GetParent()->ImplGetFrameWindow()->HideTracking(); | 
|  | mpDockWin->EndDocking( maDockRect, sal_False ); | 
|  | } | 
|  | else | 
|  | { | 
|  | mpDockWin->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, SHOWTRACK_BIG | SHOWTRACK_WINDOW ); | 
|  | maDockTimer.Start(); | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | IMPL_LINK( ImplDockFloatWin, DockingHdl, ImplDockFloatWin*, EMPTYARG ) | 
|  | { | 
|  | PointerState aState = mpDockWin->GetParent()->GetPointerState(); | 
|  |  | 
|  | mnLastUserEvent = 0; | 
|  | if( mpDockWin->IsDockable()								&& | 
|  | (Time::GetSystemTicks() - mnLastTicks > 500)		&& | 
|  | ( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) && | 
|  | !(aState.mnState & KEY_MOD1) )  // i43499 CTRL disables docking now | 
|  | { | 
|  | maDockPos = Point( mpDockWin->GetParent()->AbsoluteScreenToOutputPixel( OutputToAbsoluteScreenPixel( Point() ) ) ); | 
|  | maDockPos = mpDockWin->GetParent()->OutputToScreenPixel( maDockPos );  // sfx expects screen coordinates | 
|  |  | 
|  | if( ! mpDockWin->IsDocking() ) | 
|  | mpDockWin->StartDocking(); | 
|  | maDockRect = Rectangle( maDockPos, mpDockWin->GetSizePixel() ); | 
|  |  | 
|  | // mouse pos also in screen pixels | 
|  | Point aMousePos = mpDockWin->GetParent()->OutputToScreenPixel( aState.maPos ); | 
|  |  | 
|  | sal_Bool bFloatMode = mpDockWin->Docking( aMousePos, maDockRect ); | 
|  | if( ! bFloatMode ) | 
|  | { | 
|  | mpDockWin->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, SHOWTRACK_OBJECT | SHOWTRACK_WINDOW ); | 
|  | DockTimerHdl( this ); | 
|  | } | 
|  | else | 
|  | { | 
|  | mpDockWin->GetParent()->ImplGetFrameWindow()->HideTracking(); | 
|  | maDockTimer.Stop(); | 
|  | mpDockWin->EndDocking( maDockRect, sal_True ); | 
|  | } | 
|  | } | 
|  | mbInMove = sal_False; | 
|  | return 0; | 
|  | } | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void ImplDockFloatWin::Move() | 
|  | { | 
|  | if( mbInMove ) | 
|  | return; | 
|  |  | 
|  | mbInMove = sal_True; | 
|  | FloatingWindow::Move(); | 
|  | mpDockWin->Move(); | 
|  |  | 
|  | /* | 
|  | *  note: the window should only dock if | 
|  | *  the user releases all mouse buttons. The real problem here | 
|  | *  is that we don't get mouse events (at least not on X) | 
|  | *  if the mouse is on the decoration. So we have to start an | 
|  | *  awkward timer based process that polls the modifier/buttons | 
|  | *  to see whether they are in the right condition shortly after the | 
|  | *  last Move message. | 
|  | */ | 
|  | if( ! mnLastUserEvent ) | 
|  | mnLastUserEvent = Application::PostUserEvent( LINK( this, ImplDockFloatWin, DockingHdl ) ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void ImplDockFloatWin::Resize() | 
|  | { | 
|  | FloatingWindow::Resize(); | 
|  | Size aSize( GetSizePixel() ); | 
|  | mpDockWin->ImplPosSizeWindow( 0, 0, aSize.Width(), aSize.Height(), WINDOW_POSSIZE_POSSIZE ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void ImplDockFloatWin::TitleButtonClick( sal_uInt16 nButton ) | 
|  | { | 
|  | FloatingWindow::TitleButtonClick( nButton ); | 
|  | mpDockWin->TitleButtonClick( nButton ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void ImplDockFloatWin::Pin() | 
|  | { | 
|  | FloatingWindow::Pin(); | 
|  | mpDockWin->Pin(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void ImplDockFloatWin::Roll() | 
|  | { | 
|  | FloatingWindow::Roll(); | 
|  | mpDockWin->Roll(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void ImplDockFloatWin::PopupModeEnd() | 
|  | { | 
|  | FloatingWindow::PopupModeEnd(); | 
|  | mpDockWin->PopupModeEnd(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void ImplDockFloatWin::Resizing( Size& rSize ) | 
|  | { | 
|  | FloatingWindow::Resizing( rSize ); | 
|  | mpDockWin->Resizing( rSize ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | sal_Bool ImplDockFloatWin::Close() | 
|  | { | 
|  | return mpDockWin->Close(); | 
|  | } | 
|  |  | 
|  | // ======================================================================= | 
|  |  | 
|  | sal_Bool DockingWindow::ImplStartDocking( const Point& rPos ) | 
|  | { | 
|  | if ( !mbDockable ) | 
|  | return sal_False; | 
|  |  | 
|  | maMouseOff      = rPos; | 
|  | maMouseStart    = maMouseOff; | 
|  | mbDocking       = sal_True; | 
|  | mbLastFloatMode = IsFloatingMode(); | 
|  | mbStartFloat    = mbLastFloatMode; | 
|  |  | 
|  | // FloatingBorder berechnen | 
|  | FloatingWindow* pWin; | 
|  | if ( mpFloatWin ) | 
|  | pWin = mpFloatWin; | 
|  | else | 
|  | pWin = new ImplDockFloatWin( mpImplData->mpParent, mnFloatBits, NULL ); | 
|  | pWin->GetBorder( mnDockLeft, mnDockTop, mnDockRight, mnDockBottom ); | 
|  | if ( !mpFloatWin ) | 
|  | delete pWin; | 
|  |  | 
|  | Point   aPos    = ImplOutputToFrame( Point() ); | 
|  | Size    aSize   = Window::GetOutputSizePixel(); | 
|  | mnTrackX        = aPos.X(); | 
|  | mnTrackY        = aPos.Y(); | 
|  | mnTrackWidth    = aSize.Width(); | 
|  | mnTrackHeight   = aSize.Height(); | 
|  |  | 
|  | if ( mbLastFloatMode ) | 
|  | { | 
|  | maMouseOff.X()  += mnDockLeft; | 
|  | maMouseOff.Y()  += mnDockTop; | 
|  | mnTrackX        -= mnDockLeft; | 
|  | mnTrackY        -= mnDockTop; | 
|  | mnTrackWidth    += mnDockLeft+mnDockRight; | 
|  | mnTrackHeight   += mnDockTop+mnDockBottom; | 
|  | } | 
|  |  | 
|  | if ( GetSettings().GetStyleSettings().GetDragFullOptions() & DRAGFULL_OPTION_DOCKING && | 
|  | !( mnFloatBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ) ) // no full drag when migrating to system window | 
|  | mbDragFull = sal_True; | 
|  | else | 
|  | { | 
|  | StartDocking(); | 
|  | mbDragFull = sal_False; | 
|  | ImplUpdateAll(); | 
|  | ImplGetFrameWindow()->ImplUpdateAll(); | 
|  | } | 
|  |  | 
|  | StartTracking( STARTTRACK_KEYMOD ); | 
|  | return sal_True; | 
|  | } | 
|  |  | 
|  | // ======================================================================= | 
|  |  | 
|  | void DockingWindow::ImplInitDockingWindowData() | 
|  | { | 
|  | mpImplData              = new ImplData; | 
|  | mpWindowImpl->mbDockWin               = sal_True; | 
|  |  | 
|  | mpFloatWin              = NULL; | 
|  | mbDockCanceled          = sal_False; | 
|  | mbDockPrevented         = sal_False; | 
|  | mbFloatPrevented        = sal_False; | 
|  | mbDocking               = sal_False; | 
|  | mbPined                 = sal_False; | 
|  | mbRollUp                = sal_False; | 
|  | mbDockBtn               = sal_False; | 
|  | mbHideBtn               = sal_False; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::ImplInit( Window* pParent, WinBits nStyle ) | 
|  | { | 
|  | if ( !(nStyle & WB_NODIALOGCONTROL) ) | 
|  | nStyle |= WB_DIALOGCONTROL; | 
|  |  | 
|  | mpImplData->mpParent    = pParent; | 
|  | mbDockable              = (nStyle & WB_DOCKABLE) != 0; | 
|  | mnFloatBits             = WB_BORDER | (nStyle & DOCKWIN_FLOATSTYLES); | 
|  | nStyle                 &= ~(DOCKWIN_FLOATSTYLES | WB_BORDER); | 
|  | if ( nStyle & WB_DOCKBORDER ) | 
|  | nStyle |= WB_BORDER; | 
|  |  | 
|  | Window::ImplInit( pParent, nStyle, NULL ); | 
|  |  | 
|  | ImplInitSettings(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::ImplInitSettings() | 
|  | { | 
|  | // Hack, damit man auch DockingWindows ohne Hintergrund bauen kann | 
|  | // und noch nicht alles umgestellt ist | 
|  | if ( IsBackground() ) | 
|  | { | 
|  | const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); | 
|  |  | 
|  | Color aColor; | 
|  | if ( IsControlBackground() ) | 
|  | aColor = GetControlBackground(); | 
|  | else if ( Window::GetStyle() & WB_3DLOOK ) | 
|  | aColor = rStyleSettings.GetFaceColor(); | 
|  | else | 
|  | aColor = rStyleSettings.GetWindowColor(); | 
|  | SetBackground( aColor ); | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::ImplLoadRes( const ResId& rResId ) | 
|  | { | 
|  | Window::ImplLoadRes( rResId ); | 
|  |  | 
|  | sal_uLong  nMask = ReadLongRes(); | 
|  |  | 
|  | if ( (RSC_DOCKINGWINDOW_XYMAPMODE | RSC_DOCKINGWINDOW_X | | 
|  | RSC_DOCKINGWINDOW_Y) & nMask ) | 
|  | { | 
|  | // Groessenangabe aus der Resource verwenden | 
|  | Point   aPos; | 
|  | MapUnit ePosMap = MAP_PIXEL; | 
|  |  | 
|  | if ( RSC_DOCKINGWINDOW_XYMAPMODE & nMask ) | 
|  | ePosMap = (MapUnit)ReadLongRes(); | 
|  |  | 
|  | if ( RSC_DOCKINGWINDOW_X & nMask ) | 
|  | { | 
|  | aPos.X() = ReadShortRes(); | 
|  | aPos.X() = ImplLogicUnitToPixelX( aPos.X(), ePosMap ); | 
|  | } | 
|  |  | 
|  | if ( RSC_DOCKINGWINDOW_Y & nMask ) | 
|  | { | 
|  | aPos.Y() = ReadShortRes(); | 
|  | aPos.Y() = ImplLogicUnitToPixelY( aPos.Y(), ePosMap ); | 
|  | } | 
|  |  | 
|  | SetFloatingPos( aPos ); | 
|  | } | 
|  |  | 
|  | if ( nMask & RSC_DOCKINGWINDOW_FLOATING ) | 
|  | { | 
|  | if ( (sal_Bool)ReadShortRes() ) | 
|  | SetFloatingMode( sal_True ); | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | DockingWindow::DockingWindow( WindowType nType ) : | 
|  | Window( nType ) | 
|  | { | 
|  | ImplInitDockingWindowData(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | DockingWindow::DockingWindow( Window* pParent, WinBits nStyle ) : | 
|  | Window( WINDOW_DOCKINGWINDOW ) | 
|  | { | 
|  | ImplInitDockingWindowData(); | 
|  | ImplInit( pParent, nStyle ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | DockingWindow::DockingWindow( Window* pParent, const ResId& rResId ) : | 
|  | Window( WINDOW_DOCKINGWINDOW ) | 
|  | { | 
|  | ImplInitDockingWindowData(); | 
|  | rResId.SetRT( RSC_DOCKINGWINDOW ); | 
|  | WinBits nStyle = ImplInitRes( rResId ); | 
|  | ImplInit( pParent, nStyle ); | 
|  | ImplLoadRes( rResId ); | 
|  |  | 
|  | if ( !(nStyle & WB_HIDE) ) | 
|  | Show(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | DockingWindow::~DockingWindow() | 
|  | { | 
|  | if ( IsFloatingMode() ) | 
|  | { | 
|  | Show( sal_False, SHOW_NOFOCUSCHANGE ); | 
|  | SetFloatingMode( sal_False ); | 
|  | } | 
|  | delete mpImplData; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::Tracking( const TrackingEvent& rTEvt ) | 
|  | { | 
|  | if( GetDockingManager()->IsDockable( this ) )   // new docking interface | 
|  | return Window::Tracking( rTEvt ); | 
|  |  | 
|  | if ( mbDocking ) | 
|  | { | 
|  | if ( rTEvt.IsTrackingEnded() ) | 
|  | { | 
|  | mbDocking = sal_False; | 
|  | if ( mbDragFull ) | 
|  | { | 
|  | // Bei Abbruch alten Zustand wieder herstellen | 
|  | if ( rTEvt.IsTrackingCanceled() ) | 
|  | { | 
|  | StartDocking(); | 
|  | Rectangle aRect( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ); | 
|  | EndDocking( aRect, mbStartFloat ); | 
|  | } | 
|  | } | 
|  | else | 
|  | { | 
|  | HideTracking(); | 
|  | if ( rTEvt.IsTrackingCanceled() ) | 
|  | { | 
|  | mbDockCanceled = sal_True; | 
|  | EndDocking( Rectangle( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ), mbLastFloatMode ); | 
|  | mbDockCanceled = sal_False; | 
|  | } | 
|  | else | 
|  | EndDocking( Rectangle( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ), mbLastFloatMode ); | 
|  | } | 
|  | } | 
|  | // Docking nur bei nicht synthetischen MouseEvents | 
|  | else if ( !rTEvt.GetMouseEvent().IsSynthetic() || rTEvt.GetMouseEvent().IsModifierChanged() ) | 
|  | { | 
|  | Point   aMousePos = rTEvt.GetMouseEvent().GetPosPixel(); | 
|  | Point   aFrameMousePos = ImplOutputToFrame( aMousePos ); | 
|  | Size    aFrameSize = mpWindowImpl->mpFrameWindow->GetOutputSizePixel(); | 
|  | if ( aFrameMousePos.X() < 0 ) | 
|  | aFrameMousePos.X() = 0; | 
|  | if ( aFrameMousePos.Y() < 0 ) | 
|  | aFrameMousePos.Y() = 0; | 
|  | if ( aFrameMousePos.X() > aFrameSize.Width()-1 ) | 
|  | aFrameMousePos.X() = aFrameSize.Width()-1; | 
|  | if ( aFrameMousePos.Y() > aFrameSize.Height()-1 ) | 
|  | aFrameMousePos.Y() = aFrameSize.Height()-1; | 
|  | aMousePos = ImplFrameToOutput( aFrameMousePos ); | 
|  | aMousePos.X() -= maMouseOff.X(); | 
|  | aMousePos.Y() -= maMouseOff.Y(); | 
|  | Point aFramePos = ImplOutputToFrame( aMousePos ); | 
|  | Rectangle aTrackRect( aFramePos, Size( mnTrackWidth, mnTrackHeight ) ); | 
|  | Rectangle aCompRect = aTrackRect; | 
|  | aFramePos.X()    += maMouseOff.X(); | 
|  | aFramePos.Y()    += maMouseOff.Y(); | 
|  | if ( mbDragFull ) | 
|  | StartDocking(); | 
|  | sal_Bool bFloatMode = Docking( aFramePos, aTrackRect ); | 
|  | mbDockPrevented = sal_False; | 
|  | mbFloatPrevented = sal_False; | 
|  | if ( mbLastFloatMode != bFloatMode ) | 
|  | { | 
|  | if ( bFloatMode ) | 
|  | { | 
|  | aTrackRect.Left()   -= mnDockLeft; | 
|  | aTrackRect.Top()    -= mnDockTop; | 
|  | aTrackRect.Right()  += mnDockRight; | 
|  | aTrackRect.Bottom() += mnDockBottom; | 
|  | } | 
|  | else | 
|  | { | 
|  | if ( aCompRect == aTrackRect ) | 
|  | { | 
|  | aTrackRect.Left()   += mnDockLeft; | 
|  | aTrackRect.Top()    += mnDockTop; | 
|  | aTrackRect.Right()  -= mnDockRight; | 
|  | aTrackRect.Bottom() -= mnDockBottom; | 
|  | } | 
|  | } | 
|  | mbLastFloatMode = bFloatMode; | 
|  | } | 
|  | if ( mbDragFull ) | 
|  | { | 
|  | Point aPos; | 
|  | Point aOldPos = OutputToScreenPixel( aPos ); | 
|  | EndDocking( aTrackRect, mbLastFloatMode ); | 
|  | // Wenn der Status bzw. die Position sich | 
|  | // geaendert hat, dann neu ausgeben | 
|  | if ( aOldPos != OutputToScreenPixel( aPos ) ) | 
|  | { | 
|  | ImplUpdateAll(); | 
|  | ImplGetFrameWindow()->ImplUpdateAll(); | 
|  | } | 
|  | //                EndDocking( aTrackRect, mbLastFloatMode ); | 
|  | } | 
|  | else | 
|  | { | 
|  | sal_uInt16 nTrackStyle; | 
|  | if ( bFloatMode ) | 
|  | nTrackStyle = SHOWTRACK_BIG; | 
|  | else | 
|  | nTrackStyle = SHOWTRACK_OBJECT; | 
|  | Rectangle aShowTrackRect = aTrackRect; | 
|  | aShowTrackRect.SetPos( ImplFrameToOutput( aShowTrackRect.TopLeft() ) ); | 
|  | ShowTracking( aShowTrackRect, nTrackStyle ); | 
|  |  | 
|  | // Maus-Offset neu berechnen, da Rechteck veraendert werden | 
|  | // konnte | 
|  | maMouseOff.X()  = aFramePos.X() - aTrackRect.Left(); | 
|  | maMouseOff.Y()  = aFramePos.Y() - aTrackRect.Top(); | 
|  | } | 
|  |  | 
|  | mnTrackX        = aTrackRect.Left(); | 
|  | mnTrackY        = aTrackRect.Top(); | 
|  | mnTrackWidth    = aTrackRect.GetWidth(); | 
|  | mnTrackHeight   = aTrackRect.GetHeight(); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | long DockingWindow::Notify( NotifyEvent& rNEvt ) | 
|  | { | 
|  | if( GetDockingManager()->IsDockable( this ) )   // new docking interface | 
|  | return Window::Notify( rNEvt ); | 
|  |  | 
|  | if ( mbDockable ) | 
|  | { | 
|  | if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN ) | 
|  | { | 
|  | const MouseEvent* pMEvt = rNEvt.GetMouseEvent(); | 
|  | if ( pMEvt->IsLeft() ) | 
|  | { | 
|  | if ( pMEvt->IsMod1() && (pMEvt->GetClicks() == 2) ) | 
|  | { | 
|  | SetFloatingMode( !IsFloatingMode() ); | 
|  | return sal_True; | 
|  | } | 
|  | else if ( pMEvt->GetClicks() == 1 ) | 
|  | { | 
|  | // check if window is floating standalone (IsFloating()) | 
|  | // or only partially floating and still docked with one border | 
|  | // ( !mpWindowImpl->mbFrame) | 
|  | if( ! IsFloatingMode() || ! mpFloatWin->mpWindowImpl->mbFrame ) | 
|  | { | 
|  | Point   aPos = pMEvt->GetPosPixel(); | 
|  | Window* pWindow = rNEvt.GetWindow(); | 
|  | if ( pWindow != this ) | 
|  | { | 
|  | aPos = pWindow->OutputToScreenPixel( aPos ); | 
|  | aPos = ScreenToOutputPixel( aPos ); | 
|  | } | 
|  | ImplStartDocking( aPos ); | 
|  | } | 
|  | return sal_True; | 
|  | } | 
|  | } | 
|  | } | 
|  | else if( rNEvt.GetType() == EVENT_KEYINPUT ) | 
|  | { | 
|  | const KeyCode& rKey = rNEvt.GetKeyEvent()->GetKeyCode(); | 
|  | if( rKey.GetCode() == KEY_F10 && rKey.GetModifier() && | 
|  | rKey.IsShift() && rKey.IsMod1() ) | 
|  | { | 
|  | SetFloatingMode( !IsFloatingMode() ); | 
|  | return sal_True; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | return Window::Notify( rNEvt ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::StartDocking() | 
|  | { | 
|  | mbDocking = sal_True; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | sal_Bool DockingWindow::Docking( const Point&, Rectangle& ) | 
|  | { | 
|  | return IsFloatingMode(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::EndDocking( const Rectangle& rRect, sal_Bool bFloatMode ) | 
|  | { | 
|  | if ( !IsDockingCanceled() ) | 
|  | { | 
|  | sal_Bool bShow = sal_False; | 
|  | if ( bFloatMode != IsFloatingMode() ) | 
|  | { | 
|  | Show( sal_False, SHOW_NOFOCUSCHANGE ); | 
|  | SetFloatingMode( bFloatMode ); | 
|  | bShow = sal_True; | 
|  | if ( bFloatMode && mpFloatWin ) | 
|  | mpFloatWin->SetPosSizePixel( rRect.TopLeft(), rRect.GetSize() ); | 
|  | } | 
|  | if ( !bFloatMode ) | 
|  | { | 
|  | Point aPos = rRect.TopLeft(); | 
|  | aPos = GetParent()->ScreenToOutputPixel( aPos ); | 
|  | Window::SetPosSizePixel( aPos, rRect.GetSize() ); | 
|  | } | 
|  |  | 
|  | if ( bShow ) | 
|  | Show(); | 
|  | } | 
|  | mbDocking = sal_False; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | sal_Bool DockingWindow::PrepareToggleFloatingMode() | 
|  | { | 
|  | return sal_True; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | sal_Bool DockingWindow::Close() | 
|  | { | 
|  | ImplDelData aDelData; | 
|  | ImplAddDel( &aDelData ); | 
|  | ImplCallEventListeners( VCLEVENT_WINDOW_CLOSE ); | 
|  | if ( aDelData.IsDelete() ) | 
|  | return sal_False; | 
|  | ImplRemoveDel( &aDelData ); | 
|  |  | 
|  | if ( mpWindowImpl->mxWindowPeer.is() && IsCreatedWithToolkit() ) | 
|  | return sal_False; | 
|  |  | 
|  | Show( sal_False, SHOW_NOFOCUSCHANGE ); | 
|  | return sal_True; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::ToggleFloatingMode() | 
|  | { | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::TitleButtonClick( sal_uInt16 ) | 
|  | { | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::Pin() | 
|  | { | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::Roll() | 
|  | { | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::PopupModeEnd() | 
|  | { | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::Resizing( Size& ) | 
|  | { | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::StateChanged( StateChangedType nType ) | 
|  | { | 
|  | switch(nType) | 
|  | { | 
|  | case STATE_CHANGE_CONTROLBACKGROUND: | 
|  | ImplInitSettings(); | 
|  | Invalidate(); | 
|  | break; | 
|  |  | 
|  | case STATE_CHANGE_STYLE: | 
|  | mbDockable = (GetStyle() & WB_DOCKABLE) != 0; | 
|  | break; | 
|  |  | 
|  | default: | 
|  | break; | 
|  | } | 
|  |  | 
|  | Window::StateChanged( nType ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::DataChanged( const DataChangedEvent& rDCEvt ) | 
|  | { | 
|  | if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && | 
|  | (rDCEvt.GetFlags() & SETTINGS_STYLE) ) | 
|  | { | 
|  | ImplInitSettings(); | 
|  | Invalidate(); | 
|  | } | 
|  | else | 
|  | Window::DataChanged( rDCEvt ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::ShowTitleButton( sal_uInt16 nButton, sal_Bool bVisible ) | 
|  | { | 
|  | if ( mpFloatWin ) | 
|  | mpFloatWin->ShowTitleButton( nButton, bVisible ); | 
|  | else | 
|  | { | 
|  | if ( nButton == TITLE_BUTTON_DOCKING ) | 
|  | mbDockBtn = bVisible; | 
|  | else /* if ( nButton == TITLE_BUTTON_HIDE ) */ | 
|  | mbHideBtn = bVisible; | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | sal_Bool DockingWindow::IsTitleButtonVisible( sal_uInt16 nButton ) const | 
|  | { | 
|  | if ( mpFloatWin ) | 
|  | return mpFloatWin->IsTitleButtonVisible( nButton ); | 
|  | else | 
|  | { | 
|  | if ( nButton == TITLE_BUTTON_DOCKING ) | 
|  | return mbDockBtn; | 
|  | else /* if ( nButton == TITLE_BUTTON_HIDE ) */ | 
|  | return mbHideBtn; | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::SetFloatingMode( sal_Bool bFloatMode ) | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | pWrapper->SetFloatingMode( bFloatMode ); | 
|  | return; | 
|  | } | 
|  | if ( IsFloatingMode() != bFloatMode ) | 
|  | { | 
|  | if ( PrepareToggleFloatingMode() ) // changes to floating mode can be vetoed | 
|  | { | 
|  | sal_Bool bVisible = IsVisible(); | 
|  |  | 
|  | if ( bFloatMode ) | 
|  | { | 
|  | Show( sal_False, SHOW_NOFOCUSCHANGE ); | 
|  |  | 
|  | maDockPos = Window::GetPosPixel(); | 
|  |  | 
|  | Window* pRealParent = mpWindowImpl->mpRealParent; | 
|  | mpOldBorderWin = mpWindowImpl->mpBorderWindow; | 
|  |  | 
|  | ImplDockFloatWin* pWin = | 
|  | new ImplDockFloatWin( | 
|  | mpImplData->mpParent, | 
|  | mnFloatBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ?  mnFloatBits | WB_SYSTEMWINDOW : mnFloatBits, | 
|  | this ); | 
|  | mpFloatWin      = pWin; | 
|  | mpWindowImpl->mpBorderWindow  = NULL; | 
|  | mpWindowImpl->mnLeftBorder    = 0; | 
|  | mpWindowImpl->mnTopBorder     = 0; | 
|  | mpWindowImpl->mnRightBorder   = 0; | 
|  | mpWindowImpl->mnBottomBorder  = 0; | 
|  | // Falls Parent zerstoert wird, muessen wir auch vom | 
|  | // BorderWindow den Parent umsetzen | 
|  | if ( mpOldBorderWin ) | 
|  | mpOldBorderWin->SetParent( pWin ); | 
|  |  | 
|  | // #123765# reset the buffered DropTargets when undocking, else it may not | 
|  | // be correctly initialized | 
|  | mpWindowImpl->mxDNDListenerContainer.clear(); | 
|  |  | 
|  | SetParent( pWin ); | 
|  | SetPosPixel( Point() ); | 
|  | mpWindowImpl->mpBorderWindow = pWin; | 
|  | pWin->mpWindowImpl->mpClientWindow = this; | 
|  | mpWindowImpl->mpRealParent = pRealParent; | 
|  | pWin->SetText( Window::GetText() ); | 
|  | pWin->SetOutputSizePixel( Window::GetSizePixel() ); | 
|  | pWin->SetPosPixel( maFloatPos ); | 
|  | // DockingDaten ans FloatingWindow weiterreichen | 
|  | pWin->ShowTitleButton( TITLE_BUTTON_DOCKING, mbDockBtn ); | 
|  | pWin->ShowTitleButton( TITLE_BUTTON_HIDE, mbHideBtn ); | 
|  | pWin->SetPin( mbPined ); | 
|  | if ( mbRollUp ) | 
|  | pWin->RollUp(); | 
|  | else | 
|  | pWin->RollDown(); | 
|  | pWin->SetRollUpOutputSizePixel( maRollUpOutSize ); | 
|  | pWin->SetMinOutputSizePixel( maMinOutSize ); | 
|  | pWin->SetMaxOutputSizePixel( mpImplData->maMaxOutSize ); | 
|  |  | 
|  | ToggleFloatingMode(); | 
|  |  | 
|  | if ( bVisible ) | 
|  | Show(); | 
|  | } | 
|  | else | 
|  | { | 
|  | Show( sal_False, SHOW_NOFOCUSCHANGE ); | 
|  |  | 
|  | // FloatingDaten wird im FloatingWindow speichern | 
|  | maFloatPos      = mpFloatWin->GetPosPixel(); | 
|  | mbDockBtn       = mpFloatWin->IsTitleButtonVisible( TITLE_BUTTON_DOCKING ); | 
|  | mbHideBtn       = mpFloatWin->IsTitleButtonVisible( TITLE_BUTTON_HIDE ); | 
|  | mbPined         = mpFloatWin->IsPined(); | 
|  | mbRollUp        = mpFloatWin->IsRollUp(); | 
|  | maRollUpOutSize = mpFloatWin->GetRollUpOutputSizePixel(); | 
|  | maMinOutSize    = mpFloatWin->GetMinOutputSizePixel(); | 
|  | mpImplData->maMaxOutSize = mpFloatWin->GetMaxOutputSizePixel(); | 
|  |  | 
|  | Window* pRealParent = mpWindowImpl->mpRealParent; | 
|  | mpWindowImpl->mpBorderWindow = NULL; | 
|  | if ( mpOldBorderWin ) | 
|  | { | 
|  | SetParent( mpOldBorderWin ); | 
|  | ((ImplBorderWindow*)mpOldBorderWin)->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); | 
|  | mpOldBorderWin->Resize(); | 
|  | } | 
|  | mpWindowImpl->mpBorderWindow = mpOldBorderWin; | 
|  | SetParent( pRealParent ); | 
|  | mpWindowImpl->mpRealParent = pRealParent; | 
|  | delete static_cast<ImplDockFloatWin*>(mpFloatWin); | 
|  | mpFloatWin = NULL; | 
|  | SetPosPixel( maDockPos ); | 
|  |  | 
|  | ToggleFloatingMode(); | 
|  |  | 
|  | if ( bVisible ) | 
|  | Show(); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::SetFloatStyle( WinBits nStyle ) | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | pWrapper->SetFloatStyle( nStyle ); | 
|  | return; | 
|  | } | 
|  |  | 
|  | mnFloatBits = nStyle; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | WinBits DockingWindow::GetFloatStyle() const | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | return pWrapper->GetFloatStyle(); | 
|  | } | 
|  |  | 
|  | return mnFloatBits; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::SetTabStop() | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | pWrapper->SetTabStop(); | 
|  | return; | 
|  | } | 
|  |  | 
|  | mpWindowImpl->mnStyle |= WB_GROUP | WB_TABSTOP; | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::SetPosSizePixel( long nX, long nY, | 
|  | long nWidth, long nHeight, | 
|  | sal_uInt16 nFlags ) | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | if ( pWrapper->mpFloatWin ) | 
|  | pWrapper->mpFloatWin->SetPosSizePixel( nX, nY, nWidth, nHeight, nFlags ); | 
|  | else | 
|  | Window::SetPosSizePixel( nX, nY, nWidth, nHeight, nFlags ); | 
|  | return; | 
|  | } | 
|  |  | 
|  | if ( mpFloatWin ) | 
|  | mpFloatWin->SetPosSizePixel( nX, nY, nWidth, nHeight, nFlags ); | 
|  | else | 
|  | Window::SetPosSizePixel( nX, nY, nWidth, nHeight, nFlags ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | Point DockingWindow::GetPosPixel() const | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | if ( pWrapper->mpFloatWin ) | 
|  | return pWrapper->mpFloatWin->GetPosPixel(); | 
|  | else | 
|  | return Window::GetPosPixel(); | 
|  | } | 
|  |  | 
|  | if ( mpFloatWin ) | 
|  | return mpFloatWin->GetPosPixel(); | 
|  | else | 
|  | return Window::GetPosPixel(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | Size DockingWindow::GetSizePixel() const | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | if ( pWrapper->mpFloatWin ) | 
|  | return pWrapper->mpFloatWin->GetSizePixel(); | 
|  | else | 
|  | return Window::GetSizePixel(); | 
|  | } | 
|  |  | 
|  | if ( mpFloatWin ) | 
|  | return mpFloatWin->GetSizePixel(); | 
|  | else | 
|  | return Window::GetSizePixel(); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | void DockingWindow::SetOutputSizePixel( const Size& rNewSize ) | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | if ( pWrapper->mpFloatWin ) | 
|  | pWrapper->mpFloatWin->SetOutputSizePixel( rNewSize ); | 
|  | else | 
|  | Window::SetOutputSizePixel( rNewSize ); | 
|  | return; | 
|  | } | 
|  |  | 
|  | if ( mpFloatWin ) | 
|  | mpFloatWin->SetOutputSizePixel( rNewSize ); | 
|  | else | 
|  | Window::SetOutputSizePixel( rNewSize ); | 
|  | } | 
|  |  | 
|  | // ----------------------------------------------------------------------- | 
|  |  | 
|  | Size DockingWindow::GetOutputSizePixel() const | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | if ( pWrapper->mpFloatWin ) | 
|  | return pWrapper->mpFloatWin->GetOutputSizePixel(); | 
|  | else | 
|  | return Window::GetOutputSizePixel(); | 
|  | } | 
|  |  | 
|  | if ( mpFloatWin ) | 
|  | return mpFloatWin->GetOutputSizePixel(); | 
|  | else | 
|  | return Window::GetOutputSizePixel(); | 
|  | } | 
|  |  | 
|  | Point DockingWindow::GetFloatingPos() const | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | { | 
|  | if ( pWrapper->mpFloatWin ) | 
|  | { | 
|  | WindowStateData aData; | 
|  | aData.SetMask( WINDOWSTATE_MASK_POS ); | 
|  | pWrapper->mpFloatWin->GetWindowStateData( aData ); | 
|  | Point aPos( aData.GetX(), aData.GetY() ); | 
|  | aPos = pWrapper->mpFloatWin->GetParent()->ImplGetFrameWindow()->AbsoluteScreenToOutputPixel( aPos ); | 
|  | return aPos; | 
|  | } | 
|  | else | 
|  | return maFloatPos; | 
|  | } | 
|  |  | 
|  | if ( mpFloatWin ) | 
|  | { | 
|  | WindowStateData aData; | 
|  | aData.SetMask( WINDOWSTATE_MASK_POS ); | 
|  | mpFloatWin->GetWindowStateData( aData ); | 
|  | Point aPos( aData.GetX(), aData.GetY() ); | 
|  | aPos = mpFloatWin->GetParent()->ImplGetFrameWindow()->AbsoluteScreenToOutputPixel( aPos ); | 
|  | return aPos; | 
|  | } | 
|  | else | 
|  | return maFloatPos; | 
|  | } | 
|  |  | 
|  | sal_Bool DockingWindow::IsFloatingMode() const | 
|  | { | 
|  | ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); | 
|  | if( pWrapper ) | 
|  | return pWrapper->IsFloatingMode(); | 
|  | else | 
|  | return (mpFloatWin != NULL); | 
|  | } | 
|  |  | 
|  | void DockingWindow::SetMaxOutputSizePixel( const Size& rSize ) | 
|  | { | 
|  | if ( mpFloatWin ) | 
|  | mpFloatWin->SetMaxOutputSizePixel( rSize ); | 
|  | mpImplData->maMaxOutSize = rSize; | 
|  | } | 
|  |  | 
|  | const Size& DockingWindow::GetMaxOutputSizePixel() const | 
|  | { | 
|  | if ( mpFloatWin ) | 
|  | return mpFloatWin->GetMaxOutputSizePixel(); | 
|  | return mpImplData->maMaxOutSize; | 
|  | } |