2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 11:35:18 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 11:35:18 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 11:35:18 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 11:35:18 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 11:35:18 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 11:35:18 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 15:31:42 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_sfx2.hxx"
|
2008-12-16 16:42:03 +00:00
|
|
|
|
2009-10-16 00:05:16 +02:00
|
|
|
#include <svl/eitem.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#include <vcl/decoview.hxx>
|
|
|
|
|
2006-05-02 15:33:23 +00:00
|
|
|
#include <vcl/svapp.hxx>
|
2007-07-10 14:22:37 +00:00
|
|
|
#include <vcl/timer.hxx>
|
2008-12-16 16:42:03 +00:00
|
|
|
#include <rtl/instance.hxx>
|
|
|
|
#include <toolkit/helper/vclunohelper.hxx>
|
|
|
|
#include <comphelper/processfactory.hxx>
|
2006-05-02 15:33:23 +00:00
|
|
|
|
2007-06-27 22:11:30 +00:00
|
|
|
#include <sfx2/dockwin.hxx>
|
|
|
|
#include <sfx2/bindings.hxx>
|
|
|
|
#include <sfx2/viewfrm.hxx>
|
|
|
|
#include <sfx2/dispatch.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#include "workwin.hxx"
|
|
|
|
#include "splitwin.hxx"
|
2007-06-27 22:11:30 +00:00
|
|
|
#include <sfx2/viewsh.hxx>
|
2001-06-26 13:51:18 +00:00
|
|
|
#include "sfxhelp.hxx"
|
2008-12-16 16:42:03 +00:00
|
|
|
#include <sfx2/objsh.hxx>
|
|
|
|
|
|
|
|
#include <com/sun/star/frame/XController.hpp>
|
|
|
|
#include <com/sun/star/lang/XUnoTunnel.hpp>
|
|
|
|
#include <com/sun/star/lang/XSingleComponentFactory.hpp>
|
|
|
|
#include <com/sun/star/awt/XWindow.hpp>
|
|
|
|
#include <com/sun/star/uno/XComponentContext.hpp>
|
|
|
|
#include <com/sun/star/frame/XModuleManager.hpp>
|
|
|
|
#include <com/sun/star/container/XNameAccess.hpp>
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
#define MAX_TOGGLEAREA_WIDTH 20
|
|
|
|
#define MAX_TOGGLEAREA_HEIGHT 20
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2008-12-16 16:42:03 +00:00
|
|
|
using namespace ::com::sun::star;
|
|
|
|
|
2000-11-30 08:58:00 +00:00
|
|
|
// implemented in 'sfx2/source/appl/childwin.cxx'
|
|
|
|
extern sal_Bool GetPosSizeFromString( const String& rStr, Point& rPos, Size& rSize );
|
2005-04-18 11:20:33 +00:00
|
|
|
extern sal_Bool GetSplitSizeFromString( const String& rStr, Size& rSize );
|
2000-11-30 08:58:00 +00:00
|
|
|
|
2008-12-16 16:42:03 +00:00
|
|
|
// If you want to change the number you also have to:
|
|
|
|
// - Add new slot ids to sfxsids.hrc
|
|
|
|
// - Add new slots to frmslots.sdi
|
|
|
|
// - Add new slot definitions to sfx.sdi
|
|
|
|
static const int NUM_OF_DOCKINGWINDOWS = 10;
|
|
|
|
|
|
|
|
class SfxTitleDockingWindow;
|
|
|
|
class SfxTitleDockingWindow : public SfxDockingWindow
|
|
|
|
{
|
|
|
|
Window* m_pWrappedWindow;
|
|
|
|
USHORT m_nID;
|
|
|
|
|
|
|
|
public:
|
|
|
|
SfxTitleDockingWindow(
|
|
|
|
SfxBindings* pBindings ,
|
|
|
|
SfxChildWindow* pChildWin ,
|
|
|
|
Window* pParent ,
|
|
|
|
WinBits nBits,
|
|
|
|
USHORT nID);
|
|
|
|
virtual ~SfxTitleDockingWindow();
|
|
|
|
|
|
|
|
Window* GetWrappedWindow() const { return m_pWrappedWindow; }
|
|
|
|
void SetWrappedWindow(Window* const pWindow);
|
|
|
|
|
|
|
|
virtual void StateChanged( StateChangedType nType );
|
|
|
|
virtual long Notify( NotifyEvent& rNEvt );
|
|
|
|
virtual void Resize();
|
|
|
|
virtual void Resizing( Size& rSize );
|
|
|
|
virtual BOOL Close();
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
struct WindowState
|
|
|
|
{
|
|
|
|
::rtl::OUString sTitle;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
static uno::WeakReference< container::XNameAccess > m_xWindowStateConfiguration;
|
|
|
|
static uno::WeakReference< frame::XModuleManager > m_xModuleManager;
|
|
|
|
|
|
|
|
static bool lcl_getWindowState( const uno::Reference< container::XNameAccess >& xWindowStateMgr, const ::rtl::OUString& rResourceURL, WindowState& rWindowState )
|
|
|
|
{
|
|
|
|
bool bResult = false;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
uno::Any a;
|
|
|
|
uno::Sequence< beans::PropertyValue > aWindowState;
|
|
|
|
a = xWindowStateMgr->getByName( rResourceURL );
|
|
|
|
if ( a >>= aWindowState )
|
|
|
|
{
|
|
|
|
for ( sal_Int32 n = 0; n < aWindowState.getLength(); n++ )
|
|
|
|
{
|
|
|
|
if ( aWindowState[n].Name.equalsAscii( "UIName" ))
|
|
|
|
{
|
|
|
|
aWindowState[n].Value >>= rWindowState.sTitle;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bResult = true;
|
|
|
|
}
|
|
|
|
catch ( container::NoSuchElementException& )
|
|
|
|
{
|
|
|
|
bResult = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return bResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
SfxDockingWrapper::SfxDockingWrapper( Window* pParentWnd ,
|
|
|
|
USHORT nId ,
|
|
|
|
SfxBindings* pBindings ,
|
|
|
|
SfxChildWinInfo* pInfo )
|
|
|
|
: SfxChildWindow( pParentWnd , nId )
|
|
|
|
{
|
|
|
|
uno::Reference< lang::XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
|
|
|
|
const rtl::OUString aDockWindowResourceURL( RTL_CONSTASCII_USTRINGPARAM( "private:resource/dockingwindow/" ));
|
|
|
|
|
|
|
|
SfxTitleDockingWindow* pTitleDockWindow = new SfxTitleDockingWindow( pBindings, this, pParentWnd,
|
|
|
|
WB_STDDOCKWIN | WB_CLIPCHILDREN | WB_SIZEABLE | WB_3DLOOK | WB_ROLLABLE, nId);
|
|
|
|
pWindow = pTitleDockWindow;
|
|
|
|
eChildAlignment = SFX_ALIGN_NOALIGNMENT;
|
|
|
|
|
|
|
|
// Use factory manager to retrieve XWindow factory. That can be used to instanciate
|
|
|
|
// the real window factory.
|
|
|
|
uno::Reference< lang::XSingleComponentFactory > xFactoryMgr(
|
|
|
|
xServiceManager->createInstance(
|
|
|
|
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
|
|
|
|
"com.sun.star.ui.WindowContentFactoryManager"))),
|
|
|
|
uno::UNO_QUERY );
|
|
|
|
|
|
|
|
if (xFactoryMgr.is())
|
|
|
|
{
|
|
|
|
SfxDispatcher* pDispatcher = pBindings->GetDispatcher();
|
2009-12-15 23:07:57 +01:00
|
|
|
uno::Reference< frame::XFrame > xFrame( pDispatcher->GetFrame()->GetFrame().GetFrameInterface(), uno::UNO_QUERY );
|
2008-12-16 16:42:03 +00:00
|
|
|
uno::Sequence< uno::Any > aArgs(2);
|
|
|
|
beans::PropertyValue aPropValue;
|
|
|
|
aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Frame" ));
|
|
|
|
aPropValue.Value = uno::makeAny( xFrame );
|
|
|
|
aArgs[0] <<= aPropValue;
|
|
|
|
aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ResourceURL" ));
|
|
|
|
|
|
|
|
// create a resource URL from the nId provided by the sfx2
|
|
|
|
::rtl::OUString aResourceURL( aDockWindowResourceURL );
|
|
|
|
aResourceURL += ::rtl::OUString::valueOf(sal_Int32(nId));
|
|
|
|
aPropValue.Value = uno::makeAny( aResourceURL );
|
|
|
|
aArgs[1] <<= aPropValue;
|
|
|
|
|
|
|
|
uno::Reference< awt::XWindow > xWindow;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
uno::Reference< beans::XPropertySet > xProps( xServiceManager, uno::UNO_QUERY );
|
|
|
|
uno::Reference< uno::XComponentContext > xContext;
|
|
|
|
|
|
|
|
if ( xProps.is() )
|
|
|
|
xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))) >>= xContext;
|
|
|
|
if ( xContext.is() )
|
|
|
|
{
|
|
|
|
xWindow = uno::Reference< awt::XWindow>(
|
|
|
|
xFactoryMgr->createInstanceWithArgumentsAndContext( aArgs, xContext ),
|
|
|
|
uno::UNO_QUERY );
|
|
|
|
}
|
|
|
|
|
|
|
|
uno::Reference< frame::XModuleManager > xModuleManager( m_xModuleManager );
|
|
|
|
if ( !xModuleManager.is() )
|
|
|
|
{
|
|
|
|
xModuleManager = uno::Reference< frame::XModuleManager >(
|
|
|
|
xServiceManager->createInstance(
|
|
|
|
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ModuleManager" ))),
|
|
|
|
uno::UNO_QUERY );
|
|
|
|
m_xModuleManager = xModuleManager;
|
|
|
|
}
|
|
|
|
|
|
|
|
uno::Reference< container::XNameAccess > xWindowStateConfiguration( m_xWindowStateConfiguration );
|
|
|
|
if ( !xWindowStateConfiguration.is() )
|
|
|
|
{
|
|
|
|
xWindowStateConfiguration = uno::Reference< container::XNameAccess >(
|
|
|
|
xServiceManager->createInstance(
|
|
|
|
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.WindowStateConfiguration" ))),
|
|
|
|
uno::UNO_QUERY );
|
|
|
|
m_xWindowStateConfiguration = xWindowStateConfiguration;
|
|
|
|
}
|
|
|
|
|
|
|
|
::rtl::OUString sModuleIdentifier = xModuleManager->identify( xFrame );
|
|
|
|
|
|
|
|
uno::Reference< container::XNameAccess > xModuleWindowState(
|
|
|
|
xWindowStateConfiguration->getByName( sModuleIdentifier ),
|
|
|
|
uno::UNO_QUERY );
|
|
|
|
if ( xModuleWindowState.is() )
|
|
|
|
{
|
|
|
|
WindowState aDockWinState;
|
|
|
|
if ( lcl_getWindowState( xModuleWindowState, aResourceURL, aDockWinState ))
|
|
|
|
pTitleDockWindow->SetText( aDockWinState.sTitle );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch ( beans::UnknownPropertyException& )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
catch ( uno::RuntimeException& )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
catch ( uno::Exception& )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Window* pContentWindow = VCLUnoHelper::GetWindow(xWindow);
|
2009-10-16 15:24:43 +00:00
|
|
|
if ( pContentWindow )
|
|
|
|
pContentWindow->SetStyle( pContentWindow->GetStyle() | WB_DIALOGCONTROL | WB_CHILDDLGCTRL );
|
2008-12-16 16:42:03 +00:00
|
|
|
pTitleDockWindow->SetWrappedWindow(pContentWindow);
|
|
|
|
}
|
|
|
|
|
|
|
|
pWindow->SetOutputSizePixel( Size( 270, 240 ) );
|
|
|
|
|
|
|
|
( ( SfxDockingWindow* ) pWindow )->Initialize( pInfo );
|
|
|
|
SetHideNotDelete( TRUE );
|
|
|
|
}
|
|
|
|
|
|
|
|
SfxChildWindow* SfxDockingWrapper::CreateImpl(
|
|
|
|
Window *pParent, sal_uInt16 nId, SfxBindings *pBindings, SfxChildWinInfo* pInfo )
|
|
|
|
{
|
|
|
|
SfxChildWindow *pWin = new SfxDockingWrapper(pParent, nId, pBindings, pInfo); return pWin;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_uInt16 SfxDockingWrapper::GetChildWindowId ()
|
|
|
|
{
|
|
|
|
DBG_ASSERT( false, "This method shouldn't be called!" );
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SfxDockingWrapper::RegisterChildWindow (sal_Bool bVis, SfxModule *pMod, sal_uInt16 nFlags)
|
|
|
|
{
|
|
|
|
// pre-register a couple of docking windows
|
|
|
|
for (int i=0; i < NUM_OF_DOCKINGWINDOWS; i++ )
|
|
|
|
{
|
|
|
|
USHORT nID = USHORT(SID_DOCKWIN_START+i);
|
|
|
|
SfxChildWinFactory *pFact = new SfxChildWinFactory( SfxDockingWrapper::CreateImpl, nID, 0xffff );
|
|
|
|
pFact->aInfo.nFlags |= nFlags;
|
|
|
|
pFact->aInfo.bVisible = bVis;
|
|
|
|
SfxChildWindow::RegisterChildWindow(pMod, pFact);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SfxChildWinInfo SfxDockingWrapper::GetInfo() const
|
|
|
|
{
|
|
|
|
SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();
|
|
|
|
((SfxDockingWindow*)GetWindow())->FillInfo( aInfo );
|
|
|
|
return aInfo;
|
|
|
|
};
|
|
|
|
|
|
|
|
SfxTitleDockingWindow::SfxTitleDockingWindow( SfxBindings* pBind ,
|
|
|
|
SfxChildWindow* pChildWin ,
|
|
|
|
Window* pParent ,
|
|
|
|
WinBits nBits,
|
|
|
|
USHORT nID ) :
|
|
|
|
SfxDockingWindow( pBind ,
|
|
|
|
pChildWin ,
|
|
|
|
pParent ,
|
|
|
|
nBits ),
|
|
|
|
m_pWrappedWindow(0),
|
|
|
|
m_nID(nID)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
SfxTitleDockingWindow::~SfxTitleDockingWindow()
|
|
|
|
{
|
|
|
|
delete m_pWrappedWindow;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SfxTitleDockingWindow::SetWrappedWindow( Window* const pWindow )
|
|
|
|
{
|
|
|
|
m_pWrappedWindow = pWindow;
|
|
|
|
if (m_pWrappedWindow)
|
|
|
|
{
|
|
|
|
m_pWrappedWindow->SetParent(this);
|
|
|
|
m_pWrappedWindow->SetSizePixel( GetOutputSizePixel() );
|
|
|
|
m_pWrappedWindow->Show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
long SfxTitleDockingWindow::Notify( NotifyEvent& rNEvt )
|
|
|
|
{
|
|
|
|
return SfxDockingWindow::Notify( rNEvt );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SfxTitleDockingWindow::StateChanged( StateChangedType nType )
|
|
|
|
{
|
|
|
|
if ( nType == STATE_CHANGE_INITSHOW )
|
|
|
|
{
|
|
|
|
Window* pWindow = GetWrappedWindow();
|
|
|
|
if ( pWindow )
|
|
|
|
{
|
|
|
|
pWindow->SetSizePixel( GetOutputSizePixel() );
|
|
|
|
pWindow->Show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SfxDockingWindow::StateChanged(nType);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SfxTitleDockingWindow::Resize()
|
|
|
|
{
|
|
|
|
SfxDockingWindow::Resize();
|
|
|
|
if (m_pWrappedWindow)
|
|
|
|
m_pWrappedWindow->SetSizePixel( GetOutputSizePixel() );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SfxTitleDockingWindow::Resizing( Size &rSize )
|
|
|
|
{
|
|
|
|
SfxDockingWindow::Resizing( rSize );
|
|
|
|
if (m_pWrappedWindow)
|
|
|
|
m_pWrappedWindow->SetSizePixel( GetOutputSizePixel() );
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL SfxTitleDockingWindow::Close()
|
|
|
|
{
|
|
|
|
return SfxDockingWindow::Close();
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
struct ChildrenRegisteredMap : public rtl::Static< bool, ChildrenRegisteredMap > {};
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool lcl_checkDockingWindowID( USHORT nID )
|
|
|
|
{
|
|
|
|
if (nID < SID_DOCKWIN_START || nID >= USHORT(SID_DOCKWIN_START+NUM_OF_DOCKINGWINDOWS))
|
|
|
|
return false;
|
|
|
|
else
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
static SfxWorkWindow* lcl_getWorkWindowFromXFrame( const uno::Reference< frame::XFrame >& rFrame )
|
|
|
|
{
|
|
|
|
// We need to find the corresponding SfxFrame of our XFrame
|
|
|
|
SfxFrame* pFrame = SfxFrame::GetFirst();
|
|
|
|
SfxFrame* pXFrame = 0;
|
|
|
|
while ( pFrame )
|
|
|
|
{
|
|
|
|
uno::Reference< frame::XFrame > xViewShellFrame( pFrame->GetFrameInterface() );
|
|
|
|
if ( xViewShellFrame == rFrame )
|
|
|
|
{
|
|
|
|
pXFrame = pFrame;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
pFrame = SfxFrame::GetNext( *pFrame );
|
|
|
|
}
|
|
|
|
|
|
|
|
// If we have a SfxFrame we can retrieve the work window (Sfx layout manager for docking windows)
|
|
|
|
if ( pXFrame )
|
|
|
|
return pXFrame->GetWorkWindow_Impl();
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
Factory function used by the framework layout manager to "create" a docking window with a special name.
|
|
|
|
The string rDockingWindowName MUST BE a valid ID! The ID is pre-defined by a certain slot range located
|
|
|
|
in sfxsids.hrc (currently SID_DOCKWIN_START = 9800).
|
|
|
|
*/
|
|
|
|
void SAL_CALL SfxDockingWindowFactory( const uno::Reference< frame::XFrame >& rFrame, const rtl::OUString& rDockingWindowName )
|
|
|
|
{
|
|
|
|
::vos::OGuard aGuard( Application::GetSolarMutex() );
|
|
|
|
USHORT nID = USHORT(rDockingWindowName.toInt32());
|
|
|
|
|
|
|
|
// Check the range of the provided ID otherwise nothing will happen
|
|
|
|
if ( lcl_checkDockingWindowID( nID ))
|
|
|
|
{
|
|
|
|
SfxWorkWindow* pWorkWindow = lcl_getWorkWindowFromXFrame( rFrame );
|
|
|
|
if ( pWorkWindow )
|
|
|
|
{
|
|
|
|
SfxChildWindow* pChildWindow = pWorkWindow->GetChildWindow_Impl(nID);
|
|
|
|
if ( !pChildWindow )
|
|
|
|
{
|
|
|
|
// Register window at the workwindow child window list
|
|
|
|
pWorkWindow->SetChildWindow_Impl( nID, true, false );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
Function used by the framework layout manager to determine the visibility state of a docking window with
|
|
|
|
a special name. The string rDockingWindowName MUST BE a valid ID! The ID is pre-defined by a certain slot
|
|
|
|
range located in sfxsids.hrc (currently SID_DOCKWIN_START = 9800).
|
|
|
|
*/
|
|
|
|
bool SAL_CALL IsDockingWindowVisible( const uno::Reference< frame::XFrame >& rFrame, const rtl::OUString& rDockingWindowName )
|
|
|
|
{
|
|
|
|
::vos::OGuard aGuard( Application::GetSolarMutex() );
|
|
|
|
|
|
|
|
USHORT nID = USHORT(rDockingWindowName.toInt32());
|
|
|
|
|
|
|
|
// Check the range of the provided ID otherwise nothing will happen
|
|
|
|
if ( lcl_checkDockingWindowID( nID ))
|
|
|
|
{
|
|
|
|
SfxWorkWindow* pWorkWindow = lcl_getWorkWindowFromXFrame( rFrame );
|
|
|
|
if ( pWorkWindow )
|
|
|
|
{
|
|
|
|
SfxChildWindow* pChildWindow = pWorkWindow->GetChildWindow_Impl(nID);
|
|
|
|
if ( pChildWindow )
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
class SfxDockingWindow_Impl
|
|
|
|
{
|
|
|
|
friend class SfxDockingWindow;
|
|
|
|
|
|
|
|
SfxChildAlignment eLastAlignment;
|
|
|
|
SfxChildAlignment eDockAlignment;
|
|
|
|
BOOL bConstructed;
|
|
|
|
Size aMinSize;
|
|
|
|
SfxSplitWindow* pSplitWin;
|
|
|
|
BOOL bSplitable;
|
|
|
|
// BOOL bAutoHide;
|
2007-07-10 14:22:37 +00:00
|
|
|
Timer aMoveTimer;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Folgende members sind nur in der Zeit von StartDocking bis EndDocking
|
|
|
|
// g"ultig:
|
|
|
|
BOOL bEndDocked;
|
|
|
|
Size aSplitSize;
|
2002-04-30 13:15:44 +00:00
|
|
|
long nHorizontalSize;
|
|
|
|
long nVerticalSize;
|
2000-09-18 16:07:07 +00:00
|
|
|
USHORT nLine;
|
|
|
|
USHORT nPos;
|
|
|
|
USHORT nDockLine;
|
|
|
|
USHORT nDockPos;
|
|
|
|
BOOL bNewLine;
|
2002-09-30 16:05:42 +00:00
|
|
|
BOOL bDockingPrevented;
|
2001-11-15 14:18:34 +00:00
|
|
|
ByteString aWinState;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
SfxChildAlignment GetLastAlignment() const
|
|
|
|
{ return eLastAlignment; }
|
|
|
|
void SetLastAlignment(SfxChildAlignment eAlign)
|
|
|
|
{ eLastAlignment = eAlign; }
|
|
|
|
SfxChildAlignment GetDockAlignment() const
|
|
|
|
{ return eDockAlignment; }
|
|
|
|
void SetDockAlignment(SfxChildAlignment eAlign)
|
|
|
|
{ eDockAlignment = eAlign; }
|
|
|
|
};
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxDockingWindow::Resize()
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Diese virtuelle Methode der Klasse DockingWindow merkt sich ggf. eine
|
|
|
|
ver"anderte FloatingSize.
|
|
|
|
Wird diese Methode von einer abgeleiteten Klasse "uberschrieben, mu\s
|
|
|
|
auch SfxDockingWindow::Resize() gerufen werden.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
DockingWindow::Resize();
|
2001-12-19 17:52:57 +00:00
|
|
|
Invalidate();
|
|
|
|
if ( pImp->bConstructed && pMgr )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-12-19 17:52:57 +00:00
|
|
|
if ( IsFloatingMode() )
|
2001-11-21 11:44:07 +00:00
|
|
|
{
|
2008-01-29 15:27:40 +00:00
|
|
|
// start timer for saving window status information
|
|
|
|
pImp->aMoveTimer.Start();
|
2001-11-21 11:44:07 +00:00
|
|
|
}
|
2002-04-30 07:02:00 +00:00
|
|
|
else
|
|
|
|
{
|
2002-04-30 13:15:44 +00:00
|
|
|
Size aSize( GetSizePixel() );
|
|
|
|
switch ( pImp->GetDockAlignment() )
|
2002-04-30 07:02:00 +00:00
|
|
|
{
|
2002-04-30 13:15:44 +00:00
|
|
|
case SFX_ALIGN_LEFT:
|
|
|
|
case SFX_ALIGN_FIRSTLEFT:
|
|
|
|
case SFX_ALIGN_LASTLEFT:
|
|
|
|
case SFX_ALIGN_RIGHT:
|
|
|
|
case SFX_ALIGN_FIRSTRIGHT:
|
|
|
|
case SFX_ALIGN_LASTRIGHT:
|
|
|
|
pImp->nHorizontalSize = aSize.Width();
|
2005-03-23 15:23:28 +00:00
|
|
|
pImp->aSplitSize = aSize;
|
2002-04-30 13:15:44 +00:00
|
|
|
break;
|
|
|
|
case SFX_ALIGN_TOP:
|
|
|
|
case SFX_ALIGN_LOWESTTOP:
|
|
|
|
case SFX_ALIGN_HIGHESTTOP:
|
|
|
|
case SFX_ALIGN_BOTTOM:
|
|
|
|
case SFX_ALIGN_HIGHESTBOTTOM:
|
|
|
|
case SFX_ALIGN_LOWESTBOTTOM:
|
|
|
|
pImp->nVerticalSize = aSize.Height();
|
2005-03-23 15:23:28 +00:00
|
|
|
pImp->aSplitSize = aSize;
|
2002-04-30 13:15:44 +00:00
|
|
|
break;
|
2006-06-19 21:21:12 +00:00
|
|
|
default:
|
|
|
|
break;
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL SfxDockingWindow::PrepareToggleFloatingMode()
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Diese virtuelle Methode der Klasse DockingWindow erm"oglicht ein Eingreifen
|
|
|
|
in das Umschalten des floating mode.
|
|
|
|
Wird diese Methode von einer abgeleiteten Klasse "uberschrieben, mu\s
|
|
|
|
danach SfxDockingWindow::PrepareToggleFloatingMode() gerufen werden,
|
|
|
|
wenn nicht FALSE zur"uckgegeben wird.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
if (!pImp->bConstructed)
|
|
|
|
return TRUE;
|
|
|
|
|
2008-12-11 07:05:03 +00:00
|
|
|
if ( (Application::IsInModalMode() && IsFloatingMode()) || !pMgr )
|
2000-09-18 16:07:07 +00:00
|
|
|
return FALSE;
|
|
|
|
|
2002-09-30 16:05:42 +00:00
|
|
|
if ( pImp->bDockingPrevented )
|
|
|
|
return FALSE;
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!IsFloatingMode())
|
|
|
|
{
|
|
|
|
// Testen, ob FloatingMode erlaubt ist
|
2002-04-30 13:15:44 +00:00
|
|
|
if ( CheckAlignment(GetAlignment(),SFX_ALIGN_NOALIGNMENT) != SFX_ALIGN_NOALIGNMENT )
|
2000-09-18 16:07:07 +00:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if ( pImp->pSplitWin )
|
|
|
|
{
|
|
|
|
// Das DockingWindow sitzt in einem SplitWindow und wird abgerissen
|
2001-09-06 06:46:05 +00:00
|
|
|
pImp->pSplitWin->RemoveWindow(this/*, FALSE*/);
|
2000-09-18 16:07:07 +00:00
|
|
|
pImp->pSplitWin = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( pMgr )
|
|
|
|
{
|
2001-11-30 12:53:59 +00:00
|
|
|
pImp->aWinState = GetFloatingWindow()->GetWindowState();
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// Testen, ob es erlaubt ist, anzudocken
|
2002-04-30 13:15:44 +00:00
|
|
|
if (CheckAlignment(GetAlignment(),pImp->GetLastAlignment()) == SFX_ALIGN_NOALIGNMENT)
|
2000-09-18 16:07:07 +00:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
// Testen, ob das Workwindow gerade ein Andocken erlaubt
|
|
|
|
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl();
|
2005-09-23 14:51:59 +00:00
|
|
|
if ( !pWorkWin->IsDockingAllowed() || !pWorkWin->IsInternalDockingAllowed() )
|
2000-09-18 16:07:07 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxDockingWindow::ToggleFloatingMode()
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Diese virtuelle Methode der Klasse DockingWindow setzt die internen
|
|
|
|
Daten des SfxDockingWindow und sorgt f"ur korrektes Alignment am
|
|
|
|
parent window.
|
|
|
|
Durch PrepareToggleFloatMode und Initialize ist sichergestellt, da\s
|
|
|
|
pImp->GetLastAlignment() immer eine erlaubtes Alignment liefert.
|
|
|
|
Wird diese Methode von einer abgeleiteten Klasse "uberschrieben, mu\s
|
|
|
|
zuerst SfxDockingWindow::ToggleFloatingMode() gerufen werden.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
if ( !pImp->bConstructed || !pMgr )
|
|
|
|
return; // Kein Handler-Aufruf
|
|
|
|
|
|
|
|
// Altes Alignment merken und dann umschalten.
|
|
|
|
// Sv hat jetzt schon umgeschaltet, aber Alignment am SfxDockingWindow
|
|
|
|
// ist noch das alte!
|
|
|
|
// Was war ich bisher ?
|
|
|
|
SfxChildAlignment eLastAlign = GetAlignment();
|
|
|
|
|
|
|
|
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl();
|
|
|
|
SfxChildIdentifier eIdent = SFX_CHILDWIN_DOCKINGWINDOW;
|
|
|
|
if ( pImp->bSplitable )
|
|
|
|
eIdent = SFX_CHILDWIN_SPLITWINDOW;
|
|
|
|
|
|
|
|
if (IsFloatingMode())
|
|
|
|
{
|
|
|
|
SetAlignment(SFX_ALIGN_NOALIGNMENT);
|
2001-11-15 14:18:34 +00:00
|
|
|
if ( pImp->aWinState.Len() )
|
|
|
|
GetFloatingWindow()->SetWindowState( pImp->aWinState );
|
2001-11-29 16:01:14 +00:00
|
|
|
else
|
|
|
|
GetFloatingWindow()->SetOutputSizePixel( GetFloatingSize() );
|
2001-12-19 17:08:56 +00:00
|
|
|
/*
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pImp->bSplitable && !pImp->bEndDocked )
|
|
|
|
// Wenn das Fenster vorher in einem SplitWindow lag, kommt von
|
|
|
|
// Sv kein Show
|
|
|
|
Show();
|
2001-12-19 17:08:56 +00:00
|
|
|
*/
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (pImp->GetDockAlignment() == eLastAlign)
|
|
|
|
{
|
|
|
|
// Wenn ToggleFloatingMode aufgerufen wurde, das DockAlignment
|
|
|
|
// aber noch unver"andert ist, mu\s das ein Toggeln durch DClick
|
|
|
|
// gewesen sein, also LastAlignment verwenden
|
|
|
|
SetAlignment (pImp->GetLastAlignment());
|
2001-11-15 14:18:34 +00:00
|
|
|
if ( !pImp->bSplitable )
|
2000-09-18 16:07:07 +00:00
|
|
|
SetSizePixel( CalcDockingSize(GetAlignment()) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Toggeln wurde durch Draggen ausgel"ost
|
|
|
|
pImp->nLine = pImp->nDockLine;
|
|
|
|
pImp->nPos = pImp->nDockPos;
|
|
|
|
SetAlignment (pImp->GetDockAlignment());
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( pImp->bSplitable )
|
|
|
|
{
|
|
|
|
// Das DockingWindow kommt jetzt in ein SplitWindow
|
|
|
|
pImp->pSplitWin = pWorkWin->GetSplitWindow_Impl(GetAlignment());
|
|
|
|
|
|
|
|
// Das LastAlignment ist jetzt immer noch das zuletzt angedockte
|
2001-11-15 14:18:34 +00:00
|
|
|
SfxSplitWindow *pSplit = pWorkWin->GetSplitWindow_Impl(pImp->GetLastAlignment());
|
|
|
|
|
|
|
|
DBG_ASSERT( pSplit, "LastAlignment kann nicht stimmen!" );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pSplit && pSplit != pImp->pSplitWin )
|
|
|
|
pSplit->ReleaseWindow_Impl(this);
|
|
|
|
if ( pImp->GetDockAlignment() == eLastAlign )
|
2002-04-30 13:15:44 +00:00
|
|
|
pImp->pSplitWin->InsertWindow( this, pImp->aSplitSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2002-04-30 13:15:44 +00:00
|
|
|
pImp->pSplitWin->InsertWindow( this, pImp->aSplitSize, pImp->nLine, pImp->nPos, pImp->bNewLine );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !pImp->pSplitWin->IsFadeIn() )
|
|
|
|
pImp->pSplitWin->FadeIn();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// altes Alignment festhalten f"ur n"achstes Togglen; erst jetzt setzen
|
|
|
|
// wg. Abmelden beim SplitWindow!
|
|
|
|
pImp->SetLastAlignment(eLastAlign);
|
|
|
|
|
|
|
|
// DockAlignment zur"ucksetzen, falls noch EndDocking gerufen wird
|
|
|
|
pImp->SetDockAlignment(GetAlignment());
|
|
|
|
|
|
|
|
// SfxChildWindow korrekt andocken bzw. entdocken
|
|
|
|
if ( pMgr )
|
|
|
|
pWorkWin->ConfigChild_Impl( eIdent, SFX_TOGGLEFLOATMODE, pMgr->GetType() );
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxDockingWindow::StartDocking()
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Diese virtuelle Methode der Klasse DockingWindow holt vom parent window
|
|
|
|
das innere und "au\sere docking rectangle.
|
|
|
|
Wird diese Methode von einer abgeleiteten Klasse "uberschrieben, mu\s
|
|
|
|
am Ende SfxDockingWindow::StartDocking() gerufen werden.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
if ( !pImp->bConstructed || !pMgr )
|
|
|
|
return;
|
|
|
|
SfxChildIdentifier eIdent = SFX_CHILDWIN_DOCKINGWINDOW;
|
|
|
|
if ( pImp->bSplitable )
|
|
|
|
eIdent = SFX_CHILDWIN_SPLITWINDOW;
|
|
|
|
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl();
|
|
|
|
pWorkWin->ConfigChild_Impl( eIdent, SFX_SETDOCKINGRECTS, pMgr->GetType() );
|
|
|
|
pImp->SetDockAlignment(GetAlignment());
|
|
|
|
|
|
|
|
if ( pImp->pSplitWin )
|
|
|
|
{
|
|
|
|
// Die aktuellen Docking-Daten besorgen
|
|
|
|
pImp->pSplitWin->GetWindowPos(this, pImp->nLine, pImp->nPos);
|
|
|
|
pImp->nDockLine = pImp->nLine;
|
|
|
|
pImp->nDockPos = pImp->nPos;
|
|
|
|
pImp->bNewLine = FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL SfxDockingWindow::Docking( const Point& rPos, Rectangle& rRect )
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Diese virtuelle Methode der Klasse DockingWindow berechnet das aktuelle
|
|
|
|
tracking rectangle. Dazu benutzt sie die Methode CalcAlignment(rPos,rRect),
|
|
|
|
deren Verhalten von abgeleiteten Klassen beeinflu\st werden kann (s.u.).
|
|
|
|
Diese Methode sollte nach M"oglichkeit nicht "uberschrieben werden.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
if ( Application::IsInModalMode() )
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
if ( !pImp->bConstructed || !pMgr )
|
|
|
|
{
|
|
|
|
rRect.SetSize( Size() );
|
|
|
|
return IsFloatingMode();
|
|
|
|
}
|
|
|
|
|
2005-09-23 14:51:59 +00:00
|
|
|
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl();
|
|
|
|
if ( pImp->bDockingPrevented || !pWorkWin->IsInternalDockingAllowed() )
|
2002-09-30 16:05:42 +00:00
|
|
|
return FALSE;
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
BOOL bFloatMode = FALSE;
|
2004-07-06 12:35:55 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( GetOuterRect().IsInside( rPos ) && !IsDockingPrevented() )
|
|
|
|
{
|
|
|
|
// Maus innerhalb OuterRect : Alignment und Rectangle berechnen
|
|
|
|
SfxChildAlignment eAlign = CalcAlignment(rPos, rRect);
|
|
|
|
if (eAlign == SFX_ALIGN_NOALIGNMENT)
|
|
|
|
bFloatMode = TRUE;
|
|
|
|
pImp->SetDockAlignment(eAlign);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Maus nicht innerhalb OuterRect : muss FloatingWindow sein
|
|
|
|
// Ist das erlaubt ?
|
2001-11-15 14:18:34 +00:00
|
|
|
if (CheckAlignment(pImp->GetDockAlignment(),SFX_ALIGN_NOALIGNMENT) != SFX_ALIGN_NOALIGNMENT)
|
2000-09-18 16:07:07 +00:00
|
|
|
return FALSE;
|
|
|
|
bFloatMode = TRUE;
|
|
|
|
if ( SFX_ALIGN_NOALIGNMENT != pImp->GetDockAlignment() )
|
|
|
|
{
|
|
|
|
// wg. SV-Bug darf rRect nur ver"andert werden, wenn sich das
|
|
|
|
// Alignment "andert !
|
|
|
|
pImp->SetDockAlignment(SFX_ALIGN_NOALIGNMENT);
|
|
|
|
rRect.SetSize(CalcDockingSize(SFX_ALIGN_NOALIGNMENT));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-04-19 07:00:26 +00:00
|
|
|
if ( !pImp->bSplitable )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
// Bei individuell angedocktem Window wird die Position durch das
|
|
|
|
// Alignment und die docking rects festgelegt.
|
|
|
|
Size aSize = rRect.GetSize();
|
|
|
|
Point aPos;
|
|
|
|
|
|
|
|
switch ( pImp->GetDockAlignment() )
|
|
|
|
{
|
|
|
|
case SFX_ALIGN_LEFT:
|
|
|
|
case SFX_ALIGN_FIRSTLEFT:
|
|
|
|
case SFX_ALIGN_LASTLEFT:
|
|
|
|
aPos = aInnerRect.TopLeft();
|
|
|
|
if ( pImp->GetDockAlignment() == GetAlignment() )
|
|
|
|
aPos.X() -= aSize.Width();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SFX_ALIGN_TOP:
|
|
|
|
case SFX_ALIGN_LOWESTTOP:
|
|
|
|
case SFX_ALIGN_HIGHESTTOP:
|
|
|
|
aPos = Point(aOuterRect.Left(), aInnerRect.Top());
|
|
|
|
if ( pImp->GetDockAlignment() == GetAlignment() )
|
|
|
|
aPos.Y() -= aSize.Height();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SFX_ALIGN_RIGHT:
|
|
|
|
case SFX_ALIGN_FIRSTRIGHT:
|
|
|
|
case SFX_ALIGN_LASTRIGHT:
|
|
|
|
aPos = Point(aInnerRect.Right() - rRect.GetSize().Width(),
|
|
|
|
aInnerRect.Top());
|
|
|
|
if ( pImp->GetDockAlignment() == GetAlignment() )
|
|
|
|
aPos.X() += aSize.Width();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SFX_ALIGN_BOTTOM:
|
|
|
|
case SFX_ALIGN_HIGHESTBOTTOM:
|
|
|
|
case SFX_ALIGN_LOWESTBOTTOM:
|
|
|
|
aPos = Point(aOuterRect.Left(),
|
|
|
|
aInnerRect.Bottom() - rRect.GetSize().Height());
|
|
|
|
if ( pImp->GetDockAlignment() == GetAlignment() )
|
|
|
|
aPos.Y() += aSize.Height();
|
|
|
|
break;
|
2006-06-19 21:21:12 +00:00
|
|
|
default:
|
|
|
|
break;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
rRect.SetPos(aPos);
|
|
|
|
}
|
|
|
|
|
|
|
|
return bFloatMode;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxDockingWindow::EndDocking( const Rectangle& rRect, BOOL bFloatMode )
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Diese virtuelle Methode der Klasse DockingWindow sorgt f"ur das korrekte
|
|
|
|
Alignment am parent window.
|
|
|
|
Wird diese Methode von einer abgeleiteten Klasse "uberschrieben, mu\s
|
|
|
|
zuerst SfxDockingWindow::EndDocking() gerufen werden.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
if ( !pImp->bConstructed || IsDockingCanceled() || !pMgr )
|
|
|
|
return;
|
|
|
|
|
|
|
|
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl();
|
|
|
|
BOOL bReArrange = FALSE;
|
|
|
|
SfxChildIdentifier eIdent = SFX_CHILDWIN_DOCKINGWINDOW;
|
|
|
|
if ( pImp->bSplitable )
|
|
|
|
{
|
|
|
|
eIdent = SFX_CHILDWIN_SPLITWINDOW;
|
|
|
|
|
|
|
|
// Wenn sich das Alignment "andert und das Fenster befindet sich
|
|
|
|
// im angedockten Zustand in einem SplitWindow, mu\s umgemeldet werden
|
|
|
|
// Wenn neu angedockt wird, machen PrepareToggleFloatingMode()
|
|
|
|
// und ToggleFloatingMode() das Ummelden.
|
|
|
|
if ( !bFloatMode )
|
|
|
|
bReArrange = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bReArrange )
|
|
|
|
{
|
|
|
|
if ( GetAlignment() != pImp->GetDockAlignment() )
|
|
|
|
{
|
|
|
|
// Vor dem Show() mu\s das Ummelden passiert sein, daher kann nicht
|
|
|
|
// die Basisklasse gerufen werden
|
|
|
|
if ( IsFloatingMode() || !pImp->bSplitable )
|
|
|
|
Show( FALSE, SHOW_NOFOCUSCHANGE );
|
|
|
|
|
|
|
|
// Die Gr"o\se f"urs Toggeln setzen
|
2002-04-30 13:15:44 +00:00
|
|
|
pImp->aSplitSize = rRect.GetSize();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsFloatingMode() )
|
|
|
|
{
|
|
|
|
SetFloatingMode( bFloatMode );
|
|
|
|
if ( IsFloatingMode() || !pImp->bSplitable )
|
2002-04-30 13:15:44 +00:00
|
|
|
Show( TRUE, SHOW_NOFOCUSCHANGE );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pImp->pSplitWin->RemoveWindow(this,FALSE);
|
|
|
|
pImp->nLine = pImp->nDockLine;
|
|
|
|
pImp->nPos = pImp->nDockPos;
|
|
|
|
pImp->pSplitWin->ReleaseWindow_Impl(this);
|
|
|
|
pImp->pSplitWin = pWorkWin->GetSplitWindow_Impl(pImp->GetDockAlignment());
|
2002-04-30 13:15:44 +00:00
|
|
|
pImp->pSplitWin->InsertWindow( this, pImp->aSplitSize, pImp->nDockLine, pImp->nDockPos, pImp->bNewLine );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !pImp->pSplitWin->IsFadeIn() )
|
|
|
|
pImp->pSplitWin->FadeIn();
|
|
|
|
}
|
|
|
|
}
|
2002-04-30 13:15:44 +00:00
|
|
|
else if ( pImp->nLine != pImp->nDockLine || pImp->nPos != pImp->nDockPos || pImp->bNewLine )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
// Ich wurde innerhalb meines Splitwindows verschoben.
|
|
|
|
if ( pImp->nLine != pImp->nDockLine )
|
|
|
|
pImp->aSplitSize = rRect.GetSize();
|
2002-04-30 13:15:44 +00:00
|
|
|
pImp->pSplitWin->MoveWindow( this, pImp->aSplitSize, pImp->nDockLine, pImp->nDockPos, pImp->bNewLine );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pImp->bEndDocked = TRUE;
|
|
|
|
DockingWindow::EndDocking(rRect, bFloatMode);
|
|
|
|
pImp->bEndDocked = FALSE;
|
|
|
|
}
|
|
|
|
|
2003-03-27 10:29:38 +00:00
|
|
|
SetAlignment( IsFloatingMode() ? SFX_ALIGN_NOALIGNMENT : pImp->GetDockAlignment() );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
2006-06-19 21:21:12 +00:00
|
|
|
void SfxDockingWindow::Resizing( Size& /*rSize*/ )
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Virtuelle Methode der Klasse DockingWindow.
|
|
|
|
Hier kann das interaktive Umgr"o\sern im FloatingMode beeinflu\t werden,
|
|
|
|
z.B. indem nur diskrete Werte f"ur Breite und/oder H"ohe zugelassen werden.
|
|
|
|
Die Basisimplementation verhindert, da\s die OutputSize kleiner wird als
|
|
|
|
eine mit SetMinOutputSizePixel() gesetzte Gr"o\se.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
2002-03-27 10:47:51 +00:00
|
|
|
/*
|
2000-09-18 16:07:07 +00:00
|
|
|
if(rSize.Width() < pImp->aMinSize.Width())
|
|
|
|
rSize.Width() = pImp->aMinSize.Width();
|
|
|
|
if(rSize.Height() < pImp->aMinSize.Height())
|
|
|
|
rSize.Height() = pImp->aMinSize.Height();
|
2002-03-27 10:47:51 +00:00
|
|
|
*/
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
SfxDockingWindow::SfxDockingWindow( SfxBindings *pBindinx, SfxChildWindow *pCW,
|
|
|
|
Window* pParent, WinBits nWinBits) :
|
2006-06-19 21:21:12 +00:00
|
|
|
DockingWindow (pParent, nWinBits),
|
2000-09-18 16:07:07 +00:00
|
|
|
pBindings(pBindinx),
|
2007-07-10 14:22:37 +00:00
|
|
|
pMgr(pCW),
|
|
|
|
pImp(NULL)
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
ctor der Klasse SfxDockingWindow. Es wird ein SfxChildWindow ben"otigt,
|
|
|
|
da das Andocken im Sfx "uber SfxChildWindows realisiert wird.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
2010-06-04 13:46:22 +02:00
|
|
|
// FIXME: HELPID
|
|
|
|
ULONG nId = 0;// GetHelpId();
|
2001-03-21 08:37:55 +00:00
|
|
|
if ( !nId && pCW )
|
|
|
|
nId = pCW->GetType();
|
2010-06-04 13:46:22 +02:00
|
|
|
SetHelpId( "" );
|
|
|
|
// FIXME: HELPID
|
|
|
|
SetUniqueId( ""/*nId*/ );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
pImp = new SfxDockingWindow_Impl;
|
|
|
|
pImp->bConstructed = FALSE;
|
|
|
|
pImp->pSplitWin = 0;
|
|
|
|
pImp->bEndDocked = FALSE;
|
2002-09-30 16:05:42 +00:00
|
|
|
pImp->bDockingPrevented = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
pImp->bSplitable = TRUE;
|
|
|
|
// pImp->bAutoHide = FALSE;
|
|
|
|
|
|
|
|
// Zun"achst auf Defaults setzen; das Alignment wird in der Subklasse gesetzt
|
|
|
|
pImp->nLine = pImp->nDockLine = 0;
|
|
|
|
pImp->nPos = pImp->nDockPos = 0;
|
|
|
|
pImp->bNewLine = FALSE;
|
|
|
|
pImp->SetLastAlignment(SFX_ALIGN_NOALIGNMENT);
|
2007-07-10 14:22:37 +00:00
|
|
|
pImp->aMoveTimer.SetTimeout(50);
|
|
|
|
pImp->aMoveTimer.SetTimeoutHdl(LINK(this,SfxDockingWindow,TimerHdl));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// DBG_ASSERT(pMgr,"DockingWindow erfordert ein SfxChildWindow!");
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
SfxDockingWindow::SfxDockingWindow( SfxBindings *pBindinx, SfxChildWindow *pCW,
|
|
|
|
Window* pParent, const ResId& rResId) :
|
2006-06-19 21:21:12 +00:00
|
|
|
DockingWindow(pParent, rResId),
|
2000-09-18 16:07:07 +00:00
|
|
|
pBindings(pBindinx),
|
2007-07-10 14:22:37 +00:00
|
|
|
pMgr(pCW),
|
|
|
|
pImp(NULL)
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
ctor der Klasse SfxDockingWindow. Es wird ein SfxChildWindow ben"otigt,
|
|
|
|
da das Andocken im Sfx "uber SfxChildWindows realisiert wird.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
2010-06-04 13:46:22 +02:00
|
|
|
// FIXME: HELPID
|
|
|
|
SetUniqueId( GetHelpId() );
|
|
|
|
SetHelpId("");
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
pImp = new SfxDockingWindow_Impl;
|
|
|
|
pImp->bConstructed = FALSE;
|
|
|
|
pImp->pSplitWin = 0;
|
|
|
|
pImp->bEndDocked = FALSE;
|
2002-09-30 16:05:42 +00:00
|
|
|
pImp->bDockingPrevented = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
pImp->bSplitable = TRUE;
|
|
|
|
// pImp->bAutoHide = FALSE;
|
|
|
|
|
|
|
|
// Zun"achst auf Defaults setzen; das Alignment wird in der Subklasse gesetzt
|
|
|
|
pImp->nLine = pImp->nDockLine = 0;
|
|
|
|
pImp->nPos = pImp->nDockPos = 0;
|
|
|
|
pImp->bNewLine = FALSE;
|
|
|
|
pImp->SetLastAlignment(SFX_ALIGN_NOALIGNMENT);
|
2007-07-10 14:22:37 +00:00
|
|
|
pImp->aMoveTimer.SetTimeout(50);
|
|
|
|
pImp->aMoveTimer.SetTimeoutHdl(LINK(this,SfxDockingWindow,TimerHdl));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// DBG_ASSERT(pMgr,"DockingWindow erfordert ein SfxChildWindow!");
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxDockingWindow::Initialize(SfxChildWinInfo *pInfo)
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Initialisierung der Klasse SfxDockingWindow "uber ein SfxChildWinInfo.
|
|
|
|
Die Initialisierung erfolgt erst in einem 2.Schritt nach dem ctor und sollte
|
|
|
|
vom ctor der abgeleiteten Klasse oder vom ctor des SfxChildWindows
|
|
|
|
aufgerufen werden.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
if ( !pMgr )
|
|
|
|
{
|
|
|
|
// Bugfix #39771
|
|
|
|
pImp->SetDockAlignment( SFX_ALIGN_NOALIGNMENT );
|
|
|
|
pImp->bConstructed = TRUE;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2002-09-30 16:05:42 +00:00
|
|
|
if ( pInfo->nFlags & SFX_CHILDWIN_FORCEDOCK )
|
|
|
|
pImp->bDockingPrevented = TRUE;
|
|
|
|
|
2002-04-30 13:15:44 +00:00
|
|
|
pImp->aSplitSize = GetOutputSizePixel();
|
2001-11-29 16:01:14 +00:00
|
|
|
if ( !GetFloatingSize().Width() )
|
|
|
|
{
|
|
|
|
Size aMinSize( GetMinOutputSizePixel() );
|
|
|
|
SetFloatingSize( pImp->aSplitSize );
|
|
|
|
if ( pImp->aSplitSize.Width() < aMinSize.Width() )
|
|
|
|
pImp->aSplitSize.Width() = aMinSize.Width();
|
|
|
|
if ( pImp->aSplitSize.Height() < aMinSize.Height() )
|
|
|
|
pImp->aSplitSize.Height() = aMinSize.Height();
|
|
|
|
}
|
|
|
|
|
2005-04-18 11:20:33 +00:00
|
|
|
sal_Bool bVertHorzRead( sal_False );
|
2002-10-01 07:41:48 +00:00
|
|
|
if ( pInfo->aExtraString.Len() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-11-15 14:18:34 +00:00
|
|
|
// get information about alignment, split size and position in SplitWindow
|
|
|
|
String aStr;
|
|
|
|
USHORT nPos = pInfo->aExtraString.SearchAscii("AL:");
|
|
|
|
if ( nPos != STRING_NOTFOUND )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-11-15 14:18:34 +00:00
|
|
|
// alignment information
|
|
|
|
USHORT n1 = pInfo->aExtraString.Search('(', nPos);
|
|
|
|
if ( n1 != STRING_NOTFOUND )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-11-15 14:18:34 +00:00
|
|
|
USHORT n2 = pInfo->aExtraString.Search(')', n1);
|
|
|
|
if ( n2 != STRING_NOTFOUND )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-11-15 14:18:34 +00:00
|
|
|
// extract alignment information from extrastring
|
|
|
|
aStr = pInfo->aExtraString.Copy(nPos, n2 - nPos + 1);
|
|
|
|
pInfo->aExtraString.Erase(nPos, n2 - nPos + 1);
|
|
|
|
aStr.Erase(nPos, n1-nPos+1);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
2001-11-15 14:18:34 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2001-11-15 14:18:34 +00:00
|
|
|
if ( aStr.Len() )
|
|
|
|
{
|
|
|
|
// accept window state only if alignment is also set
|
|
|
|
pImp->aWinState = pInfo->aWinState;
|
|
|
|
|
|
|
|
// check for valid alignment
|
2002-09-30 16:05:42 +00:00
|
|
|
SfxChildAlignment eLocalAlignment = (SfxChildAlignment) (USHORT) aStr.ToInt32();
|
|
|
|
if ( pImp->bDockingPrevented )
|
|
|
|
// docking prevented, ignore old configuration and take alignment from default
|
|
|
|
aStr.Erase();
|
|
|
|
else
|
|
|
|
SetAlignment( eLocalAlignment );
|
|
|
|
|
2001-11-15 14:18:34 +00:00
|
|
|
SfxChildAlignment eAlign = CheckAlignment(GetAlignment(),GetAlignment());
|
|
|
|
if ( eAlign != GetAlignment() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-11-15 14:18:34 +00:00
|
|
|
DBG_ERROR("Invalid Alignment!");
|
|
|
|
SetAlignment( eAlign );
|
2002-09-30 16:05:42 +00:00
|
|
|
aStr.Erase();
|
2001-11-15 14:18:34 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2001-11-15 14:18:34 +00:00
|
|
|
// get last alignment (for toggeling)
|
|
|
|
nPos = aStr.Search(',');
|
|
|
|
if ( nPos != STRING_NOTFOUND )
|
|
|
|
{
|
|
|
|
aStr.Erase(0, nPos+1);
|
|
|
|
pImp->SetLastAlignment( (SfxChildAlignment) (USHORT) aStr.ToInt32() );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2001-11-15 14:18:34 +00:00
|
|
|
nPos = aStr.Search(',');
|
|
|
|
if ( nPos != STRING_NOTFOUND )
|
|
|
|
{
|
|
|
|
// get split size and position in SplitWindow
|
|
|
|
Point aPos;
|
|
|
|
aStr.Erase(0, nPos+1);
|
|
|
|
if ( GetPosSizeFromString( aStr, aPos, pImp->aSplitSize ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-11-15 14:18:34 +00:00
|
|
|
pImp->nLine = pImp->nDockLine = (USHORT) aPos.X();
|
|
|
|
pImp->nPos = pImp->nDockPos = (USHORT) aPos.Y();
|
2005-04-18 11:20:33 +00:00
|
|
|
pImp->nVerticalSize = pImp->aSplitSize.Height();
|
|
|
|
pImp->nHorizontalSize = pImp->aSplitSize.Width();
|
|
|
|
if ( GetSplitSizeFromString( aStr, pImp->aSplitSize ))
|
|
|
|
bVertHorzRead = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-04-22 14:41:44 +00:00
|
|
|
else {
|
2001-11-15 14:18:34 +00:00
|
|
|
DBG_ERROR( "Information is missing!" );
|
2008-04-22 14:41:44 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2005-04-18 11:20:33 +00:00
|
|
|
if ( !bVertHorzRead )
|
|
|
|
{
|
|
|
|
pImp->nVerticalSize = pImp->aSplitSize.Height();
|
|
|
|
pImp->nHorizontalSize = pImp->aSplitSize.Width();
|
|
|
|
}
|
2002-04-30 13:15:44 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl();
|
|
|
|
if ( GetAlignment() != SFX_ALIGN_NOALIGNMENT )
|
|
|
|
{
|
2001-11-15 14:18:34 +00:00
|
|
|
// check if SfxWorkWindow is able to allow docking at its border
|
2008-12-11 07:05:03 +00:00
|
|
|
if (
|
|
|
|
!pWorkWin->IsDockingAllowed() ||
|
|
|
|
!pWorkWin->IsInternalDockingAllowed() ||
|
|
|
|
( (GetFloatStyle() & WB_STANDALONE) && Application::IsInModalMode()) )
|
|
|
|
{
|
2000-09-18 16:07:07 +00:00
|
|
|
SetAlignment( SFX_ALIGN_NOALIGNMENT );
|
2008-12-11 07:05:03 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2001-11-15 14:18:34 +00:00
|
|
|
// detect floating mode
|
|
|
|
// toggeling mode will not execute code in handlers, because pImp->bConstructed is not set yet
|
|
|
|
BOOL bFloatMode = IsFloatingMode();
|
|
|
|
if ( bFloatMode != ((GetAlignment() == SFX_ALIGN_NOALIGNMENT)) )
|
|
|
|
{
|
|
|
|
bFloatMode = !bFloatMode;
|
|
|
|
SetFloatingMode( bFloatMode );
|
2001-12-07 16:28:21 +00:00
|
|
|
if ( bFloatMode )
|
|
|
|
{
|
|
|
|
if ( pImp->aWinState.Len() )
|
|
|
|
GetFloatingWindow()->SetWindowState( pImp->aWinState );
|
|
|
|
else
|
|
|
|
GetFloatingWindow()->SetOutputSizePixel( GetFloatingSize() );
|
|
|
|
}
|
2001-11-15 14:18:34 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2001-11-15 14:18:34 +00:00
|
|
|
if ( IsFloatingMode() )
|
|
|
|
{
|
|
|
|
// validate last alignment
|
2000-09-18 16:07:07 +00:00
|
|
|
SfxChildAlignment eLastAlign = pImp->GetLastAlignment();
|
|
|
|
if ( eLastAlign == SFX_ALIGN_NOALIGNMENT)
|
|
|
|
eLastAlign = CheckAlignment(eLastAlign, SFX_ALIGN_LEFT);
|
|
|
|
if ( eLastAlign == SFX_ALIGN_NOALIGNMENT)
|
|
|
|
eLastAlign = CheckAlignment(eLastAlign, SFX_ALIGN_RIGHT);
|
|
|
|
if ( eLastAlign == SFX_ALIGN_NOALIGNMENT)
|
|
|
|
eLastAlign = CheckAlignment(eLastAlign, SFX_ALIGN_TOP);
|
|
|
|
if ( eLastAlign == SFX_ALIGN_NOALIGNMENT)
|
|
|
|
eLastAlign = CheckAlignment(eLastAlign, SFX_ALIGN_BOTTOM);
|
|
|
|
pImp->SetLastAlignment(eLastAlign);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-11-15 14:18:34 +00:00
|
|
|
// docked window must have NOALIGNMENT as last alignment
|
2000-09-18 16:07:07 +00:00
|
|
|
pImp->SetLastAlignment(SFX_ALIGN_NOALIGNMENT);
|
|
|
|
|
2001-02-19 10:43:23 +00:00
|
|
|
if ( pImp->bSplitable )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
// pImp->bAutoHide = ( pInfo->nFlags & SFX_CHILDWIN_AUTOHIDE) != 0;
|
|
|
|
pImp->pSplitWin = pWorkWin->GetSplitWindow_Impl(GetAlignment());
|
|
|
|
pImp->pSplitWin->InsertWindow(this, pImp->aSplitSize);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-11-15 14:18:34 +00:00
|
|
|
//?????? Currently not supported
|
2000-09-18 16:07:07 +00:00
|
|
|
// Fenster ist individuell angedockt; Gr"o\se berechnen.
|
|
|
|
// Dazu mu\s sie mit der FloatingSize initialisiert werden, falls
|
|
|
|
// irgendwer sich darauf verl"a\st, da\s eine vern"unftige Gr"o\se
|
2001-11-15 14:18:34 +00:00
|
|
|
// gesetzt ist
|
2000-09-18 16:07:07 +00:00
|
|
|
SetSizePixel(GetFloatingSize());
|
|
|
|
SetSizePixel(CalcDockingSize(GetAlignment()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-11-15 14:18:34 +00:00
|
|
|
// save alignment
|
2000-09-18 16:07:07 +00:00
|
|
|
pImp->SetDockAlignment( GetAlignment() );
|
2001-11-21 11:44:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SfxDockingWindow::Initialize_Impl()
|
|
|
|
{
|
|
|
|
if ( !pMgr )
|
2001-12-20 10:16:40 +00:00
|
|
|
{
|
2001-11-21 11:44:07 +00:00
|
|
|
// Bugfix #39771
|
2001-12-20 10:16:40 +00:00
|
|
|
pImp->bConstructed = TRUE;
|
2001-11-21 11:44:07 +00:00
|
|
|
return;
|
2001-12-20 10:16:40 +00:00
|
|
|
}
|
2001-11-21 11:44:07 +00:00
|
|
|
|
2002-04-19 07:00:26 +00:00
|
|
|
FloatingWindow* pFloatWin = GetFloatingWindow();
|
|
|
|
BOOL bSet = FALSE;
|
|
|
|
if ( pFloatWin )
|
|
|
|
{
|
|
|
|
bSet = !pFloatWin->IsDefaultPos();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Point aPos = GetFloatingPos();
|
|
|
|
if ( aPos != Point() )
|
|
|
|
bSet = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !bSet)
|
2001-11-30 12:53:59 +00:00
|
|
|
{
|
|
|
|
SfxViewFrame *pFrame = pBindings->GetDispatcher_Impl()->GetFrame();
|
|
|
|
Window* pEditWin = pFrame->GetViewShell()->GetWindow();
|
2002-04-19 07:00:26 +00:00
|
|
|
Point aPos = pEditWin->OutputToScreenPixel( pEditWin->GetPosPixel() );
|
2001-11-30 12:53:59 +00:00
|
|
|
aPos = GetParent()->ScreenToOutputPixel( aPos );
|
|
|
|
SetFloatingPos( aPos );
|
|
|
|
}
|
|
|
|
|
2001-11-21 11:44:07 +00:00
|
|
|
if ( pFloatWin )
|
|
|
|
{
|
|
|
|
// initialize floating window
|
|
|
|
if ( !pImp->aWinState.Len() )
|
|
|
|
// window state never set before, get if from defaults
|
|
|
|
pImp->aWinState = pFloatWin->GetWindowState();
|
|
|
|
|
|
|
|
// trick: use VCL method SetWindowState to adjust position and size
|
|
|
|
pFloatWin->SetWindowState( pImp->aWinState );
|
|
|
|
|
|
|
|
// remember floating size for calculating alignment and tracking rectangle
|
|
|
|
SetFloatingSize( pFloatWin->GetSizePixel() );
|
|
|
|
|
|
|
|
// some versions of VCL didn't call resize in the current situation
|
|
|
|
//Resize();
|
|
|
|
}
|
2001-11-15 14:18:34 +00:00
|
|
|
|
|
|
|
// allow calling of docking handlers
|
2000-09-18 16:07:07 +00:00
|
|
|
pImp->bConstructed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxDockingWindow::FillInfo(SfxChildWinInfo& rInfo) const
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
F"ullt ein SfxChildWinInfo mit f"ur SfxDockingWindow spezifischen Daten,
|
|
|
|
damit sie in die INI-Datei geschrieben werden koennen.
|
|
|
|
Es wird angenommen, da\s rInfo alle anderen evt. relevanten Daten in
|
|
|
|
der ChildWindow-Klasse erh"alt.
|
|
|
|
Eingetragen werden hier gemerkten Gr"o\sen, das ZoomIn-Flag und die
|
|
|
|
f"ur das Docking relevanten Informationen.
|
|
|
|
Wird diese Methode "uberschrieben, mu\s zuerst die Basisimplementierung
|
|
|
|
gerufen werden.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
if ( !pMgr )
|
|
|
|
return;
|
|
|
|
|
2001-11-21 11:44:07 +00:00
|
|
|
if ( GetFloatingWindow() && pImp->bConstructed )
|
2001-11-15 14:18:34 +00:00
|
|
|
pImp->aWinState = GetFloatingWindow()->GetWindowState();
|
|
|
|
|
|
|
|
rInfo.aWinState = pImp->aWinState;
|
2005-03-23 15:23:28 +00:00
|
|
|
rInfo.aExtraString = DEFINE_CONST_UNICODE("AL:(");
|
2000-09-18 16:07:07 +00:00
|
|
|
rInfo.aExtraString += String::CreateFromInt32((USHORT) GetAlignment());
|
|
|
|
rInfo.aExtraString += ',';
|
|
|
|
rInfo.aExtraString += String::CreateFromInt32 ((USHORT) pImp->GetLastAlignment());
|
|
|
|
if ( pImp->bSplitable )
|
|
|
|
{
|
|
|
|
Point aPos(pImp->nLine, pImp->nPos);
|
2000-11-30 08:58:00 +00:00
|
|
|
rInfo.aExtraString += ',';
|
|
|
|
rInfo.aExtraString += String::CreateFromInt32( aPos.X() );
|
|
|
|
rInfo.aExtraString += '/';
|
|
|
|
rInfo.aExtraString += String::CreateFromInt32( aPos.Y() );
|
|
|
|
rInfo.aExtraString += '/';
|
2002-04-30 13:15:44 +00:00
|
|
|
rInfo.aExtraString += String::CreateFromInt32( pImp->nHorizontalSize );
|
2000-11-30 08:58:00 +00:00
|
|
|
rInfo.aExtraString += '/';
|
2002-04-30 13:15:44 +00:00
|
|
|
rInfo.aExtraString += String::CreateFromInt32( pImp->nVerticalSize );
|
2005-04-18 11:20:33 +00:00
|
|
|
rInfo.aExtraString += ',';
|
|
|
|
rInfo.aExtraString += String::CreateFromInt32( pImp->aSplitSize.Width() );
|
|
|
|
rInfo.aExtraString += ';';
|
|
|
|
rInfo.aExtraString += String::CreateFromInt32( pImp->aSplitSize.Height() );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
rInfo.aExtraString += ')';
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
SfxDockingWindow::~SfxDockingWindow()
|
2001-11-28 10:23:58 +00:00
|
|
|
{
|
|
|
|
ReleaseChildWindow_Impl();
|
|
|
|
delete pImp;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SfxDockingWindow::ReleaseChildWindow_Impl()
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-09-06 12:57:31 +00:00
|
|
|
if ( pMgr && pMgr->GetFrame() == pBindings->GetActiveFrame() )
|
|
|
|
pBindings->SetActiveFrame( NULL );
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pMgr && pImp->pSplitWin && pImp->pSplitWin->IsItemValid( GetType() ) )
|
|
|
|
pImp->pSplitWin->RemoveWindow(this);
|
2001-11-28 10:23:58 +00:00
|
|
|
|
|
|
|
pMgr=NULL;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
SfxChildAlignment SfxDockingWindow::CalcAlignment(const Point& rPos, Rectangle& rRect)
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Diese Methode berechnet f"ur gegebene Mausposition und tracking rectangle,
|
|
|
|
welches Alignment sich daraus ergeben w"urde. Beim Wechsel des Alignments
|
|
|
|
kann sich auch das tracking rectangle "andern, so dass ein ver"andertes
|
|
|
|
rectangle zur"uckgegeben wird.
|
|
|
|
|
|
|
|
Der Klassenbenutzer kann das Verhalten dieser Methode und damit das Verhalten
|
|
|
|
seiner DockinWindow-Klasse beim Docken beeinflussen, indem er die hier
|
|
|
|
aufgerufene virtuelle Methode
|
|
|
|
|
|
|
|
SfxDockingWindow::CalcDockingSize(SfxChildAlignment eAlign)
|
|
|
|
|
|
|
|
"uberschreibt (s.u.).
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
2002-04-30 07:02:00 +00:00
|
|
|
// calculate hypothetical sizes for different modes
|
2000-09-18 16:07:07 +00:00
|
|
|
Size aFloatingSize(CalcDockingSize(SFX_ALIGN_NOALIGNMENT));
|
|
|
|
Size aVerticalSize(CalcDockingSize(SFX_ALIGN_LEFT));
|
|
|
|
Size aHorizontalSize(CalcDockingSize(SFX_ALIGN_TOP));
|
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
// check if docking is permitted
|
2000-09-18 16:07:07 +00:00
|
|
|
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl();
|
|
|
|
if ( !pWorkWin->IsDockingAllowed() )
|
|
|
|
{
|
2002-04-30 07:02:00 +00:00
|
|
|
rRect.SetSize( aFloatingSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
return pImp->GetDockAlignment();
|
|
|
|
}
|
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
// calculate borders to shrink inner area before checking for intersection with tracking rectangle
|
|
|
|
long nLRBorder, nTBBorder;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pImp->bSplitable )
|
|
|
|
{
|
2002-04-30 07:02:00 +00:00
|
|
|
// take the smaller size of docked and floating mode
|
2002-04-30 13:15:44 +00:00
|
|
|
Size aSize = pImp->aSplitSize;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( GetFloatingSize().Height() < aSize.Height() )
|
|
|
|
aSize.Height() = GetFloatingSize().Height();
|
|
|
|
if ( GetFloatingSize().Width() < aSize.Width() )
|
|
|
|
aSize.Width() = GetFloatingSize().Width();
|
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
nLRBorder = aSize.Width();
|
|
|
|
nTBBorder = aSize.Height();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-04-30 07:02:00 +00:00
|
|
|
nLRBorder = aVerticalSize.Width();
|
|
|
|
nTBBorder = aHorizontalSize.Height();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
// limit border to predefined constant values
|
|
|
|
if ( nLRBorder > MAX_TOGGLEAREA_WIDTH )
|
|
|
|
nLRBorder = MAX_TOGGLEAREA_WIDTH;
|
|
|
|
if ( nTBBorder > MAX_TOGGLEAREA_WIDTH )
|
|
|
|
nTBBorder = MAX_TOGGLEAREA_WIDTH;
|
|
|
|
|
|
|
|
// shrink area for floating mode if possible
|
2000-09-18 16:07:07 +00:00
|
|
|
Rectangle aInRect = GetInnerRect();
|
2002-04-30 07:02:00 +00:00
|
|
|
if ( aInRect.GetWidth() > nLRBorder )
|
|
|
|
aInRect.Left() += nLRBorder/2;
|
|
|
|
if ( aInRect.GetWidth() > nLRBorder )
|
|
|
|
aInRect.Right() -= nLRBorder/2;
|
|
|
|
if ( aInRect.GetHeight() > nTBBorder )
|
|
|
|
aInRect.Top() += nTBBorder/2;
|
|
|
|
if ( aInRect.GetHeight() > nTBBorder )
|
|
|
|
aInRect.Bottom() -= nTBBorder/2;
|
|
|
|
|
|
|
|
// calculate alignment resulting from docking rectangle
|
|
|
|
BOOL bBecomesFloating = FALSE;
|
|
|
|
SfxChildAlignment eDockAlign = pImp->GetDockAlignment();
|
|
|
|
Rectangle aDockingRect( rRect );
|
|
|
|
if ( !IsFloatingMode() )
|
|
|
|
{
|
|
|
|
// don't use tracking rectangle for alignment check, because it will be too large
|
|
|
|
// to get a floating mode as result - switch to floating size
|
|
|
|
// so the calculation only depends on the position of the rectangle, not the current
|
|
|
|
// docking state of the window
|
|
|
|
aDockingRect.SetSize( GetFloatingSize() );
|
|
|
|
|
|
|
|
// in this mode docking is never done by keyboard, so it's OK to use the mouse position
|
2004-07-06 12:35:55 +00:00
|
|
|
aDockingRect.SetPos( pWorkWin->GetWindow()->OutputToScreenPixel( pWorkWin->GetWindow()->GetPointerPosPixel() ) );
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
Point aPos = aDockingRect.TopLeft();
|
|
|
|
Rectangle aIntersect = GetOuterRect().GetIntersection( aDockingRect );
|
|
|
|
if ( aIntersect.IsEmpty() )
|
|
|
|
// docking rectangle completely outside docking area -> floating mode
|
|
|
|
bBecomesFloating = TRUE;
|
|
|
|
else
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-07-06 12:35:55 +00:00
|
|
|
// create a small test rect around the mouse position and use this one
|
|
|
|
// instead of the passed rRect to not dock too easily or by accident
|
|
|
|
Rectangle aSmallDockingRect;
|
|
|
|
aSmallDockingRect.SetSize( Size( MAX_TOGGLEAREA_WIDTH, MAX_TOGGLEAREA_HEIGHT ) );
|
|
|
|
Point aNewPos(rPos);
|
|
|
|
aNewPos.X() -= aSmallDockingRect.GetWidth()/2;
|
|
|
|
aNewPos.Y() -= aSmallDockingRect.GetHeight()/2;
|
|
|
|
aSmallDockingRect.SetPos(rPos);
|
2006-06-19 21:21:12 +00:00
|
|
|
Rectangle aIntersectRect = aInRect.GetIntersection( aSmallDockingRect );
|
|
|
|
if ( aIntersectRect == aSmallDockingRect )
|
2002-04-30 07:02:00 +00:00
|
|
|
// docking rectangle completely inside (shrinked) inner area -> floating mode
|
|
|
|
bBecomesFloating = TRUE;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
if ( bBecomesFloating )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
eDockAlign = CheckAlignment(pImp->GetDockAlignment(),SFX_ALIGN_NOALIGNMENT);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-04-30 07:02:00 +00:00
|
|
|
// docking rectangle is in the "sensible area"
|
|
|
|
Point aInPosTL( aPos.X()-aInRect.Left(), aPos.Y()-aInRect.Top() );
|
|
|
|
Point aInPosBR( aPos.X()-aInRect.Left() + aDockingRect.GetWidth(), aPos.Y()-aInRect.Top() + aDockingRect.GetHeight() );
|
2000-09-18 16:07:07 +00:00
|
|
|
Size aInSize = aInRect.GetSize();
|
|
|
|
BOOL bNoChange = FALSE;
|
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
// check if alignment is still unchanged
|
2000-09-18 16:07:07 +00:00
|
|
|
switch ( GetAlignment() )
|
|
|
|
{
|
|
|
|
case SFX_ALIGN_LEFT:
|
|
|
|
case SFX_ALIGN_FIRSTLEFT:
|
|
|
|
case SFX_ALIGN_LASTLEFT:
|
2002-04-19 07:00:26 +00:00
|
|
|
if (aInPosTL.X() <= 0)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
eDockAlign = GetAlignment();
|
|
|
|
bNoChange = TRUE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SFX_ALIGN_TOP:
|
|
|
|
case SFX_ALIGN_LOWESTTOP:
|
|
|
|
case SFX_ALIGN_HIGHESTTOP:
|
2002-04-19 07:00:26 +00:00
|
|
|
if ( aInPosTL.Y() <= 0)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
eDockAlign = GetAlignment();
|
|
|
|
bNoChange = TRUE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SFX_ALIGN_RIGHT:
|
|
|
|
case SFX_ALIGN_FIRSTRIGHT:
|
|
|
|
case SFX_ALIGN_LASTRIGHT:
|
2002-04-19 07:00:26 +00:00
|
|
|
if ( aInPosBR.X() >= aInSize.Width())
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
eDockAlign = GetAlignment();
|
|
|
|
bNoChange = TRUE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case SFX_ALIGN_BOTTOM:
|
|
|
|
case SFX_ALIGN_LOWESTBOTTOM:
|
|
|
|
case SFX_ALIGN_HIGHESTBOTTOM:
|
2002-04-19 07:00:26 +00:00
|
|
|
if ( aInPosBR.Y() >= aInSize.Height())
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
eDockAlign = GetAlignment();
|
|
|
|
bNoChange = TRUE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !bNoChange )
|
|
|
|
{
|
2002-04-30 07:02:00 +00:00
|
|
|
// alignment will change, test alignment according to distance of the docking rectangles edges
|
2000-09-18 16:07:07 +00:00
|
|
|
BOOL bForbidden = TRUE;
|
2002-04-19 07:00:26 +00:00
|
|
|
if ( aInPosTL.X() <= 0)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
eDockAlign = CheckAlignment(pImp->GetDockAlignment(),SFX_ALIGN_LEFT);
|
|
|
|
bForbidden = ( eDockAlign != SFX_ALIGN_LEFT &&
|
|
|
|
eDockAlign != SFX_ALIGN_FIRSTLEFT &&
|
|
|
|
eDockAlign != SFX_ALIGN_LASTLEFT );
|
|
|
|
}
|
|
|
|
|
2002-04-19 07:00:26 +00:00
|
|
|
if ( bForbidden && aInPosTL.Y() <= 0)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
eDockAlign = CheckAlignment(pImp->GetDockAlignment(),SFX_ALIGN_TOP);
|
|
|
|
bForbidden = ( eDockAlign != SFX_ALIGN_TOP &&
|
|
|
|
eDockAlign != SFX_ALIGN_HIGHESTTOP &&
|
|
|
|
eDockAlign != SFX_ALIGN_LOWESTTOP );
|
|
|
|
}
|
|
|
|
|
2002-04-19 07:00:26 +00:00
|
|
|
if ( bForbidden && aInPosBR.X() >= aInSize.Width())
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
eDockAlign = CheckAlignment(pImp->GetDockAlignment(),SFX_ALIGN_RIGHT);
|
|
|
|
bForbidden = ( eDockAlign != SFX_ALIGN_RIGHT &&
|
|
|
|
eDockAlign != SFX_ALIGN_FIRSTRIGHT &&
|
|
|
|
eDockAlign != SFX_ALIGN_LASTRIGHT );
|
|
|
|
}
|
|
|
|
|
2002-04-19 07:00:26 +00:00
|
|
|
if ( bForbidden && aInPosBR.Y() >= aInSize.Height())
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
eDockAlign = CheckAlignment(pImp->GetDockAlignment(),SFX_ALIGN_BOTTOM);
|
|
|
|
bForbidden = ( eDockAlign != SFX_ALIGN_BOTTOM &&
|
|
|
|
eDockAlign != SFX_ALIGN_HIGHESTBOTTOM &&
|
|
|
|
eDockAlign != SFX_ALIGN_LOWESTBOTTOM );
|
|
|
|
}
|
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
// the calculated alignment was rejected by the window -> take floating mode
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( bForbidden )
|
|
|
|
eDockAlign = CheckAlignment(pImp->GetDockAlignment(),SFX_ALIGN_NOALIGNMENT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( eDockAlign == SFX_ALIGN_NOALIGNMENT )
|
|
|
|
{
|
|
|
|
//Im FloatingMode erh"alt das tracking rectangle die floating size
|
|
|
|
// wg. SV-Bug darf rRect nur ver"andert werden, wenn sich das
|
|
|
|
// Alignment "andert !
|
|
|
|
if ( eDockAlign != pImp->GetDockAlignment() )
|
2002-04-30 07:02:00 +00:00
|
|
|
aDockingRect.SetSize( aFloatingSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else if ( pImp->bSplitable )
|
|
|
|
{
|
2002-04-30 07:02:00 +00:00
|
|
|
USHORT nLine, nPos;
|
|
|
|
SfxSplitWindow *pSplitWin = pWorkWin->GetSplitWindow_Impl(eDockAlign);
|
2002-09-20 07:37:18 +00:00
|
|
|
aPos = pSplitWin->ScreenToOutputPixel( aPos );
|
2002-04-30 07:02:00 +00:00
|
|
|
if ( pSplitWin->GetWindowPos( aPos, nLine, nPos ) )
|
|
|
|
{
|
|
|
|
// mouse over splitwindow, get line and position
|
|
|
|
pImp->nDockLine = nLine;
|
|
|
|
pImp->nDockPos = nPos;
|
|
|
|
pImp->bNewLine = FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( 0 )
|
|
|
|
{
|
|
|
|
// mouse touches outer border -> treated as floating mode
|
|
|
|
eDockAlign = SFX_ALIGN_NOALIGNMENT;
|
|
|
|
aDockingRect.SetSize( aFloatingSize );
|
|
|
|
rRect = aDockingRect;
|
|
|
|
return eDockAlign;
|
|
|
|
}
|
|
|
|
|
|
|
|
// mouse touches inner border -> create new line
|
|
|
|
if ( eDockAlign == GetAlignment() && pImp->pSplitWin &&
|
|
|
|
pImp->nLine == pImp->pSplitWin->GetLineCount()-1 && pImp->pSplitWin->GetWindowCount(pImp->nLine) == 1 )
|
|
|
|
{
|
|
|
|
// if this window is the only one in the last line, it can't be docked as new line in the same splitwindow
|
|
|
|
pImp->nDockLine = pImp->nLine;
|
|
|
|
pImp->nDockPos = pImp->nPos;
|
|
|
|
pImp->bNewLine = FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// create new line
|
|
|
|
pImp->nDockLine = pSplitWin->GetLineCount();
|
|
|
|
pImp->nDockPos = 0;
|
|
|
|
pImp->bNewLine = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL bChanged = pImp->nLine != pImp->nDockLine || pImp->nPos != pImp->nDockPos || eDockAlign != GetAlignment();
|
2003-03-27 10:29:38 +00:00
|
|
|
if ( !bChanged && !IsFloatingMode() )
|
2002-04-30 07:02:00 +00:00
|
|
|
{
|
|
|
|
// window only sightly moved, no change of any property
|
2002-04-30 13:15:44 +00:00
|
|
|
rRect.SetSize( pImp->aSplitSize );
|
2003-03-27 10:29:38 +00:00
|
|
|
rRect.SetPos( aDockingRect.TopLeft() );
|
2002-04-30 07:02:00 +00:00
|
|
|
return eDockAlign;
|
|
|
|
}
|
|
|
|
|
|
|
|
// calculate new size and position
|
2002-04-30 13:15:44 +00:00
|
|
|
Size aSize;
|
2002-09-20 07:37:18 +00:00
|
|
|
Point aPoint = aDockingRect.TopLeft();
|
2002-04-30 07:02:00 +00:00
|
|
|
Size aInnerSize = GetInnerRect().GetSize();
|
|
|
|
if ( eDockAlign == SFX_ALIGN_LEFT || eDockAlign == SFX_ALIGN_RIGHT )
|
|
|
|
{
|
|
|
|
if ( pImp->bNewLine )
|
|
|
|
{
|
|
|
|
// set height to height of free area
|
|
|
|
aSize.Height() = aInnerSize.Height();
|
2002-04-30 13:15:44 +00:00
|
|
|
aSize.Width() = pImp->nHorizontalSize;
|
2002-04-30 07:02:00 +00:00
|
|
|
if ( eDockAlign == SFX_ALIGN_LEFT )
|
|
|
|
{
|
2002-09-20 07:37:18 +00:00
|
|
|
aPoint = aInnerRect.TopLeft();
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-09-20 07:37:18 +00:00
|
|
|
aPoint = aInnerRect.TopRight();
|
|
|
|
aPoint.X() -= aSize.Width();
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// get width from splitwindow
|
|
|
|
aSize.Width() = pSplitWin->GetLineSize(nLine);
|
2002-04-30 13:15:44 +00:00
|
|
|
aSize.Height() = pImp->aSplitSize.Height();
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( pImp->bNewLine )
|
|
|
|
{
|
|
|
|
// set width to width of free area
|
|
|
|
aSize.Width() = aInnerSize.Width();
|
2002-04-30 13:15:44 +00:00
|
|
|
aSize.Height() = pImp->nVerticalSize;
|
2002-04-30 07:02:00 +00:00
|
|
|
if ( eDockAlign == SFX_ALIGN_TOP )
|
|
|
|
{
|
2002-09-20 07:37:18 +00:00
|
|
|
aPoint = aInnerRect.TopLeft();
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-09-20 07:37:18 +00:00
|
|
|
aPoint = aInnerRect.BottomLeft();
|
|
|
|
aPoint.Y() -= aSize.Height();
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// get height from splitwindow
|
|
|
|
aSize.Height() = pSplitWin->GetLineSize(nLine);
|
2002-04-30 13:15:44 +00:00
|
|
|
aSize.Width() = pImp->aSplitSize.Width();
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
aDockingRect.SetSize( aSize );
|
2002-09-20 07:37:18 +00:00
|
|
|
aDockingRect.SetPos( aPoint );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-04-30 07:02:00 +00:00
|
|
|
// window can be docked, but outside our splitwindows
|
|
|
|
// tracking rectangle only needs to be modified if alignment was changed
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( eDockAlign != pImp->GetDockAlignment() )
|
|
|
|
{
|
|
|
|
switch ( eDockAlign )
|
|
|
|
{
|
|
|
|
case SFX_ALIGN_LEFT:
|
|
|
|
case SFX_ALIGN_RIGHT:
|
|
|
|
case SFX_ALIGN_FIRSTLEFT:
|
2002-04-30 07:02:00 +00:00
|
|
|
aDockingRect.SetPos( aInnerRect.TopLeft() );
|
|
|
|
aDockingRect.SetSize( aVerticalSize );
|
|
|
|
break;
|
2000-09-18 16:07:07 +00:00
|
|
|
case SFX_ALIGN_LASTLEFT:
|
|
|
|
case SFX_ALIGN_FIRSTRIGHT:
|
|
|
|
case SFX_ALIGN_LASTRIGHT:
|
2002-04-30 07:02:00 +00:00
|
|
|
{
|
|
|
|
Point aPt( aInnerRect.TopRight() );
|
|
|
|
aPt.X() -= aDockingRect.GetWidth();
|
|
|
|
aDockingRect.SetPos( aPt );
|
|
|
|
aDockingRect.SetSize( aVerticalSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
break;
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
case SFX_ALIGN_TOP:
|
|
|
|
case SFX_ALIGN_BOTTOM:
|
|
|
|
case SFX_ALIGN_LOWESTTOP:
|
2002-04-30 07:02:00 +00:00
|
|
|
aDockingRect.SetPos( aInnerRect.TopLeft() );
|
|
|
|
aDockingRect.SetSize( aHorizontalSize );
|
|
|
|
break;
|
2000-09-18 16:07:07 +00:00
|
|
|
case SFX_ALIGN_HIGHESTTOP:
|
|
|
|
case SFX_ALIGN_LOWESTBOTTOM:
|
|
|
|
case SFX_ALIGN_HIGHESTBOTTOM:
|
2002-04-30 07:02:00 +00:00
|
|
|
{
|
|
|
|
Point aPt( aInnerRect.BottomLeft() );
|
|
|
|
aPt.Y() -= aDockingRect.GetHeight();
|
|
|
|
aDockingRect.SetPos( aPt );
|
|
|
|
aDockingRect.SetSize( aHorizontalSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
break;
|
2002-04-30 07:02:00 +00:00
|
|
|
}
|
2006-06-19 21:21:12 +00:00
|
|
|
default:
|
|
|
|
break;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-04-30 07:02:00 +00:00
|
|
|
rRect = aDockingRect;
|
2000-09-18 16:07:07 +00:00
|
|
|
return eDockAlign;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
Size SfxDockingWindow::CalcDockingSize(SfxChildAlignment eAlign)
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Virtuelle Methode der Klasse SfxDockingWindow.
|
|
|
|
Hier wird festgelegt, wie sich die Gr"o\se des DockingWindows abh"angig vom
|
|
|
|
Alignment "andert.
|
|
|
|
Die Basisimplementation setzt im Floating Mode die Gr"o\se auf die gemerkte
|
|
|
|
Floating Size.
|
|
|
|
Bei horizontalem Alignment wird die Breite auf die Breite des "au\seren
|
|
|
|
DockingRects, bei vertikalem Alignment die H"ohe auf die H"ohe des inneren
|
|
|
|
DockingRects (ergibt sich aus der Reihenfolge, in der im SFX ChildWindows
|
|
|
|
ausgegeben werden). Die jeweils andere Gr"o\se wird auf die aktuelle
|
|
|
|
Floating Size gesetzt, hier k"onnte eine abgeleitete Klasse "andernd
|
|
|
|
eingreifen.
|
|
|
|
Die DockingSize mu\s f"ur Left/Right und Top/Bottom jeweils gleich sein.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
// Achtung: falls das Resizing auch im angedockten Zustand geht, mu\s dabei
|
|
|
|
// auch die Floating Size angepa\st werden !?
|
|
|
|
|
|
|
|
Size aSize = GetFloatingSize();
|
|
|
|
switch (eAlign)
|
|
|
|
{
|
|
|
|
case SFX_ALIGN_TOP:
|
|
|
|
case SFX_ALIGN_BOTTOM:
|
|
|
|
case SFX_ALIGN_LOWESTTOP:
|
|
|
|
case SFX_ALIGN_HIGHESTTOP:
|
|
|
|
case SFX_ALIGN_LOWESTBOTTOM:
|
|
|
|
case SFX_ALIGN_HIGHESTBOTTOM:
|
|
|
|
aSize.Width() = aOuterRect.Right() - aOuterRect.Left();
|
|
|
|
break;
|
|
|
|
case SFX_ALIGN_LEFT:
|
|
|
|
case SFX_ALIGN_RIGHT:
|
|
|
|
case SFX_ALIGN_FIRSTLEFT:
|
|
|
|
case SFX_ALIGN_LASTLEFT:
|
|
|
|
case SFX_ALIGN_FIRSTRIGHT:
|
|
|
|
case SFX_ALIGN_LASTRIGHT:
|
|
|
|
aSize.Height() = aInnerRect.Bottom() - aInnerRect.Top();
|
|
|
|
break;
|
|
|
|
case SFX_ALIGN_NOALIGNMENT:
|
|
|
|
break;
|
2006-06-19 21:21:12 +00:00
|
|
|
default:
|
|
|
|
break;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return aSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
SfxChildAlignment SfxDockingWindow::CheckAlignment(SfxChildAlignment,
|
|
|
|
SfxChildAlignment eAlign)
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Virtuelle Methode der Klasse SfxDockingWindow.
|
|
|
|
Hier kann eine abgeleitete Klasse bestimmte Alignments verbieten.
|
|
|
|
Die Basisimplementation verbietet kein Alignment.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
return eAlign;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL SfxDockingWindow::Close()
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Das Fenster wird geschlossen, indem das ChildWindow durch Ausf"uhren des
|
|
|
|
ChildWindow-Slots zerst"ort wird.
|
|
|
|
Wird diese Methode von einer abgeleiteten Klasse "uberschrieben, mu\s
|
|
|
|
danach SfxDockingWindow::Close() gerufen werden, wenn nicht das Close()
|
|
|
|
mit "return FALSE" abgebrochen wird.
|
|
|
|
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
// Execute mit Parametern, da Toggle von einigen ChildWindows ignoriert
|
|
|
|
// werden kann
|
|
|
|
if ( !pMgr )
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
SfxBoolItem aValue( pMgr->GetType(), FALSE);
|
|
|
|
pBindings->GetDispatcher_Impl()->Execute(
|
|
|
|
pMgr->GetType(), SFX_CALLMODE_RECORD | SFX_CALLMODE_ASYNCHRON, &aValue, 0L );
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
2006-06-19 21:21:12 +00:00
|
|
|
void SfxDockingWindow::Paint(const Rectangle& /*rRect*/)
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Es wird im angedockten Zustand eine Begrenzungslinie an der angedockten
|
|
|
|
Kante und ein Rahmen ausgegeben. Dabei wird SVLOOK ber"ucksichtigt.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
if ( pImp->bSplitable || IsFloatingMode() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
Rectangle aRect = Rectangle(Point(0, 0),
|
|
|
|
GetOutputSizePixel());
|
|
|
|
switch (GetAlignment())
|
|
|
|
{
|
|
|
|
case SFX_ALIGN_TOP:
|
|
|
|
{
|
|
|
|
DrawLine(aRect.BottomLeft(), aRect.BottomRight());
|
|
|
|
aRect.Bottom()--;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case SFX_ALIGN_BOTTOM:
|
|
|
|
{
|
|
|
|
DrawLine(aRect.TopLeft(), aRect.TopRight());
|
|
|
|
aRect.Top()++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case SFX_ALIGN_LEFT:
|
|
|
|
{
|
|
|
|
DrawLine(aRect.TopRight(), aRect.BottomRight());
|
|
|
|
aRect.Right()--;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case SFX_ALIGN_RIGHT:
|
|
|
|
{
|
|
|
|
DrawLine(aRect.TopLeft(), aRect.BottomLeft());
|
|
|
|
aRect.Left()++;
|
|
|
|
break;
|
|
|
|
}
|
2006-06-19 21:21:12 +00:00
|
|
|
default:
|
|
|
|
break;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DecorationView aView( this );
|
|
|
|
aView.DrawFrame( aRect, FRAME_DRAW_OUT );
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxDockingWindow::SetMinOutputSizePixel( const Size& rSize )
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Mit dieser Methode kann eine minimale OutpuSize gesetzt werden, die
|
|
|
|
im Resizing()-Handler abgefragt wird.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
pImp->aMinSize = rSize;
|
2002-03-27 10:47:51 +00:00
|
|
|
DockingWindow::SetMinOutputSizePixel( rSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
Size SfxDockingWindow::GetMinOutputSizePixel() const
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Die gesetzte minimale Gr"o\se wird zur"uckgegeben.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
return pImp->aMinSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
long SfxDockingWindow::Notify( NotifyEvent& rEvt )
|
|
|
|
{
|
2000-12-07 10:23:05 +00:00
|
|
|
if ( rEvt.GetType() == EVENT_GETFOCUS )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
pBindings->SetActiveFrame( pMgr->GetFrame() );
|
|
|
|
|
|
|
|
if ( pImp->pSplitWin )
|
|
|
|
pImp->pSplitWin->SetActiveWindow_Impl( this );
|
|
|
|
else
|
|
|
|
pMgr->Activate_Impl();
|
2001-06-26 13:51:18 +00:00
|
|
|
|
|
|
|
Window* pWindow = rEvt.GetWindow();
|
2001-07-10 10:32:11 +00:00
|
|
|
ULONG nHelpId = 0;
|
|
|
|
while ( !nHelpId && pWindow )
|
|
|
|
{
|
2010-06-04 13:46:22 +02:00
|
|
|
// FIXME: HELPID
|
|
|
|
//nHelpId = pWindow->GetHelpId();
|
2001-07-10 10:32:11 +00:00
|
|
|
pWindow = pWindow->GetParent();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( nHelpId )
|
2009-12-15 23:07:57 +01:00
|
|
|
SfxHelp::OpenHelpAgent( &pBindings->GetDispatcher_Impl()->GetFrame()->GetFrame(), nHelpId );
|
2006-11-01 17:27:06 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// In VCL geht Notify zun"achst an das Fenster selbst,
|
|
|
|
// also base class rufen, sonst erf"ahrt der parent nichts
|
2007-02-26 15:00:32 +00:00
|
|
|
// if ( rEvt.GetWindow() == this ) PB: #i74693# not necessary any longer
|
|
|
|
DockingWindow::Notify( rEvt );
|
2000-09-18 16:07:07 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else if( rEvt.GetType() == EVENT_KEYINPUT )
|
|
|
|
{
|
|
|
|
// KeyInput zuerst f"ur Dialogfunktionen zulassen
|
2006-02-09 13:06:51 +00:00
|
|
|
if ( !DockingWindow::Notify( rEvt ) && SfxViewShell::Current() )
|
2000-09-18 16:07:07 +00:00
|
|
|
// dann auch global g"ultige Acceleratoren verwenden
|
|
|
|
return SfxViewShell::Current()->GlobalKeyInput_Impl( *rEvt.GetKeyEvent() );
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else if ( rEvt.GetType() == EVENT_LOSEFOCUS && !HasChildPathFocus() )
|
|
|
|
{
|
2004-10-22 11:45:01 +00:00
|
|
|
pBindings->SetActiveFrame( NULL );
|
2000-09-18 16:07:07 +00:00
|
|
|
pMgr->Deactivate_Impl();
|
|
|
|
}
|
|
|
|
|
|
|
|
return DockingWindow::Notify( rEvt );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
USHORT SfxDockingWindow::GetWinBits_Impl() const
|
|
|
|
{
|
|
|
|
USHORT nBits = 0;
|
|
|
|
// if ( pImp->bAutoHide )
|
|
|
|
// nBits |= SWIB_AUTOHIDE;
|
|
|
|
return nBits;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxDockingWindow::SetItemSize_Impl( const Size& rSize )
|
|
|
|
{
|
|
|
|
pImp->aSplitSize = rSize;
|
2005-03-23 15:23:28 +00:00
|
|
|
|
2001-12-20 10:16:40 +00:00
|
|
|
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl();
|
|
|
|
SfxChildIdentifier eIdent = SFX_CHILDWIN_DOCKINGWINDOW;
|
|
|
|
if ( pImp->bSplitable )
|
|
|
|
eIdent = SFX_CHILDWIN_SPLITWINDOW;
|
|
|
|
pWorkWin->ConfigChild_Impl( eIdent, SFX_ALIGNDOCKINGWINDOW, pMgr->GetType() );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SfxDockingWindow::Disappear_Impl()
|
|
|
|
{
|
|
|
|
if ( pImp->pSplitWin && pImp->pSplitWin->IsItemValid( GetType() ) )
|
|
|
|
pImp->pSplitWin->RemoveWindow(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SfxDockingWindow::Reappear_Impl()
|
|
|
|
{
|
|
|
|
if ( pImp->pSplitWin && !pImp->pSplitWin->IsItemValid( GetType() ) )
|
|
|
|
{
|
|
|
|
pImp->pSplitWin->InsertWindow( this, pImp->aSplitSize );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL SfxDockingWindow::IsAutoHide_Impl() const
|
|
|
|
{
|
|
|
|
if ( pImp->pSplitWin )
|
|
|
|
return !pImp->pSplitWin->IsFadeIn();
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL SfxDockingWindow::IsPinned_Impl() const
|
|
|
|
{
|
|
|
|
if ( pImp->pSplitWin )
|
|
|
|
return pImp->pSplitWin->IsPinned();
|
|
|
|
else
|
|
|
|
return TRUE;
|
|
|
|
}
|
2004-09-20 14:14:50 +00:00
|
|
|
void SfxDockingWindow::AutoShow( BOOL bShow )
|
|
|
|
{
|
|
|
|
AutoShow_Impl(bShow);
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
void SfxDockingWindow::AutoShow_Impl( BOOL bShow )
|
|
|
|
{
|
|
|
|
if ( pImp->pSplitWin )
|
|
|
|
{
|
|
|
|
if ( bShow )
|
|
|
|
pImp->pSplitWin->FadeIn();
|
|
|
|
else
|
|
|
|
pImp->pSplitWin->FadeOut();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-09-06 06:46:05 +00:00
|
|
|
/*
|
2000-09-18 16:07:07 +00:00
|
|
|
void SfxDockingWindow::Pin_Impl( BOOL bPinned )
|
|
|
|
{
|
|
|
|
if ( pImp->pSplitWin )
|
|
|
|
pImp->pSplitWin->Pin_Impl( bPinned );
|
|
|
|
}
|
2001-09-06 06:46:05 +00:00
|
|
|
*/
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
SfxSplitWindow* SfxDockingWindow::GetSplitWindow_Impl() const
|
|
|
|
{
|
|
|
|
return pImp->pSplitWin;
|
|
|
|
}
|
|
|
|
|
2006-06-19 21:21:12 +00:00
|
|
|
void SfxDockingWindow::FadeIn( BOOL /*bFadeIn*/ )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2001-11-21 11:44:07 +00:00
|
|
|
void SfxDockingWindow::StateChanged( StateChangedType nStateChange )
|
|
|
|
{
|
|
|
|
if ( nStateChange == STATE_CHANGE_INITSHOW )
|
|
|
|
Initialize_Impl();
|
|
|
|
|
|
|
|
DockingWindow::StateChanged( nStateChange );
|
|
|
|
}
|
|
|
|
|
2002-04-17 11:42:12 +00:00
|
|
|
void SfxDockingWindow::Move()
|
|
|
|
{
|
2007-07-10 14:22:37 +00:00
|
|
|
if ( pImp )
|
|
|
|
pImp->aMoveTimer.Start();
|
|
|
|
}
|
|
|
|
|
|
|
|
IMPL_LINK( SfxDockingWindow, TimerHdl, Timer*, EMPTYARG)
|
|
|
|
{
|
|
|
|
pImp->aMoveTimer.Stop();
|
2003-03-27 10:29:38 +00:00
|
|
|
if ( IsReallyVisible() && IsFloatingMode() )
|
2002-04-17 11:42:12 +00:00
|
|
|
{
|
2008-01-29 15:27:40 +00:00
|
|
|
if( !GetFloatingWindow()->IsRollUp() )
|
|
|
|
SetFloatingSize( GetOutputSizePixel() );
|
|
|
|
pImp->aWinState = GetFloatingWindow()->GetWindowState();
|
2002-04-17 11:42:12 +00:00
|
|
|
SfxChildIdentifier eIdent = SFX_CHILDWIN_DOCKINGWINDOW;
|
|
|
|
if ( pImp->bSplitable )
|
|
|
|
eIdent = SFX_CHILDWIN_SPLITWINDOW;
|
|
|
|
SfxWorkWindow *pWorkWin = pBindings->GetWorkWindow_Impl();
|
|
|
|
pWorkWin->ConfigChild_Impl( eIdent, SFX_ALIGNDOCKINGWINDOW, pMgr->GetType() );
|
|
|
|
}
|
2007-07-10 14:22:37 +00:00
|
|
|
return 0;
|
2002-04-17 11:42:12 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|