1 --- sfx2/inc/sfx2/tabdlg.hxx
2 +++ sfx2/inc/sfx2/tabdlg.hxx
4 #include <svtools/itemset.hxx>
5 #include <com/sun/star/frame/XFrame.hpp>
8 +namespace layout { class TabPage; }
13 @@ -52,6 +55,11 @@ class SfxBindings;
14 // typedefs --------------------------------------------------------------
16 typedef SfxTabPage* (*CreateTabPage)(Window *pParent, const SfxItemSet &rAttrSet);
20 +typedef TabPage* (*CreateTabPage)(::Window *pParent, ::SfxItemSet const& set );
22 typedef USHORT* (*GetTabPageRanges)(); // liefert internationale Which-Wert
25 @@ -98,6 +106,8 @@ friend class SfxTabDialogController;
29 + std::map<int, layout::TabPage*> layoutPages;
30 + std::map<int, layout::CreateTabPage> layoutPageFuncs;
32 //#if 0 // _SOLAR__PRIVATE
33 DECL_DLLPRIVATE_LINK( ActivatePageHdl, TabControl * );
34 @@ -128,7 +138,7 @@ protected:
35 handles the item sets to copy.
36 @return TRUE if it is allowed to leave the current page, FALSE otherwise
38 - BOOL PrepareLeaveCurrentPage();
39 + bool PrepareLeaveCurrentPage();
42 SfxTabDialog( Window* pParent, const ResId &rResId, USHORT nSetId, SfxBindings& rBindings,
43 @@ -168,6 +178,8 @@ public:
44 BOOL bItemsOnDemand = FALSE,
45 USHORT nPos = TAB_APPEND);
47 + void AddTabPage( int id, layout::TabPage* page, bool=false );
48 + void AddTabPage( int id, layout::CreateTabPage, bool=false );
49 void RemoveTabPage( USHORT nId );
51 void SetCurPageId( USHORT nId ) { nAppPageId = nId; }
52 diff --git a/sfx2/source/dialog/tabdlg.cxx b/sfx2/source/dialog/tabdlg.cxx
53 index 084ec17..d3254ed 100644
54 --- sfx2/source/dialog/tabdlg.cxx
55 +++ sfx2/source/dialog/tabdlg.cxx
57 #include <sfx2/bindings.hxx>
58 #include <sfx2/sfxdlg.hxx>
59 #include <sfx2/itemconnect.hxx>
60 +#include <layout/layout.hxx>
64 @@ -171,6 +172,12 @@ void SfxTabDialogController::StateChanged( USHORT /*nSID*/, SfxItemState /*eStat
65 for ( USHORT n=0; n<pDialog->aTabCtrl.GetPageCount(); n++ )
67 USHORT nPageId = pDialog->aTabCtrl.GetPageId( n );
68 + if ( layout::TabPage* page = pDialog->layoutPages[nPageId] )
70 + page->Reset( pSetItem->GetItemSet() );
71 + bDialogStarted = TRUE;
74 SfxTabPage* pTabPage = (SfxTabPage*) pDialog->aTabCtrl.GetTabPage( nPageId );
77 @@ -617,6 +624,10 @@ SfxTabDialog::~SfxTabDialog()
82 + for ( size_t i = 0; i < layoutPages.size(); i++ )
83 + if (layout::TabPage *page = layoutPages[i])
87 // -----------------------------------------------------------------------
88 @@ -922,6 +933,16 @@ void SfxTabDialog::AddTabPage
92 +void SfxTabDialog::AddTabPage( int id, layout::TabPage* page, bool )
94 + layoutPages[id] = page;
97 +void SfxTabDialog::AddTabPage( int id, layout::CreateTabPage func, bool )
99 + layoutPageFuncs[id] = func;
102 // -----------------------------------------------------------------------
104 void SfxTabDialog::RemoveTabPage( USHORT nId )
105 @@ -1164,19 +1185,39 @@ IMPL_LINK( SfxTabDialog, OkHdl, Button *, EMPTYARG )
107 // -----------------------------------------------------------------------
109 -BOOL SfxTabDialog::PrepareLeaveCurrentPage()
110 +bool SfxTabDialog::PrepareLeaveCurrentPage()
112 - SfxTabPage* pPage =
113 - (SfxTabPage*)aTabCtrl.GetTabPage( aTabCtrl.GetCurPageId() );
114 + USHORT const nId = aTabCtrl.GetCurPageId();
116 + if ( layout::TabPage* page = layoutPages[nId] )
119 + return page->DeactivatePage( 0 );
121 + SfxItemSet set( *pSet->GetPool(), pSet->GetRanges() );
123 + if ( page->HasExchangeSupport() )
124 + return page->DeactivatePage( &set );
126 + int result = page->DeactivatePage( 0 );
127 + if ( result & layout::TabPage::LEAVE_PAGE && set.Count() )
129 + pExampleSet->Put( set );
130 + pOutSet->Put( set );
135 + SfxTabPage* pPage = (SfxTabPage*)aTabCtrl.GetTabPage( nId );
141 int nRet = SfxTabPage::LEAVE_PAGE;
144 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
147 if ( pPage->HasExchangeSupport() )
148 nRet = pPage->DeactivatePage( &aTmp );
149 @@ -1189,8 +1230,6 @@ BOOL SfxTabDialog::PrepareLeaveCurrentPage()
150 pExampleSet->Put( aTmp );
151 pOutSet->Put( aTmp );
154 - pImpl->bModified |= TRUE;
157 nRet = pPage->DeactivatePage( NULL );
158 @@ -1215,37 +1254,7 @@ IMPL_LINK( SfxTabDialog, UserHdl, Button *, EMPTYARG )
162 - SfxTabPage* pPage =
163 - (SfxTabPage *)aTabCtrl.GetTabPage( aTabCtrl.GetCurPageId() );
165 - FASTBOOL bEnd = !pPage;
169 - int nRet = SfxTabPage::LEAVE_PAGE;
173 - SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
175 - if ( pPage->HasExchangeSupport() )
176 - nRet = pPage->DeactivatePage( &aTmp );
178 - nRet = pPage->DeactivatePage( NULL );
180 - if ( ( SfxTabPage::LEAVE_PAGE & nRet ) == SfxTabPage::LEAVE_PAGE
183 - pExampleSet->Put( aTmp );
184 - pOutSet->Put( aTmp );
188 - nRet = pPage->DeactivatePage( NULL );
193 + if ( PrepareLeaveCurrentPage () )
197 @@ -1271,7 +1280,14 @@ IMPL_LINK( SfxTabDialog, ResetHdl, Button *, EMPTYARG )
201 - Data_Impl* pDataObject = Find( *pImpl->pData, aTabCtrl.GetCurPageId() );
202 + int const nId = aTabCtrl.GetCurPageId();
203 + if ( layout::TabPage* page = layoutPages[nId] )
205 + page->Reset( *pSet );
209 + Data_Impl* pDataObject = Find( *pImpl->pData, nId );
210 DBG_ASSERT( pDataObject, "Id nicht bekannt" );
212 if ( pDataObject->bOnDemand )
213 @@ -1365,6 +1381,7 @@ IMPL_LINK( SfxTabDialog, BaseFmtHdl, Button *, EMPTYARG )
215 // -----------------------------------------------------------------------
218 IMPL_LINK( SfxTabDialog, ActivatePageHdl, TabControl *, pTabCtrl )
221 @@ -1379,8 +1396,33 @@ IMPL_LINK( SfxTabDialog, ActivatePageHdl, TabControl *, pTabCtrl )
225 + int const nId = pTabCtrl->GetCurPageId();
226 + OSL_TRACE ("%s: page: %d", __FUNCTION__, nId );
227 + if ( !layoutPages[nId] )
228 + if ( layout::CreateTabPage func = layoutPageFuncs[nId] )
230 + layout::TabPage::global_parent = pTabCtrl;
231 + layout::TabPage* page = (func) (pTabCtrl, *pSet);
232 + AddTabPage( nId, page );
234 + if ( layout::TabPage* page = layoutPages[nId] )
236 + TabPage *vclPage = page->GetTabPage();
237 + TabControl *dialog = pTabCtrl;
238 + page->Reset( page->GetItemSet() );
239 + page->ActivatePage();
240 + dialog->SetTabPage( nId, vclPage );
242 + Size tabSize = vclPage->GetSizePixel();
243 + Size dialogSize = dialog->GetTabPageSizePixel();
244 + OSL_TRACE ("%s: tabSize: %d, %d", __FUNCTION__, tabSize.Width(), tabSize.Height() );
245 + OSL_TRACE ("%s: dialogSize: %d, %d", __FUNCTION__, dialogSize.Width(), dialogSize.Height() );
247 + dialog->SetTabPageSizePixel( dialogSize );
251 DBG_ASSERT( pImpl->pData->Count(), "keine Pages angemeldet" );
252 - const USHORT nId = pTabCtrl->GetCurPageId();
255 // Tab Page schon da?
256 @@ -1455,6 +1497,9 @@ IMPL_LINK( SfxTabDialog, DeactivatePageHdl, TabControl *, pTabCtrl )
260 + if ( /* layout::TabPage* p = */ layoutPages[pTabCtrl->GetCurPageId()] )
261 + return SfxTabPage::LEAVE_PAGE;
263 USHORT nId = pTabCtrl->GetCurPageId();
265 SfxTabPage *pPage = (SfxTabPage*)pTabCtrl->GetTabPage( nId );