1*5900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5900e8ecSAndrew Rist  * distributed with this work for additional information
6*5900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
9*5900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5900e8ecSAndrew Rist  *
11*5900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5900e8ecSAndrew Rist  *
13*5900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5900e8ecSAndrew Rist  * software distributed under the License is distributed on an
15*5900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
17*5900e8ecSAndrew Rist  * specific language governing permissions and limitations
18*5900e8ecSAndrew Rist  * under the License.
19*5900e8ecSAndrew Rist  *
20*5900e8ecSAndrew Rist  *************************************************************/
21*5900e8ecSAndrew Rist 
22*5900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir #include <svtools/wizardmachine.hxx>
27cdf0e10cSrcweir #include <svtools/helpid.hrc>
28cdf0e10cSrcweir #include <tools/debug.hxx>
29cdf0e10cSrcweir #include <tools/diagnose_ex.h>
30cdf0e10cSrcweir #include <vcl/msgbox.hxx>
31cdf0e10cSrcweir #include <svtools/svtdata.hxx>
32cdf0e10cSrcweir #ifndef _SVTOOLS_HRC
33cdf0e10cSrcweir #include <svtools/svtools.hrc>
34cdf0e10cSrcweir #endif
35cdf0e10cSrcweir 
36cdf0e10cSrcweir //.........................................................................
37cdf0e10cSrcweir namespace svt
38cdf0e10cSrcweir {
39cdf0e10cSrcweir //.........................................................................
40cdf0e10cSrcweir 
41cdf0e10cSrcweir 	//=====================================================================
42cdf0e10cSrcweir 	//= WizardPageImplData
43cdf0e10cSrcweir 	//=====================================================================
44cdf0e10cSrcweir 	struct WizardPageImplData
45cdf0e10cSrcweir 	{
WizardPageImplDatasvt::WizardPageImplData46cdf0e10cSrcweir 		WizardPageImplData()
47cdf0e10cSrcweir 		{
48cdf0e10cSrcweir 		}
49cdf0e10cSrcweir 	};
50cdf0e10cSrcweir 
51cdf0e10cSrcweir 	//=====================================================================
52cdf0e10cSrcweir 	//= OWizardPage
53cdf0e10cSrcweir 	//=====================================================================
54cdf0e10cSrcweir 	//---------------------------------------------------------------------
OWizardPage(Window * _pParent,WinBits _nStyle)55cdf0e10cSrcweir     OWizardPage::OWizardPage( Window* _pParent, WinBits _nStyle )
56cdf0e10cSrcweir 		:TabPage( _pParent, _nStyle )
57cdf0e10cSrcweir 		,m_pImpl( new WizardPageImplData )
58cdf0e10cSrcweir 	{
59cdf0e10cSrcweir 	}
60cdf0e10cSrcweir 
61cdf0e10cSrcweir 	//---------------------------------------------------------------------
OWizardPage(Window * _pParent,const ResId & _rResId)62cdf0e10cSrcweir     OWizardPage::OWizardPage( Window* _pParent, const ResId& _rResId )
63cdf0e10cSrcweir 		:TabPage( _pParent, _rResId )
64cdf0e10cSrcweir 		,m_pImpl( new WizardPageImplData )
65cdf0e10cSrcweir 	{
66cdf0e10cSrcweir 	}
67cdf0e10cSrcweir 
68cdf0e10cSrcweir 	//---------------------------------------------------------------------
~OWizardPage()69cdf0e10cSrcweir 	OWizardPage::~OWizardPage()
70cdf0e10cSrcweir 	{
71cdf0e10cSrcweir 		delete m_pImpl;
72cdf0e10cSrcweir 	}
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 	//---------------------------------------------------------------------
initializePage()75cdf0e10cSrcweir 	void OWizardPage::initializePage()
76cdf0e10cSrcweir 	{
77cdf0e10cSrcweir 	}
78cdf0e10cSrcweir 
79cdf0e10cSrcweir 	//---------------------------------------------------------------------
ActivatePage()80cdf0e10cSrcweir 	void OWizardPage::ActivatePage()
81cdf0e10cSrcweir 	{
82cdf0e10cSrcweir 		TabPage::ActivatePage();
83cdf0e10cSrcweir         updateDialogTravelUI();
84cdf0e10cSrcweir 	}
85cdf0e10cSrcweir 
86cdf0e10cSrcweir     //---------------------------------------------------------------------
updateDialogTravelUI()87cdf0e10cSrcweir     void OWizardPage::updateDialogTravelUI()
88cdf0e10cSrcweir     {
89cdf0e10cSrcweir         OWizardMachine* pWizardMachine = dynamic_cast< OWizardMachine* >( GetParent() );
90cdf0e10cSrcweir         if ( pWizardMachine )
91cdf0e10cSrcweir             pWizardMachine->updateTravelUI();
92cdf0e10cSrcweir     }
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 	//---------------------------------------------------------------------
canAdvance() const95cdf0e10cSrcweir 	bool OWizardPage::canAdvance() const
96cdf0e10cSrcweir 	{
97cdf0e10cSrcweir         return true;
98cdf0e10cSrcweir 	}
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 	//---------------------------------------------------------------------
commitPage(WizardTypes::CommitPageReason)101cdf0e10cSrcweir 	sal_Bool OWizardPage::commitPage( WizardTypes::CommitPageReason )
102cdf0e10cSrcweir 	{
103cdf0e10cSrcweir 		return sal_True;
104cdf0e10cSrcweir 	}
105cdf0e10cSrcweir 
106cdf0e10cSrcweir 	//=====================================================================
107cdf0e10cSrcweir 	//= WizardMachineImplData
108cdf0e10cSrcweir 	//=====================================================================
109cdf0e10cSrcweir     struct WizardMachineImplData : public WizardTypes
110cdf0e10cSrcweir 	{
111cdf0e10cSrcweir         String                          sTitleBase;         // the base for the title
112cdf0e10cSrcweir         ::std::stack< WizardState >     aStateHistory;      // the history of all states (used for implementing "Back")
113cdf0e10cSrcweir 
114cdf0e10cSrcweir         WizardState                     nFirstUnknownPage;
115cdf0e10cSrcweir             // the WizardDialog does not allow non-linear transitions (e.g. it's
116cdf0e10cSrcweir             // not possible to add pages in a non-linear order), so we need some own maintainance data
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 		sal_Bool						m_bAutoNextButtonState;
119cdf0e10cSrcweir 
120cdf0e10cSrcweir         bool                            m_bTravelingSuspended;
121cdf0e10cSrcweir 
WizardMachineImplDatasvt::WizardMachineImplData122cdf0e10cSrcweir         WizardMachineImplData()
123cdf0e10cSrcweir             :nFirstUnknownPage( 0 )
124cdf0e10cSrcweir             ,m_bAutoNextButtonState( sal_False )
125cdf0e10cSrcweir             ,m_bTravelingSuspended( false )
126cdf0e10cSrcweir         {
127cdf0e10cSrcweir         }
128cdf0e10cSrcweir 	};
129cdf0e10cSrcweir 
calcRightHelpOffset(sal_uInt32 _nButtonFlags)130cdf0e10cSrcweir     long OWizardMachine::calcRightHelpOffset(sal_uInt32 _nButtonFlags)
131cdf0e10cSrcweir     {
132cdf0e10cSrcweir         sal_Int32 nMask = 1;
133cdf0e10cSrcweir         sal_Int32 nRightAlignedButtonCount = -1;
134cdf0e10cSrcweir         for (unsigned int i = 0; i < 8*sizeof(_nButtonFlags); i++ )
135cdf0e10cSrcweir         {
136cdf0e10cSrcweir             if( ( _nButtonFlags & nMask ) != 0 )
137cdf0e10cSrcweir                 nRightAlignedButtonCount++;
138cdf0e10cSrcweir             nMask <<= 1;
139cdf0e10cSrcweir         }
140cdf0e10cSrcweir         Size aSize = GetPageSizePixel();
141cdf0e10cSrcweir         sal_Int32 nTotButtonWidth = nRightAlignedButtonCount * LogicalCoordinateToPixel(50);
142cdf0e10cSrcweir         sal_Int32 nTotRightButtonSpaceOffset = (nRightAlignedButtonCount) * WIZARDDIALOG_BUTTON_STDOFFSET_X;
143cdf0e10cSrcweir         if ((_nButtonFlags & WZB_NEXT) && (_nButtonFlags & WZB_NEXT))
144cdf0e10cSrcweir             nTotRightButtonSpaceOffset = (nTotRightButtonSpaceOffset - WIZARDDIALOG_BUTTON_STDOFFSET_X) + WIZARDDIALOG_BUTTON_SMALLSTDOFFSET_X;
145cdf0e10cSrcweir         return aSize.Width() - nTotButtonWidth - nTotRightButtonSpaceOffset;
146cdf0e10cSrcweir     }
147cdf0e10cSrcweir 
148cdf0e10cSrcweir 	//=====================================================================
149cdf0e10cSrcweir 	//= OWizardMachine
150cdf0e10cSrcweir 	//=====================================================================
151cdf0e10cSrcweir 	//---------------------------------------------------------------------
OWizardMachine(Window * _pParent,const ResId & _rRes,sal_uInt32 _nButtonFlags)152cdf0e10cSrcweir 	OWizardMachine::OWizardMachine(Window* _pParent, const ResId& _rRes, sal_uInt32 _nButtonFlags )
153cdf0e10cSrcweir 		:WizardDialog( _pParent, _rRes )
154cdf0e10cSrcweir 		,m_pFinish(NULL)
155cdf0e10cSrcweir 		,m_pCancel(NULL)
156cdf0e10cSrcweir 		,m_pNextPage(NULL)
157cdf0e10cSrcweir 		,m_pPrevPage(NULL)
158cdf0e10cSrcweir 		,m_pHelp(NULL)
159cdf0e10cSrcweir 		,m_pImpl( new WizardMachineImplData )
160cdf0e10cSrcweir 	{
161cdf0e10cSrcweir         implConstruct( _nButtonFlags );
162cdf0e10cSrcweir 	}
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 	//---------------------------------------------------------------------
OWizardMachine(Window * _pParent,const WinBits i_nStyle,sal_uInt32 _nButtonFlags)165cdf0e10cSrcweir     OWizardMachine::OWizardMachine(Window* _pParent, const WinBits i_nStyle, sal_uInt32 _nButtonFlags )
166cdf0e10cSrcweir 		:WizardDialog( _pParent, i_nStyle )
167cdf0e10cSrcweir 		,m_pFinish(NULL)
168cdf0e10cSrcweir 		,m_pCancel(NULL)
169cdf0e10cSrcweir 		,m_pNextPage(NULL)
170cdf0e10cSrcweir 		,m_pPrevPage(NULL)
171cdf0e10cSrcweir 		,m_pHelp(NULL)
172cdf0e10cSrcweir 		,m_pImpl( new WizardMachineImplData )
173cdf0e10cSrcweir     {
174cdf0e10cSrcweir         implConstruct( _nButtonFlags );
175cdf0e10cSrcweir     }
176cdf0e10cSrcweir 
177cdf0e10cSrcweir 	//---------------------------------------------------------------------
implConstruct(const sal_uInt32 _nButtonFlags)178cdf0e10cSrcweir     void OWizardMachine::implConstruct( const sal_uInt32 _nButtonFlags )
179cdf0e10cSrcweir     {
180cdf0e10cSrcweir 		m_pImpl->sTitleBase = GetText();
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 		// create the buttons according to the wizard button flags
183cdf0e10cSrcweir 		// the help button
184cdf0e10cSrcweir 		if (_nButtonFlags & WZB_HELP)
185cdf0e10cSrcweir 		{
186cdf0e10cSrcweir 			m_pHelp= new HelpButton(this, WB_TABSTOP);
187cdf0e10cSrcweir 			m_pHelp->SetSizePixel( LogicToPixel( Size( 50, 14 ), MAP_APPFONT ) );
188cdf0e10cSrcweir 			m_pHelp->Show();
189cdf0e10cSrcweir 			AddButton( m_pHelp, WIZARDDIALOG_BUTTON_STDOFFSET_X);
190cdf0e10cSrcweir 		}
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 		// the previous button
193cdf0e10cSrcweir 		if (_nButtonFlags & WZB_PREVIOUS)
194cdf0e10cSrcweir 		{
195cdf0e10cSrcweir 			m_pPrevPage = new PushButton(this, WB_TABSTOP);
196cdf0e10cSrcweir             m_pPrevPage->SetHelpId( HID_WIZARD_PREVIOUS );
197cdf0e10cSrcweir 			m_pPrevPage->SetSizePixel( LogicToPixel( Size( 50, 14 ), MAP_APPFONT ) );
198cdf0e10cSrcweir 			m_pPrevPage->SetText(String(SvtResId(STR_WIZDLG_PREVIOUS)));
199cdf0e10cSrcweir 			m_pPrevPage->Show();
200cdf0e10cSrcweir 
201cdf0e10cSrcweir 			if (_nButtonFlags & WZB_NEXT)
202cdf0e10cSrcweir 				AddButton( m_pPrevPage, ( WIZARDDIALOG_BUTTON_SMALLSTDOFFSET_X) );		// half x-offset to the next button
203cdf0e10cSrcweir 			else
204cdf0e10cSrcweir 				AddButton( m_pPrevPage, WIZARDDIALOG_BUTTON_STDOFFSET_X );
205cdf0e10cSrcweir 			SetPrevButton( m_pPrevPage );
206cdf0e10cSrcweir 			m_pPrevPage->SetClickHdl( LINK( this, OWizardMachine, OnPrevPage ) );
207cdf0e10cSrcweir 		}
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 		// the next button
210cdf0e10cSrcweir 		if (_nButtonFlags & WZB_NEXT)
211cdf0e10cSrcweir 		{
212cdf0e10cSrcweir 			m_pNextPage = new PushButton(this, WB_TABSTOP);
213cdf0e10cSrcweir             m_pNextPage->SetHelpId( HID_WIZARD_NEXT );
214cdf0e10cSrcweir 			m_pNextPage->SetSizePixel( LogicToPixel( Size( 50, 14 ), MAP_APPFONT ) );
215cdf0e10cSrcweir 			m_pNextPage->SetText(String(SvtResId(STR_WIZDLG_NEXT)));
216cdf0e10cSrcweir 			m_pNextPage->Show();
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 			AddButton( m_pNextPage, WIZARDDIALOG_BUTTON_STDOFFSET_X );
219cdf0e10cSrcweir 			SetNextButton( m_pNextPage );
220cdf0e10cSrcweir 			m_pNextPage->SetClickHdl( LINK( this, OWizardMachine, OnNextPage ) );
221cdf0e10cSrcweir 		}
222cdf0e10cSrcweir 
223cdf0e10cSrcweir 		// the finish button
224cdf0e10cSrcweir 		if (_nButtonFlags & WZB_FINISH)
225cdf0e10cSrcweir 		{
226cdf0e10cSrcweir 			m_pFinish = new OKButton(this, WB_TABSTOP);
227cdf0e10cSrcweir 			m_pFinish->SetSizePixel( LogicToPixel( Size( 50, 14 ), MAP_APPFONT ) );
228cdf0e10cSrcweir 			m_pFinish->SetText(String(SvtResId(STR_WIZDLG_FINISH)));
229cdf0e10cSrcweir 			m_pFinish->Show();
230cdf0e10cSrcweir 
231cdf0e10cSrcweir 			AddButton( m_pFinish, WIZARDDIALOG_BUTTON_STDOFFSET_X );
232cdf0e10cSrcweir 			m_pFinish->SetClickHdl( LINK( this, OWizardMachine, OnFinish ) );
233cdf0e10cSrcweir 		}
234cdf0e10cSrcweir 
235cdf0e10cSrcweir         // the cancel button
236cdf0e10cSrcweir 		if (_nButtonFlags & WZB_CANCEL)
237cdf0e10cSrcweir 		{
238cdf0e10cSrcweir 			m_pCancel = new CancelButton(this, WB_TABSTOP);
239cdf0e10cSrcweir 			m_pCancel->SetSizePixel( LogicToPixel( Size( 50, 14 ), MAP_APPFONT ) );
240cdf0e10cSrcweir 			m_pCancel->Show();
241cdf0e10cSrcweir 
242cdf0e10cSrcweir 			AddButton( m_pCancel, WIZARDDIALOG_BUTTON_STDOFFSET_X );
243cdf0e10cSrcweir 		}
244cdf0e10cSrcweir     }
245cdf0e10cSrcweir 
246cdf0e10cSrcweir     //---------------------------------------------------------------------
~OWizardMachine()247cdf0e10cSrcweir 	OWizardMachine::~OWizardMachine()
248cdf0e10cSrcweir 	{
249cdf0e10cSrcweir 		delete m_pFinish;
250cdf0e10cSrcweir 		delete m_pCancel;
251cdf0e10cSrcweir 		delete m_pNextPage;
252cdf0e10cSrcweir 		delete m_pPrevPage;
253cdf0e10cSrcweir 		delete m_pHelp;
254cdf0e10cSrcweir 
255cdf0e10cSrcweir 		for (WizardState i=0; i<m_pImpl->nFirstUnknownPage; ++i)
256cdf0e10cSrcweir 			delete GetPage(i);
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 		delete m_pImpl;
259cdf0e10cSrcweir 	}
260cdf0e10cSrcweir 
261cdf0e10cSrcweir 	//---------------------------------------------------------------------
implUpdateTitle()262cdf0e10cSrcweir 	void OWizardMachine::implUpdateTitle()
263cdf0e10cSrcweir 	{
264cdf0e10cSrcweir 		String sCompleteTitle(m_pImpl->sTitleBase);
265cdf0e10cSrcweir 
266cdf0e10cSrcweir         // append the page title
267cdf0e10cSrcweir 		TabPage* pCurrentPage = GetPage(getCurrentState());
268cdf0e10cSrcweir 		if ( pCurrentPage && pCurrentPage->GetText().Len() )
269cdf0e10cSrcweir 		{
270cdf0e10cSrcweir 			sCompleteTitle += String::CreateFromAscii(" - ");
271cdf0e10cSrcweir 			sCompleteTitle += pCurrentPage->GetText();
272cdf0e10cSrcweir 		}
273cdf0e10cSrcweir 
274cdf0e10cSrcweir         SetText(sCompleteTitle);
275cdf0e10cSrcweir 	}
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 	//---------------------------------------------------------------------
getTitleBase() const278cdf0e10cSrcweir 	const String& OWizardMachine::getTitleBase() const
279cdf0e10cSrcweir 	{
280cdf0e10cSrcweir 		return m_pImpl->sTitleBase;
281cdf0e10cSrcweir 	}
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 	//---------------------------------------------------------------------
setTitleBase(const String & _rTitleBase)284cdf0e10cSrcweir 	void OWizardMachine::setTitleBase(const String& _rTitleBase)
285cdf0e10cSrcweir 	{
286cdf0e10cSrcweir 		m_pImpl->sTitleBase = _rTitleBase;
287cdf0e10cSrcweir 		implUpdateTitle();
288cdf0e10cSrcweir 	}
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	//---------------------------------------------------------------------
GetOrCreatePage(const WizardState i_nState)291cdf0e10cSrcweir     TabPage* OWizardMachine::GetOrCreatePage( const WizardState i_nState )
292cdf0e10cSrcweir     {
293cdf0e10cSrcweir 		if ( NULL == GetPage( i_nState ) )
294cdf0e10cSrcweir 		{
295cdf0e10cSrcweir 			TabPage* pNewPage = createPage( i_nState );
296cdf0e10cSrcweir 			DBG_ASSERT( pNewPage, "OWizardMachine::GetOrCreatePage: invalid new page (NULL)!" );
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 			// fill up the page sequence of our base class (with dummies)
299cdf0e10cSrcweir 			while ( m_pImpl->nFirstUnknownPage < i_nState )
300cdf0e10cSrcweir 			{
301cdf0e10cSrcweir 				AddPage( NULL );
302cdf0e10cSrcweir 				++m_pImpl->nFirstUnknownPage;
303cdf0e10cSrcweir 			}
304cdf0e10cSrcweir 
305cdf0e10cSrcweir 			if ( m_pImpl->nFirstUnknownPage == i_nState )
306cdf0e10cSrcweir 			{
307cdf0e10cSrcweir 				// encountered this page number the first time
308cdf0e10cSrcweir 				AddPage( pNewPage );
309cdf0e10cSrcweir 				++m_pImpl->nFirstUnknownPage;
310cdf0e10cSrcweir 			}
311cdf0e10cSrcweir 			else
312cdf0e10cSrcweir 				// already had this page - just change it
313cdf0e10cSrcweir 				SetPage( i_nState, pNewPage );
314cdf0e10cSrcweir 		}
315cdf0e10cSrcweir         return GetPage( i_nState );
316cdf0e10cSrcweir     }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir 	//---------------------------------------------------------------------
ActivatePage()319cdf0e10cSrcweir 	void OWizardMachine::ActivatePage()
320cdf0e10cSrcweir 	{
321cdf0e10cSrcweir 		WizardDialog::ActivatePage();
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 		WizardState nCurrentLevel = GetCurLevel();
324cdf0e10cSrcweir         GetOrCreatePage( nCurrentLevel );
325cdf0e10cSrcweir 
326cdf0e10cSrcweir 		enterState( nCurrentLevel );
327cdf0e10cSrcweir 	}
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 	//---------------------------------------------------------------------
DeactivatePage()330cdf0e10cSrcweir 	long OWizardMachine::DeactivatePage()
331cdf0e10cSrcweir 	{
332cdf0e10cSrcweir 		WizardState nCurrentState = getCurrentState();
333cdf0e10cSrcweir 		if (!leaveState(nCurrentState) || !WizardDialog::DeactivatePage())
334cdf0e10cSrcweir 			return sal_False;
335cdf0e10cSrcweir 		return sal_True;
336cdf0e10cSrcweir 	}
337cdf0e10cSrcweir 
338cdf0e10cSrcweir 	//---------------------------------------------------------------------
defaultButton(sal_uInt32 _nWizardButtonFlags)339cdf0e10cSrcweir 	void OWizardMachine::defaultButton(sal_uInt32 _nWizardButtonFlags)
340cdf0e10cSrcweir 	{
341cdf0e10cSrcweir 		// the new default button
342cdf0e10cSrcweir 		PushButton* pNewDefButton = NULL;
343cdf0e10cSrcweir 		if (m_pFinish && (_nWizardButtonFlags & WZB_FINISH))
344cdf0e10cSrcweir 			pNewDefButton = m_pFinish;
345cdf0e10cSrcweir 		if (m_pNextPage && (_nWizardButtonFlags & WZB_NEXT))
346cdf0e10cSrcweir 			pNewDefButton = m_pNextPage;
347cdf0e10cSrcweir 		if (m_pPrevPage && (_nWizardButtonFlags & WZB_PREVIOUS))
348cdf0e10cSrcweir 			pNewDefButton = m_pPrevPage;
349cdf0e10cSrcweir 		if (m_pHelp && (_nWizardButtonFlags & WZB_HELP))
350cdf0e10cSrcweir 			pNewDefButton = m_pHelp;
351cdf0e10cSrcweir 		if (m_pCancel && (_nWizardButtonFlags & WZB_CANCEL))
352cdf0e10cSrcweir 			pNewDefButton = m_pCancel;
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 		if ( pNewDefButton )
355cdf0e10cSrcweir 			defaultButton( pNewDefButton );
356cdf0e10cSrcweir         else
357cdf0e10cSrcweir             implResetDefault( this );
358cdf0e10cSrcweir 	}
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 	//---------------------------------------------------------------------
implResetDefault(Window * _pWindow)361cdf0e10cSrcweir 	void OWizardMachine::implResetDefault(Window* _pWindow)
362cdf0e10cSrcweir 	{
363cdf0e10cSrcweir 		Window* pChildLoop = _pWindow->GetWindow(WINDOW_FIRSTCHILD);
364cdf0e10cSrcweir 		while (pChildLoop)
365cdf0e10cSrcweir 		{
366cdf0e10cSrcweir 			// does the window participate in the tabbing order?
367cdf0e10cSrcweir 			if (pChildLoop->GetStyle() & WB_DIALOGCONTROL)
368cdf0e10cSrcweir 				implResetDefault(pChildLoop);
369cdf0e10cSrcweir 
370cdf0e10cSrcweir 			// is it a button?
371cdf0e10cSrcweir 			WindowType eType = pChildLoop->GetType();
372cdf0e10cSrcweir 			if	(	(WINDOW_BUTTON == eType)
373cdf0e10cSrcweir 				||	(WINDOW_PUSHBUTTON == eType)
374cdf0e10cSrcweir 				||	(WINDOW_OKBUTTON == eType)
375cdf0e10cSrcweir 				||	(WINDOW_CANCELBUTTON == eType)
376cdf0e10cSrcweir 				||	(WINDOW_HELPBUTTON == eType)
377cdf0e10cSrcweir 				||	(WINDOW_IMAGEBUTTON == eType)
378cdf0e10cSrcweir 				||	(WINDOW_MENUBUTTON == eType)
379cdf0e10cSrcweir 				||	(WINDOW_MOREBUTTON == eType)
380cdf0e10cSrcweir 				)
381cdf0e10cSrcweir 			{
382cdf0e10cSrcweir 				pChildLoop->SetStyle(pChildLoop->GetStyle() & ~WB_DEFBUTTON);
383cdf0e10cSrcweir 			}
384cdf0e10cSrcweir 
385cdf0e10cSrcweir 			// the next one ...
386cdf0e10cSrcweir 			pChildLoop = pChildLoop->GetWindow(WINDOW_NEXT);
387cdf0e10cSrcweir 		}
388cdf0e10cSrcweir 	}
389cdf0e10cSrcweir 
390cdf0e10cSrcweir 	//---------------------------------------------------------------------
defaultButton(PushButton * _pNewDefButton)391cdf0e10cSrcweir 	void OWizardMachine::defaultButton(PushButton* _pNewDefButton)
392cdf0e10cSrcweir 	{
393cdf0e10cSrcweir 		// loop through all (direct and indirect) descendants which participate in our tabbing order, and
394cdf0e10cSrcweir 		// reset the WB_DEFBUTTON for every window which is a button
395cdf0e10cSrcweir 		implResetDefault(this);
396cdf0e10cSrcweir 
397cdf0e10cSrcweir 		// set it's new style
398cdf0e10cSrcweir 		if (_pNewDefButton)
399cdf0e10cSrcweir 			_pNewDefButton->SetStyle(_pNewDefButton->GetStyle() | WB_DEFBUTTON);
400cdf0e10cSrcweir 	}
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 	//---------------------------------------------------------------------
enableButtons(sal_uInt32 _nWizardButtonFlags,sal_Bool _bEnable)403cdf0e10cSrcweir 	void OWizardMachine::enableButtons(sal_uInt32 _nWizardButtonFlags, sal_Bool _bEnable)
404cdf0e10cSrcweir 	{
405cdf0e10cSrcweir 		if (m_pFinish && (_nWizardButtonFlags & WZB_FINISH))
406cdf0e10cSrcweir 			m_pFinish->Enable(_bEnable);
407cdf0e10cSrcweir 		if (m_pNextPage && (_nWizardButtonFlags & WZB_NEXT))
408cdf0e10cSrcweir 			m_pNextPage->Enable(_bEnable);
409cdf0e10cSrcweir 		if (m_pPrevPage && (_nWizardButtonFlags & WZB_PREVIOUS))
410cdf0e10cSrcweir 			m_pPrevPage->Enable(_bEnable);
411cdf0e10cSrcweir 		if (m_pHelp && (_nWizardButtonFlags & WZB_HELP))
412cdf0e10cSrcweir 			m_pHelp->Enable(_bEnable);
413cdf0e10cSrcweir 		if (m_pCancel && (_nWizardButtonFlags & WZB_CANCEL))
414cdf0e10cSrcweir 			m_pCancel->Enable(_bEnable);
415cdf0e10cSrcweir 	}
416cdf0e10cSrcweir 
417cdf0e10cSrcweir 	//---------------------------------------------------------------------
enterState(WizardState _nState)418cdf0e10cSrcweir 	void OWizardMachine::enterState(WizardState _nState)
419cdf0e10cSrcweir 	{
420cdf0e10cSrcweir 		// tell the page
421cdf0e10cSrcweir 		IWizardPageController* pController = getPageController( GetPage( _nState ) );
422cdf0e10cSrcweir         OSL_ENSURE( pController, "OWizardMachine::enterState: no controller for the given page!" );
423cdf0e10cSrcweir 		if ( pController )
424cdf0e10cSrcweir 			pController->initializePage();
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 		if ( isAutomaticNextButtonStateEnabled() )
427cdf0e10cSrcweir 			enableButtons( WZB_NEXT, canAdvance() );
428cdf0e10cSrcweir 
429cdf0e10cSrcweir 		enableButtons( WZB_PREVIOUS, !m_pImpl->aStateHistory.empty() );
430cdf0e10cSrcweir 
431cdf0e10cSrcweir 		// set the new title - it depends on the current page (i.e. state)
432cdf0e10cSrcweir 		implUpdateTitle();
433cdf0e10cSrcweir 	}
434cdf0e10cSrcweir 
435cdf0e10cSrcweir 	//---------------------------------------------------------------------
leaveState(WizardState)436cdf0e10cSrcweir 	sal_Bool OWizardMachine::leaveState(WizardState)
437cdf0e10cSrcweir 	{
438cdf0e10cSrcweir 		// no need to ask the page here.
439cdf0e10cSrcweir 		// If we reach this point, we already gave the current page the chance to commit it's data,
440cdf0e10cSrcweir 		// and it was allowed to commit it's data
441cdf0e10cSrcweir 
442cdf0e10cSrcweir 		return sal_True;
443cdf0e10cSrcweir 	}
444cdf0e10cSrcweir 
445cdf0e10cSrcweir 	//---------------------------------------------------------------------
onFinish()446cdf0e10cSrcweir 	sal_Bool OWizardMachine::onFinish()
447cdf0e10cSrcweir 	{
448cdf0e10cSrcweir 		return Finnish( RET_OK );
449cdf0e10cSrcweir 	}
450cdf0e10cSrcweir 
451cdf0e10cSrcweir 	//---------------------------------------------------------------------
IMPL_LINK(OWizardMachine,OnFinish,PushButton *,EMPTYARG)452cdf0e10cSrcweir 	IMPL_LINK(OWizardMachine, OnFinish, PushButton*, EMPTYARG)
453cdf0e10cSrcweir 	{
454cdf0e10cSrcweir 		if ( isTravelingSuspended() )
455cdf0e10cSrcweir             return 0;
456cdf0e10cSrcweir         WizardTravelSuspension aTravelGuard( *this );
457cdf0e10cSrcweir         if ( !prepareLeaveCurrentState( eFinish ) )
458cdf0e10cSrcweir         {
459cdf0e10cSrcweir 			return 0L;
460cdf0e10cSrcweir         }
461cdf0e10cSrcweir         return onFinish() ? 1L : 0L;
462cdf0e10cSrcweir 	}
463cdf0e10cSrcweir 
464cdf0e10cSrcweir 	//---------------------------------------------------------------------
determineNextState(WizardState _nCurrentState) const465cdf0e10cSrcweir 	OWizardMachine::WizardState OWizardMachine::determineNextState( WizardState _nCurrentState ) const
466cdf0e10cSrcweir 	{
467cdf0e10cSrcweir 		return _nCurrentState + 1;
468cdf0e10cSrcweir 	}
469cdf0e10cSrcweir 
470cdf0e10cSrcweir 	//---------------------------------------------------------------------
prepareLeaveCurrentState(CommitPageReason _eReason)471cdf0e10cSrcweir     sal_Bool OWizardMachine::prepareLeaveCurrentState( CommitPageReason _eReason )
472cdf0e10cSrcweir 	{
473cdf0e10cSrcweir 		IWizardPageController* pController = getPageController( GetPage( getCurrentState() ) );
474cdf0e10cSrcweir         ENSURE_OR_RETURN( pController != NULL, "OWizardMachine::prepareLeaveCurrentState: no controller for the current page!", sal_True );
475cdf0e10cSrcweir         return pController->commitPage( _eReason );
476cdf0e10cSrcweir 	}
477cdf0e10cSrcweir 
478cdf0e10cSrcweir 	//---------------------------------------------------------------------
skipBackwardUntil(WizardState _nTargetState)479cdf0e10cSrcweir 	sal_Bool OWizardMachine::skipBackwardUntil( WizardState _nTargetState )
480cdf0e10cSrcweir     {
481cdf0e10cSrcweir 		// alowed to leave the current page?
482cdf0e10cSrcweir 		if ( !prepareLeaveCurrentState( eTravelBackward ) )
483cdf0e10cSrcweir 			return sal_False;
484cdf0e10cSrcweir 
485cdf0e10cSrcweir         // don't travel directly on m_pImpl->aStateHistory, in case something goes wrong
486cdf0e10cSrcweir         ::std::stack< WizardState > aTravelVirtually = m_pImpl->aStateHistory;
487cdf0e10cSrcweir 		::std::stack< WizardState > aOldStateHistory = m_pImpl->aStateHistory;
488cdf0e10cSrcweir 
489cdf0e10cSrcweir         WizardState nCurrentRollbackState = getCurrentState();
490cdf0e10cSrcweir         while ( nCurrentRollbackState != _nTargetState )
491cdf0e10cSrcweir         {
492cdf0e10cSrcweir             DBG_ASSERT( !aTravelVirtually.empty(), "OWizardMachine::skipBackwardUntil: this target state does not exist in the history!" );
493cdf0e10cSrcweir 		    nCurrentRollbackState = aTravelVirtually.top();
494cdf0e10cSrcweir     		aTravelVirtually.pop();
495cdf0e10cSrcweir         }
496cdf0e10cSrcweir         m_pImpl->aStateHistory = aTravelVirtually;
497cdf0e10cSrcweir 		if ( !ShowPage( _nTargetState ) )
498cdf0e10cSrcweir 		{
499cdf0e10cSrcweir 	        m_pImpl->aStateHistory = aOldStateHistory;
500cdf0e10cSrcweir 			return sal_False;
501cdf0e10cSrcweir 		}
502cdf0e10cSrcweir 		return sal_True;
503cdf0e10cSrcweir     }
504cdf0e10cSrcweir 
505cdf0e10cSrcweir 	//---------------------------------------------------------------------
skipUntil(WizardState _nTargetState)506cdf0e10cSrcweir 	sal_Bool OWizardMachine::skipUntil( WizardState _nTargetState )
507cdf0e10cSrcweir     {
508cdf0e10cSrcweir 		WizardState nCurrentState = getCurrentState();
509cdf0e10cSrcweir 
510cdf0e10cSrcweir         // alowed to leave the current page?
511cdf0e10cSrcweir         if ( !prepareLeaveCurrentState( nCurrentState < _nTargetState ? eTravelForward : eTravelBackward ) )
512cdf0e10cSrcweir 			return sal_False;
513cdf0e10cSrcweir 
514cdf0e10cSrcweir         // don't travel directly on m_pImpl->aStateHistory, in case something goes wrong
515cdf0e10cSrcweir         ::std::stack< WizardState > aTravelVirtually = m_pImpl->aStateHistory;
516cdf0e10cSrcweir 		::std::stack< WizardState > aOldStateHistory = m_pImpl->aStateHistory;
517cdf0e10cSrcweir         while ( nCurrentState != _nTargetState )
518cdf0e10cSrcweir         {
519cdf0e10cSrcweir     		WizardState nNextState = determineNextState( nCurrentState );
520cdf0e10cSrcweir 			if ( WZS_INVALID_STATE == nNextState )
521cdf0e10cSrcweir             {
522cdf0e10cSrcweir                 DBG_ERROR( "OWizardMachine::skipUntil: the given target state does not exist!" );
523cdf0e10cSrcweir 				return sal_False;
524cdf0e10cSrcweir             }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir             // remember the skipped state in the history
527cdf0e10cSrcweir 			aTravelVirtually.push( nCurrentState );
528cdf0e10cSrcweir 
529cdf0e10cSrcweir 			// get the next state
530cdf0e10cSrcweir 			nCurrentState = nNextState;
531cdf0e10cSrcweir         }
532cdf0e10cSrcweir         m_pImpl->aStateHistory = aTravelVirtually;
533cdf0e10cSrcweir 		// show the target page
534cdf0e10cSrcweir 		if ( !ShowPage( nCurrentState ) )
535cdf0e10cSrcweir         {
536cdf0e10cSrcweir             // argh! prepareLeaveCurrentPage succeeded, determineNextState succeeded,
537cdf0e10cSrcweir             // but ShowPage doesn't? Somebody behaves very strange here ....
538cdf0e10cSrcweir 			DBG_ERROR( "OWizardMachine::skipUntil: very unpolite ...." );
539cdf0e10cSrcweir 	        m_pImpl->aStateHistory = aOldStateHistory;
540cdf0e10cSrcweir 			return sal_False;
541cdf0e10cSrcweir         }
542cdf0e10cSrcweir 		return sal_True;
543cdf0e10cSrcweir     }
544cdf0e10cSrcweir 
545cdf0e10cSrcweir 	//---------------------------------------------------------------------
skip(sal_Int32 _nSteps)546cdf0e10cSrcweir 	sal_Bool OWizardMachine::skip(sal_Int32 _nSteps)
547cdf0e10cSrcweir 	{
548cdf0e10cSrcweir 		DBG_ASSERT(_nSteps > 0, "OWizardMachine::skip: invalid number of steps!");
549cdf0e10cSrcweir 		// alowed to leave the current page?
550cdf0e10cSrcweir 		if ( !prepareLeaveCurrentState( eTravelForward ) )
551cdf0e10cSrcweir 			return sal_False;
552cdf0e10cSrcweir 
553cdf0e10cSrcweir 		WizardState nCurrentState = getCurrentState();
554cdf0e10cSrcweir 		WizardState nNextState = determineNextState(nCurrentState);
555cdf0e10cSrcweir 		// loop _nSteps steps
556cdf0e10cSrcweir 		while (_nSteps-- > 0)
557cdf0e10cSrcweir 		{
558cdf0e10cSrcweir 			if (WZS_INVALID_STATE == nNextState)
559cdf0e10cSrcweir 				return sal_False;
560cdf0e10cSrcweir 
561cdf0e10cSrcweir 			// remember the skipped state in the history
562cdf0e10cSrcweir 			m_pImpl->aStateHistory.push(nCurrentState);
563cdf0e10cSrcweir 
564cdf0e10cSrcweir 			// get the next state
565cdf0e10cSrcweir 			nCurrentState = nNextState;
566cdf0e10cSrcweir 			nNextState = determineNextState(nCurrentState);
567cdf0e10cSrcweir 		}
568cdf0e10cSrcweir 
569cdf0e10cSrcweir 		// show the (n+1)th page
570cdf0e10cSrcweir 		if (!ShowPage(nCurrentState))
571cdf0e10cSrcweir 		{
572cdf0e10cSrcweir 			// TODO: this leaves us in a state where we have no current page and an inconsistent state history.
573cdf0e10cSrcweir 			// Perhaps we should rollback the skipping here ....
574cdf0e10cSrcweir 			DBG_ERROR("OWizardMachine::skip: very unpolite ....");
575cdf0e10cSrcweir 				// if somebody does a skip and then does not allow to leave ...
576cdf0e10cSrcweir 				// (can't be a commit error, as we've already committed the current page. So if ShowPage fails here,
577cdf0e10cSrcweir 				// somebody behaves really strange ...)
578cdf0e10cSrcweir 			return sal_False;
579cdf0e10cSrcweir 		}
580cdf0e10cSrcweir 
581cdf0e10cSrcweir 		// all fine
582cdf0e10cSrcweir 		return sal_True;
583cdf0e10cSrcweir 	}
584cdf0e10cSrcweir 
585cdf0e10cSrcweir 	//---------------------------------------------------------------------
travelNext()586cdf0e10cSrcweir 	sal_Bool OWizardMachine::travelNext()
587cdf0e10cSrcweir 	{
588cdf0e10cSrcweir 		// allowed to leave the current page?
589cdf0e10cSrcweir 		if ( !prepareLeaveCurrentState( eTravelForward ) )
590cdf0e10cSrcweir 			return sal_False;
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 		// determine the next state to travel to
593cdf0e10cSrcweir 		WizardState nCurrentState = getCurrentState();
594cdf0e10cSrcweir 		WizardState nNextState = determineNextState(nCurrentState);
595cdf0e10cSrcweir 		if (WZS_INVALID_STATE == nNextState)
596cdf0e10cSrcweir 			return sal_False;
597cdf0e10cSrcweir 
598cdf0e10cSrcweir 		// the state history is used by the enterState method
599cdf0e10cSrcweir 		// all fine
600cdf0e10cSrcweir 		m_pImpl->aStateHistory.push(nCurrentState);
601cdf0e10cSrcweir 		if (!ShowPage(nNextState))
602cdf0e10cSrcweir 		{
603cdf0e10cSrcweir 			m_pImpl->aStateHistory.pop();
604cdf0e10cSrcweir 			return sal_False;
605cdf0e10cSrcweir 		}
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 		return sal_True;
608cdf0e10cSrcweir 	}
609cdf0e10cSrcweir 
610cdf0e10cSrcweir 	//---------------------------------------------------------------------
travelPrevious()611cdf0e10cSrcweir 	sal_Bool OWizardMachine::travelPrevious()
612cdf0e10cSrcweir 	{
613cdf0e10cSrcweir 		DBG_ASSERT(m_pImpl->aStateHistory.size() > 0, "OWizardMachine::travelPrevious: have no previous page!");
614cdf0e10cSrcweir 
615cdf0e10cSrcweir 		// alowed to leave the current page?
616cdf0e10cSrcweir 		if ( !prepareLeaveCurrentState( eTravelBackward ) )
617cdf0e10cSrcweir 			return sal_False;
618cdf0e10cSrcweir 
619cdf0e10cSrcweir 		// the next state to switch to
620cdf0e10cSrcweir 		WizardState nPreviousState = m_pImpl->aStateHistory.top();
621cdf0e10cSrcweir 
622cdf0e10cSrcweir 		// the state history is used by the enterState method
623cdf0e10cSrcweir 		m_pImpl->aStateHistory.pop();
624cdf0e10cSrcweir 		// show this page
625cdf0e10cSrcweir 		if (!ShowPage(nPreviousState))
626cdf0e10cSrcweir 		{
627cdf0e10cSrcweir 			m_pImpl->aStateHistory.push(nPreviousState);
628cdf0e10cSrcweir 			return sal_False;
629cdf0e10cSrcweir 		}
630cdf0e10cSrcweir 
631cdf0e10cSrcweir 		// all fine
632cdf0e10cSrcweir 		return sal_True;
633cdf0e10cSrcweir 	}
634cdf0e10cSrcweir 
635cdf0e10cSrcweir     //---------------------------------------------------------------------
removePageFromHistory(WizardState nToRemove)636cdf0e10cSrcweir     void  OWizardMachine::removePageFromHistory( WizardState nToRemove )
637cdf0e10cSrcweir     {
638cdf0e10cSrcweir 
639cdf0e10cSrcweir         ::std::stack< WizardState > aTemp;
640cdf0e10cSrcweir         while(!m_pImpl->aStateHistory.empty())
641cdf0e10cSrcweir         {
642cdf0e10cSrcweir             WizardState nPreviousState = m_pImpl->aStateHistory.top();
643cdf0e10cSrcweir             m_pImpl->aStateHistory.pop();
644cdf0e10cSrcweir             if(nPreviousState != nToRemove)
645cdf0e10cSrcweir                 aTemp.push( nPreviousState );
646cdf0e10cSrcweir             else
647cdf0e10cSrcweir                 break;
648cdf0e10cSrcweir         }
649cdf0e10cSrcweir         while(!aTemp.empty())
650cdf0e10cSrcweir         {
651cdf0e10cSrcweir             m_pImpl->aStateHistory.push( aTemp.top() );
652cdf0e10cSrcweir             aTemp.pop();
653cdf0e10cSrcweir         }
654cdf0e10cSrcweir     }
655cdf0e10cSrcweir 
656cdf0e10cSrcweir 	//---------------------------------------------------------------------
enableAutomaticNextButtonState(bool _bEnable)657cdf0e10cSrcweir     void OWizardMachine::enableAutomaticNextButtonState( bool _bEnable )
658cdf0e10cSrcweir     {
659cdf0e10cSrcweir         m_pImpl->m_bAutoNextButtonState = _bEnable;
660cdf0e10cSrcweir     }
661cdf0e10cSrcweir 
662cdf0e10cSrcweir     //---------------------------------------------------------------------
isAutomaticNextButtonStateEnabled() const663cdf0e10cSrcweir     bool OWizardMachine::isAutomaticNextButtonStateEnabled() const
664cdf0e10cSrcweir     {
665cdf0e10cSrcweir         return m_pImpl->m_bAutoNextButtonState;
666cdf0e10cSrcweir     }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir     //---------------------------------------------------------------------
IMPL_LINK(OWizardMachine,OnPrevPage,PushButton *,EMPTYARG)669cdf0e10cSrcweir 	IMPL_LINK(OWizardMachine, OnPrevPage, PushButton*, EMPTYARG)
670cdf0e10cSrcweir 	{
671cdf0e10cSrcweir 		if ( isTravelingSuspended() )
672cdf0e10cSrcweir             return 0;
673cdf0e10cSrcweir         WizardTravelSuspension aTravelGuard( *this );
674cdf0e10cSrcweir 		sal_Int32 nRet = travelPrevious();
675cdf0e10cSrcweir         return nRet;
676cdf0e10cSrcweir 	}
677cdf0e10cSrcweir 
678cdf0e10cSrcweir 	//---------------------------------------------------------------------
IMPL_LINK(OWizardMachine,OnNextPage,PushButton *,EMPTYARG)679cdf0e10cSrcweir 	IMPL_LINK(OWizardMachine, OnNextPage, PushButton*, EMPTYARG)
680cdf0e10cSrcweir 	{
681cdf0e10cSrcweir 		if ( isTravelingSuspended() )
682cdf0e10cSrcweir             return 0;
683cdf0e10cSrcweir         WizardTravelSuspension aTravelGuard( *this );
684cdf0e10cSrcweir 		sal_Int32 nRet = travelNext();
685cdf0e10cSrcweir         return nRet;
686cdf0e10cSrcweir 	}
687cdf0e10cSrcweir 
688cdf0e10cSrcweir     //---------------------------------------------------------------------
getPageController(TabPage * _pCurrentPage) const689cdf0e10cSrcweir 	IWizardPageController* OWizardMachine::getPageController( TabPage* _pCurrentPage ) const
690cdf0e10cSrcweir 	{
691cdf0e10cSrcweir 		IWizardPageController* pController = dynamic_cast< IWizardPageController* >( _pCurrentPage );
692cdf0e10cSrcweir 		return pController;
693cdf0e10cSrcweir 	}
694cdf0e10cSrcweir 
695cdf0e10cSrcweir     //---------------------------------------------------------------------
getStateHistory(::std::vector<WizardState> & _out_rHistory)696cdf0e10cSrcweir     void OWizardMachine::getStateHistory( ::std::vector< WizardState >& _out_rHistory )
697cdf0e10cSrcweir     {
698cdf0e10cSrcweir         ::std::stack< WizardState > aHistoryCopy( m_pImpl->aStateHistory );
699cdf0e10cSrcweir         while ( !aHistoryCopy.empty() )
700cdf0e10cSrcweir         {
701cdf0e10cSrcweir             _out_rHistory.push_back( aHistoryCopy.top() );
702cdf0e10cSrcweir             aHistoryCopy.pop();
703cdf0e10cSrcweir         }
704cdf0e10cSrcweir     }
705cdf0e10cSrcweir 
706cdf0e10cSrcweir     //---------------------------------------------------------------------
canAdvance() const707cdf0e10cSrcweir     bool OWizardMachine::canAdvance() const
708cdf0e10cSrcweir     {
709cdf0e10cSrcweir         return WZS_INVALID_STATE != determineNextState( getCurrentState() );
710cdf0e10cSrcweir     }
711cdf0e10cSrcweir 
712cdf0e10cSrcweir     //---------------------------------------------------------------------
updateTravelUI()713cdf0e10cSrcweir     void OWizardMachine::updateTravelUI()
714cdf0e10cSrcweir     {
715cdf0e10cSrcweir         const IWizardPageController* pController = getPageController( GetPage( getCurrentState() ) );
716cdf0e10cSrcweir         OSL_ENSURE( pController != NULL, "RoadmapWizard::updateTravelUI: no controller for the current page!" );
717cdf0e10cSrcweir 
718cdf0e10cSrcweir         bool bCanAdvance =
719cdf0e10cSrcweir                 ( !pController || pController->canAdvance() )   // the current page allows to advance
720cdf0e10cSrcweir             &&  canAdvance();                                   // the dialog as a whole allows to advance
721cdf0e10cSrcweir         enableButtons( WZB_NEXT, bCanAdvance );
722cdf0e10cSrcweir     }
723cdf0e10cSrcweir 
724cdf0e10cSrcweir     //---------------------------------------------------------------------
isTravelingSuspended() const725cdf0e10cSrcweir     bool OWizardMachine::isTravelingSuspended() const
726cdf0e10cSrcweir     {
727cdf0e10cSrcweir         return m_pImpl->m_bTravelingSuspended;
728cdf0e10cSrcweir     }
729cdf0e10cSrcweir 
730cdf0e10cSrcweir 	//---------------------------------------------------------------------
suspendTraveling(AccessGuard)731cdf0e10cSrcweir     void OWizardMachine::suspendTraveling( AccessGuard )
732cdf0e10cSrcweir     {
733cdf0e10cSrcweir         DBG_ASSERT( !m_pImpl->m_bTravelingSuspended, "OWizardMachine::suspendTraveling: already suspended!" );
734cdf0e10cSrcweir        m_pImpl->m_bTravelingSuspended = true;
735cdf0e10cSrcweir     }
736cdf0e10cSrcweir 
737cdf0e10cSrcweir 	//---------------------------------------------------------------------
resumeTraveling(AccessGuard)738cdf0e10cSrcweir     void OWizardMachine::resumeTraveling( AccessGuard )
739cdf0e10cSrcweir     {
740cdf0e10cSrcweir         DBG_ASSERT( m_pImpl->m_bTravelingSuspended, "OWizardMachine::resumeTraveling: nothing to resume!" );
741cdf0e10cSrcweir        m_pImpl->m_bTravelingSuspended = false;
742cdf0e10cSrcweir     }
743cdf0e10cSrcweir 
744cdf0e10cSrcweir //.........................................................................
745cdf0e10cSrcweir }	// namespace svt
746cdf0e10cSrcweir //.........................................................................
747