blob: 79a64bbe86f7f5acb7bc9c7d4c7d0148753a6793 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_cui.hxx"
#include <sfx2/app.hxx>
#include <tools/rc.h>
#include <tools/shl.hxx>
#define _SVSTDARR_USHORTS
#include <svl/svstdarr.hxx>
#include <dialmgr.hxx>
#include "iconcdlg.hxx"
#include "helpid.hrc"
#include <cuires.hrc>
#include <unotools/viewoptions.hxx>
#include <svtools/apearcfg.hxx>
#include <vcl/mnemonic.hxx>
#include <vcl/i18nhelp.hxx>
#ifdef WNT
int __cdecl IconcDlgCmpUS_Impl( const void* p1, const void* p2 )
#else
#if defined(OS2) && defined(ICC)
int _Optlink IconcDlgCmpUS_Impl( const void* p1, const void* p2 )
#else
int IconcDlgCmpUS_Impl( const void* p1, const void* p2 )
#endif
#endif
{
return *(sal_uInt16*)p1 - *(sal_uInt16*)p2;
}
// some stuff for easier changes for SvtViewOptions
static const sal_Char* pViewOptDataName = "dialog data";
#define VIEWOPT_DATANAME ::rtl::OUString::createFromAscii( pViewOptDataName )
static inline void SetViewOptUserItem( SvtViewOptions& rOpt, const String& rData )
{
rOpt.SetUserItem( VIEWOPT_DATANAME, ::com::sun::star::uno::makeAny( ::rtl::OUString( rData ) ) );
}
static inline String GetViewOptUserItem( const SvtViewOptions& rOpt )
{
::com::sun::star::uno::Any aAny( rOpt.GetUserItem( VIEWOPT_DATANAME ) );
::rtl::OUString aUserData;
aAny >>= aUserData;
return String( aUserData );
}
//#####################################################################
//
// Class IconChoicePage
//
//#####################################################################
/**********************************************************************
|
| Ctor / Dtor
|
\**********************************************************************/
IconChoicePage::IconChoicePage( Window *pParent, const ResId &rResId,
const SfxItemSet &rAttrSet )
: TabPage ( pParent, rResId ),
pSet ( &rAttrSet ),
bHasExchangeSupport ( sal_False ),
pDialog ( NULL ),
bStandard ( sal_False )
{
SetStyle ( GetStyle() | WB_DIALOGCONTROL | WB_HIDE );
}
// -----------------------------------------------------------------------
IconChoicePage::~IconChoicePage()
{
}
/**********************************************************************
|
| Activate / Deaktivate
|
\**********************************************************************/
void IconChoicePage::ActivatePage( const SfxItemSet& )
{
}
// -----------------------------------------------------------------------
int IconChoicePage::DeactivatePage( SfxItemSet* )
{
return LEAVE_PAGE;
}
/**********************************************************************
|
| ...
|
\**********************************************************************/
void IconChoicePage::FillUserData()
{
}
// -----------------------------------------------------------------------
sal_Bool IconChoicePage::IsReadOnly() const
{
return sal_False;
}
// -----------------------------------------------------------------------
sal_Bool IconChoicePage::QueryClose()
{
return sal_True;
}
/**********************************************************************
|
| window-methods
|
\**********************************************************************/
void IconChoicePage::ImplInitSettings()
{
Window* pParent = GetParent();
if ( pParent->IsChildTransparentModeEnabled() && !IsControlBackground() )
{
EnableChildTransparentMode( sal_True );
SetParentClipMode( PARENTCLIPMODE_NOCLIP );
SetPaintTransparent( sal_True );
SetBackground();
}
else
{
EnableChildTransparentMode( sal_False );
SetParentClipMode( 0 );
SetPaintTransparent( sal_False );
if ( IsControlBackground() )
SetBackground( GetControlBackground() );
else
SetBackground( pParent->GetBackground() );
}
}
// -----------------------------------------------------------------------
void IconChoicePage::StateChanged( StateChangedType nType )
{
Window::StateChanged( nType );
if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
{
ImplInitSettings();
Invalidate();
}
}
// -----------------------------------------------------------------------
void IconChoicePage::DataChanged( const DataChangedEvent& rDCEvt )
{
Window::DataChanged( rDCEvt );
if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
(rDCEvt.GetFlags() & SETTINGS_STYLE) )
{
ImplInitSettings();
Invalidate();
}
}
//#####################################################################
//
// Class IconChoiceDialog
//
//#####################################################################
/**********************************************************************
|
| Ctor / Dtor
|
\**********************************************************************/
IconChoiceDialog::IconChoiceDialog ( Window* pParent, const ResId &rResId,
const EIconChoicePos ePos,
const SfxItemSet *pItemSet )//, sal_Bool bEditFmt, const String *pUserButtonText = 0 )
: ModalDialog ( pParent, rResId ),
meChoicePos ( ePos ),
maIconCtrl ( this, WB_3DLOOK | WB_ICON | WB_BORDER |
WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME |
/* WB_NOSELECTION | */ WB_NODRAGSELECTION | WB_TABSTOP ),
mnCurrentPageId ( USHRT_MAX ),
aOKBtn ( this, WB_DEFBUTTON ),
aCancelBtn ( this, WB_DEFBUTTON ),
aHelpBtn ( this ),
aResetBtn ( this ),
pSet ( pItemSet ),
pOutSet ( NULL ),
pExampleSet ( NULL ),
pRanges ( NULL ),
nResId ( rResId.GetId() ),
bHideResetBtn ( sal_False ),
bModal ( sal_False ),
bInOK ( sal_False ),
bModified ( sal_False ),
bItemsReset ( sal_False )
{
// IconChoiceCtrl-Settings
//maIconCtrl.SetBackground ( Wallpaper( Color (146, 146, 186) ) );
maIconCtrl.SetStyle (WB_3DLOOK | WB_ICON | WB_BORDER | WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME | /* WB_NOSELECTION | */ WB_NODRAGSELECTION | WB_TABSTOP | WB_CLIPCHILDREN );
SetCtrlPos ( meChoicePos );
maIconCtrl.SetClickHdl ( LINK ( this, IconChoiceDialog , ChosePageHdl_Impl ) );
maIconCtrl.Show();
maIconCtrl.SetChoiceWithCursor ( sal_True );
maIconCtrl.SetSelectionMode( SINGLE_SELECTION );
maIconCtrl.SetHelpId( HID_ICCDIALOG_CHOICECTRL );
// ItemSet
if ( pSet )
{
pExampleSet = new SfxItemSet( *pSet );
pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
}
// Buttons
aOKBtn.SetClickHdl ( LINK( this, IconChoiceDialog, OkHdl ) );
aOKBtn.SetHelpId( HID_ICCDIALOG_OK_BTN );
aCancelBtn.SetHelpId( HID_ICCDIALOG_CANCEL_BTN );
aResetBtn.SetClickHdl( LINK( this, IconChoiceDialog, ResetHdl ) );
aResetBtn.SetText( CUI_RESSTR(RID_SVXSTR_ICONCHOICEDLG_RESETBUT) );
aResetBtn.SetHelpId( HID_ICCDIALOG_RESET_BTN );
aOKBtn.Show();
aCancelBtn.Show();
aHelpBtn.Show();
aResetBtn.Show();
SetPosSizeCtrls ( sal_True );
}
// -----------------------------------------------------------------------
/*
IconChoiceDialog ::IconChoiceDialog ( SfxViewFrame *pViewFrame, Window* pParent, const ResId &rResId,
const SfxItemSet * = 0, sal_Bool bEditFmt = sal_False,
const String *pUserButtonText = 0 )
: meChoicePos ( PosLeft ), // Default erst ma Links
maIconCtrl ( this, Die_Winbits ),
aOKBtn ( this ),
pUserBtn ( pUserButtonText? new PushButton(this): 0 ),
aCancelBtn ( this ),
aHelpBtn ( this ),
aResetBtn ( this ),
aBaseFmtBtn ( this ),
mnCurrentPageId ( 0 )
{
FreeResource();
}
*/
// -----------------------------------------------------------------------
IconChoiceDialog ::~IconChoiceDialog ()
{
sal_uLong i;
// save configuration at INI-Manager
// and remove pages
SvtViewOptions aTabDlgOpt( E_TABDIALOG, String::CreateFromInt32( nResId ) );
aTabDlgOpt.SetWindowState( ::rtl::OUString::createFromAscii( GetWindowState((WINDOWSTATE_MASK_X | WINDOWSTATE_MASK_Y | WINDOWSTATE_MASK_STATE | WINDOWSTATE_MASK_MINIMIZED)).GetBuffer() ) );
aTabDlgOpt.SetPageID( mnCurrentPageId );
const sal_uLong nCount = maPageList.Count();
for ( i = 0; i < nCount; ++i )
{
IconChoicePageData* pData = maPageList.GetObject(i);
if ( pData->pPage )
{
pData->pPage->FillUserData();
String aPageData(pData->pPage->GetUserData());
if ( aPageData.Len() )
{
SvtViewOptions aTabPageOpt( E_TABPAGE, String::CreateFromInt32( pData->nId ) );
SetViewOptUserItem( aTabPageOpt, aPageData );
}
if ( pData->bOnDemand )
delete (SfxItemSet*)&pData->pPage->GetItemSet();
delete pData->pPage;
}
delete pData;
}
// remove Userdata from Icons
for ( i=0; i<maIconCtrl.GetEntryCount(); i++)
{
SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.GetEntry ( i );
sal_uInt16* pUserData = (sal_uInt16*) pEntry->GetUserData();
delete pUserData;
}
//
if ( pRanges )
delete pRanges;
if ( pOutSet )
delete pOutSet;
}
/**********************************************************************
|
| add new page
|
\**********************************************************************/
SvxIconChoiceCtrlEntry* IconChoiceDialog::AddTabPage( sal_uInt16 nId, const String& rIconText,
const Image& rChoiceIcon,
const Image& rChoiceIconHC,
CreatePage pCreateFunc /* != 0 */,
GetPageRanges pRangesFunc /* darf 0 sein */,
sal_Bool bItemsOnDemand, sal_uLong /*nPos*/ )
{
IconChoicePageData* pData = new IconChoicePageData ( nId, pCreateFunc,
pRangesFunc,
bItemsOnDemand );
maPageList.Insert ( pData, LIST_APPEND );
pData->fnGetRanges = pRangesFunc;
pData->bOnDemand = bItemsOnDemand;
sal_uInt16 *pId = new sal_uInt16 ( nId );
SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.InsertEntry( rIconText, rChoiceIcon, rChoiceIconHC );
pEntry->SetUserData ( (void*) pId );
return pEntry;
}
/**********************************************************************
|
| Paint-method
|
\**********************************************************************/
void IconChoiceDialog::Paint( const Rectangle& rRect )
{
Dialog::Paint ( rRect );
for ( sal_uLong i=0; i<maPageList.Count(); i++ )
{
IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i );
if ( pData->nId == mnCurrentPageId )
{
ShowPageImpl ( pData );
}
else
{
HidePageImpl ( pData );
}
}
}
EIconChoicePos IconChoiceDialog::SetCtrlPos( const EIconChoicePos& rPos )
{
WinBits aWinBits = maIconCtrl.GetStyle ();
switch ( meChoicePos )
{
case PosLeft :
aWinBits &= ~WB_ALIGN_TOP & ~WB_NOVSCROLL;
aWinBits |= WB_ALIGN_LEFT | WB_NOHSCROLL;
break;
case PosRight :
aWinBits &= ~WB_ALIGN_TOP & ~WB_NOVSCROLL;
aWinBits |= WB_ALIGN_LEFT | WB_NOHSCROLL;
break;
case PosTop :
aWinBits &= ~WB_ALIGN_LEFT & ~WB_NOHSCROLL;
aWinBits |= WB_ALIGN_TOP | WB_NOVSCROLL;
break;
case PosBottom :
aWinBits &= ~WB_ALIGN_LEFT & ~WB_NOHSCROLL;
aWinBits |= WB_ALIGN_TOP | WB_NOVSCROLL;
break;
};
maIconCtrl.SetStyle ( aWinBits );
SetPosSizeCtrls();
EIconChoicePos eOldPos = meChoicePos;
meChoicePos = rPos;
return eOldPos;
}
/**********************************************************************
|
| Show / Hide page or button
|
\**********************************************************************/
void IconChoiceDialog::ShowPageImpl ( IconChoicePageData* pData )
{
if ( pData->pPage )
pData->pPage->Show();
}
// -----------------------------------------------------------------------
void IconChoiceDialog::HidePageImpl ( IconChoicePageData* pData )
{
if ( pData->pPage )
pData->pPage->Hide();
}
// -----------------------------------------------------------------------
void IconChoiceDialog::ShowPage( sal_uInt16 nId )
{
bool bInvalidate = GetCurPageId() != nId;
SetCurPageId( nId );
ActivatePageImpl( );
if(bInvalidate)
Invalidate();
// IA2 CWS. MT: I guess we want the event now, and not in Paint()?
IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
if(pData)
ShowPageImpl ( pData );
}
/**********************************************************************
|
| Resize Dialog
|
\**********************************************************************/
#define ICONCTRL_WIDTH_PIXEL 110
#define ICONCTRL_HEIGHT_PIXEL 75
#define MINSIZE_BUTTON_WIDTH 70
#define MINSIZE_BUTTON_HEIGHT 22
void IconChoiceDialog::Resize()
{
Dialog::Resize ();
if ( IsReallyVisible() )
{
SetPosSizeCtrls ();
}
}
void IconChoiceDialog::SetPosSizeCtrls ( sal_Bool bInit )
{
const Point aCtrlOffset ( LogicToPixel( Point( CTRLS_OFFSET, CTRLS_OFFSET ), MAP_APPFONT ) );
Size aOutSize ( GetOutputSizePixel() );
////////////////////////////////////////
// Button-Defaults
//
Size aDefaultButtonSize = LogicToPixel( Size( 50, 14 ), MAP_APPFONT );
// Reset-Button
Size aResetButtonSize ( bInit ? aDefaultButtonSize :
aResetBtn.GetSizePixel () );
////////////////////////////////////////
// IconChoiceCtrl resizen & positionieren
//
SvtTabAppearanceCfg aCfg;
const long nDefaultWidth = (aCfg.GetScaleFactor() * ICONCTRL_WIDTH_PIXEL) / 100;
const long nDefaultHeight = (aCfg.GetScaleFactor() * ICONCTRL_HEIGHT_PIXEL) / 100;
Size aNewIconCtrlSize ( nDefaultWidth,
aOutSize.Height()-(2*aCtrlOffset.X()) );
Point aIconCtrlPos;
switch ( meChoicePos )
{
case PosLeft :
aIconCtrlPos = aCtrlOffset;
aNewIconCtrlSize = Size ( nDefaultWidth,
aOutSize.Height()-(2*aCtrlOffset.X()) );
break;
case PosRight :
aIconCtrlPos = Point ( aOutSize.Width() - nDefaultWidth -
aCtrlOffset.X(), aCtrlOffset.X() );
aNewIconCtrlSize = Size ( nDefaultWidth,
aOutSize.Height()-(2*aCtrlOffset.X()) );
break;
case PosTop :
aIconCtrlPos = aCtrlOffset;
aNewIconCtrlSize = Size ( aOutSize.Width()-(2*aCtrlOffset.X()),
nDefaultHeight );
break;
case PosBottom :
aIconCtrlPos = Point ( aCtrlOffset.X(), aOutSize.Height() -
aResetButtonSize.Height() - (2*aCtrlOffset.X()) -
nDefaultHeight );
aNewIconCtrlSize = Size ( aOutSize.Width()-(2*aCtrlOffset.X()),
nDefaultHeight );
break;
};
maIconCtrl.SetPosSizePixel ( aIconCtrlPos, aNewIconCtrlSize );
maIconCtrl.ArrangeIcons();
////////////////////////////////////////
// Pages resizen & positionieren
//
for ( sal_uLong i=0; i<maPageList.Count(); i++ )
{
IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i );
Point aNewPagePos;
Size aNewPageSize;
switch ( meChoicePos )
{
case PosLeft :
aNewPagePos = Point ( aNewIconCtrlSize.Width() + (2*CTRLS_OFFSET),
CTRLS_OFFSET );
aNewPageSize = Size ( aOutSize.Width() - aNewIconCtrlSize.Width() -
(3*CTRLS_OFFSET),
aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
(3*CTRLS_OFFSET) );
break;
case PosRight :
aNewPagePos = aCtrlOffset;
aNewPageSize = Size ( aOutSize.Width() - aNewIconCtrlSize.Width() -
(3*aCtrlOffset.X()),
aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
(3*aCtrlOffset.X()) );
break;
case PosTop :
aNewPagePos = Point ( aCtrlOffset.X(), aNewIconCtrlSize.Height() +
(2*aCtrlOffset.X()) );
aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()),
aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
aNewIconCtrlSize.Height() - (4*aCtrlOffset.X()) );
break;
case PosBottom :
aNewPagePos = aCtrlOffset;
aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()),
aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
aNewIconCtrlSize.Height() - (4*aCtrlOffset.X()) );
break;
};
if ( pData->pPage )
pData->pPage->SetPosSizePixel ( aNewPagePos, aNewPageSize );
}
////////////////////////////////////////
// Buttons positionieren
//
sal_uLong nXOffset=0;
if ( meChoicePos == PosRight )
nXOffset = aNewIconCtrlSize.Width()+(2*aCtrlOffset.X());
aResetBtn.SetPosSizePixel ( Point( aOutSize.Width() - nXOffset -
aResetButtonSize.Width()-aCtrlOffset.X(),
aOutSize.Height()-aResetButtonSize.Height()-
aCtrlOffset.X() ),
aResetButtonSize );
// Help-Button
Size aHelpButtonSize ( bInit ? aDefaultButtonSize :
aHelpBtn.GetSizePixel () );
aHelpBtn.SetPosSizePixel ( Point( aOutSize.Width()-aResetButtonSize.Width()-
aHelpButtonSize.Width()- nXOffset -
(2*aCtrlOffset.X()),
aOutSize.Height()-aHelpButtonSize.Height()-
aCtrlOffset.X() ),
aHelpButtonSize );
// Cancel-Button
Size aCancelButtonSize ( bInit ? aDefaultButtonSize :
aCancelBtn.GetSizePixel () );
aCancelBtn.SetPosSizePixel ( Point( aOutSize.Width()-aCancelButtonSize.Width()-
aResetButtonSize.Width()-aHelpButtonSize.Width()-
(3*aCtrlOffset.X()) - nXOffset,
aOutSize.Height()-aCancelButtonSize.Height()-
aCtrlOffset.X() ),
aCancelButtonSize );
// OK-Button
Size aOKButtonSize ( bInit ? aDefaultButtonSize : aOKBtn.GetSizePixel () );
aOKBtn.SetPosSizePixel ( Point( aOutSize.Width()-aOKButtonSize.Width()-
aCancelButtonSize.Width()-aResetButtonSize.Width()-
aHelpButtonSize.Width()-(4*aCtrlOffset.X())- nXOffset,
aOutSize.Height()-aOKButtonSize.Height()-aCtrlOffset.X() ),
aOKButtonSize );
Invalidate();
}
void IconChoiceDialog::SetPosSizePages ( sal_uInt16 nId )
{
const Point aCtrlOffset ( LogicToPixel( Point( CTRLS_OFFSET, CTRLS_OFFSET ), MAP_APPFONT ) );
IconChoicePageData* pData = GetPageData ( nId );
if ( pData->pPage )
{
Size aOutSize ( GetOutputSizePixel() );
Size aIconCtrlSize ( maIconCtrl.GetSizePixel() );
Point aNewPagePos;
Size aNewPageSize;
switch ( meChoicePos )
{
case PosLeft :
aNewPagePos = Point ( aIconCtrlSize.Width() + (2*aCtrlOffset.X()),
aCtrlOffset.X() );
aNewPageSize = Size ( aOutSize.Width() - maIconCtrl.GetSizePixel().Width() -
(3*aCtrlOffset.X()),
aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
(3*aCtrlOffset.X()) );
break;
case PosRight :
aNewPagePos = aCtrlOffset;
aNewPageSize = Size ( aOutSize.Width() - maIconCtrl.GetSizePixel().Width() -
(3*aCtrlOffset.X()),
aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
(3*aCtrlOffset.X()) );
break;
case PosTop :
aNewPagePos = Point ( aCtrlOffset.X(), aIconCtrlSize.Height() +
(2*aCtrlOffset.X()) );
aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()),
aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
maIconCtrl.GetSizePixel().Height() - (4*aCtrlOffset.X()) );
break;
case PosBottom :
aNewPagePos = aCtrlOffset;
aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()),
aOutSize.Height() - aOKBtn.GetSizePixel().Height() -
maIconCtrl.GetSizePixel().Height() - (4*aCtrlOffset.X()) );
break;
};
pData->pPage->SetPosSizePixel ( aNewPagePos, aNewPageSize );
}
}
/**********************************************************************
|
| select a page
|
\**********************************************************************/
IMPL_LINK ( IconChoiceDialog , ChosePageHdl_Impl, void *, EMPTYARG )
{
sal_uLong nPos;
SvxIconChoiceCtrlEntry *pEntry = maIconCtrl.GetSelectedEntry ( nPos );
if ( !pEntry )
pEntry = maIconCtrl.GetCursor( );
sal_uInt16 *pId = (sal_uInt16*)pEntry->GetUserData ();
if( *pId != mnCurrentPageId )
{
IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
if ( pData->pPage )
DeActivatePageImpl();
SetCurPageId ( *pId );
ActivatePageImpl();
Invalidate();
}
return 0L;
}
/**********************************************************************
|
| Button-handler
|
\**********************************************************************/
IMPL_LINK( IconChoiceDialog, OkHdl, Button *, EMPTYARG )
{
bInOK = sal_True;
if ( OK_Impl() )
{
if ( bModal )
EndDialog( Ok() );
else
{
Ok();
Close();
}
}
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( IconChoiceDialog, ResetHdl, Button *, EMPTYARG )
{
ResetPageImpl ();
IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
DBG_ASSERT( pData, "Id nicht bekannt" );
if ( pData->bOnDemand )
{
// CSet auf AIS hat hier Probleme, daher getrennt
const SfxItemSet* _pSet = &( pData->pPage->GetItemSet() );
pData->pPage->Reset( *(SfxItemSet*)_pSet );
}
else
pData->pPage->Reset( *pSet );
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( IconChoiceDialog, CancelHdl, Button*, EMPTYARG )
{
Close();
return 0;
}
/**********************************************************************
|
| call page
|
\**********************************************************************/
void IconChoiceDialog::ActivatePageImpl ()
{
DBG_ASSERT( maPageList.Count(), "keine Pages angemeldet" );
IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
DBG_ASSERT( pData, "Id nicht bekannt" );
if ( pData )
{
if ( !pData->pPage )
{
const SfxItemSet* pTmpSet = 0;
if ( pSet )
{
if ( bItemsReset && pSet->GetParent() )
pTmpSet = pSet->GetParent();
else
pTmpSet = pSet;
}
if ( pTmpSet && !pData->bOnDemand )
pData->pPage = (pData->fnCreatePage)( this, *pTmpSet );
else
pData->pPage = (pData->fnCreatePage)( this, *CreateInputItemSet( mnCurrentPageId ) );
SvtViewOptions aTabPageOpt( E_TABPAGE, String::CreateFromInt32( pData->nId ) );
pData->pPage->SetUserData( GetViewOptUserItem( aTabPageOpt ) );
SetPosSizePages ( pData->nId );
if ( pData->bOnDemand )
pData->pPage->Reset( (SfxItemSet &)pData->pPage->GetItemSet() );
else
pData->pPage->Reset( *pSet );
PageCreated( mnCurrentPageId, *pData->pPage );
}
else if ( pData->bRefresh )
{
pData->pPage->Reset( *pSet );
}
pData->bRefresh = sal_False;
if ( pExampleSet )
pData->pPage->ActivatePage( *pExampleSet );
}
SetHelpId( pData->pPage->GetHelpId() );
sal_Bool bReadOnly = pData->pPage->IsReadOnly();
if ( bReadOnly || bHideResetBtn )
aResetBtn.Hide();
else
aResetBtn.Show();
}
// -----------------------------------------------------------------------
sal_Bool IconChoiceDialog::DeActivatePageImpl ()
{
IconChoicePageData *pData = GetPageData ( mnCurrentPageId );
int nRet = IconChoicePage::LEAVE_PAGE;
if ( pData )
{
IconChoicePage * pPage = pData->pPage;
if ( !pExampleSet && pPage->HasExchangeSupport() && pSet )
pExampleSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
if ( pSet )
{
SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
if ( pPage->HasExchangeSupport() )
nRet = pPage->DeactivatePage( &aTmp );
if ( ( IconChoicePage::LEAVE_PAGE & nRet ) == IconChoicePage::LEAVE_PAGE &&
aTmp.Count() )
{
pExampleSet->Put( aTmp );
pOutSet->Put( aTmp );
}
}
else
{
if ( pPage->HasExchangeSupport() ) //!!!
{
if ( !pExampleSet )
{
SfxItemPool* pPool = pPage->GetItemSet().GetPool();
pExampleSet =
new SfxItemSet( *pPool, GetInputRanges( *pPool ) );
}
nRet = pPage->DeactivatePage( pExampleSet );
}
else
nRet = pPage->DeactivatePage( NULL );
}
if ( nRet & IconChoicePage::REFRESH_SET )
{
pSet = GetRefreshedSet();
DBG_ASSERT( pSet, "GetRefreshedSet() liefert NULL" );
// alle Pages als neu zu initialsieren flaggen
const sal_uLong nCount = maPageList.Count();
for ( sal_uInt16 i = 0; i < nCount; ++i )
{
IconChoicePageData* pObj = (IconChoicePageData*)maPageList.GetObject(i);
if ( pObj->pPage != pPage ) // eigene Page nicht mehr refreshen
pObj->bRefresh = sal_True;
else
pObj->bRefresh = sal_False;
}
}
}
if ( nRet & IconChoicePage::LEAVE_PAGE )
return sal_True;
else
return sal_False;
}
// -----------------------------------------------------------------------
void IconChoiceDialog::ResetPageImpl ()
{
IconChoicePageData *pData = GetPageData ( mnCurrentPageId );
DBG_ASSERT( pData, "Id nicht bekannt" );
if ( pData->bOnDemand )
{
// CSet auf AIS hat hier Probleme, daher getrennt
const SfxItemSet* _pSet = &pData->pPage->GetItemSet();
pData->pPage->Reset( *(SfxItemSet*)_pSet );
}
else
pData->pPage->Reset( *pSet );
}
/**********************************************************************
|
| handling itemsets
|
\**********************************************************************/
const sal_uInt16* IconChoiceDialog::GetInputRanges( const SfxItemPool& rPool )
{
if ( pSet )
{
DBG_ERRORFILE( "Set bereits vorhanden!" );
return pSet->GetRanges();
}
if ( pRanges )
return pRanges;
SvUShorts aUS( 16, 16 );
sal_uLong nCount = maPageList.Count();
sal_uInt16 i;
for ( i = 0; i < nCount; ++i )
{
IconChoicePageData* pData = maPageList.GetObject (i);
if ( pData->fnGetRanges )
{
const sal_uInt16* pTmpRanges = (pData->fnGetRanges)();
const sal_uInt16* pIter = pTmpRanges;
sal_uInt16 nLen;
for( nLen = 0; *pIter; ++nLen, ++pIter )
;
aUS.Insert( pTmpRanges, nLen, aUS.Count() );
}
}
// remove double Id's
#ifndef TF_POOLABLE
if ( rPool.HasMap() )
#endif
{
nCount = aUS.Count();
for ( i = 0; i < nCount; ++i )
aUS[i] = rPool.GetWhich( aUS[i] );
}
// sortieren
if ( aUS.Count() > 1 )
{
#if defined __SUNPRO_CC
#pragma disable_warn
#endif
qsort( (void*)aUS.GetData(), aUS.Count(), sizeof(sal_uInt16), IconcDlgCmpUS_Impl );
#if defined __SUNPRO_CC
#pragma enable_warn
#endif
}
pRanges = new sal_uInt16[aUS.Count() + 1];
memcpy(pRanges, aUS.GetData(), sizeof(sal_uInt16) * aUS.Count());
pRanges[aUS.Count()] = 0;
return pRanges;
}
// -----------------------------------------------------------------------
void IconChoiceDialog::SetInputSet( const SfxItemSet* pInSet )
{
FASTBOOL bSet = ( pSet != NULL );
pSet = pInSet;
if ( !bSet && !pExampleSet && !pOutSet )
{
pExampleSet = new SfxItemSet( *pSet );
pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
}
}
// -----------------------------------------------------------------------
void IconChoiceDialog::PageCreated( sal_uInt16 /*nId*/, IconChoicePage& /*rPage*/ )
{
// not interested in
}
// -----------------------------------------------------------------------
SfxItemSet* IconChoiceDialog::CreateInputItemSet( sal_uInt16 )
{
DBG_WARNINGFILE( "CreateInputItemSet nicht implementiert" );
return 0;
}
/**********************************************************************
|
| start dialog
|
\**********************************************************************/
short IconChoiceDialog::Execute()
{
if ( !maPageList.Count() )
return RET_CANCEL;
Start_Impl();
return Dialog::Execute();
}
// -----------------------------------------------------------------------
void IconChoiceDialog::Start( sal_Bool bShow )
{
aCancelBtn.SetClickHdl( LINK( this, IconChoiceDialog, CancelHdl ) );
bModal = sal_False;
Start_Impl();
if ( bShow )
Window::Show();
}
// -----------------------------------------------------------------------
sal_Bool IconChoiceDialog::QueryClose()
{
sal_Bool bRet = sal_True;
const sal_uLong nCount = maPageList.Count();
for ( sal_uLong i = 0; i < nCount; ++i )
{
IconChoicePageData* pData = maPageList.GetObject(i);
if ( pData->pPage && !pData->pPage->QueryClose() )
{
bRet = sal_False;
break;
}
}
return bRet;
}
// -----------------------------------------------------------------------
void IconChoiceDialog::Start_Impl()
{
Point aPos;
sal_uInt16 nActPage;
if ( mnCurrentPageId == 0 || mnCurrentPageId == USHRT_MAX )
nActPage = maPageList.GetObject(0)->nId;//First()->nId;
else
nActPage = mnCurrentPageId;
// Konfiguration vorhanden?
SvtViewOptions aTabDlgOpt( E_TABDIALOG, String::CreateFromInt32( nResId ) );
if ( aTabDlgOpt.Exists() )
{
// ggf. Position aus Konfig
SetWindowState( ByteString( aTabDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US ) );
// initiale TabPage aus Programm/Hilfe/Konfig
nActPage = (sal_uInt16)aTabDlgOpt.GetPageID();
if ( USHRT_MAX != mnCurrentPageId )
nActPage = mnCurrentPageId;
if ( GetPageData ( nActPage ) == NULL )
nActPage = ( (IconChoicePageData*)maPageList.GetObject(0) )->nId;
}
else if ( USHRT_MAX != mnCurrentPageId && GetPageData ( mnCurrentPageId ) != NULL )
nActPage = mnCurrentPageId;
mnCurrentPageId = nActPage;
FocusOnIcon( mnCurrentPageId );
ActivatePageImpl();
}
// -----------------------------------------------------------------------
const SfxItemSet* IconChoiceDialog::GetRefreshedSet()
{
DBG_ERRORFILE( "GetRefreshedSet nicht implementiert" );
return 0;
}
/**********************************************************************
|
| tool-methods
|
\**********************************************************************/
IconChoicePageData* IconChoiceDialog::GetPageData ( sal_uInt16 nId )
{
IconChoicePageData *pRet = NULL;
sal_Bool bFound = sal_False;
for ( sal_uLong i=0; i<maPageList.Count() && !bFound; i++ )
{
IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i );
if ( pData->nId == nId )
{
pRet = pData;
}
}
return pRet;
}
/**********************************************************************
|
| OK-Status
|
\**********************************************************************/
sal_Bool IconChoiceDialog::OK_Impl()
{
IconChoicePage* pPage = GetPageData ( mnCurrentPageId )->pPage;
bool bEnd = !pPage;
if ( pPage )
{
int nRet = IconChoicePage::LEAVE_PAGE;
if ( pSet )
{
SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
sal_Bool bRet = sal_False;
if ( pPage->HasExchangeSupport() )
nRet = pPage->DeactivatePage( &aTmp );
if ( ( IconChoicePage::LEAVE_PAGE & nRet ) == IconChoicePage::LEAVE_PAGE
&& aTmp.Count() )
{
pExampleSet->Put( aTmp );
pOutSet->Put( aTmp );
}
else if ( bRet )
bModified |= sal_True;
}
else
nRet = pPage->DeactivatePage( NULL );
bEnd = nRet;
}
return bEnd;
}
// -----------------------------------------------------------------------
short IconChoiceDialog::Ok()
{
bInOK = sal_True;
if ( !pOutSet )
{
if ( !pExampleSet && pSet )
pOutSet = pSet->Clone( sal_False ); // ohne Items
else if ( pExampleSet )
pOutSet = new SfxItemSet( *pExampleSet );
}
sal_Bool _bModified = sal_False;
const sal_uLong nCount = maPageList.Count();
for ( sal_uInt16 i = 0; i < nCount; ++i )
{
IconChoicePageData* pData = GetPageData ( i );
IconChoicePage* pPage = pData->pPage;
if ( pPage )
{
if ( pData->bOnDemand )
{
SfxItemSet& rSet = (SfxItemSet&)pPage->GetItemSet();
rSet.ClearItem();
_bModified |= pPage->FillItemSet( rSet );
}
else if ( pSet && !pPage->HasExchangeSupport() )
{
SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
if ( pPage->FillItemSet( aTmp ) )
{
_bModified |= sal_True;
pExampleSet->Put( aTmp );
pOutSet->Put( aTmp );
}
}
}
}
if ( _bModified || ( pOutSet && pOutSet->Count() > 0 ) )
_bModified |= sal_True;
return _bModified ? RET_OK : RET_CANCEL;
}
// -----------------------------------------------------------------------
void IconChoiceDialog::FocusOnIcon( sal_uInt16 nId )
{
// set focus to icon for the current visible page
for ( sal_uInt16 i=0; i<maIconCtrl.GetEntryCount(); i++)
{
SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.GetEntry ( i );
sal_uInt16* pUserData = (sal_uInt16*) pEntry->GetUserData();
if ( pUserData && *pUserData == nId )
{
maIconCtrl.SetCursor( pEntry );
break;
}
}
}