merge the formfield patch from ooo-build
[ooovba.git] / sfx2 / source / dialog / tabdlg.cxx
blob6e52807a5c287dc372a95876b7a643f7bfdf1638
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 $
10 * $Revision: 1.38 $
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"
34 #include <limits.h>
35 #include <stdlib.h>
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>
55 #include "dialog.hrc"
56 #include "helpid.hrc"
58 #if ENABLE_LAYOUT_SFX_TABDIALOG
59 #undef TabPage
60 #undef SfxTabPage
61 #define SfxTabPage ::SfxTabPage
62 #undef SfxTabDialog
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);
72 struct TabPageImpl
74 BOOL mbStandard;
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
83 struct Data_Impl
85 USHORT nId; // Die ID
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
92 // Konstruktor
93 Data_Impl( USHORT Id, CreateTabPage fnPage,
94 GetTabPageRanges fnRanges, BOOL bDemand ) :
96 nId ( Id ),
97 fnCreatePage( fnPage ),
98 fnGetRanges ( fnRanges ),
99 pTabPage ( 0 ),
100 bOnDemand ( bDemand ),
101 bRefresh ( FALSE )
103 if ( !fnCreatePage )
105 SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
106 if ( pFact )
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!" );
133 return NULL;
136 class SfxTabDialogController : public SfxControllerItem
138 SfxTabDialog* pDialog;
139 const SfxItemSet* pSet;
140 public:
141 SfxTabDialogController( USHORT nSlotId, SfxBindings& rBindings, SfxTabDialog* pDlg )
142 : SfxControllerItem( nSlotId, rBindings )
143 , pDialog( pDlg )
144 , pSet( NULL )
147 ~SfxTabDialogController();
149 DECL_LINK( Execute_Impl, void* );
150 virtual void StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState );
153 SfxTabDialogController::~SfxTabDialogController()
155 delete pSet;
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() );
165 aItems[0] = &aItem;
166 aItems[1] = NULL;
167 GetBindings().Execute( GetId(), aItems );
170 return 0;
173 void SfxTabDialogController::StateChanged( USHORT /*nSID*/, SfxItemState /*eState*/, const SfxPoolItem* pState )
175 const SfxSetItem* pSetItem = PTR_CAST( SfxSetItem, pState );
176 if ( pSetItem )
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 ));
184 if ( pTabPage )
186 pTabPage->Reset( pSetItem->GetItemSet() );
187 bDialogStarted = TRUE;
191 if ( bDialogStarted )
192 pDialog->Show();
194 else
195 pDialog->Hide();
198 DECL_PTRARRAY(SfxTabDlgData_Impl, Data_Impl *, 4,4)
200 struct TabDlg_Impl
202 BOOL bModified : 1,
203 bModal : 1,
204 bInOK : 1,
205 bHideResetBtn : 1;
206 SfxTabDlgData_Impl* pData;
208 PushButton* pApplyButton;
209 SfxTabDialogController* pController;
211 TabDlg_Impl( BYTE nCnt ) :
213 bModified ( FALSE ),
214 bModal ( TRUE ),
215 bInOK ( FALSE ),
216 bHideResetBtn ( FALSE ),
217 pData ( new SfxTabDlgData_Impl( nCnt ) ),
218 pApplyButton ( NULL ),
219 pController ( 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 )
235 if ( pPos )
236 *pPos = i;
237 return pObj;
240 return 0;
243 #if !ENABLE_LAYOUT_SFX_TABDIALOG
245 void SfxTabPage::SetFrame(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& xFrame)
247 if (pImpl)
248 pImpl->mxFrame = xFrame;
251 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > SfxTabPage::GetFrame()
253 if (pImpl)
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 ) :
261 /* [Beschreibung]
263 Konstruktor
266 TabPage( pParent, rResId ),
268 pSet ( &rAttrSet ),
269 bHasExchangeSupport ( FALSE ),
270 pTabDlg ( NULL ),
271 pImpl ( new TabPageImpl )
275 // -----------------------------------------------------------------------
276 SfxTabPage:: SfxTabPage( Window *pParent, WinBits nStyle, const SfxItemSet &rAttrSet ) :
277 TabPage(pParent, nStyle),
278 pSet ( &rAttrSet ),
279 bHasExchangeSupport ( FALSE ),
280 pTabDlg ( NULL ),
281 pImpl ( new TabPageImpl )
284 // -----------------------------------------------------------------------
286 SfxTabPage::~SfxTabPage()
288 /* [Beschreibung]
290 Destruktor
294 #if !ENABLE_LAYOUT
295 delete pImpl;
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& )
318 /* [Beschreibung]
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* )
334 /* [Beschreibung]
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.
347 [R"uckgabewert]
349 LEAVE_PAGE; Verlassen der Seite erlauben
353 return LEAVE_PAGE;
356 // -----------------------------------------------------------------------
358 void SfxTabPage::FillUserData()
360 /* [Beschreibung]
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
375 /* [Description]
380 return FALSE;
383 // -----------------------------------------------------------------------
385 const SfxPoolItem* SfxTabPage::GetItem( const SfxItemSet& rSet, USHORT nSlot, sal_Bool bDeep )
387 /* [Beschreibung]
389 static Methode: hiermit wird der Code der TabPage-Implementierungen
390 vereinfacht.
395 const SfxItemPool* pPool = rSet.GetPool();
396 USHORT nWh = pPool->GetWhich( nSlot, bDeep );
397 const SfxPoolItem* pItem = 0;
398 #ifdef DEBUG
399 SfxItemState eState;
400 eState =
401 #endif
402 rSet.GetItemState( nWh, TRUE, &pItem ); // -Wall required??
404 if ( !pItem && nWh != nSlot )
405 pItem = &pPool->GetDefaultItem( nWh );
406 return pItem;
409 // -----------------------------------------------------------------------
411 const SfxPoolItem* SfxTabPage::GetOldItem( const SfxItemSet& rSet,
412 USHORT nSlot, sal_Bool bDeep )
414 /* [Beschreibung]
416 Diese Methode gibt f"ur Vergleiche den alten Wert eines
417 Attributs zur"uck.
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 );
430 else
431 pItem = GetItem( rOldSet, nSlot );
432 return pItem;
435 // -----------------------------------------------------------------------
437 const SfxPoolItem* SfxTabPage::GetExchangeItem( const SfxItemSet& rSet,
438 USHORT nSlot )
440 /* [Beschreibung]
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 );
450 else
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");
458 }//CHINA001
459 // add CHINA001 end
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
471 #undef ResId
472 #define ResId(id, foo) #id
473 #undef TabDialog
474 #define TabDialog(parent, res_id) Dialog (parent, "tab-dialog.xml", "tab-dialog")
476 #define aOKBtn(this) aOKBtn (this, "BTN_OK")
477 #undef PushButton
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() ) ),\
487 aOKBtn ( this ),\
488 pUserBtn ( pUserButtonText? new PushButton(this): 0 ),\
489 aCancelBtn ( this ),\
490 aHelpBtn ( this ),\
491 aResetBtn ( this ),\
492 aBaseFmtBtn ( this ),\
493 pSet ( ItemSetPtr ),\
494 pOutSet ( 0 ),\
495 pImpl ( new TabDlg_Impl( (BYTE)aTabCtrl.GetPageCount() ) ), \
496 pRanges ( 0 ), \
497 nResId ( rResId.GetId() ), \
498 nAppPageId ( USHRT_MAX ), \
499 bItemsReset ( FALSE ),\
500 bFmt ( bEditFmt ),\
501 pExampleSet ( 0 )
503 // -----------------------------------------------------------------------
505 SfxTabDialog::SfxTabDialog
507 /* [Beschreibung]
509 Konstruktor
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 ),
525 INI_LIST(pItemSet)
527 Init_Impl( bFmt, pUserButtonText );
530 // -----------------------------------------------------------------------
532 SfxTabDialog::SfxTabDialog
534 /* [Beschreibung]
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 ),
550 pFrame( 0 ),
551 INI_LIST(pItemSet)
553 Init_Impl( bFmt, pUserButtonText );
554 DBG_WARNING( "bitte den Ctor mit ViewFrame verwenden" );
557 SfxTabDialog::SfxTabDialog
559 /* [Beschreibung]
561 Konstruktor, tempor"ar ohne Frame
565 Window* pParent, // Parent-Fenster
566 const ResId& rResId, // ResourceId
567 USHORT nSetId,
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 ),
575 pFrame( 0 ),
576 INI_LIST(NULL)
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
595 #undef ResId
596 #undef TabDialog
597 #undef aOKBtn
598 #undef PushButton
599 #undef aCancelBtn
600 #undef aHelpBtn
601 #undef aResetBtn
602 #undef aBaseFmtBtn
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;
635 delete pDataObject;
638 delete pImpl->pController;
639 delete pImpl->pApplyButton;
640 delete pImpl->pData;
641 delete pImpl;
642 delete pUserBtn;
643 delete pOutSet;
644 delete pExampleSet;
645 delete [] pRanges;
648 // -----------------------------------------------------------------------
650 void SfxTabDialog::Init_Impl( BOOL bFmtFlag, const String* pUserButtonText )
652 /* [Beschreibung]
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 ) );
665 aTabCtrl.Show();
666 aOKBtn.Show();
667 aCancelBtn.Show();
668 aHelpBtn.Show();
669 aResetBtn.Show();
670 aResetBtn.SetHelpId( HID_TABDLG_RESET_BTN );
672 if ( pUserBtn )
674 pUserBtn->SetText( *pUserButtonText );
675 pUserBtn->SetClickHdl( LINK( this, SfxTabDialog, UserHdl ) );
676 pUserBtn->Show();
679 /* TODO: Check what is up with bFmt/bFmtFlag. Comment below suggests a
680 different behavior than implemented!! */
681 if ( bFmtFlag )
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
692 if ( bFmtFlag != 2 )
693 aBaseFmtBtn.Show();
694 else
695 bFmtFlag = TRUE;
698 if ( pSet )
700 pExampleSet = new SfxItemSet( *pSet );
701 pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
705 // -----------------------------------------------------------------------
707 void SfxTabDialog::RemoveResetButton()
709 aResetBtn.Hide();
710 pImpl->bHideResetBtn = TRUE;
713 // -----------------------------------------------------------------------
715 #if ENABLE_LAYOUT_SFX_TABDIALOG
716 #undef TabDialog
717 #define TabDialog Dialog
718 #endif /* ENABLE_LAYOUT_SFX_TABDIALOG */
720 short SfxTabDialog::Execute()
722 if ( !aTabCtrl.GetPageCount() )
723 return RET_CANCEL;
724 Start_Impl();
725 return TabDialog::Execute();
728 // -----------------------------------------------------------------------
730 void SfxTabDialog::StartExecuteModal( const Link& rEndDialogHdl )
732 #if !ENABLE_LAYOUT_SFX_TABDIALOG
733 if ( !aTabCtrl.GetPageCount() )
734 return;
735 Start_Impl();
736 TabDialog::StartExecuteModal( rEndDialogHdl );
737 #else
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;
748 Start_Impl();
750 if ( bShow )
751 Show();
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 )
769 return Link();
771 return pImpl->pApplyButton->GetClickHdl();
774 // -----------------------------------------------------------------------
776 void SfxTabDialog::EnableApplyButton(BOOL bEnable)
778 if ( IsApplyButtonEnabled() == bEnable )
779 // nothing to do
780 return;
782 // create or remove the apply button
783 if ( bEnable )
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 );
795 else
797 delete pImpl->pApplyButton;
798 pImpl->pApplyButton = NULL;
801 #if !ENABLE_LAYOUT_SFX_TABDIALOG
802 // adjust the layout
803 if (IsReallyShown())
804 AdjustLayout();
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;
849 else
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 );
883 #endif
885 // -----------------------------------------------------------------------
887 void SfxTabDialog::AddTabPage
889 /* [Beschreibung]
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
913 /* [Beschreibung]
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.
921 USHORT nId,
922 const String& rRiderText,
923 CreateTabPage pCreateFunc,
924 GetTabPageRanges pRangesFunc,
925 BOOL bItemsOnDemand,
926 USHORT nPos
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
941 /* [Beschreibung]
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.
949 USHORT nId,
950 const Bitmap &rRiderBitmap,
951 CreateTabPage pCreateFunc,
952 GetTabPageRanges pRangesFunc,
953 BOOL bItemsOnDemand,
954 USHORT nPos
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 ) );
963 #endif
965 // -----------------------------------------------------------------------
967 void SfxTabDialog::RemoveTabPage( USHORT nId )
969 /* [Beschreibung]
971 L"oschen der TabPage mit der ID nId
975 USHORT nPos = 0;
976 aTabCtrl.RemovePage( nId );
977 Data_Impl* pDataObject = Find( *pImpl->pData, nId, &nPos );
979 if ( pDataObject )
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;
997 delete pDataObject;
998 pImpl->pData->Remove( nPos );
1000 else
1002 DBG_WARNINGFILE( "TabPage-Id nicht bekannt" );
1006 // -----------------------------------------------------------------------
1008 void SfxTabDialog::PageCreated
1010 /* [Beschreibung]
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()
1028 /* [Beschreibung]
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
1043 /* [Beschreibung]
1045 TabPage mit der "Ubergebenen Id zur"uckgeben.
1049 USHORT nPos = 0;
1050 Data_Impl* pDataObject = Find( *pImpl->pData, nPageId, &nPos );
1052 if ( pDataObject )
1053 return pDataObject->pTabPage;
1054 return NULL;
1057 // -----------------------------------------------------------------------
1059 BOOL SfxTabDialog::IsInOK() const
1061 /* [Beschreibung]
1066 return pImpl->bInOK;
1069 // -----------------------------------------------------------------------
1071 short SfxTabDialog::Ok()
1073 /* [Beschreibung]
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.
1081 [R"uckgabewert]
1083 RET_OK: wenn mindestens eine Seite TRUE als Returnwert von
1084 FillItemSet geliefert hat, sonst RET_CANCEL.
1088 pImpl->bInOK = TRUE;
1090 if ( !pOutSet )
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;
1106 if ( pTabPage )
1108 if ( pDataObject->bOnDemand )
1110 SfxItemSet& rSet = (SfxItemSet&)pTabPage->GetItemSet();
1111 rSet.ClearItem();
1112 bModified |= pTabPage->FillItemSet( rSet );
1114 else if ( pSet && !pTabPage->HasExchangeSupport() )
1116 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
1118 if ( pTabPage->FillItemSet( aTmp ) )
1120 bModified |= TRUE;
1121 pExampleSet->Put( aTmp );
1122 pOutSet->Put( aTmp );
1128 if ( pImpl->bModified || ( pOutSet && pOutSet->Count() > 0 ) )
1129 bModified |= TRUE;
1131 if ( bFmt == 2 )
1132 bModified |= TRUE;
1133 return bModified ? RET_OK : RET_CANCEL;
1136 // -----------------------------------------------------------------------
1138 IMPL_LINK( SfxTabDialog, CancelHdl, Button*, pButton )
1140 (void)pButton; //unused
1141 Close();
1142 return 0;
1145 // -----------------------------------------------------------------------
1147 SfxItemSet* SfxTabDialog::CreateInputItemSet( USHORT )
1149 /* [Beschreibung]
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()
1164 /* [Beschreibung]
1166 Defaultimplemetierung der virtuellen Methode.
1167 Diese wird gerufen, wenn <SfxTabPage::DeactivatePage(SfxItemSet *)>
1168 <SfxTabPage::REFRESH_SET> liefert.
1172 DBG_ERRORFILE( "GetRefreshedSet nicht implementiert" );
1173 return 0;
1176 // -----------------------------------------------------------------------
1178 IMPL_LINK( SfxTabDialog, OkHdl, Button *, EMPTYARG )
1180 /* [Beschreibung]
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;
1192 if ( OK_Impl() )
1194 if ( pImpl->bModal )
1195 EndDialog( Ok() );
1196 else
1198 Ok();
1199 Close();
1202 return 0;
1205 // -----------------------------------------------------------------------
1207 bool SfxTabDialog::PrepareLeaveCurrentPage()
1209 USHORT const nId = aTabCtrl.GetCurPageId();
1210 SfxTabPage* pPage = dynamic_cast<SfxTabPage*> (aTabCtrl.GetTabPage( nId ));
1211 bool bEnd = !pPage;
1213 if ( pPage )
1215 int nRet = SfxTabPage::LEAVE_PAGE;
1216 if ( pSet )
1218 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
1220 if ( pPage->HasExchangeSupport() )
1221 nRet = pPage->DeactivatePage( &aTmp );
1222 else
1223 nRet = pPage->DeactivatePage( NULL );
1225 if ( ( SfxTabPage::LEAVE_PAGE & nRet ) == SfxTabPage::LEAVE_PAGE
1226 && aTmp.Count() )
1228 pExampleSet->Put( aTmp );
1229 pOutSet->Put( aTmp );
1232 else
1233 nRet = pPage->DeactivatePage( NULL );
1234 bEnd = nRet;
1237 return bEnd;
1241 // -----------------------------------------------------------------------
1243 IMPL_LINK( SfxTabDialog, UserHdl, Button *, EMPTYARG )
1245 /* [Beschreibung]
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 () )
1257 short nRet = Ok();
1259 if ( RET_OK == nRet )
1260 nRet = RET_USER;
1261 else
1262 nRet = RET_USER_CANCEL;
1263 EndDialog( nRet );
1265 return 0;
1268 // -----------------------------------------------------------------------
1270 IMPL_LINK( SfxTabDialog, ResetHdl, Button *, EMPTYARG )
1272 /* [Beschreibung]
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 );
1291 else
1292 pDataObject->pTabPage->Reset( *pSet );
1293 return 0;
1296 // -----------------------------------------------------------------------
1298 IMPL_LINK( SfxTabDialog, BaseFmtHdl, Button *, EMPTYARG )
1300 /* [Beschreibung]
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
1305 werden gel"oscht.
1309 const USHORT nId = aTabCtrl.GetCurPageId();
1310 Data_Impl* pDataObject = Find( *pImpl->pData, nId );
1311 DBG_ASSERT( pDataObject, "Id nicht bekannt" );
1312 bFmt = 2;
1314 if ( pDataObject->fnGetRanges )
1316 if ( !pExampleSet )
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 );
1337 else
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;
1347 nTmp = nTmpEnd;
1348 nTmpEnd = nTmp1;
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 );
1360 nTmp++;
1363 // zum n"achsten Paar gehen
1364 pTmpRanges += 2;
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;
1371 return 1;
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 )
1384 /* [Beschreibung]
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" );
1399 SFX_APP();
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:
1407 if ( !pTabPage )
1409 #if ENABLE_LAYOUT_SFX_TABDIALOG
1410 if (dynamic_cast<layout SfxTabPage*> (pTabPage))
1411 layout::TabPage::global_parent = pTabCtrl->GetWindow ();
1412 #endif
1413 const SfxItemSet* pTmpSet = 0;
1415 if ( pSet )
1417 if ( bItemsReset && pSet->GetParent() )
1418 pTmpSet = pSet->GetParent();
1419 else
1420 pTmpSet = pSet;
1423 if ( pTmpSet && !pDataObject->bOnDemand )
1424 pTabPage = (pDataObject->fnCreatePage)( tabControlWindow, *pTmpSet );
1425 else
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 ) );
1435 String sUserData;
1436 Any aUserItem = aPageOpt.GetUserItem( USERITEM_NAME );
1437 OUString aTemp;
1438 if ( aUserItem >>= aTemp )
1439 sUserData = String( aTemp );
1440 pTabPage->SetUserData( sUserData );
1441 Size aSiz = pTabPage->GetSizePixel();
1443 #if ENABLE_LAYOUT
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 )
1456 aSiz = optimalSize;
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() );
1471 else
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 */
1484 if ( pExampleSet )
1485 pTabPage->ActivatePage( *pExampleSet );
1486 BOOL bReadOnly = pTabPage->IsReadOnly();
1487 ( bReadOnly || pImpl->bHideResetBtn ) ? aResetBtn.Hide() : aResetBtn.Show();
1488 return 0;
1491 // -----------------------------------------------------------------------
1493 IMPL_LINK( SfxTabDialog, DeactivatePageHdl, TabControl *, pTabCtrl )
1495 /* [Beschreibung]
1497 Handler, der vor dem Verlassen einer Seite durch Starview gerufen wird.
1499 [Querverweise]
1501 <SfxTabPage::DeactivatePage(SfxItemSet *)>
1505 USHORT nId = pTabCtrl->GetCurPageId();
1506 SFX_APP();
1507 SfxTabPage *pPage = dynamic_cast<SfxTabPage*> (pTabCtrl->GetTabPage( nId ));
1508 DBG_ASSERT( pPage, "keine aktive Page" );
1509 #ifdef DBG_UTIL
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!" );
1516 #endif
1518 int nRet = SfxTabPage::LEAVE_PAGE;
1520 if ( !pExampleSet && pPage->HasExchangeSupport() && pSet )
1521 pExampleSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
1523 if ( pSet )
1525 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
1527 if ( pPage->HasExchangeSupport() )
1528 nRet = pPage->DeactivatePage( &aTmp );
1529 else
1530 nRet = pPage->DeactivatePage( NULL );
1531 //! else
1532 //! pPage->FillItemSet( aTmp );
1534 if ( ( SfxTabPage::LEAVE_PAGE & nRet ) == SfxTabPage::LEAVE_PAGE &&
1535 aTmp.Count() )
1537 pExampleSet->Put( aTmp );
1538 pOutSet->Put( aTmp );
1541 else
1543 if ( pPage->HasExchangeSupport() ) //!!!
1545 if ( !pExampleSet )
1547 SfxItemPool* pPool = pPage->GetItemSet().GetPool();
1548 pExampleSet =
1549 new SfxItemSet( *pPool, GetInputRanges( *pPool ) );
1551 nRet = pPage->DeactivatePage( pExampleSet );
1553 else
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;
1570 else
1571 pObj->bRefresh = FALSE;
1574 if ( nRet & SfxTabPage::LEAVE_PAGE )
1575 return TRUE;
1576 else
1577 return FALSE;
1580 // -----------------------------------------------------------------------
1582 const SfxItemSet* SfxTabDialog::GetOutputItemSet
1584 /* [Beschreibung]
1586 Liefert die Pages, die ihre Sets onDemand liefern, das OutputItemSet.
1588 [Querverweise]
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.
1598 ) const
1600 Data_Impl* pDataObject = Find( *pImpl->pData, nId );
1601 DBG_ASSERT( pDataObject, "TabPage nicht gefunden" );
1603 if ( pDataObject )
1605 if ( !pDataObject->pTabPage )
1606 return NULL;
1608 if ( pDataObject->bOnDemand )
1609 return &pDataObject->pTabPage->GetItemSet();
1610 // else
1611 return pOutSet;
1613 return NULL;
1616 // -----------------------------------------------------------------------
1618 int SfxTabDialog::FillOutputItemSet()
1620 int nRet = SfxTabPage::LEAVE_PAGE;
1621 if ( OK_Impl() )
1622 Ok();
1623 else
1624 nRet = SfxTabPage::KEEP_PAGE;
1625 return nRet;
1628 // -----------------------------------------------------------------------
1630 #ifdef WNT
1631 int __cdecl TabDlgCmpUS_Impl( const void* p1, const void* p2 )
1632 #else
1633 #if defined(OS2) && defined(ICC)
1634 int _Optlink TabDlgCmpUS_Impl( const void* p1, const void* p2 )
1635 #else
1636 extern "C" int TabDlgCmpUS_Impl( const void* p1, const void* p2 )
1637 #endif
1638 #endif
1640 /* [Beschreibung]
1642 Vergleichsfunktion f"ur qsort
1646 return *(USHORT*)p1 - *(USHORT*)p2;
1649 // -----------------------------------------------------------------------
1651 void SfxTabDialog::ShowPage( USHORT nId )
1653 /* [Beschreibung]
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 )
1667 /* [Beschreibung]
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.
1673 [Querverweise]
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)>
1679 [R"uckgabewert]
1681 Pointer auf nullterminiertes Array von USHORTs
1682 Dieses Array geh"ort dem Dialog und wird beim
1683 Zerst"oren des Dialogs gel"oscht.
1687 if ( pSet )
1689 DBG_ERRORFILE( "Set bereits vorhanden!" );
1690 return pSet->GetRanges();
1693 if ( pRanges )
1694 return pRanges;
1695 SvUShorts aUS( 16, 16 );
1696 USHORT nCount = pImpl->pData->Count();
1698 USHORT i;
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;
1708 USHORT nLen;
1709 for( nLen = 0; *pIter; ++nLen, ++pIter )
1711 aUS.Insert( pTmpRanges, nLen, aUS.Count() );
1715 //! Doppelte Ids entfernen?
1716 #ifndef TF_POOLABLE
1717 if ( rPool.HasMap() )
1718 #endif
1720 nCount = aUS.Count();
1722 for ( i = 0; i < nCount; ++i )
1723 aUS[i] = rPool.GetWhich( aUS[i] );
1726 // sortieren
1727 if ( aUS.Count() > 1 )
1728 qsort( (void*)aUS.GetData(),
1729 aUS.Count(), sizeof(USHORT), TabDlgCmpUS_Impl );
1731 // Ranges erzeugen
1732 //!! Auskommentiert, da fehlerhaft
1734 pRanges = new USHORT[aUS.Count() * 2 + 1];
1735 int j = 0;
1736 i = 0;
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] )
1744 break;
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;
1753 return pRanges;
1756 // -----------------------------------------------------------------------
1758 void SfxTabDialog::SetInputSet( const SfxItemSet* pInSet )
1760 /* [Beschreibung]
1762 Mit dieser Methode kann nachtr"aglich der Input-Set initial oder
1763 neu gesetzt werden.
1767 FASTBOOL bSet = ( pSet != NULL );
1769 pSet = pInSet;
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();
1783 if ( pViewFrame )
1785 Window* pWindow = rNEvt.GetWindow();
1786 ULONG nHelpId = 0;
1787 while ( !nHelpId && pWindow )
1789 nHelpId = pWindow->GetHelpId();
1790 pWindow = pWindow->GetParent();
1793 if ( nHelpId )
1794 SfxHelp::OpenHelpAgent( pViewFrame->GetFrame(), nHelpId );
1798 return TabDialog::Notify( rNEvt );
1801 END_NAMESPACE_LAYOUT_SFX_TABDIALOG