966 lines
28 KiB
C++
966 lines
28 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* 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.
|
|
*
|
|
* 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).
|
|
*
|
|
* 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.
|
|
*
|
|
************************************************************************/
|
|
|
|
|
|
// include ---------------------------------------------------------------
|
|
|
|
#include <stdlib.h>
|
|
#include <vcl/fixed.hxx>
|
|
#include <vcl/help.hxx>
|
|
#include <vcl/msgbox.hxx>
|
|
#include <svl/eitem.hxx>
|
|
#include <unotools/viewoptions.hxx>
|
|
#include <svtools/fixedhyper.hxx>
|
|
#include <svtools/controldims.hrc>
|
|
|
|
#include <sfx2/basedlgs.hxx>
|
|
#include <sfx2/viewfrm.hxx>
|
|
#include <sfx2/tabdlg.hxx>
|
|
#include <sfx2/app.hxx>
|
|
#include <sfx2/bindings.hxx>
|
|
#include <sfx2/dispatch.hxx>
|
|
#include <sfx2/childwin.hxx>
|
|
#include <sfx2/viewsh.hxx>
|
|
#include "sfx2/sfxhelp.hxx"
|
|
#include "workwin.hxx"
|
|
#include "sfx2/sfxresid.hxx"
|
|
#include "dialog.hrc"
|
|
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::rtl;
|
|
|
|
#define USERITEM_NAME OUString(RTL_CONSTASCII_USTRINGPARAM("UserItem"))
|
|
|
|
class SfxModelessDialog_Impl : public SfxListener
|
|
{
|
|
public:
|
|
rtl::OString aWinState;
|
|
SfxChildWindow* pMgr;
|
|
sal_Bool bConstructed;
|
|
void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
|
|
|
|
Timer aMoveTimer;
|
|
};
|
|
|
|
void SfxModelessDialog_Impl::Notify( SfxBroadcaster&, const SfxHint& rHint )
|
|
{
|
|
if ( rHint.IsA(TYPE(SfxSimpleHint)) )
|
|
{
|
|
switch( ( (SfxSimpleHint&) rHint ).GetId() )
|
|
{
|
|
case SFX_HINT_DYING:
|
|
pMgr->Destroy();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
class SfxFloatingWindow_Impl : public SfxListener
|
|
{
|
|
public:
|
|
rtl::OString aWinState;
|
|
SfxChildWindow* pMgr;
|
|
sal_Bool bConstructed;
|
|
Timer aMoveTimer;
|
|
|
|
void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
|
|
};
|
|
|
|
void SfxFloatingWindow_Impl::Notify( SfxBroadcaster&, const SfxHint& rHint )
|
|
{
|
|
if ( rHint.IsA(TYPE(SfxSimpleHint)) )
|
|
{
|
|
switch( ( (SfxSimpleHint&) rHint ).GetId() )
|
|
{
|
|
case SFX_HINT_DYING:
|
|
pMgr->Destroy();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// class SfxModalDefParentHelper -----------------------------------------
|
|
|
|
SfxModalDefParentHelper::SfxModalDefParentHelper( Window *pWindow)
|
|
{
|
|
pOld = Application::GetDefDialogParent();
|
|
Application::SetDefDialogParent( pWindow );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxModalDefParentHelper::~SfxModalDefParentHelper()
|
|
{
|
|
Application::SetDefDialogParent( pOld );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SfxModalDialog::SetDialogData_Impl()
|
|
{
|
|
// save settings (position and user data)
|
|
SvtViewOptions aDlgOpt( E_DIALOG, String::CreateFromInt32( nUniqId ) );
|
|
aDlgOpt.SetWindowState(OStringToOUString(
|
|
GetWindowState(WINDOWSTATE_MASK_POS), RTL_TEXTENCODING_ASCII_US));
|
|
if ( aExtraData.Len() )
|
|
aDlgOpt.SetUserItem( USERITEM_NAME, makeAny( OUString( aExtraData ) ) );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SfxModalDialog::GetDialogData_Impl()
|
|
|
|
/* [Description]
|
|
|
|
Helper function, reads the dialogue position from the ini file and
|
|
puts them on the transfered window.
|
|
*/
|
|
|
|
{
|
|
SvtViewOptions aDlgOpt( E_DIALOG, String::CreateFromInt32( nUniqId ) );
|
|
if ( aDlgOpt.Exists() )
|
|
{
|
|
// load settings
|
|
SetWindowState( rtl::OUStringToOString( aDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US ) );
|
|
Any aUserItem = aDlgOpt.GetUserItem( USERITEM_NAME );
|
|
OUString aTemp;
|
|
if ( aUserItem >>= aTemp )
|
|
aExtraData = String( aTemp );
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SfxModalDialog::init()
|
|
{
|
|
GetDialogData_Impl();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxModalDialog::SfxModalDialog(Window* pParent, const ResId &rResId )
|
|
|
|
/* [Description]
|
|
|
|
Constructor of the general base class for modal Dialoge;
|
|
ResId is used as ID in ini-file. The saved position from there is set.
|
|
*/
|
|
|
|
: ModalDialog(pParent, rResId),
|
|
nUniqId(rResId.GetId()),
|
|
pInputSet(0),
|
|
pOutputSet(0)
|
|
{
|
|
init();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxModalDialog::SfxModalDialog(Window* pParent,
|
|
sal_uInt32 nUniqueId,
|
|
WinBits nWinStyle) :
|
|
/* [Description]
|
|
|
|
Constructor of the general base class for modal Dialoge;
|
|
The ID for the ini-file wird explicilty handed over.
|
|
The saved position from there is set.
|
|
*/
|
|
|
|
ModalDialog(pParent, nWinStyle),
|
|
nUniqId(nUniqueId),
|
|
pInputSet(0),
|
|
pOutputSet(0)
|
|
{
|
|
init();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxModalDialog::~SfxModalDialog()
|
|
|
|
/* [Description]
|
|
|
|
Destructor; writes the Dialog position in the ini-file.
|
|
*/
|
|
|
|
{
|
|
SetDialogData_Impl();
|
|
delete pOutputSet;
|
|
}
|
|
|
|
void SfxModalDialog::CreateOutputItemSet( SfxItemPool& rPool )
|
|
{
|
|
DBG_ASSERT( !pOutputSet, "Double creation of OutputSet!" );
|
|
if (!pOutputSet)
|
|
pOutputSet = new SfxAllItemSet( rPool );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SfxModalDialog::CreateOutputItemSet( const SfxItemSet& rSet )
|
|
{
|
|
DBG_ASSERT( !pOutputSet, "Double creation of OutputSet!" );
|
|
if (!pOutputSet)
|
|
{
|
|
pOutputSet = new SfxItemSet( rSet );
|
|
pOutputSet->ClearItem();
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
void SfxModelessDialog::StateChanged( StateChangedType nStateChange )
|
|
{
|
|
if ( nStateChange == STATE_CHANGE_INITSHOW )
|
|
{
|
|
if ( pImp->aWinState.getLength() )
|
|
{
|
|
SetWindowState( pImp->aWinState );
|
|
}
|
|
else
|
|
{
|
|
Point aPos = GetPosPixel();
|
|
if ( !aPos.X() )
|
|
{
|
|
aSize = GetSizePixel();
|
|
|
|
Size aParentSize = GetParent()->GetOutputSizePixel();
|
|
Size aDlgSize = GetSizePixel();
|
|
aPos.X() += ( aParentSize.Width() - aDlgSize.Width() ) / 2;
|
|
aPos.Y() += ( aParentSize.Height() - aDlgSize.Height() ) / 2;
|
|
|
|
Point aPoint;
|
|
Rectangle aRect = GetDesktopRectPixel();
|
|
aPoint.X() = aRect.Right() - aDlgSize.Width();
|
|
aPoint.Y() = aRect.Bottom() - aDlgSize.Height();
|
|
|
|
aPoint = OutputToScreenPixel( aPoint );
|
|
|
|
if ( aPos.X() > aPoint.X() )
|
|
aPos.X() = aPoint.X() ;
|
|
if ( aPos.Y() > aPoint.Y() )
|
|
aPos.Y() = aPoint.Y();
|
|
|
|
if ( aPos.X() < 0 ) aPos.X() = 0;
|
|
if ( aPos.Y() < 0 ) aPos.Y() = 0;
|
|
|
|
SetPosPixel( aPos );
|
|
}
|
|
}
|
|
|
|
pImp->bConstructed = sal_True;
|
|
}
|
|
|
|
ModelessDialog::StateChanged( nStateChange );
|
|
}
|
|
|
|
void SfxModelessDialog::Initialize(SfxChildWinInfo *pInfo)
|
|
|
|
/* [Description]
|
|
|
|
Initialization of the class SfxModelessDialog via a SfxChildWinInfo.
|
|
The initialization is done only in a 2nd step after the constructor, this
|
|
constructor should be called from the derived class or from the
|
|
SfxChildWindows.
|
|
*/
|
|
|
|
{
|
|
pImp->aWinState = pInfo->aWinState;
|
|
}
|
|
|
|
void SfxModelessDialog::Resize()
|
|
|
|
/* [Description]
|
|
|
|
This virtual method of the class FloatingWindow keeps track if a change
|
|
in size has been made. When this method is overridden by a derived class,
|
|
then the SfxFloatingWindow: Resize() must also be called.
|
|
*/
|
|
|
|
{
|
|
ModelessDialog::Resize();
|
|
if ( pImp->bConstructed && pImp->pMgr )
|
|
{
|
|
// start timer for saving window status information
|
|
pImp->aMoveTimer.Start();
|
|
}
|
|
}
|
|
|
|
void SfxModelessDialog::Move()
|
|
{
|
|
ModelessDialog::Move();
|
|
if ( pImp->bConstructed && pImp->pMgr && IsReallyVisible() )
|
|
{
|
|
// start timer for saving window status information
|
|
pImp->aMoveTimer.Start();
|
|
}
|
|
}
|
|
|
|
/*
|
|
Implements a timer event that is triggered by a move or resize of the window
|
|
This will save config information to Views.xcu with a small delay
|
|
*/
|
|
IMPL_LINK( SfxModelessDialog, TimerHdl, Timer*, EMPTYARG)
|
|
{
|
|
pImp->aMoveTimer.Stop();
|
|
if ( pImp->bConstructed && pImp->pMgr )
|
|
{
|
|
if ( !IsRollUp() )
|
|
aSize = GetSizePixel();
|
|
sal_uIntPtr nMask = WINDOWSTATE_MASK_POS | WINDOWSTATE_MASK_STATE;
|
|
if ( GetStyle() & WB_SIZEABLE )
|
|
nMask |= ( WINDOWSTATE_MASK_WIDTH | WINDOWSTATE_MASK_HEIGHT );
|
|
pImp->aWinState = GetWindowState( nMask );
|
|
GetBindings().GetWorkWindow_Impl()->ConfigChild_Impl( SFX_CHILDWIN_DOCKINGWINDOW, SFX_ALIGNDOCKINGWINDOW, pImp->pMgr->GetType() );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxModelessDialog::SfxModelessDialog( SfxBindings *pBindinx,
|
|
SfxChildWindow *pCW, Window *pParent,
|
|
const ResId& rResId ) :
|
|
ModelessDialog(pParent, rResId),
|
|
pBindings(pBindinx),
|
|
pImp( new SfxModelessDialog_Impl )
|
|
{
|
|
pImp->pMgr = pCW;
|
|
pImp->bConstructed = sal_False;
|
|
SetUniqueId( GetHelpId() );
|
|
SetHelpId("");
|
|
if ( pBindinx )
|
|
pImp->StartListening( *pBindinx );
|
|
pImp->aMoveTimer.SetTimeout(50);
|
|
pImp->aMoveTimer.SetTimeoutHdl(LINK(this,SfxModelessDialog,TimerHdl));
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
long SfxModelessDialog::Notify( NotifyEvent& rEvt )
|
|
|
|
/* [Description]
|
|
|
|
If a ModelessDialog is enabled its ViewFrame wil be activated.
|
|
This is necessary by PluginInFrames.
|
|
*/
|
|
|
|
{
|
|
if ( rEvt.GetType() == EVENT_GETFOCUS )
|
|
{
|
|
pBindings->SetActiveFrame( pImp->pMgr->GetFrame() );
|
|
pImp->pMgr->Activate_Impl();
|
|
Window* pWindow = rEvt.GetWindow();
|
|
rtl::OString sHelpId;
|
|
while ( !sHelpId.getLength() && pWindow )
|
|
{
|
|
sHelpId = pWindow->GetHelpId();
|
|
pWindow = pWindow->GetParent();
|
|
}
|
|
|
|
if ( sHelpId.getLength() )
|
|
SfxHelp::OpenHelpAgent( &pBindings->GetDispatcher_Impl()->GetFrame()->GetFrame(), sHelpId );
|
|
}
|
|
else if ( rEvt.GetType() == EVENT_LOSEFOCUS && !HasChildPathFocus() )
|
|
{
|
|
pBindings->SetActiveFrame( ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > () );
|
|
pImp->pMgr->Deactivate_Impl();
|
|
}
|
|
else if( rEvt.GetType() == EVENT_KEYINPUT )
|
|
{
|
|
// First, allow KeyInput for Dialog functions ( TAB etc. )
|
|
if ( !ModelessDialog::Notify( rEvt ) && SfxViewShell::Current() )
|
|
// then also for valid global accelerators.
|
|
return SfxViewShell::Current()->GlobalKeyInput_Impl( *rEvt.GetKeyEvent() );
|
|
return sal_True;
|
|
}
|
|
|
|
return ModelessDialog::Notify( rEvt );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxModelessDialog::~SfxModelessDialog()
|
|
|
|
/* [Description]
|
|
|
|
Destructor
|
|
*/
|
|
|
|
{
|
|
if ( pImp->pMgr->GetFrame().is() && pImp->pMgr->GetFrame() == pBindings->GetActiveFrame() )
|
|
pBindings->SetActiveFrame( NULL );
|
|
delete pImp;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
sal_Bool SfxModelessDialog::Close()
|
|
|
|
/* [Description]
|
|
|
|
The window is closed when the ChildWindow is destroyed by running the
|
|
ChildWindow-slots. If this is method is overridden by a derived class
|
|
method, then the SfxModelessDialogWindow: Close() must be called afterwards
|
|
if the Close() was not cancelled with "return sal_False".
|
|
*/
|
|
|
|
{
|
|
// Execute with Parameters, since Toggle is ignored by some ChildWindows.
|
|
SfxBoolItem aValue( pImp->pMgr->GetType(), sal_False);
|
|
pBindings->GetDispatcher_Impl()->Execute(
|
|
pImp->pMgr->GetType(),
|
|
SFX_CALLMODE_RECORD|SFX_CALLMODE_SYNCHRON, &aValue, 0L );
|
|
return sal_True;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
void SfxModelessDialog::FillInfo(SfxChildWinInfo& rInfo) const
|
|
|
|
/* [Description]
|
|
|
|
Fills a SfxChildWinInfo with specific data from SfxModelessDialog,
|
|
so that it can be written in the INI file. It is assumed that rinfo
|
|
receives all other possible relevant data in the ChildWindow class.
|
|
ModelessDialogs have no specific information, so that the base
|
|
implementation does nothing and therefore must not be called.
|
|
*/
|
|
|
|
{
|
|
rInfo.aSize = aSize;
|
|
if ( IsRollUp() )
|
|
rInfo.nFlags |= SFX_CHILDWIN_ZOOMIN;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
long SfxFloatingWindow::Notify( NotifyEvent& rEvt )
|
|
|
|
/* [Description]
|
|
|
|
If a ModelessDialog is enabled, its ViewFrame will be activated.
|
|
This necessary for the PluginInFrames.
|
|
*/
|
|
|
|
{
|
|
if ( rEvt.GetType() == EVENT_GETFOCUS )
|
|
{
|
|
pBindings->SetActiveFrame( pImp->pMgr->GetFrame() );
|
|
pImp->pMgr->Activate_Impl();
|
|
Window* pWindow = rEvt.GetWindow();
|
|
rtl::OString sHelpId;
|
|
while ( !sHelpId.getLength() && pWindow )
|
|
{
|
|
sHelpId = pWindow->GetHelpId();
|
|
pWindow = pWindow->GetParent();
|
|
}
|
|
|
|
if ( sHelpId.getLength() )
|
|
SfxHelp::OpenHelpAgent( &pBindings->GetDispatcher_Impl()->GetFrame()->GetFrame(), sHelpId );
|
|
}
|
|
else if ( rEvt.GetType() == EVENT_LOSEFOCUS )
|
|
{
|
|
if ( !HasChildPathFocus() )
|
|
{
|
|
pBindings->SetActiveFrame( NULL );
|
|
pImp->pMgr->Deactivate_Impl();
|
|
}
|
|
}
|
|
else if( rEvt.GetType() == EVENT_KEYINPUT )
|
|
{
|
|
// First, allow KeyInput for Dialog functions
|
|
if ( !FloatingWindow::Notify( rEvt ) && SfxViewShell::Current() )
|
|
// then also for valid global accelerators.
|
|
return SfxViewShell::Current()->GlobalKeyInput_Impl( *rEvt.GetKeyEvent() );
|
|
return sal_True;
|
|
}
|
|
|
|
return FloatingWindow::Notify( rEvt );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxFloatingWindow::SfxFloatingWindow( SfxBindings *pBindinx,
|
|
SfxChildWindow *pCW,
|
|
Window* pParent, WinBits nWinBits) :
|
|
FloatingWindow (pParent, nWinBits),
|
|
pBindings(pBindinx),
|
|
pImp( new SfxFloatingWindow_Impl )
|
|
{
|
|
pImp->pMgr = pCW;
|
|
pImp->bConstructed = sal_False;
|
|
SetUniqueId( GetHelpId() );
|
|
SetHelpId("");
|
|
if ( pBindinx )
|
|
pImp->StartListening( *pBindinx );
|
|
pImp->aMoveTimer.SetTimeout(50);
|
|
pImp->aMoveTimer.SetTimeoutHdl(LINK(this,SfxFloatingWindow,TimerHdl));
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxFloatingWindow::SfxFloatingWindow( SfxBindings *pBindinx,
|
|
SfxChildWindow *pCW,
|
|
Window* pParent,
|
|
const ResId& rResId) :
|
|
FloatingWindow(pParent, rResId),
|
|
pBindings(pBindinx),
|
|
pImp( new SfxFloatingWindow_Impl )
|
|
{
|
|
pImp->pMgr = pCW;
|
|
pImp->bConstructed = sal_False;
|
|
SetUniqueId( GetHelpId() );
|
|
SetHelpId("");
|
|
if ( pBindinx )
|
|
pImp->StartListening( *pBindinx );
|
|
pImp->aMoveTimer.SetTimeout(50);
|
|
pImp->aMoveTimer.SetTimeoutHdl(LINK(this,SfxFloatingWindow,TimerHdl));
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
sal_Bool SfxFloatingWindow::Close()
|
|
|
|
/* [Description]
|
|
|
|
The window is closed when the ChildWindow is destroyed by running the
|
|
ChildWindow-slots. If this is method is overridden by a derived class
|
|
method, then the SfxModelessDialogWindow: Close) must be called afterwards
|
|
if the Close() was not cancelled with "return sal_False".
|
|
*/
|
|
|
|
{
|
|
// Execute with Parameters, since Toggle is ignored by some ChildWindows.
|
|
SfxBoolItem aValue( pImp->pMgr->GetType(), sal_False);
|
|
pBindings->GetDispatcher_Impl()->Execute(
|
|
pImp->pMgr->GetType(),
|
|
SFX_CALLMODE_RECORD|SFX_CALLMODE_SYNCHRON, &aValue, 0L );
|
|
return sal_True;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxFloatingWindow::~SfxFloatingWindow()
|
|
|
|
/* [Description]
|
|
|
|
Destructor
|
|
*/
|
|
|
|
{
|
|
if ( pImp->pMgr->GetFrame() == pBindings->GetActiveFrame() )
|
|
pBindings->SetActiveFrame( NULL );
|
|
delete pImp;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
void SfxFloatingWindow::Resize()
|
|
|
|
/* [Description]
|
|
|
|
This virtual method of the class FloatingWindow keeps track if a change
|
|
in size has been made. When this method is overridden by a derived class,
|
|
then the SfxFloatingWindow: Resize() must also be called.
|
|
*/
|
|
|
|
{
|
|
FloatingWindow::Resize();
|
|
if ( pImp->bConstructed && pImp->pMgr )
|
|
{
|
|
// start timer for saving window status information
|
|
pImp->aMoveTimer.Start();
|
|
}
|
|
}
|
|
|
|
void SfxFloatingWindow::Move()
|
|
{
|
|
FloatingWindow::Move();
|
|
if ( pImp->bConstructed && pImp->pMgr )
|
|
{
|
|
// start timer for saving window status information
|
|
pImp->aMoveTimer.Start();
|
|
}
|
|
}
|
|
|
|
/*
|
|
Implements a timer event that is triggered by a move or resize of the window
|
|
This will save config information to Views.xcu with a small delay
|
|
*/
|
|
IMPL_LINK( SfxFloatingWindow, TimerHdl, Timer*, EMPTYARG)
|
|
{
|
|
pImp->aMoveTimer.Stop();
|
|
if ( pImp->bConstructed && pImp->pMgr )
|
|
{
|
|
if ( !IsRollUp() )
|
|
aSize = GetSizePixel();
|
|
sal_uIntPtr nMask = WINDOWSTATE_MASK_POS | WINDOWSTATE_MASK_STATE;
|
|
if ( GetStyle() & WB_SIZEABLE )
|
|
nMask |= ( WINDOWSTATE_MASK_WIDTH | WINDOWSTATE_MASK_HEIGHT );
|
|
pImp->aWinState = GetWindowState( nMask );
|
|
GetBindings().GetWorkWindow_Impl()->ConfigChild_Impl( SFX_CHILDWIN_DOCKINGWINDOW, SFX_ALIGNDOCKINGWINDOW, pImp->pMgr->GetType() );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
void SfxFloatingWindow::StateChanged( StateChangedType nStateChange )
|
|
{
|
|
if ( nStateChange == STATE_CHANGE_INITSHOW )
|
|
{
|
|
// FloatingWindows are not centered by default
|
|
if ( pImp->aWinState.getLength() )
|
|
SetWindowState( pImp->aWinState );
|
|
pImp->bConstructed = sal_True;
|
|
}
|
|
|
|
FloatingWindow::StateChanged( nStateChange );
|
|
}
|
|
|
|
|
|
void SfxFloatingWindow::Initialize(SfxChildWinInfo *pInfo)
|
|
|
|
/* [Description]
|
|
|
|
Initialization of a class SfxFloatingWindow through a SfxChildWinInfo.
|
|
The initialization is done only in a 2nd step after the constructor and
|
|
should be called by the constructor of the derived class or from the
|
|
SfxChildWindows.
|
|
*/
|
|
{
|
|
pImp->aWinState = pInfo->aWinState;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
void SfxFloatingWindow::FillInfo(SfxChildWinInfo& rInfo) const
|
|
|
|
/* [Description]
|
|
|
|
Fills a SfxChildWinInfo with specific data from SfxFloatingWindow,
|
|
so that it can be written in the INI file. It is assumed that rinfo
|
|
receives all other possible relevant data in the ChildWindow class.
|
|
Insertions are marked with size and the ZoomIn flag.
|
|
If this method is overridden, the base implementation must be called first.
|
|
*/
|
|
|
|
{
|
|
rInfo.aSize = aSize;
|
|
if ( IsRollUp() )
|
|
rInfo.nFlags |= SFX_CHILDWIN_ZOOMIN;
|
|
}
|
|
|
|
// SfxSingleTabDialog ----------------------------------------------------
|
|
|
|
IMPL_LINK( SfxSingleTabDialog, OKHdl_Impl, Button *, EMPTYARG )
|
|
|
|
/* [Description]
|
|
|
|
Ok_Handler; FillItemSet() is called for setting of Page.
|
|
*/
|
|
|
|
{
|
|
if ( !GetInputItemSet() )
|
|
{
|
|
// TabPage without ItemSet
|
|
EndDialog( RET_OK );
|
|
return 1;
|
|
}
|
|
|
|
if ( !GetOutputItemSet() )
|
|
{
|
|
CreateOutputItemSet( *GetInputItemSet() );
|
|
}
|
|
sal_Bool bModified = sal_False;
|
|
|
|
if ( pImpl->m_pSfxPage->HasExchangeSupport() )
|
|
{
|
|
int nRet = pImpl->m_pSfxPage->DeactivatePage( GetOutputSetImpl() );
|
|
if ( nRet != SfxTabPage::LEAVE_PAGE )
|
|
return 0;
|
|
else
|
|
bModified = ( GetOutputItemSet()->Count() > 0 );
|
|
}
|
|
else
|
|
bModified = pImpl->m_pSfxPage->FillItemSet( *GetOutputSetImpl() );
|
|
|
|
if ( bModified )
|
|
{
|
|
// Save user data in IniManager.
|
|
pImpl->m_pSfxPage->FillUserData();
|
|
String sData( pImpl->m_pSfxPage->GetUserData() );
|
|
SvtViewOptions aPageOpt( E_TABPAGE, String::CreateFromInt32( GetUniqId() ) );
|
|
aPageOpt.SetUserItem( USERITEM_NAME, makeAny( OUString( sData ) ) );
|
|
EndDialog( RET_OK );
|
|
}
|
|
else
|
|
EndDialog( RET_CANCEL );
|
|
return 0;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxSingleTabDialog::SfxSingleTabDialog
|
|
(
|
|
Window *pParent,
|
|
const SfxItemSet& rSet,
|
|
sal_uInt16 nUniqueId
|
|
) :
|
|
|
|
/* [Description]
|
|
|
|
Constructor of the general base class for SingleTab-Dialoge;
|
|
ID for the ini-file is handed over.
|
|
*/
|
|
|
|
SfxModalDialog( pParent, nUniqueId, WinBits( WB_STDMODAL | WB_3DLOOK ) ),
|
|
|
|
pOKBtn ( 0 ),
|
|
pCancelBtn ( 0 ),
|
|
pHelpBtn ( 0 ),
|
|
pImpl ( new SingleTabDlgImpl )
|
|
{
|
|
DBG_WARNING( "please use the constructor with ViewFrame" );
|
|
SetInputSet( &rSet );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxSingleTabDialog::SfxSingleTabDialog
|
|
(
|
|
Window* pParent,
|
|
sal_uInt16 nUniqueId,
|
|
const SfxItemSet* pInSet
|
|
)
|
|
|
|
/* [Description]
|
|
|
|
Constructor of the general base class for SingleTab-Dialoge;
|
|
ID for the ini-file is handed over.
|
|
Deprecated.
|
|
*/
|
|
|
|
: SfxModalDialog( pParent, nUniqueId, WinBits( WB_STDMODAL | WB_3DLOOK ) ),
|
|
|
|
pOKBtn ( 0 ),
|
|
pCancelBtn ( 0 ),
|
|
pHelpBtn ( 0 ),
|
|
pImpl ( new SingleTabDlgImpl )
|
|
{
|
|
DBG_WARNING( "please use the constructor with ViewFrame" );
|
|
SetInputSet( pInSet );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxSingleTabDialog::SfxSingleTabDialog
|
|
(
|
|
Window* pParent,
|
|
sal_uInt16 nUniqueId,
|
|
const String& rInfoURL
|
|
)
|
|
|
|
/* [Description]
|
|
|
|
Constructor of the general base class for SingleTab-Dialoge;
|
|
ID for the ini-file is handed over.
|
|
*/
|
|
|
|
: SfxModalDialog( pParent, nUniqueId, WinBits( WB_STDMODAL | WB_3DLOOK ) ),
|
|
|
|
pOKBtn ( NULL ),
|
|
pCancelBtn ( NULL ),
|
|
pHelpBtn ( NULL ),
|
|
pImpl ( new SingleTabDlgImpl )
|
|
{
|
|
pImpl->m_sInfoURL = rInfoURL;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxSingleTabDialog::~SfxSingleTabDialog()
|
|
{
|
|
delete pOKBtn;
|
|
delete pCancelBtn;
|
|
delete pHelpBtn;
|
|
delete pImpl->m_pTabPage;
|
|
delete pImpl->m_pSfxPage;
|
|
delete pImpl->m_pLine;
|
|
delete pImpl->m_pInfoImage;
|
|
delete pImpl;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SfxSingleTabDialog::SetPage( TabPage* pNewPage )
|
|
{
|
|
if ( !pImpl->m_pLine )
|
|
pImpl->m_pLine = new FixedLine( this );
|
|
|
|
if ( !pOKBtn )
|
|
{
|
|
pOKBtn = new OKButton( this, WB_DEFBUTTON );
|
|
pOKBtn->SetClickHdl( LINK( this, SfxSingleTabDialog, OKHdl_Impl ) );
|
|
}
|
|
|
|
if ( pImpl->m_sInfoURL.Len() > 0 && !pImpl->m_pInfoImage )
|
|
{
|
|
pImpl->m_pInfoImage = new ::svt::FixedHyperlinkImage( this );
|
|
Image aInfoImage = Image( SfxResId( IMG_INFO ) );
|
|
Size aImageSize = aInfoImage.GetSizePixel();
|
|
aImageSize.Width() += 4;
|
|
aImageSize.Height() += 4;
|
|
pImpl->m_pInfoImage->SetSizePixel( aImageSize );
|
|
pImpl->m_pInfoImage->SetImage( aInfoImage );
|
|
pImpl->m_pInfoImage->SetURL( pImpl->m_sInfoURL );
|
|
pImpl->m_pInfoImage->SetClickHdl( pImpl->m_aInfoLink );
|
|
}
|
|
|
|
if ( pImpl->m_pTabPage )
|
|
delete pImpl->m_pTabPage;
|
|
if ( pImpl->m_pSfxPage )
|
|
delete pImpl->m_pSfxPage;
|
|
pImpl->m_pTabPage = pNewPage;
|
|
|
|
if ( pImpl->m_pTabPage )
|
|
{
|
|
// Adjust size and position.
|
|
pImpl->m_pTabPage->SetPosPixel( Point() );
|
|
Size aOutSz( pImpl->m_pTabPage->GetSizePixel() );
|
|
Size aOffSz = LogicToPixel( Size( RSC_SP_CTRL_X, RSC_SP_CTRL_Y ), MAP_APPFONT );
|
|
Size aFLSz = LogicToPixel( Size( aOutSz.Width(), RSC_CD_FIXEDLINE_HEIGHT ) );
|
|
Size aBtnSz = LogicToPixel( Size( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ), MAP_APPFONT );
|
|
|
|
Point aPnt( 0, aOutSz.Height() );
|
|
pImpl->m_pLine->SetPosSizePixel( aPnt, aFLSz );
|
|
aPnt.X() = aOutSz.Width() - aOffSz.Width() - aBtnSz.Width();
|
|
aPnt.Y() += aFLSz.Height() + ( aOffSz.Height() / 2 );
|
|
pOKBtn->SetPosSizePixel( aPnt, aBtnSz );
|
|
|
|
if ( pImpl->m_pInfoImage )
|
|
{
|
|
aPnt.X() = aOffSz.Width();
|
|
long nDelta = ( pImpl->m_pInfoImage->GetSizePixel().Height() - aBtnSz.Height() ) / 2;
|
|
aPnt.Y() -= nDelta;
|
|
pImpl->m_pInfoImage->SetPosPixel( aPnt );
|
|
pImpl->m_pInfoImage->Show();
|
|
}
|
|
|
|
aOutSz.Height() += aFLSz.Height() + ( aOffSz.Height() / 2 ) + aBtnSz.Height() + aOffSz.Height();
|
|
SetOutputSizePixel( aOutSz );
|
|
|
|
pImpl->m_pLine->Show();
|
|
pOKBtn->Show();
|
|
pImpl->m_pTabPage->Show();
|
|
|
|
// Set TabPage text in the Dialog
|
|
SetText( pImpl->m_pTabPage->GetText() );
|
|
|
|
// Dialog recieves the HelpId of TabPage
|
|
SetHelpId( pImpl->m_pTabPage->GetHelpId() );
|
|
SetUniqueId( pImpl->m_pTabPage->GetUniqueId() );
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SfxSingleTabDialog::SetTabPage( SfxTabPage* pTabPage,
|
|
GetTabPageRanges pRangesFunc )
|
|
/* [Description]
|
|
|
|
Insert a (new) TabPage; an existing page is deleted.
|
|
The passed on page is initialized with the initially given Itemset
|
|
through calling Reset().
|
|
*/
|
|
|
|
{
|
|
if ( !pOKBtn )
|
|
{
|
|
pOKBtn = new OKButton( this, WB_DEFBUTTON );
|
|
pOKBtn->SetClickHdl( LINK( this, SfxSingleTabDialog, OKHdl_Impl ) );
|
|
}
|
|
if ( !pCancelBtn )
|
|
pCancelBtn = new CancelButton( this );
|
|
if ( !pHelpBtn )
|
|
pHelpBtn = new HelpButton( this );
|
|
|
|
if ( pImpl->m_pTabPage )
|
|
delete pImpl->m_pTabPage;
|
|
if ( pImpl->m_pSfxPage )
|
|
delete pImpl->m_pSfxPage;
|
|
pImpl->m_pSfxPage = pTabPage;
|
|
fnGetRanges = pRangesFunc;
|
|
|
|
if ( pImpl->m_pSfxPage )
|
|
{
|
|
// First obtain the user data, only then Reset()
|
|
SvtViewOptions aPageOpt( E_TABPAGE, String::CreateFromInt32( GetUniqId() ) );
|
|
String sUserData;
|
|
Any aUserItem = aPageOpt.GetUserItem( USERITEM_NAME );
|
|
OUString aTemp;
|
|
if ( aUserItem >>= aTemp )
|
|
sUserData = String( aTemp );
|
|
pImpl->m_pSfxPage->SetUserData( sUserData );
|
|
pImpl->m_pSfxPage->Reset( *GetInputItemSet() );
|
|
pImpl->m_pSfxPage->Show();
|
|
|
|
// Adjust size and position
|
|
pImpl->m_pSfxPage->SetPosPixel( Point() );
|
|
Size aOutSz( pImpl->m_pSfxPage->GetSizePixel() );
|
|
Size aBtnSiz = LogicToPixel( Size( 50, 14 ), MAP_APPFONT );
|
|
Point aPnt( aOutSz.Width(), LogicToPixel( Point( 0, 6 ), MAP_APPFONT ).Y() );
|
|
aOutSz.Width() += aBtnSiz.Width() + LogicToPixel( Size( 6, 0 ), MAP_APPFONT ).Width();
|
|
SetOutputSizePixel( aOutSz );
|
|
pOKBtn->SetPosSizePixel( aPnt, aBtnSiz );
|
|
pOKBtn->Show();
|
|
aPnt.Y() = LogicToPixel( Point( 0, 23 ), MAP_APPFONT ).Y();
|
|
pCancelBtn->SetPosSizePixel( aPnt, aBtnSiz );
|
|
pCancelBtn->Show();
|
|
aPnt.Y() = LogicToPixel( Point( 0, 43 ), MAP_APPFONT ).Y();
|
|
pHelpBtn->SetPosSizePixel( aPnt, aBtnSiz );
|
|
|
|
if ( Help::IsContextHelpEnabled() )
|
|
pHelpBtn->Show();
|
|
|
|
// Set TabPage text in the Dialog
|
|
SetText( pImpl->m_pSfxPage->GetText() );
|
|
|
|
// Dialog recieves the HelpId of TabPage
|
|
SetHelpId( pImpl->m_pSfxPage->GetHelpId() );
|
|
SetUniqueId( pImpl->m_pSfxPage->GetUniqueId() );
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SfxSingleTabDialog::SetInfoLink( const Link& rLink )
|
|
{
|
|
pImpl->m_aInfoLink = rLink;
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|