1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: tabdlg.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sfx2.hxx"
36 #include <vcl/msgbox.hxx>
37 #include <svtools/viewoptions.hxx>
39 #define _SVSTDARR_USHORTS
40 #include <svtools/svstdarr.hxx>
42 #include "appdata.hxx"
43 #include "sfxtypes.hxx"
44 #include <sfx2/minarray.hxx>
45 #include <sfx2/tabdlg.hxx>
46 #include <sfx2/viewfrm.hxx>
47 #include <sfx2/app.hxx>
48 #include "sfxresid.hxx"
49 #include "sfxhelp.hxx"
50 #include <sfx2/ctrlitem.hxx>
51 #include <sfx2/bindings.hxx>
52 #include <sfx2/sfxdlg.hxx>
53 #include <sfx2/itemconnect.hxx>
58 #if ENABLE_LAYOUT_SFX_TABDIALOG
61 #define SfxTabPage ::SfxTabPage
63 #endif /* ENABLE_LAYOUT_SFX_TABDIALOG */
65 using namespace ::com::sun::star::uno
;
66 using namespace ::rtl
;
68 #define USERITEM_NAME OUString::createFromAscii( "UserItem" )
70 TYPEINIT1(LAYOUT_NS_SFX_TABDIALOG SfxTabDialogItem
,SfxSetItem
);
75 sfx::ItemConnectionArray maItemConn
;
76 ::com::sun::star::uno::Reference
< ::com::sun::star::frame::XFrame
> mxFrame
;
78 TabPageImpl() : mbStandard( FALSE
) {}
81 NAMESPACE_LAYOUT_SFX_TABDIALOG
86 CreateTabPage fnCreatePage
; // Pointer auf die Factory
87 GetTabPageRanges fnGetRanges
;// Pointer auf die Ranges-Funktion
88 SfxTabPage
* pTabPage
; // die TabPage selber
89 BOOL bOnDemand
; // Flag: ItemSet onDemand
90 BOOL bRefresh
; // Flag: Seite mu\s neu initialisiert werden
93 Data_Impl( USHORT Id
, CreateTabPage fnPage
,
94 GetTabPageRanges fnRanges
, BOOL bDemand
) :
97 fnCreatePage( fnPage
),
98 fnGetRanges ( fnRanges
),
100 bOnDemand ( bDemand
),
105 SfxAbstractDialogFactory
* pFact
= SfxAbstractDialogFactory::Create();
108 fnCreatePage
= pFact
->GetTabPageCreatorFunc( nId
);
109 fnGetRanges
= pFact
->GetTabPageRangesFunc( nId
);
115 SfxTabDialogItem::SfxTabDialogItem( const SfxTabDialogItem
& rAttr
, SfxItemPool
* pItemPool
)
116 : SfxSetItem( rAttr
, pItemPool
)
120 SfxTabDialogItem::SfxTabDialogItem( USHORT nId
, const SfxItemSet
& rItemSet
)
121 : SfxSetItem( nId
, rItemSet
)
125 SfxPoolItem
* __EXPORT
SfxTabDialogItem::Clone(SfxItemPool
* pToPool
) const
127 return new SfxTabDialogItem( *this, pToPool
);
130 SfxPoolItem
* __EXPORT
SfxTabDialogItem::Create(SvStream
& /*rStream*/, USHORT
/*nVersion*/) const
132 DBG_ERROR( "Use it only in UI!" );
136 class SfxTabDialogController
: public SfxControllerItem
138 SfxTabDialog
* pDialog
;
139 const SfxItemSet
* pSet
;
141 SfxTabDialogController( USHORT nSlotId
, SfxBindings
& rBindings
, SfxTabDialog
* pDlg
)
142 : SfxControllerItem( nSlotId
, rBindings
)
147 ~SfxTabDialogController();
149 DECL_LINK( Execute_Impl
, void* );
150 virtual void StateChanged( USHORT nSID
, SfxItemState eState
, const SfxPoolItem
* pState
);
153 SfxTabDialogController::~SfxTabDialogController()
158 IMPL_LINK( SfxTabDialogController
, Execute_Impl
, void*, pVoid
)
160 (void)pVoid
; //unused
161 if ( pDialog
->OK_Impl() && pDialog
->Ok() )
163 const SfxPoolItem
* aItems
[2];
164 SfxTabDialogItem
aItem( GetId(), *pDialog
->GetOutputItemSet() );
167 GetBindings().Execute( GetId(), aItems
);
173 void SfxTabDialogController::StateChanged( USHORT
/*nSID*/, SfxItemState
/*eState*/, const SfxPoolItem
* pState
)
175 const SfxSetItem
* pSetItem
= PTR_CAST( SfxSetItem
, pState
);
178 pSet
= pDialog
->pSet
= pSetItem
->GetItemSet().Clone();
179 BOOL bDialogStarted
= FALSE
;
180 for ( USHORT n
=0; n
<pDialog
->aTabCtrl
.GetPageCount(); n
++ )
182 USHORT nPageId
= pDialog
->aTabCtrl
.GetPageId( n
);
183 SfxTabPage
* pTabPage
= dynamic_cast<SfxTabPage
*> (pDialog
->aTabCtrl
.GetTabPage( nPageId
));
186 pTabPage
->Reset( pSetItem
->GetItemSet() );
187 bDialogStarted
= TRUE
;
191 if ( bDialogStarted
)
198 DECL_PTRARRAY(SfxTabDlgData_Impl
, Data_Impl
*, 4,4)
206 SfxTabDlgData_Impl
* pData
;
208 PushButton
* pApplyButton
;
209 SfxTabDialogController
* pController
;
211 TabDlg_Impl( BYTE nCnt
) :
216 bHideResetBtn ( FALSE
),
217 pData ( new SfxTabDlgData_Impl( nCnt
) ),
218 pApplyButton ( NULL
),
223 Data_Impl
* Find( SfxTabDlgData_Impl
& rArr
, USHORT nId
, USHORT
* pPos
= 0 );
225 Data_Impl
* Find( SfxTabDlgData_Impl
& rArr
, USHORT nId
, USHORT
* pPos
)
227 const USHORT nCount
= rArr
.Count();
229 for ( USHORT i
= 0; i
< nCount
; ++i
)
231 Data_Impl
* pObj
= rArr
[i
];
233 if ( pObj
->nId
== nId
)
243 #if !ENABLE_LAYOUT_SFX_TABDIALOG
245 void SfxTabPage::SetFrame(const ::com::sun::star::uno::Reference
< ::com::sun::star::frame::XFrame
>& xFrame
)
248 pImpl
->mxFrame
= xFrame
;
251 ::com::sun::star::uno::Reference
< ::com::sun::star::frame::XFrame
> SfxTabPage::GetFrame()
254 return pImpl
->mxFrame
;
255 return ::com::sun::star::uno::Reference
< ::com::sun::star::frame::XFrame
>();
258 SfxTabPage::SfxTabPage( Window
*pParent
,
259 const ResId
&rResId
, const SfxItemSet
&rAttrSet
) :
266 TabPage( pParent
, rResId
),
269 bHasExchangeSupport ( FALSE
),
271 pImpl ( new TabPageImpl
)
275 // -----------------------------------------------------------------------
276 SfxTabPage:: SfxTabPage( Window
*pParent
, WinBits nStyle
, const SfxItemSet
&rAttrSet
) :
277 TabPage(pParent
, nStyle
),
279 bHasExchangeSupport ( FALSE
),
281 pImpl ( new TabPageImpl
)
284 // -----------------------------------------------------------------------
286 SfxTabPage::~SfxTabPage()
296 #endif /* ENABLE_LAYOUT */
299 // -----------------------------------------------------------------------
301 BOOL
SfxTabPage::FillItemSet( SfxItemSet
& rSet
)
303 return pImpl
->maItemConn
.DoFillItemSet( rSet
, GetItemSet() );
306 // -----------------------------------------------------------------------
308 void SfxTabPage::Reset( const SfxItemSet
& rSet
)
310 pImpl
->maItemConn
.DoApplyFlags( rSet
);
311 pImpl
->maItemConn
.DoReset( rSet
);
314 // -----------------------------------------------------------------------
316 void SfxTabPage::ActivatePage( const SfxItemSet
& )
320 Defaultimplementierung der virtuellen ActivatePage-Methode
321 Diese wird gerufen, wenn eine Seite des Dialogs den Datenaustausch
322 zwischen Pages unterst"utzt.
324 <SfxTabPage::DeactivatePage(SfxItemSet *)>
330 // -----------------------------------------------------------------------
332 int SfxTabPage::DeactivatePage( SfxItemSet
* )
336 Defaultimplementierung der virtuellen DeactivatePage-Methode
337 Diese wird vor dem Verlassen einer Seite durch den Sfx gerufen;
338 die Anwendung kann "uber den Returnwert steuern,
339 ob die Seite verlassen werden soll.
340 Falls die Seite "uber bHasExchangeSupport
341 anzeigt, da\s sie einen Datenaustausch zwischen Seiten
342 unterst"utzt, wird ein Pointer auf das Austausch-Set als
343 Parameter "ubergeben. Dieser nimmt die Daten f"ur den Austausch
344 entgegen; das Set steht anschlie\send als Parameter in
345 <SfxTabPage::ActivatePage(const SfxItemSet &)> zur Verf"ugung.
349 LEAVE_PAGE; Verlassen der Seite erlauben
356 // -----------------------------------------------------------------------
358 void SfxTabPage::FillUserData()
362 virtuelle Methode, wird von der Basisklasse im Destruktor gerufen
363 um spezielle Informationen der TabPage in der Ini-Datei zu speichern.
364 Beim "Uberladen muss ein String zusammengestellt werden, der mit
365 <SetUserData()> dann weggeschrieben wird.
371 // -----------------------------------------------------------------------
373 BOOL
SfxTabPage::IsReadOnly() const
383 // -----------------------------------------------------------------------
385 const SfxPoolItem
* SfxTabPage::GetItem( const SfxItemSet
& rSet
, USHORT nSlot
, sal_Bool bDeep
)
389 static Methode: hiermit wird der Code der TabPage-Implementierungen
395 const SfxItemPool
* pPool
= rSet
.GetPool();
396 USHORT nWh
= pPool
->GetWhich( nSlot
, bDeep
);
397 const SfxPoolItem
* pItem
= 0;
402 rSet
.GetItemState( nWh
, TRUE
, &pItem
); // -Wall required??
404 if ( !pItem
&& nWh
!= nSlot
)
405 pItem
= &pPool
->GetDefaultItem( nWh
);
409 // -----------------------------------------------------------------------
411 const SfxPoolItem
* SfxTabPage::GetOldItem( const SfxItemSet
& rSet
,
412 USHORT nSlot
, sal_Bool bDeep
)
416 Diese Methode gibt f"ur Vergleiche den alten Wert eines
421 const SfxItemSet
& rOldSet
= GetItemSet();
422 USHORT nWh
= GetWhich( nSlot
, bDeep
);
423 const SfxPoolItem
* pItem
= 0;
425 if ( pImpl
->mbStandard
&& rOldSet
.GetParent() )
426 pItem
= GetItem( *rOldSet
.GetParent(), nSlot
);
427 else if ( rSet
.GetParent() &&
428 SFX_ITEM_DONTCARE
== rSet
.GetItemState( nWh
) )
429 pItem
= GetItem( *rSet
.GetParent(), nSlot
);
431 pItem
= GetItem( rOldSet
, nSlot
);
435 // -----------------------------------------------------------------------
437 const SfxPoolItem
* SfxTabPage::GetExchangeItem( const SfxItemSet
& rSet
,
442 Diese Methode gibt f"ur Vergleiche den alten Wert eines
443 Attributs zur"uck. Dabei wird ber"ucksichtigt, ob der Dialog
444 gerade mit OK beendet wurde.
448 if ( pTabDlg
&& !pTabDlg
->IsInOK() && pTabDlg
->GetExampleSet() )
449 return GetItem( *pTabDlg
->GetExampleSet(), nSlot
);
451 return GetOldItem( rSet
, nSlot
);
454 // add CHINA001 begin
455 void SfxTabPage::PageCreated( SfxAllItemSet
/*aSet*/ )
457 DBG_ASSERT(0, "SfxTabPage::PageCreated should not be called");
461 // -----------------------------------------------------------------------
463 void SfxTabPage::AddItemConnection( sfx::ItemConnectionBase
* pConnection
)
465 pImpl
->maItemConn
.AddConnection( pConnection
);
468 #endif /* !ENABLE_LAYOUT_SFX_TABDIALOG */
470 #if ENABLE_LAYOUT_SFX_TABDIALOG
472 #define ResId(id, foo) #id
474 #define TabDialog(parent, res_id) Dialog (parent, "tab-dialog.xml", "tab-dialog")
476 #define aOKBtn(this) aOKBtn (this, "BTN_OK")
478 #define PushButton(this) layout::PushButton (this, "BTN_USER")
479 #define aCancelBtn(this) aCancelBtn (this, "BTN_CANCEL")
480 #define aHelpBtn(this) aHelpBtn (this, "BTN_HELP")
481 #define aResetBtn(this) aResetBtn (this, "BTN_RESET")
482 #define aBaseFmtBtn(this) aBaseFmtBtn (this, "BTN_BASEFMT")
483 #endif /* ENABLE_LAYOUT_SFX_TABDIALOG */
485 #define INI_LIST(ItemSetPtr) \
486 aTabCtrl ( this, ResId(ID_TABCONTROL,*rResId.GetResMgr() ) ),\
488 pUserBtn ( pUserButtonText? new PushButton(this): 0 ),\
489 aCancelBtn ( this ),\
492 aBaseFmtBtn ( this ),\
493 pSet ( ItemSetPtr ),\
495 pImpl ( new TabDlg_Impl( (BYTE)aTabCtrl.GetPageCount() ) ), \
497 nResId ( rResId.GetId() ), \
498 nAppPageId ( USHRT_MAX ), \
499 bItemsReset ( FALSE ),\
503 // -----------------------------------------------------------------------
505 SfxTabDialog::SfxTabDialog
513 SfxViewFrame
* pViewFrame
, // Frame, zu dem der Dialog geh"ort
514 Window
* pParent
, // Parent-Fenster
515 const ResId
& rResId
, // ResourceId
516 const SfxItemSet
* pItemSet
, // Itemset mit den Daten;
517 // kann NULL sein, wenn Pages onDemand
518 BOOL bEditFmt
, // Flag: es werden Vorlagen bearbeitet
519 // wenn ja -> zus"atzlicher Button f"ur Standard
520 const String
* pUserButtonText
// Text fuer BenutzerButton;
521 // wenn != 0, wird der UserButton erzeugt
523 TabDialog( pParent
, rResId
),
524 pFrame( pViewFrame
),
527 Init_Impl( bFmt
, pUserButtonText
);
530 // -----------------------------------------------------------------------
532 SfxTabDialog::SfxTabDialog
536 Konstruktor, tempor"ar ohne Frame
540 Window
* pParent
, // Parent-Fenster
541 const ResId
& rResId
, // ResourceId
542 const SfxItemSet
* pItemSet
, // Itemset mit den Daten; kann NULL sein,
543 // wenn Pages onDemand
544 BOOL bEditFmt
, // Flag: es werden Vorlagen bearbeitet
545 // wenn ja -> zus"atzlicher Button f"ur Standard
546 const String
* pUserButtonText
// Text f"ur BenutzerButton;
547 // wenn != 0, wird der UserButton erzeugt
549 TabDialog( pParent
, rResId
),
553 Init_Impl( bFmt
, pUserButtonText
);
554 DBG_WARNING( "bitte den Ctor mit ViewFrame verwenden" );
557 SfxTabDialog::SfxTabDialog
561 Konstruktor, tempor"ar ohne Frame
565 Window
* pParent
, // Parent-Fenster
566 const ResId
& rResId
, // ResourceId
568 SfxBindings
& rBindings
,
569 BOOL bEditFmt
, // Flag: es werden Vorlagen bearbeitet
570 // wenn ja -> zus"atzlicher Button f"ur Standard
571 const String
* pUserButtonText
// Text f"ur BenutzerButton;
572 // wenn != 0, wird der UserButton erzeugt
574 TabDialog( pParent
, rResId
),
578 rBindings
.ENTERREGISTRATIONS();
579 pImpl
->pController
= new SfxTabDialogController( nSetId
, rBindings
, this );
580 rBindings
.LEAVEREGISTRATIONS();
582 EnableApplyButton( TRUE
);
583 SetApplyHandler( LINK( pImpl
->pController
, SfxTabDialogController
, Execute_Impl
) );
585 rBindings
.Invalidate( nSetId
);
586 rBindings
.Update( nSetId
);
587 DBG_ASSERT( pSet
, "No ItemSet!" );
589 Init_Impl( bFmt
, pUserButtonText
);
592 // -----------------------------------------------------------------------
594 #if ENABLE_LAYOUT_SFX_TABDIALOG
603 #endif /* ENABLE_LAYOUT_SFX_TABDIALOG */
605 SfxTabDialog::~SfxTabDialog()
607 // save settings (screen position and current page)
608 SvtViewOptions
aDlgOpt( E_TABDIALOG
, String::CreateFromInt32( nResId
) );
609 #if !ENABLE_LAYOUT_SFX_TABDIALOG
610 aDlgOpt
.SetWindowState( OUString::createFromAscii( GetWindowState( WINDOWSTATE_MASK_POS
).GetBuffer() ) );
611 #endif /* !ENABLE_LAYOUT_SFX_TABDIALOG */
612 aDlgOpt
.SetPageID( aTabCtrl
.GetCurPageId() );
614 const USHORT nCount
= pImpl
->pData
->Count();
615 for ( USHORT i
= 0; i
< nCount
; ++i
)
617 Data_Impl
* pDataObject
= pImpl
->pData
->GetObject(i
);
619 if ( pDataObject
->pTabPage
)
621 // save settings of all pages (user data)
622 pDataObject
->pTabPage
->FillUserData();
623 String
aPageData( pDataObject
->pTabPage
->GetUserData() );
624 if ( aPageData
.Len() )
626 // save settings of all pages (user data)
627 SvtViewOptions
aPageOpt( E_TABPAGE
, String::CreateFromInt32( pDataObject
->nId
) );
628 aPageOpt
.SetUserItem( USERITEM_NAME
, makeAny( OUString( aPageData
) ) );
631 if ( pDataObject
->bOnDemand
)
632 delete (SfxItemSet
*)&pDataObject
->pTabPage
->GetItemSet();
633 delete pDataObject
->pTabPage
;
638 delete pImpl
->pController
;
639 delete pImpl
->pApplyButton
;
648 // -----------------------------------------------------------------------
650 void SfxTabDialog::Init_Impl( BOOL bFmtFlag
, const String
* pUserButtonText
)
654 interne Initialisierung des Dialogs
658 aOKBtn
.SetClickHdl( LINK( this, SfxTabDialog
, OkHdl
) );
659 aResetBtn
.SetClickHdl( LINK( this, SfxTabDialog
, ResetHdl
) );
660 aResetBtn
.SetText( String( SfxResId( STR_RESET
) ) );
661 aTabCtrl
.SetActivatePageHdl(
662 LINK( this, SfxTabDialog
, ActivatePageHdl
) );
663 aTabCtrl
.SetDeactivatePageHdl(
664 LINK( this, SfxTabDialog
, DeactivatePageHdl
) );
670 aResetBtn
.SetHelpId( HID_TABDLG_RESET_BTN
);
674 pUserBtn
->SetText( *pUserButtonText
);
675 pUserBtn
->SetClickHdl( LINK( this, SfxTabDialog
, UserHdl
) );
679 /* TODO: Check what is up with bFmt/bFmtFlag. Comment below suggests a
680 different behavior than implemented!! */
683 String
aStd( SfxResId( STR_STANDARD_SHORTCUT
) );
684 aBaseFmtBtn
.SetText( aStd
);
685 aBaseFmtBtn
.SetClickHdl( LINK( this, SfxTabDialog
, BaseFmtHdl
) );
686 aBaseFmtBtn
.SetHelpId( HID_TABDLG_STANDARD_BTN
);
688 // bFmt = tempor"ares Flag im Ctor() "ubergeben,
689 // wenn bFmt == 2, dann auch TRUE,
690 // zus"atzlich Ausblendung vom StandardButton,
691 // nach der Initialisierung wieder auf TRUE setzen
700 pExampleSet
= new SfxItemSet( *pSet
);
701 pOutSet
= new SfxItemSet( *pSet
->GetPool(), pSet
->GetRanges() );
705 // -----------------------------------------------------------------------
707 void SfxTabDialog::RemoveResetButton()
710 pImpl
->bHideResetBtn
= TRUE
;
713 // -----------------------------------------------------------------------
715 #if ENABLE_LAYOUT_SFX_TABDIALOG
717 #define TabDialog Dialog
718 #endif /* ENABLE_LAYOUT_SFX_TABDIALOG */
720 short SfxTabDialog::Execute()
722 if ( !aTabCtrl
.GetPageCount() )
725 return TabDialog::Execute();
728 // -----------------------------------------------------------------------
730 void SfxTabDialog::StartExecuteModal( const Link
& rEndDialogHdl
)
732 #if !ENABLE_LAYOUT_SFX_TABDIALOG
733 if ( !aTabCtrl
.GetPageCount() )
736 TabDialog::StartExecuteModal( rEndDialogHdl
);
738 rEndDialogHdl
.IsSet();
739 #endif /* !ENABLE_LAYOUT_SFX_TABDIALOG */
742 // -----------------------------------------------------------------------
744 void SfxTabDialog::Start( BOOL bShow
)
746 aCancelBtn
.SetClickHdl( LINK( this, SfxTabDialog
, CancelHdl
) );
747 pImpl
->bModal
= FALSE
;
754 // -----------------------------------------------------------------------
756 void SfxTabDialog::SetApplyHandler(const Link
& _rHdl
)
758 DBG_ASSERT( pImpl
->pApplyButton
, "SfxTabDialog::GetApplyHandler: no apply button enabled!" );
759 if ( pImpl
->pApplyButton
)
760 pImpl
->pApplyButton
->SetClickHdl( _rHdl
);
763 // -----------------------------------------------------------------------
765 Link
SfxTabDialog::GetApplyHandler() const
767 DBG_ASSERT( pImpl
->pApplyButton
, "SfxTabDialog::GetApplyHandler: no button enabled!" );
768 if ( !pImpl
->pApplyButton
)
771 return pImpl
->pApplyButton
->GetClickHdl();
774 // -----------------------------------------------------------------------
776 void SfxTabDialog::EnableApplyButton(BOOL bEnable
)
778 if ( IsApplyButtonEnabled() == bEnable
)
782 // create or remove the apply button
785 pImpl
->pApplyButton
= new PushButton( this );
786 #if !ENABLE_LAYOUT_SFX_TABDIALOG
787 // in the z-order, the apply button should be behind the ok button, thus appearing at the right side of it
788 pImpl
->pApplyButton
->SetZOrder(&aOKBtn
, WINDOW_ZORDER_BEHIND
);
789 #endif /* ENABLE_LAYOUT_SFX_TABDIALOG */
790 pImpl
->pApplyButton
->SetText( String( SfxResId( STR_APPLY
) ) );
791 pImpl
->pApplyButton
->Show();
793 pImpl
->pApplyButton
->SetHelpId( HID_TABDLG_APPLY_BTN
);
797 delete pImpl
->pApplyButton
;
798 pImpl
->pApplyButton
= NULL
;
801 #if !ENABLE_LAYOUT_SFX_TABDIALOG
805 #endif /* !ENABLE_LAYOUT_SFX_TABDIALOG */
808 // -----------------------------------------------------------------------
810 BOOL
SfxTabDialog::IsApplyButtonEnabled() const
812 return ( NULL
!= pImpl
->pApplyButton
);
815 // -----------------------------------------------------------------------
817 const PushButton
* SfxTabDialog::GetApplyButton() const
819 return pImpl
->pApplyButton
;
822 // -----------------------------------------------------------------------
824 PushButton
* SfxTabDialog::GetApplyButton()
826 return pImpl
->pApplyButton
;
829 // -----------------------------------------------------------------------
831 void SfxTabDialog::Start_Impl()
833 DBG_ASSERT( pImpl
->pData
->Count() == aTabCtrl
.GetPageCount(), "not all pages registered" );
834 USHORT nActPage
= aTabCtrl
.GetPageId( 0 );
836 // load old settings, when exists
837 SvtViewOptions
aDlgOpt( E_TABDIALOG
, String::CreateFromInt32( nResId
) );
838 if ( aDlgOpt
.Exists() )
840 #if !ENABLE_LAYOUT_SFX_TABDIALOG
841 SetWindowState( ByteString( aDlgOpt
.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US
) );
842 #endif /* !ENABLE_LAYOUT_SFX_TABDIALOG */
844 // initiale TabPage aus Programm/Hilfe/Konfig
845 nActPage
= (USHORT
)aDlgOpt
.GetPageID();
847 if ( USHRT_MAX
!= nAppPageId
)
848 nActPage
= nAppPageId
;
851 USHORT nAutoTabPageId
= SFX_APP()->Get_Impl()->nAutoTabPageId
;
852 if ( nAutoTabPageId
)
853 nActPage
= nAutoTabPageId
;
856 if ( TAB_PAGE_NOTFOUND
== aTabCtrl
.GetPagePos( nActPage
) )
857 nActPage
= aTabCtrl
.GetPageId( 0 );
859 else if ( USHRT_MAX
!= nAppPageId
&& TAB_PAGE_NOTFOUND
!= aTabCtrl
.GetPagePos( nAppPageId
) )
860 nActPage
= nAppPageId
;
862 aTabCtrl
.SetCurPageId( nActPage
);
863 ActivatePageHdl( &aTabCtrl
);
866 void SfxTabDialog::AddTabPage( USHORT nId
, BOOL bItemsOnDemand
)
868 AddTabPage( nId
, 0, 0, bItemsOnDemand
);
871 void SfxTabDialog::AddTabPage( USHORT nId
, const String
&rRiderText
, BOOL bItemsOnDemand
, USHORT nPos
)
873 AddTabPage( nId
, rRiderText
, 0, 0, bItemsOnDemand
, nPos
);
876 #ifdef SV_HAS_RIDERBITMAPS
878 void SfxTabDialog::AddTabPage( USHORT nId
, const Bitmap
&rRiderBitmap
, BOOL bItemsOnDemand
, USHORT nPos
)
880 AddTabPage( nId
, rRiderBitmap
, 0, 0, bItemsOnDemand
, nPos
);
885 // -----------------------------------------------------------------------
887 void SfxTabDialog::AddTabPage
891 Hinzuf"ugen einer Seite zu dem Dialog.
892 Mu\s korrespondieren zu einem entsprechende Eintrag im
893 TabControl in der Resource des Dialogs.
897 USHORT nId
, // ID der Seite
898 CreateTabPage pCreateFunc
, // Pointer auf die Factory-Methode
899 GetTabPageRanges pRangesFunc
, // Pointer auf die Methode f"ur das
900 // Erfragen der Ranges onDemand
901 BOOL bItemsOnDemand
// gibt an, ob das Set dieser Seite beim
902 // Erzeugen der Seite erfragt wird
905 pImpl
->pData
->Append(
906 new Data_Impl( nId
, pCreateFunc
, pRangesFunc
, bItemsOnDemand
) );
909 // -----------------------------------------------------------------------
911 void SfxTabDialog::AddTabPage
915 Hinzuf"ugen einer Seite zu dem Dialog.
916 Der Ridertext wird "ubergeben, die Seite hat keine Entsprechung im
917 TabControl in der Resource des Dialogs.
922 const String
& rRiderText
,
923 CreateTabPage pCreateFunc
,
924 GetTabPageRanges pRangesFunc
,
929 DBG_ASSERT( TAB_PAGE_NOTFOUND
== aTabCtrl
.GetPagePos( nId
),
930 "Doppelte Page-Ids in der Tabpage" );
931 aTabCtrl
.InsertPage( nId
, rRiderText
, nPos
);
932 pImpl
->pData
->Append(
933 new Data_Impl( nId
, pCreateFunc
, pRangesFunc
, bItemsOnDemand
) );
936 // -----------------------------------------------------------------------
937 #ifdef SV_HAS_RIDERBITMAPS
939 void SfxTabDialog::AddTabPage
943 Hinzuf"ugen einer Seite zu dem Dialog.
944 Die Riderbitmap wird "ubergeben, die Seite hat keine Entsprechung im
945 TabControl in der Resource des Dialogs.
950 const Bitmap
&rRiderBitmap
,
951 CreateTabPage pCreateFunc
,
952 GetTabPageRanges pRangesFunc
,
957 DBG_ASSERT( TAB_PAGE_NOTFOUND
== aTabCtrl
.GetPagePos( nId
),
958 "Doppelte Page-Ids in der Tabpage" );
959 aTabCtrl
.InsertPage( nId
, rRiderBitmap
, nPos
);
960 pImpl
->pData
->Append(
961 new Data_Impl( nId
, pCreateFunc
, pRangesFunc
, bItemsOnDemand
) );
965 // -----------------------------------------------------------------------
967 void SfxTabDialog::RemoveTabPage( USHORT nId
)
971 L"oschen der TabPage mit der ID nId
976 aTabCtrl
.RemovePage( nId
);
977 Data_Impl
* pDataObject
= Find( *pImpl
->pData
, nId
, &nPos
);
981 if ( pDataObject
->pTabPage
)
983 pDataObject
->pTabPage
->FillUserData();
984 String
aPageData( pDataObject
->pTabPage
->GetUserData() );
985 if ( aPageData
.Len() )
987 // save settings of this page (user data)
988 SvtViewOptions
aPageOpt( E_TABPAGE
, String::CreateFromInt32( pDataObject
->nId
) );
989 aPageOpt
.SetUserItem( USERITEM_NAME
, makeAny( OUString( aPageData
) ) );
992 if ( pDataObject
->bOnDemand
)
993 delete (SfxItemSet
*)&pDataObject
->pTabPage
->GetItemSet();
994 delete pDataObject
->pTabPage
;
998 pImpl
->pData
->Remove( nPos
);
1002 DBG_WARNINGFILE( "TabPage-Id nicht bekannt" );
1006 // -----------------------------------------------------------------------
1008 void SfxTabDialog::PageCreated
1012 Defaultimplemetierung der virtuellen Methode.
1013 Diese wird unmittelbar nach dem Erzeugen einer Seite gerufen.
1014 Hier kann der Dialog direkt an der TabPage Methoden rufen.
1018 USHORT
, // Id der erzeugten Seite
1019 SfxTabPage
& // Referenz auf die erzeugte Seite
1024 // -----------------------------------------------------------------------
1026 SfxItemSet
* SfxTabDialog::GetInputSetImpl()
1030 Abgeleitete Klassen legen ggf. fuer den InputSet neuen Speicher an.
1031 Dieser mu\s im Destruktor auch wieder freigegeben werden. Dazu mu\s
1032 diese Methode gerufen werden.
1036 return (SfxItemSet
*)pSet
;
1039 // -----------------------------------------------------------------------
1041 SfxTabPage
* SfxTabDialog::GetTabPage( USHORT nPageId
) const
1045 TabPage mit der "Ubergebenen Id zur"uckgeben.
1050 Data_Impl
* pDataObject
= Find( *pImpl
->pData
, nPageId
, &nPos
);
1053 return pDataObject
->pTabPage
;
1057 // -----------------------------------------------------------------------
1059 BOOL
SfxTabDialog::IsInOK() const
1066 return pImpl
->bInOK
;
1069 // -----------------------------------------------------------------------
1071 short SfxTabDialog::Ok()
1075 Ok-Handler des Dialogs
1076 Das OutputSet wird erstellt und jede Seite wird mit
1077 dem bzw. ihrem speziellen OutputSet durch Aufruf der Methode
1078 <SfxTabPage::FillItemSet(SfxItemSet &)> dazu aufgefordert,
1079 die vom Benuzter eingestellten Daten in das Set zu tun.
1083 RET_OK: wenn mindestens eine Seite TRUE als Returnwert von
1084 FillItemSet geliefert hat, sonst RET_CANCEL.
1088 pImpl
->bInOK
= TRUE
;
1092 if ( !pExampleSet
&& pSet
)
1093 pOutSet
= pSet
->Clone( FALSE
); // ohne Items
1094 else if ( pExampleSet
)
1095 pOutSet
= new SfxItemSet( *pExampleSet
);
1097 BOOL bModified
= FALSE
;
1099 const USHORT nCount
= pImpl
->pData
->Count();
1101 for ( USHORT i
= 0; i
< nCount
; ++i
)
1103 Data_Impl
* pDataObject
= pImpl
->pData
->GetObject(i
);
1104 SfxTabPage
* pTabPage
= pDataObject
->pTabPage
;
1108 if ( pDataObject
->bOnDemand
)
1110 SfxItemSet
& rSet
= (SfxItemSet
&)pTabPage
->GetItemSet();
1112 bModified
|= pTabPage
->FillItemSet( rSet
);
1114 else if ( pSet
&& !pTabPage
->HasExchangeSupport() )
1116 SfxItemSet
aTmp( *pSet
->GetPool(), pSet
->GetRanges() );
1118 if ( pTabPage
->FillItemSet( aTmp
) )
1121 pExampleSet
->Put( aTmp
);
1122 pOutSet
->Put( aTmp
);
1128 if ( pImpl
->bModified
|| ( pOutSet
&& pOutSet
->Count() > 0 ) )
1133 return bModified
? RET_OK
: RET_CANCEL
;
1136 // -----------------------------------------------------------------------
1138 IMPL_LINK( SfxTabDialog
, CancelHdl
, Button
*, pButton
)
1140 (void)pButton
; //unused
1145 // -----------------------------------------------------------------------
1147 SfxItemSet
* SfxTabDialog::CreateInputItemSet( USHORT
)
1151 Defaultimplemetierung der virtuellen Methode.
1152 Diese wird gerufen, wenn Pages ihre Sets onDenamd anlegen
1156 DBG_WARNINGFILE( "CreateInputItemSet nicht implementiert" );
1157 return new SfxAllItemSet( SFX_APP()->GetPool() );
1160 // -----------------------------------------------------------------------
1162 const SfxItemSet
* SfxTabDialog::GetRefreshedSet()
1166 Defaultimplemetierung der virtuellen Methode.
1167 Diese wird gerufen, wenn <SfxTabPage::DeactivatePage(SfxItemSet *)>
1168 <SfxTabPage::REFRESH_SET> liefert.
1172 DBG_ERRORFILE( "GetRefreshedSet nicht implementiert" );
1176 // -----------------------------------------------------------------------
1178 IMPL_LINK( SfxTabDialog
, OkHdl
, Button
*, EMPTYARG
)
1182 Handler des Ok-Buttons
1183 Dieser ruft f"ur die aktuelle Seite
1184 <SfxTabPage::DeactivatePage(SfxItemSet *)>.
1185 Liefert diese <SfxTabPage::LEAVE_PAGE>, wird <SfxTabDialog::Ok()> gerufen
1186 und so der Dialog beendet.
1190 pImpl
->bInOK
= TRUE
;
1194 if ( pImpl
->bModal
)
1205 // -----------------------------------------------------------------------
1207 bool SfxTabDialog::PrepareLeaveCurrentPage()
1209 USHORT
const nId
= aTabCtrl
.GetCurPageId();
1210 SfxTabPage
* pPage
= dynamic_cast<SfxTabPage
*> (aTabCtrl
.GetTabPage( nId
));
1215 int nRet
= SfxTabPage::LEAVE_PAGE
;
1218 SfxItemSet
aTmp( *pSet
->GetPool(), pSet
->GetRanges() );
1220 if ( pPage
->HasExchangeSupport() )
1221 nRet
= pPage
->DeactivatePage( &aTmp
);
1223 nRet
= pPage
->DeactivatePage( NULL
);
1225 if ( ( SfxTabPage::LEAVE_PAGE
& nRet
) == SfxTabPage::LEAVE_PAGE
1228 pExampleSet
->Put( aTmp
);
1229 pOutSet
->Put( aTmp
);
1233 nRet
= pPage
->DeactivatePage( NULL
);
1241 // -----------------------------------------------------------------------
1243 IMPL_LINK( SfxTabDialog
, UserHdl
, Button
*, EMPTYARG
)
1247 Handler des User-Buttons
1248 Dieser ruft f"ur die aktuelle Seite
1249 <SfxTabPage::DeactivatePage(SfxItemSet *)>.
1250 Liefert diese <SfxTabPage::LEAVE_PAGE>, wird <SfxTabDialog::Ok()> gerufen.
1251 Mit dem Return-Wert von <SfxTabDialog::Ok()> wird dann der Dialog beendet.
1255 if ( PrepareLeaveCurrentPage () )
1259 if ( RET_OK
== nRet
)
1262 nRet
= RET_USER_CANCEL
;
1268 // -----------------------------------------------------------------------
1270 IMPL_LINK( SfxTabDialog
, ResetHdl
, Button
*, EMPTYARG
)
1274 Handler hinter dem Zur"ucksetzen-Button.
1275 Die aktuelle Page wird mit ihren initialen Daten
1276 neu initialisiert; alle Einstellungen, die der Benutzer
1277 auf dieser Seite get"atigt hat, werden aufgehoben.
1281 const USHORT nId
= aTabCtrl
.GetCurPageId();
1282 Data_Impl
* pDataObject
= Find( *pImpl
->pData
, nId
);
1283 DBG_ASSERT( pDataObject
, "Id nicht bekannt" );
1285 if ( pDataObject
->bOnDemand
)
1287 // CSet auf AIS hat hier Probleme, daher getrennt
1288 const SfxItemSet
* pItemSet
= &pDataObject
->pTabPage
->GetItemSet();
1289 pDataObject
->pTabPage
->Reset( *(SfxItemSet
*)pItemSet
);
1292 pDataObject
->pTabPage
->Reset( *pSet
);
1296 // -----------------------------------------------------------------------
1298 IMPL_LINK( SfxTabDialog
, BaseFmtHdl
, Button
*, EMPTYARG
)
1302 Handler hinter dem Standard-Button.
1303 Dieser Button steht beim Bearbeiten von StyleSheets zur Verf"ugung.
1304 Alle in dem bearbeiteten StyleSheet eingestellten Attribute
1309 const USHORT nId
= aTabCtrl
.GetCurPageId();
1310 Data_Impl
* pDataObject
= Find( *pImpl
->pData
, nId
);
1311 DBG_ASSERT( pDataObject
, "Id nicht bekannt" );
1314 if ( pDataObject
->fnGetRanges
)
1317 pExampleSet
= new SfxItemSet( *pSet
);
1319 const SfxItemPool
* pPool
= pSet
->GetPool();
1320 const USHORT
* pTmpRanges
= (pDataObject
->fnGetRanges
)();
1321 SfxItemSet
aTmpSet( *pExampleSet
);
1323 while ( *pTmpRanges
)
1325 const USHORT
* pU
= pTmpRanges
+ 1;
1327 if ( *pTmpRanges
== *pU
)
1329 // Range mit zwei gleichen Werten -> nur ein Item setzen
1330 USHORT nWh
= pPool
->GetWhich( *pTmpRanges
);
1331 pExampleSet
->ClearItem( nWh
);
1332 aTmpSet
.ClearItem( nWh
);
1333 // am OutSet mit InvalidateItem,
1334 // damit die "Anderung wirksam wird
1335 pOutSet
->InvalidateItem( nWh
);
1339 // richtiger Range mit mehreren Werten
1340 USHORT nTmp
= *pTmpRanges
, nTmpEnd
= *pU
;
1341 DBG_ASSERT( nTmp
<= nTmpEnd
, "Range ist falsch sortiert" );
1343 if ( nTmp
> nTmpEnd
)
1345 // wenn wirklich falsch sortiert, dann neu setzen
1346 USHORT nTmp1
= nTmp
;
1351 while ( nTmp
<= nTmpEnd
)
1353 // "uber den Range iterieren, und die Items setzen
1354 USHORT nWh
= pPool
->GetWhich( nTmp
);
1355 pExampleSet
->ClearItem( nWh
);
1356 aTmpSet
.ClearItem( nWh
);
1357 // am OutSet mit InvalidateItem,
1358 // damit die "Anderung wirksam wird
1359 pOutSet
->InvalidateItem( nWh
);
1363 // zum n"achsten Paar gehen
1366 // alle Items neu gesetzt -> dann an der aktuellen Page Reset() rufen
1367 DBG_ASSERT( pDataObject
->pTabPage
, "die Page ist weg" );
1368 pDataObject
->pTabPage
->Reset( aTmpSet
);
1369 pDataObject
->pTabPage
->pImpl
->mbStandard
= TRUE
;
1374 // -----------------------------------------------------------------------
1376 #if ENABLE_LAYOUT_SFX_TABDIALOG
1377 #define tabControlWindow pTabCtrl->GetWindow ()
1378 #else /* !ENABLE_LAYOUT_SFX_TABDIALOG */
1379 #define tabControlWindow pTabCtrl
1380 #endif /* !ENABLE_LAYOUT_SFX_TABDIALOG */
1382 IMPL_LINK( SfxTabDialog
, ActivatePageHdl
, TabControl
*, pTabCtrl
)
1386 Handler, der vor dem Umschalten auf eine andere Seite
1387 durch Starview gerufen wird.
1388 Existiert die Seite noch nicht, so wird sie erzeugt und
1389 die virtuelle Methode <SfxTabDialog::PageCreated( USHORT, SfxTabPage &)>
1390 gerufen. Existiert die Seite bereits, so wird ggf.
1391 <SfxTabPage::Reset(const SfxItemSet &)> oder
1392 <SfxTabPage::ActivatePage(const SfxItemSet &)> gerufen.
1396 USHORT
const nId
= pTabCtrl
->GetCurPageId();
1398 DBG_ASSERT( pImpl
->pData
->Count(), "keine Pages angemeldet" );
1401 // Tab Page schon da?
1402 SfxTabPage
* pTabPage
= dynamic_cast<SfxTabPage
*> (pTabCtrl
->GetTabPage( nId
));
1403 Data_Impl
* pDataObject
= Find( *pImpl
->pData
, nId
);
1404 DBG_ASSERT( pDataObject
, "Id nicht bekannt" );
1406 // ggf. TabPage erzeugen:
1409 #if ENABLE_LAYOUT_SFX_TABDIALOG
1410 if (dynamic_cast<layout SfxTabPage
*> (pTabPage
))
1411 layout::TabPage::global_parent
= pTabCtrl
->GetWindow ();
1413 const SfxItemSet
* pTmpSet
= 0;
1417 if ( bItemsReset
&& pSet
->GetParent() )
1418 pTmpSet
= pSet
->GetParent();
1423 if ( pTmpSet
&& !pDataObject
->bOnDemand
)
1424 pTabPage
= (pDataObject
->fnCreatePage
)( tabControlWindow
, *pTmpSet
);
1426 pTabPage
= (pDataObject
->fnCreatePage
)
1427 ( tabControlWindow
, *CreateInputItemSet( nId
) );
1428 DBG_ASSERT( NULL
== pDataObject
->pTabPage
, "create TabPage more than once" );
1429 pDataObject
->pTabPage
= pTabPage
;
1431 #if !ENABLE_LAYOUT_SFX_TABDIALOG
1432 pDataObject
->pTabPage
->SetTabDialog( this );
1433 #endif /* ENABLE_LAYOUT_SFX_TABDIALOG */
1434 SvtViewOptions
aPageOpt( E_TABPAGE
, String::CreateFromInt32( pDataObject
->nId
) );
1436 Any aUserItem
= aPageOpt
.GetUserItem( USERITEM_NAME
);
1438 if ( aUserItem
>>= aTemp
)
1439 sUserData
= String( aTemp
);
1440 pTabPage
->SetUserData( sUserData
);
1441 Size aSiz
= pTabPage
->GetSizePixel();
1444 Size optimalSize
= pTabPage
->GetOptimalSize (WINDOWSIZE_MINIMUM
);
1445 #if ENABLE_LAYOUT_SFX_TABDIALOG
1446 if (dynamic_cast<layout SfxTabPage
*> (pTabPage
))
1448 if (optimalSize
.Height () && optimalSize
.Width ())
1450 optimalSize
.Width () = optimalSize
.Width ();
1451 optimalSize
.Height () = optimalSize
.Height () + 40;
1454 #endif /* ENABLE_LAYOUT_SFX_TABDIALOG */
1455 if (optimalSize
.Height () > 0 && optimalSize
.Width () > 0 )
1457 #endif /* ENABLE_LAYOUT */
1459 Size aCtrlSiz
= pTabCtrl
->GetTabPageSizePixel();
1460 // Gr"o/se am TabControl nur dann setzen, wenn < als TabPage
1461 if ( aCtrlSiz
.Width() < aSiz
.Width() ||
1462 aCtrlSiz
.Height() < aSiz
.Height() )
1464 pTabCtrl
->SetTabPageSizePixel( aSiz
);
1467 PageCreated( nId
, *pTabPage
);
1469 if ( pDataObject
->bOnDemand
)
1470 pTabPage
->Reset( (SfxItemSet
&)pTabPage
->GetItemSet() );
1472 pTabPage
->Reset( *pSet
);
1474 pTabCtrl
->SetTabPage( nId
, pTabPage
);
1476 else if ( pDataObject
->bRefresh
)
1477 pTabPage
->Reset( *pSet
);
1478 pDataObject
->bRefresh
= FALSE
;
1480 #if ENABLE_LAYOUT_SFX_TABDIALOG
1481 pTabCtrl
->GetPagePos (nId
);
1482 #endif /* ENABLE_LAYOUT_SFX_TABDIALOG */
1485 pTabPage
->ActivatePage( *pExampleSet
);
1486 BOOL bReadOnly
= pTabPage
->IsReadOnly();
1487 ( bReadOnly
|| pImpl
->bHideResetBtn
) ? aResetBtn
.Hide() : aResetBtn
.Show();
1491 // -----------------------------------------------------------------------
1493 IMPL_LINK( SfxTabDialog
, DeactivatePageHdl
, TabControl
*, pTabCtrl
)
1497 Handler, der vor dem Verlassen einer Seite durch Starview gerufen wird.
1501 <SfxTabPage::DeactivatePage(SfxItemSet *)>
1505 USHORT nId
= pTabCtrl
->GetCurPageId();
1507 SfxTabPage
*pPage
= dynamic_cast<SfxTabPage
*> (pTabCtrl
->GetTabPage( nId
));
1508 DBG_ASSERT( pPage
, "keine aktive Page" );
1510 Data_Impl
* pDataObject
= Find( *pImpl
->pData
, pTabCtrl
->GetCurPageId() );
1511 DBG_ASSERT( pDataObject
, "keine Datenstruktur zur aktuellen Seite" );
1512 if ( pPage
->HasExchangeSupport() && pDataObject
->bOnDemand
)
1514 DBG_WARNING( "Datenaustausch bei ItemsOnDemand ist nicht gewuenscht!" );
1518 int nRet
= SfxTabPage::LEAVE_PAGE
;
1520 if ( !pExampleSet
&& pPage
->HasExchangeSupport() && pSet
)
1521 pExampleSet
= new SfxItemSet( *pSet
->GetPool(), pSet
->GetRanges() );
1525 SfxItemSet
aTmp( *pSet
->GetPool(), pSet
->GetRanges() );
1527 if ( pPage
->HasExchangeSupport() )
1528 nRet
= pPage
->DeactivatePage( &aTmp
);
1530 nRet
= pPage
->DeactivatePage( NULL
);
1532 //! pPage->FillItemSet( aTmp );
1534 if ( ( SfxTabPage::LEAVE_PAGE
& nRet
) == SfxTabPage::LEAVE_PAGE
&&
1537 pExampleSet
->Put( aTmp
);
1538 pOutSet
->Put( aTmp
);
1543 if ( pPage
->HasExchangeSupport() ) //!!!
1547 SfxItemPool
* pPool
= pPage
->GetItemSet().GetPool();
1549 new SfxItemSet( *pPool
, GetInputRanges( *pPool
) );
1551 nRet
= pPage
->DeactivatePage( pExampleSet
);
1554 nRet
= pPage
->DeactivatePage( NULL
);
1557 if ( nRet
& SfxTabPage::REFRESH_SET
)
1559 pSet
= GetRefreshedSet();
1560 DBG_ASSERT( pSet
, "GetRefreshedSet() liefert NULL" );
1561 // alle Pages als neu zu initialsieren flaggen
1562 const USHORT nCount
= pImpl
->pData
->Count();
1564 for ( USHORT i
= 0; i
< nCount
; ++i
)
1566 Data_Impl
* pObj
= (*pImpl
->pData
)[i
];
1568 if ( pObj
->pTabPage
!= pPage
) // eigene Page nicht mehr refreshen
1569 pObj
->bRefresh
= TRUE
;
1571 pObj
->bRefresh
= FALSE
;
1574 if ( nRet
& SfxTabPage::LEAVE_PAGE
)
1580 // -----------------------------------------------------------------------
1582 const SfxItemSet
* SfxTabDialog::GetOutputItemSet
1586 Liefert die Pages, die ihre Sets onDemand liefern, das OutputItemSet.
1590 <SfxTabDialog::AddTabPage(USHORT, CreateTabPage, GetTabPageRanges, BOOL)>
1591 <SfxTabDialog::AddTabPage(USHORT, const String &, CreateTabPage, GetTabPageRanges, BOOL, USHORT)>
1592 <SfxTabDialog::AddTabPage(USHORT, const Bitmap &, CreateTabPage, GetTabPageRanges, BOOL, USHORT)>
1596 USHORT nId
// die Id, unter der die Seite bei AddTabPage()
1597 // hinzugef"ugt wurde.
1600 Data_Impl
* pDataObject
= Find( *pImpl
->pData
, nId
);
1601 DBG_ASSERT( pDataObject
, "TabPage nicht gefunden" );
1605 if ( !pDataObject
->pTabPage
)
1608 if ( pDataObject
->bOnDemand
)
1609 return &pDataObject
->pTabPage
->GetItemSet();
1616 // -----------------------------------------------------------------------
1618 int SfxTabDialog::FillOutputItemSet()
1620 int nRet
= SfxTabPage::LEAVE_PAGE
;
1624 nRet
= SfxTabPage::KEEP_PAGE
;
1628 // -----------------------------------------------------------------------
1631 int __cdecl
TabDlgCmpUS_Impl( const void* p1
, const void* p2
)
1633 #if defined(OS2) && defined(ICC)
1634 int _Optlink
TabDlgCmpUS_Impl( const void* p1
, const void* p2
)
1636 extern "C" int TabDlgCmpUS_Impl( const void* p1
, const void* p2
)
1642 Vergleichsfunktion f"ur qsort
1646 return *(USHORT
*)p1
- *(USHORT
*)p2
;
1649 // -----------------------------------------------------------------------
1651 void SfxTabDialog::ShowPage( USHORT nId
)
1655 Es wird die TabPage mit der "ubergebenen Id aktiviert.
1659 aTabCtrl
.SetCurPageId( nId
);
1660 ActivatePageHdl( &aTabCtrl
);
1663 // -----------------------------------------------------------------------
1665 const USHORT
* SfxTabDialog::GetInputRanges( const SfxItemPool
& rPool
)
1669 Bildet das Set "uber die Ranges aller Seiten des Dialogs.
1670 Die Pages m"ussen die statische Methode f"ur das Erfragen ihrer
1671 Ranges bei AddTabPage angegeben haben, liefern also ihre Sets onDemand.
1675 <SfxTabDialog::AddTabPage(USHORT, CreateTabPage, GetTabPageRanges, BOOL)>
1676 <SfxTabDialog::AddTabPage(USHORT, const String &, CreateTabPage, GetTabPageRanges, BOOL, USHORT)>
1677 <SfxTabDialog::AddTabPage(USHORT, const Bitmap &, CreateTabPage, GetTabPageRanges, BOOL, USHORT)>
1681 Pointer auf nullterminiertes Array von USHORTs
1682 Dieses Array geh"ort dem Dialog und wird beim
1683 Zerst"oren des Dialogs gel"oscht.
1689 DBG_ERRORFILE( "Set bereits vorhanden!" );
1690 return pSet
->GetRanges();
1695 SvUShorts
aUS( 16, 16 );
1696 USHORT nCount
= pImpl
->pData
->Count();
1699 for ( i
= 0; i
< nCount
; ++i
)
1701 Data_Impl
* pDataObject
= pImpl
->pData
->GetObject(i
);
1703 if ( pDataObject
->fnGetRanges
)
1705 const USHORT
* pTmpRanges
= (pDataObject
->fnGetRanges
)();
1706 const USHORT
* pIter
= pTmpRanges
;
1709 for( nLen
= 0; *pIter
; ++nLen
, ++pIter
)
1711 aUS
.Insert( pTmpRanges
, nLen
, aUS
.Count() );
1715 //! Doppelte Ids entfernen?
1717 if ( rPool
.HasMap() )
1720 nCount
= aUS
.Count();
1722 for ( i
= 0; i
< nCount
; ++i
)
1723 aUS
[i
] = rPool
.GetWhich( aUS
[i
] );
1727 if ( aUS
.Count() > 1 )
1728 qsort( (void*)aUS
.GetData(),
1729 aUS
.Count(), sizeof(USHORT
), TabDlgCmpUS_Impl
);
1732 //!! Auskommentiert, da fehlerhaft
1734 pRanges = new USHORT[aUS.Count() * 2 + 1];
1738 while ( i < aUS.Count() )
1740 pRanges[j++] = aUS[i];
1741 // aufeinanderfolgende Zahlen
1742 for( ; i < aUS.Count()-1; ++i )
1743 if ( aUS[i] + 1 != aUS[i+1] )
1745 pRanges[j++] = aUS[i++];
1747 pRanges[j] = 0; // terminierende NULL
1750 pRanges
= new USHORT
[aUS
.Count() + 1];
1751 memcpy(pRanges
, aUS
.GetData(), sizeof(USHORT
) * aUS
.Count());
1752 pRanges
[aUS
.Count()] = 0;
1756 // -----------------------------------------------------------------------
1758 void SfxTabDialog::SetInputSet( const SfxItemSet
* pInSet
)
1762 Mit dieser Methode kann nachtr"aglich der Input-Set initial oder
1767 FASTBOOL bSet
= ( pSet
!= NULL
);
1771 if ( !bSet
&& !pExampleSet
&& !pOutSet
)
1773 pExampleSet
= new SfxItemSet( *pSet
);
1774 pOutSet
= new SfxItemSet( *pSet
->GetPool(), pSet
->GetRanges() );
1778 long SfxTabDialog::Notify( NotifyEvent
& rNEvt
)
1780 if ( rNEvt
.GetType() == EVENT_GETFOCUS
)
1782 SfxViewFrame
* pViewFrame
= GetViewFrame() ? GetViewFrame() : SfxViewFrame::Current();
1785 Window
* pWindow
= rNEvt
.GetWindow();
1787 while ( !nHelpId
&& pWindow
)
1789 nHelpId
= pWindow
->GetHelpId();
1790 pWindow
= pWindow
->GetParent();
1794 SfxHelp::OpenHelpAgent( pViewFrame
->GetFrame(), nHelpId
);
1798 return TabDialog::Notify( rNEvt
);
1801 END_NAMESPACE_LAYOUT_SFX_TABDIALOG