blob: 9f1669ec2919168872783bfaa1f39493f0ee2051 [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#ifndef _SV_DOCKWIN_HXX
#define _SV_DOCKWIN_HXX
#include <vcl/sv.h>
#include <vcl/dllapi.h>
#include <vcl/floatwin.hxx>
#include <vector>
// data to be sent with docking events
struct DockingData
{
Point maMousePos; // in
Rectangle maTrackRect; // in/out
sal_Bool mbFloating; // out
sal_Bool mbLivemode; // in
sal_Bool mbInteractive; // in
DockingData() {};
DockingData( const Point& rPt, const Rectangle& rRect, sal_Bool b) :
maMousePos( rPt ), maTrackRect( rRect ), mbFloating( b ), mbLivemode( sal_False ), mbInteractive( sal_True )
{};
};
struct EndDockingData
{
Rectangle maWindowRect; // in
sal_Bool mbFloating; // in
sal_Bool mbCancelled; // in
EndDockingData() {};
EndDockingData( const Rectangle& rRect, sal_Bool b, sal_Bool bCancelled ) :
maWindowRect( rRect ), mbFloating( b ), mbCancelled( bCancelled )
{};
};
struct EndPopupModeData
{
Point maFloatingPos; // in
sal_Bool mbTearoff; // in
EndPopupModeData() {};
EndPopupModeData( const Point& rPos, sal_Bool bTearoff ) :
maFloatingPos( rPos ), mbTearoff( bTearoff )
{};
};
/** ImplDockingWindowWrapper
*
* ImplDockingWindowWrapper obsoletes the DockingWindow class.
* It is better because it can make a "normal window" dockable.
* All DockingWindows should be converted the new class.
*/
class ImplDockingWindowWrapper
{
friend class Window;
friend class DockingManager;
friend class DockingWindow;
private:
// the original 'Docking'window
Window *mpDockingWindow;
// the original DockingWindow members
FloatingWindow* mpFloatWin;
Window* mpOldBorderWin;
Window* mpParent;
Point maFloatPos;
Point maDockPos;
Point maMouseOff;
Point maMouseStart;
Size maRollUpOutSize;
Size maMinOutSize;
Size maMaxOutSize;
Rectangle maDragArea;
long mnTrackX;
long mnTrackY;
long mnTrackWidth;
long mnTrackHeight;
sal_Int32 mnDockLeft;
sal_Int32 mnDockTop;
sal_Int32 mnDockRight;
sal_Int32 mnDockBottom;
WinBits mnFloatBits;
sal_Bool mbDockCanceled:1,
mbFloatPrevented:1,
mbDockable:1,
mbDocking:1,
mbDragFull:1,
mbLastFloatMode:1,
mbStartFloat:1,
mbTrackDock:1,
mbPined:1,
mbRollUp:1,
mbDockBtn:1,
mbHideBtn:1,
mbStartDockingEnabled:1,
mbLocked:1;
void ImplInitData();
DECL_LINK( PopupModeEnd, void* );
void ImplEnableStartDocking( sal_Bool bEnable = sal_True ) { mbStartDockingEnabled = bEnable; }
sal_Bool ImplStartDockingEnabled() { return mbStartDockingEnabled; }
public:
ImplDockingWindowWrapper( const Window *pWindow );
virtual ~ImplDockingWindowWrapper();
Window* GetWindow() { return mpDockingWindow; }
sal_Bool ImplStartDocking( const Point& rPos );
// those methods actually call the corresponding handlers
void StartDocking( const Point& rPos, Rectangle& rRect );
sal_Bool Docking( const Point& rPos, Rectangle& rRect );
void EndDocking( const Rectangle& rRect, sal_Bool bFloatMode );
sal_Bool PrepareToggleFloatingMode();
void ToggleFloatingMode();
void SetDragArea( const Rectangle& rRect );
Rectangle GetDragArea() const;
void Lock();
void Unlock();
sal_Bool IsLocked() const;
void StartPopupMode( ToolBox* pParentToolBox, sal_uLong nPopupModeFlags );
sal_Bool IsInPopupMode() const;
void TitleButtonClick( sal_uInt16 nButton );
void Pin();
void Roll();
void PopupModeEnd();
void Resizing( Size& rSize );
sal_Bool Close();
void Tracking( const TrackingEvent& rTEvt );
long Notify( NotifyEvent& rNEvt );
void ShowTitleButton( sal_uInt16 nButton, sal_Bool bVisible = sal_True );
sal_Bool IsTitleButtonVisible( sal_uInt16 nButton ) const;
void SetPin( sal_Bool bPin );
sal_Bool IsPined() const;
void RollUp();
void RollDown();
sal_Bool IsRollUp() const;
void SetRollUpOutputSizePixel( const Size& rSize );
Size GetRollUpOutputSizePixel() const;
void SetMinOutputSizePixel( const Size& rSize );
const Size& GetMinOutputSizePixel() const;
void SetMaxOutputSizePixel( const Size& rSize );
const Size& GetMaxOutputSizePixel() const;
sal_Bool IsDocking() const { return mbDocking; }
sal_Bool IsDockable() const { return mbDockable; }
sal_Bool IsDockingCanceled() const { return mbDockCanceled; }
sal_Bool IsFloatingPrevented() const { return mbFloatPrevented; }
void SetFloatingMode( sal_Bool bFloatMode = sal_False );
sal_Bool IsFloatingMode() const;
FloatingWindow* GetFloatingWindow() const { return mpFloatWin; }
void SetFloatingPos( const Point& rNewPos );
Point GetFloatingPos() const;
void SetFloatStyle( WinBits nWinStyle );
WinBits GetFloatStyle() const;
void SetTabStop();
virtual void SetPosSizePixel( long nX, long nY,
long nWidth, long nHeight,
sal_uInt16 nFlags = WINDOW_POSSIZE_ALL );
void SetPosSizePixel( const Point& rNewPos,
const Size& rNewSize )
{ mpDockingWindow->SetPosSizePixel( rNewPos, rNewSize ); }
Point GetPosPixel() const;
Size GetSizePixel() const;
void SetOutputSizePixel( const Size& rNewSize );
Size GetOutputSizePixel() const;
};
class VCL_DLLPUBLIC DockingManager
{
protected:
::std::vector<ImplDockingWindowWrapper *> mDockingWindows;
public:
DockingManager();
~DockingManager();
void AddWindow( const Window *pWin );
void RemoveWindow( const Window *pWin );
ImplDockingWindowWrapper* GetDockingWindowWrapper( const Window *pWin );
sal_Bool IsDockable( const Window *pWin );
sal_Bool IsFloating( const Window *pWin );
void SetFloatingMode( const Window *pWin, sal_Bool bFloating );
void Lock( const Window *pWin );
void Unlock( const Window *pWin );
sal_Bool IsLocked( const Window *pWin );
void StartPopupMode( ToolBox *pParentToolBox, const Window *pWin );
void StartPopupMode( ToolBox *pParentToolBox, const Window *pWin, sal_uLong nPopupModeFlags );
sal_Bool IsInPopupMode( const Window *pWin );
void EndPopupMode( const Window *pWin );
// required because those methods are not virtual in Window (!!!) and must
// be availbale from the toolkit
void SetPosSizePixel( Window *pWin, long nX, long nY,
long nWidth, long nHeight,
sal_uInt16 nFlags = WINDOW_POSSIZE_ALL );
Rectangle GetPosSizePixel( const Window *pWin );
};
// -----------------
// - DockingWindow -
// -----------------
class VCL_DLLPUBLIC DockingWindow : public Window
{
class ImplData;
private:
FloatingWindow* mpFloatWin;
Window* mpOldBorderWin;
ImplData* mpImplData;
Point maFloatPos;
Point maDockPos;
Point maMouseOff;
Point maMouseStart;
Size maRollUpOutSize;
Size maMinOutSize;
long mnTrackX;
long mnTrackY;
long mnTrackWidth;
long mnTrackHeight;
sal_Int32 mnDockLeft;
sal_Int32 mnDockTop;
sal_Int32 mnDockRight;
sal_Int32 mnDockBottom;
WinBits mnFloatBits;
sal_Bool mbDockCanceled:1,
mbDockPrevented:1,
mbFloatPrevented:1,
mbDockable:1,
mbDocking:1,
mbDragFull:1,
mbLastFloatMode:1,
mbStartFloat:1,
mbTrackDock:1,
mbPined:1,
mbRollUp:1,
mbDockBtn:1,
mbHideBtn:1;
//#if 0 // _SOLAR__PRIVATE
SAL_DLLPRIVATE void ImplInitDockingWindowData();
// Copy assignment is forbidden and not implemented.
SAL_DLLPRIVATE DockingWindow (const DockingWindow &);
SAL_DLLPRIVATE DockingWindow & operator= (const DockingWindow &);
protected:
using Window::ImplInit;
SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle );
SAL_DLLPRIVATE void ImplInitSettings();
SAL_DLLPRIVATE void ImplLoadRes( const ResId& rResId );
public:
SAL_DLLPRIVATE sal_Bool ImplStartDocking( const Point& rPos );
//#endif
protected:
DockingWindow( WindowType nType );
public:
DockingWindow( Window* pParent, WinBits nStyle = WB_STDDOCKWIN );
DockingWindow( Window* pParent, const ResId& rResId );
~DockingWindow();
virtual void StartDocking();
virtual sal_Bool Docking( const Point& rPos, Rectangle& rRect );
virtual void EndDocking( const Rectangle& rRect, sal_Bool bFloatMode );
virtual sal_Bool PrepareToggleFloatingMode();
virtual void ToggleFloatingMode();
virtual void TitleButtonClick( sal_uInt16 nButton );
virtual void Pin();
virtual void Roll();
virtual void PopupModeEnd();
virtual void Resizing( Size& rSize );
virtual sal_Bool Close();
virtual void Tracking( const TrackingEvent& rTEvt );
virtual long Notify( NotifyEvent& rNEvt );
virtual void StateChanged( StateChangedType nType );
virtual void DataChanged( const DataChangedEvent& rDCEvt );
void ShowTitleButton( sal_uInt16 nButton, sal_Bool bVisible = sal_True );
sal_Bool IsTitleButtonVisible( sal_uInt16 nButton ) const;
void SetPin( sal_Bool bPin );
sal_Bool IsPined() const;
void RollUp();
void RollDown();
sal_Bool IsRollUp() const;
void SetRollUpOutputSizePixel( const Size& rSize );
Size GetRollUpOutputSizePixel() const;
void SetMinOutputSizePixel( const Size& rSize );
const Size& GetMinOutputSizePixel() const;
void SetMaxOutputSizePixel( const Size& rSize );
const Size& GetMaxOutputSizePixel() const;
sal_Bool IsDocking() const { return mbDocking; }
sal_Bool IsDockable() const { return mbDockable; }
sal_Bool IsDockingCanceled() const { return mbDockCanceled; }
sal_Bool IsDockingPrevented() const { return mbDockPrevented; }
sal_Bool IsFloatingPrevented() const { return mbFloatPrevented; }
void SetFloatingMode( sal_Bool bFloatMode = sal_False );
sal_Bool IsFloatingMode() const;
FloatingWindow* GetFloatingWindow() const { return mpFloatWin; }
void SetFloatingPos( const Point& rNewPos );
Point GetFloatingPos() const;
void SetFloatStyle( WinBits nWinStyle );
WinBits GetFloatStyle() const;
void SetTabStop();
virtual void SetPosSizePixel( long nX, long nY,
long nWidth, long nHeight,
sal_uInt16 nFlags = WINDOW_POSSIZE_ALL );
void SetPosSizePixel( const Point& rNewPos,
const Size& rNewSize )
{ Window::SetPosSizePixel( rNewPos, rNewSize ); }
Point GetPosPixel() const;
Size GetSizePixel() const;
void SetOutputSizePixel( const Size& rNewSize );
Size GetOutputSizePixel() const;
};
inline void DockingWindow::SetPin( sal_Bool bPin )
{
if ( mpFloatWin )
mpFloatWin->SetPin( bPin );
mbPined = bPin;
}
inline sal_Bool DockingWindow::IsPined() const
{
if ( mpFloatWin )
return mpFloatWin->IsPined();
return mbPined;
}
inline void DockingWindow::RollUp()
{
if ( mpFloatWin )
mpFloatWin->RollUp();
mbRollUp = sal_True;
}
inline void DockingWindow::RollDown()
{
if ( mpFloatWin )
mpFloatWin->RollDown();
mbRollUp = sal_False;
}
inline sal_Bool DockingWindow::IsRollUp() const
{
if ( mpFloatWin )
return mpFloatWin->IsRollUp();
return mbRollUp;
}
inline void DockingWindow::SetRollUpOutputSizePixel( const Size& rSize )
{
if ( mpFloatWin )
mpFloatWin->SetRollUpOutputSizePixel( rSize );
maRollUpOutSize = rSize;
}
inline Size DockingWindow::GetRollUpOutputSizePixel() const
{
if ( mpFloatWin )
return mpFloatWin->GetRollUpOutputSizePixel();
return maRollUpOutSize;
}
inline void DockingWindow::SetMinOutputSizePixel( const Size& rSize )
{
if ( mpFloatWin )
mpFloatWin->SetMinOutputSizePixel( rSize );
maMinOutSize = rSize;
}
inline const Size& DockingWindow::GetMinOutputSizePixel() const
{
if ( mpFloatWin )
return mpFloatWin->GetMinOutputSizePixel();
return maMinOutSize;
}
inline void DockingWindow::SetFloatingPos( const Point& rNewPos )
{
if ( mpFloatWin )
mpFloatWin->SetPosPixel( rNewPos );
else
maFloatPos = rNewPos;
}
#endif // _SV_DOCKWIN_HXX