diff options
Diffstat (limited to 'cui/source/dialogs/iconcdlg.cxx')
-rw-r--r-- | cui/source/dialogs/iconcdlg.cxx | 1435 |
1 files changed, 1435 insertions, 0 deletions
diff --git a/cui/source/dialogs/iconcdlg.cxx b/cui/source/dialogs/iconcdlg.cxx new file mode 100644 index 000000000000..adea20068499 --- /dev/null +++ b/cui/source/dialogs/iconcdlg.cxx @@ -0,0 +1,1435 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +// 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 *(USHORT*)p1 - *(USHORT*)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 ( FALSE ), + pDialog ( NULL ), + bStandard ( 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() +{ +} + +// ----------------------------------------------------------------------- + +BOOL IconChoicePage::IsReadOnly() const +{ + return FALSE; +} + +// ----------------------------------------------------------------------- + +sal_Bool IconChoicePage::QueryClose() +{ + return sal_True; +} + +/********************************************************************** +| +| handling itemsets +| +\**********************************************************************/ + +const SfxPoolItem* IconChoicePage::GetItem( const SfxItemSet& rSet, + USHORT nSlot ) +{ + const SfxItemPool* pPool = rSet.GetPool(); + USHORT nWh = pPool->GetWhich( nSlot ); + const SfxPoolItem* pItem = 0; + rSet.GetItemState( nWh, TRUE, &pItem ); + + if ( !pItem && nWh != nSlot ) + pItem = &pPool->GetDefaultItem( nWh ); + + return pItem; +} + +// ----------------------------------------------------------------------- + +const SfxPoolItem* IconChoicePage::GetOldItem( const SfxItemSet& rSet, + USHORT nSlot ) +{ + const SfxItemSet& rOldSet = GetItemSet(); + USHORT nWh = GetWhich( nSlot ); + const SfxPoolItem* pItem = 0; + + if ( bStandard && rOldSet.GetParent() ) + pItem = GetItem( *rOldSet.GetParent(), nSlot ); + else if ( rSet.GetParent() && SFX_ITEM_DONTCARE == rSet.GetItemState( nWh ) ) + pItem = GetItem( *rSet.GetParent(), nSlot ); + else + pItem = GetItem( rOldSet, nSlot ); + + return pItem; +} + +// ----------------------------------------------------------------------- + +const SfxPoolItem* IconChoicePage::GetExchangeItem( const SfxItemSet& rSet, + USHORT nSlot ) +{ + if ( pDialog && !pDialog->IsInOK() && pDialog->GetExampleSet() ) + return GetItem( *pDialog->GetExampleSet(), nSlot ); + else + return GetOldItem( rSet, nSlot ); +} + +/********************************************************************** +| +| window-methods +| +\**********************************************************************/ + +void IconChoicePage::ImplInitSettings() +{ + Window* pParent = GetParent(); + if ( pParent->IsChildTransparentModeEnabled() && !IsControlBackground() ) + { + EnableChildTransparentMode( TRUE ); + SetParentClipMode( PARENTCLIPMODE_NOCLIP ); + SetPaintTransparent( TRUE ); + SetBackground(); + } + else + { + EnableChildTransparentMode( FALSE ); + SetParentClipMode( 0 ); + SetPaintTransparent( 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 )//, 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 ( FALSE ), + bModal ( FALSE ), + bInOK ( FALSE ), + bModified ( FALSE ), + bItemsReset ( 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 ( 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 ( TRUE ); +} + +// ----------------------------------------------------------------------- + +/* +IconChoiceDialog ::IconChoiceDialog ( SfxViewFrame *pViewFrame, Window* pParent, const ResId &rResId, + const SfxItemSet * = 0, BOOL bEditFmt = 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 () +{ + 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 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 Pagelist +/* for ( i=0; i<maPageList.Count(); i++ ) + { + IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i ); + + 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 ); + USHORT* pUserData = (USHORT*) pEntry->GetUserData(); + delete pUserData; + } + + // + if ( pRanges ) + delete pRanges; + if ( pOutSet ) + delete pOutSet; +} + +/********************************************************************** +| +| add new page +| +\**********************************************************************/ + +SvxIconChoiceCtrlEntry* IconChoiceDialog::AddTabPage( USHORT nId, const String& rIconText, + const Image& rChoiceIcon, + CreatePage pCreateFunc /* != 0 */, + GetPageRanges pRangesFunc /* darf 0 sein */, + BOOL bItemsOnDemand, ULONG /*nPos*/ ) +{ + IconChoicePageData* pData = new IconChoicePageData ( nId, pCreateFunc, + pRangesFunc, + bItemsOnDemand ); + maPageList.Insert ( pData, LIST_APPEND ); + + pData->fnGetRanges = pRangesFunc; + pData->bOnDemand = bItemsOnDemand; + + USHORT *pId = new USHORT ( nId ); + SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.InsertEntry( rIconText, rChoiceIcon ); + pEntry->SetUserData ( (void*) pId ); + return pEntry; +} + +SvxIconChoiceCtrlEntry* IconChoiceDialog::AddTabPage( USHORT nId, const String& rIconText, + const Image& rChoiceIcon, + const Image& rChoiceIconHC, + CreatePage pCreateFunc /* != 0 */, + GetPageRanges pRangesFunc /* darf 0 sein */, + BOOL bItemsOnDemand, ULONG /*nPos*/ ) +{ + IconChoicePageData* pData = new IconChoicePageData ( nId, pCreateFunc, + pRangesFunc, + bItemsOnDemand ); + maPageList.Insert ( pData, LIST_APPEND ); + + pData->fnGetRanges = pRangesFunc; + pData->bOnDemand = bItemsOnDemand; + + USHORT *pId = new USHORT ( nId ); + SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.InsertEntry( rIconText, rChoiceIcon, rChoiceIconHC ); + pEntry->SetUserData ( (void*) pId ); + return pEntry; +} + +/********************************************************************** +| +| remove page +| +\**********************************************************************/ + +void IconChoiceDialog::RemoveTabPage( USHORT nId ) +{ + IconChoicePageData* pData = GetPageData ( nId ); + + // remove page from list + if ( pData ) + { + maPageList.Remove ( pData ); + + // save settings + 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 Icon + BOOL bFound=FALSE; + for ( ULONG i=0; i<maIconCtrl.GetEntryCount() && !bFound; i++) + { + SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.GetEntry ( i ); + USHORT* pUserData = (USHORT*) pEntry->GetUserData(); + + if ( *pUserData == nId ) + { + delete pUserData; + maIconCtrl.RemoveEntry ( pEntry ); + bFound = TRUE; + } + } + + // was it the current page ? + if ( nId == mnCurrentPageId ) + { + mnCurrentPageId = maPageList.First()->nId; + } + + Invalidate (); +} + +/********************************************************************** +| +| Paint-method +| +\**********************************************************************/ + +void IconChoiceDialog::Paint( const Rectangle& rRect ) +{ + Dialog::Paint ( rRect ); + + for ( 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; +} + +void IconChoiceDialog::SetCtrlColor ( const Color& rColor ) +{ + Wallpaper aWallpaper ( rColor ); + maIconCtrl.SetBackground( aWallpaper ); + maIconCtrl.SetFontColorToBackground (); +} + +/********************************************************************** +| +| 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::RemoveResetButton() +{ + aResetBtn.Hide(); + bHideResetBtn = TRUE; +} + +// ----------------------------------------------------------------------- + +void IconChoiceDialog::ShowPage( USHORT nId ) +{ + bool bInvalidate = GetCurPageId() != nId; + SetCurPageId( nId ); + ActivatePageImpl( ); + if(bInvalidate) + Invalidate(); +} + +/********************************************************************** +| +| 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 ( 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 ( 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 + // + 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 ( USHORT 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 ) +{ + ULONG nPos; + + SvxIconChoiceCtrlEntry *pEntry = maIconCtrl.GetSelectedEntry ( nPos ); + if ( !pEntry ) + pEntry = maIconCtrl.GetCursor( ); + + USHORT *pId = (USHORT*)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 = 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 = FALSE; + + if ( pExampleSet ) + pData->pPage->ActivatePage( *pExampleSet ); + } + + SetHelpId( pData->pPage->GetHelpId() ); + + BOOL bReadOnly = pData->pPage->IsReadOnly(); + if ( bReadOnly || bHideResetBtn ) + aResetBtn.Hide(); + else + aResetBtn.Show(); + +} + +// ----------------------------------------------------------------------- + +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 ULONG nCount = maPageList.Count(); + + for ( USHORT i = 0; i < nCount; ++i ) + { + IconChoicePageData* pObj = (IconChoicePageData*)maPageList.GetObject(i); + + if ( pObj->pPage != pPage ) // eigene Page nicht mehr refreshen + pObj->bRefresh = TRUE; + else + pObj->bRefresh = FALSE; + } + } + } + + if ( nRet & IconChoicePage::LEAVE_PAGE ) + return TRUE; + else + return 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 USHORT* IconChoiceDialog::GetInputRanges( const SfxItemPool& rPool ) +{ + if ( pSet ) + { + DBG_ERRORFILE( "Set bereits vorhanden!" ); + return pSet->GetRanges(); + } + + if ( pRanges ) + return pRanges; + SvUShorts aUS( 16, 16 ); + ULONG nCount = maPageList.Count(); + + USHORT i; + for ( i = 0; i < nCount; ++i ) + { + IconChoicePageData* pData = maPageList.GetObject (i); + + if ( pData->fnGetRanges ) + { + const USHORT* pTmpRanges = (pData->fnGetRanges)(); + const USHORT* pIter = pTmpRanges; + + USHORT 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(USHORT), IconcDlgCmpUS_Impl ); +#if defined __SUNPRO_CC +#pragma enable_warn +#endif + } + + pRanges = new USHORT[aUS.Count() + 1]; + memcpy(pRanges, aUS.GetData(), sizeof(USHORT) * 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() ); + } +} + +// ----------------------------------------------------------------------- + +// Liefert die Pages, die ihre Sets onDemand liefern, das OutputItemSet. +const SfxItemSet* IconChoiceDialog::GetOutputItemSet ( USHORT nId ) +{ + IconChoicePageData * pData = GetPageData ( nId ); + DBG_ASSERT( pData, "TabPage nicht gefunden" ); + + if ( pData ) + { + if ( !pData->pPage ) + return NULL; + + if ( pData->bOnDemand ) + return &pData->pPage->GetItemSet(); + + return pOutSet; + } + + return NULL; +} + +// ----------------------------------------------------------------------- + +int IconChoiceDialog::FillOutputItemSet() +{ + int nRet = IconChoicePage::LEAVE_PAGE; + if ( OK_Impl() ) + Ok(); + else + nRet = IconChoicePage::KEEP_PAGE; + return nRet; +} + +// ----------------------------------------------------------------------- + +void IconChoiceDialog::PageCreated( USHORT /*nId*/, IconChoicePage& /*rPage*/ ) +{ + // not interested in +} + +// ----------------------------------------------------------------------- + +SfxItemSet* IconChoiceDialog::CreateInputItemSet( USHORT ) +{ + 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( BOOL bShow ) +{ + + aCancelBtn.SetClickHdl( LINK( this, IconChoiceDialog, CancelHdl ) ); + bModal = FALSE; + + Start_Impl(); + + if ( bShow ) + Window::Show(); + +} + +// ----------------------------------------------------------------------- + +sal_Bool IconChoiceDialog::QueryClose() +{ + sal_Bool bRet = sal_True; + const ULONG nCount = maPageList.Count(); + for ( 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; + USHORT 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 = (USHORT)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 ( USHORT nId ) +{ + IconChoicePageData *pRet = NULL; + BOOL bFound = FALSE; + + for ( ULONG i=0; i<maPageList.Count() && !bFound; i++ ) + { + IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i ); + + if ( pData->nId == nId ) + { + pRet = pData; + } + } + + return pRet; +} + +/********************************************************************** +| +| OK-Status +| +\**********************************************************************/ + +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() ); + BOOL bRet = 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 |= TRUE; + } + else + nRet = pPage->DeactivatePage( NULL ); + bEnd = nRet; + } + + return bEnd; +} + +// ----------------------------------------------------------------------- + +short IconChoiceDialog::Ok() +{ + bInOK = TRUE; + + if ( !pOutSet ) + { + if ( !pExampleSet && pSet ) + pOutSet = pSet->Clone( FALSE ); // ohne Items + else if ( pExampleSet ) + pOutSet = new SfxItemSet( *pExampleSet ); + } + BOOL _bModified = FALSE; + + const ULONG nCount = maPageList.Count(); + + for ( USHORT 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 |= TRUE; + pExampleSet->Put( aTmp ); + pOutSet->Put( aTmp ); + } + } + } + } + + if ( _bModified || ( pOutSet && pOutSet->Count() > 0 ) ) + _bModified |= TRUE; + + return _bModified ? RET_OK : RET_CANCEL; +} + +// ----------------------------------------------------------------------- + +BOOL IconChoiceDialog::IsInOK() const +{ + return bInOK; +} + +// ----------------------------------------------------------------------- + +void IconChoiceDialog::FocusOnIcon( USHORT nId ) +{ + // set focus to icon for the current visible page + for ( USHORT i=0; i<maIconCtrl.GetEntryCount(); i++) + { + SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.GetEntry ( i ); + USHORT* pUserData = (USHORT*) pEntry->GetUserData(); + + if ( pUserData && *pUserData == nId ) + { + maIconCtrl.SetCursor( pEntry ); + break; + } + } +} + +// ----------------------------------------------------------------------- + +void IconChoiceDialog::CreateIconTextAutoMnemonics( void ) +{ + maIconCtrl.CreateAutoMnemonics(); +} |