xref: /trunk/main/svtools/source/dialogs/wizardmachine.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
15900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
35900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
45900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
55900e8ecSAndrew Rist  * distributed with this work for additional information
65900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
75900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
85900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
95900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
115900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
135900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
145900e8ecSAndrew Rist  * software distributed under the License is distributed on an
155900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
175900e8ecSAndrew Rist  * specific language governing permissions and limitations
185900e8ecSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
205900e8ecSAndrew Rist  *************************************************************/
215900e8ecSAndrew Rist 
225900e8ecSAndrew 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
116*49333635SJohn Bampton             // not possible to add pages in a non-linear order), so we need some own maintenance 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     {
481*49333635SJohn Bampton         // allowed 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 
510*49333635SJohn Bampton         // allowed 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!");
549*49333635SJohn Bampton         // allowed 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 
615*49333635SJohn Bampton         // allowed 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