xref: /aoo41x/main/svtools/source/dialogs/wizdlg.cxx (revision 5900e8ec)
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 
27cdf0e10cSrcweir #define _SVT_WIZDLG_CXX
28cdf0e10cSrcweir #include <tools/debug.hxx>
29cdf0e10cSrcweir #ifndef _VCL_FIXED_HXX
30cdf0e10cSrcweir #include <vcl/fixed.hxx>
31cdf0e10cSrcweir #endif
32cdf0e10cSrcweir #ifndef _VCL_BUTTON_HXX
33cdf0e10cSrcweir #include <vcl/button.hxx>
34cdf0e10cSrcweir #endif
35cdf0e10cSrcweir #ifndef _VCL_TABPAGE_HXX
36cdf0e10cSrcweir #include <vcl/tabpage.hxx>
37cdf0e10cSrcweir #endif
38cdf0e10cSrcweir #include <svtools/wizdlg.hxx>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir // =======================================================================
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #define WIZARDDIALOG_BUTTON_OFFSET_Y        6
43cdf0e10cSrcweir #define WIZARDDIALOG_BUTTON_DLGOFFSET_X     6
44cdf0e10cSrcweir #define WIZARDDIALOG_VIEW_DLGOFFSET_X       6
45cdf0e10cSrcweir #define WIZARDDIALOG_VIEW_DLGOFFSET_Y       6
46cdf0e10cSrcweir 
47cdf0e10cSrcweir // =======================================================================
48cdf0e10cSrcweir 
49cdf0e10cSrcweir struct ImplWizPageData
50cdf0e10cSrcweir {
51cdf0e10cSrcweir     ImplWizPageData*    mpNext;
52cdf0e10cSrcweir     TabPage*            mpPage;
53cdf0e10cSrcweir };
54cdf0e10cSrcweir 
55cdf0e10cSrcweir // -----------------------------------------------------------------------
56cdf0e10cSrcweir 
57cdf0e10cSrcweir struct ImplWizButtonData
58cdf0e10cSrcweir {
59cdf0e10cSrcweir     ImplWizButtonData*  mpNext;
60cdf0e10cSrcweir     Button*             mpButton;
61cdf0e10cSrcweir     long                mnOffset;
62cdf0e10cSrcweir };
63cdf0e10cSrcweir 
64cdf0e10cSrcweir // =======================================================================
65cdf0e10cSrcweir 
ImplInitData()66cdf0e10cSrcweir void WizardDialog::ImplInitData()
67cdf0e10cSrcweir {
68cdf0e10cSrcweir     mpFirstPage     = NULL;
69cdf0e10cSrcweir     mpFirstBtn      = NULL;
70cdf0e10cSrcweir     mpFixedLine     = NULL;
71cdf0e10cSrcweir     mpCurTabPage    = NULL;
72cdf0e10cSrcweir     mpPrevBtn       = NULL;
73cdf0e10cSrcweir     mpNextBtn       = NULL;
74cdf0e10cSrcweir     mpViewWindow    = NULL;
75cdf0e10cSrcweir     mnCurLevel      = 0;
76cdf0e10cSrcweir     meViewAlign     = WINDOWALIGN_LEFT;
77cdf0e10cSrcweir     mbEmptyViewMargin =  false;
78cdf0e10cSrcweir     mnLeftAlignCount = 0;
79cdf0e10cSrcweir }
80cdf0e10cSrcweir 
81cdf0e10cSrcweir // -----------------------------------------------------------------------
SetLeftAlignedButtonCount(sal_Int16 _nCount)82cdf0e10cSrcweir void WizardDialog::SetLeftAlignedButtonCount( sal_Int16 _nCount )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir     mnLeftAlignCount = _nCount;
85cdf0e10cSrcweir }
86cdf0e10cSrcweir 
87cdf0e10cSrcweir // -----------------------------------------------------------------------
88cdf0e10cSrcweir 
SetEmptyViewMargin()89cdf0e10cSrcweir void WizardDialog::SetEmptyViewMargin()
90cdf0e10cSrcweir {
91cdf0e10cSrcweir     mbEmptyViewMargin = true;
92cdf0e10cSrcweir }
93cdf0e10cSrcweir 
94cdf0e10cSrcweir // -----------------------------------------------------------------------
95cdf0e10cSrcweir 
ImplCalcSize(Size & rSize)96cdf0e10cSrcweir void WizardDialog::ImplCalcSize( Size& rSize )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir     // ButtonBar-Hoehe berechnen
99cdf0e10cSrcweir     long                nMaxHeight = 0;
100cdf0e10cSrcweir     ImplWizButtonData*  pBtnData = mpFirstBtn;
101cdf0e10cSrcweir     while ( pBtnData )
102cdf0e10cSrcweir     {
103cdf0e10cSrcweir         long nBtnHeight = pBtnData->mpButton->GetSizePixel().Height();
104cdf0e10cSrcweir         if ( nBtnHeight > nMaxHeight )
105cdf0e10cSrcweir             nMaxHeight = nBtnHeight;
106cdf0e10cSrcweir         pBtnData = pBtnData->mpNext;
107cdf0e10cSrcweir     }
108cdf0e10cSrcweir     if ( nMaxHeight )
109cdf0e10cSrcweir         nMaxHeight += WIZARDDIALOG_BUTTON_OFFSET_Y*2;
110cdf0e10cSrcweir     if ( mpFixedLine && mpFixedLine->IsVisible() )
111cdf0e10cSrcweir         nMaxHeight += mpFixedLine->GetSizePixel().Height();
112cdf0e10cSrcweir     rSize.Height() += nMaxHeight;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir     // View-Window-Groesse dazurechnen
115cdf0e10cSrcweir     if ( mpViewWindow && mpViewWindow->IsVisible() )
116cdf0e10cSrcweir     {
117cdf0e10cSrcweir         Size aViewSize = mpViewWindow->GetSizePixel();
118cdf0e10cSrcweir         if ( meViewAlign == WINDOWALIGN_TOP )
119cdf0e10cSrcweir             rSize.Height() += aViewSize.Height();
120cdf0e10cSrcweir         else if ( meViewAlign == WINDOWALIGN_LEFT )
121cdf0e10cSrcweir             rSize.Width() += aViewSize.Width();
122cdf0e10cSrcweir         else if ( meViewAlign == WINDOWALIGN_BOTTOM )
123cdf0e10cSrcweir             rSize.Height() += aViewSize.Height();
124cdf0e10cSrcweir         else if ( meViewAlign == WINDOWALIGN_RIGHT )
125cdf0e10cSrcweir             rSize.Width() += aViewSize.Width();
126cdf0e10cSrcweir     }
127cdf0e10cSrcweir }
128cdf0e10cSrcweir 
129cdf0e10cSrcweir // -----------------------------------------------------------------------
130cdf0e10cSrcweir 
ImplPosCtrls()131cdf0e10cSrcweir void WizardDialog::ImplPosCtrls()
132cdf0e10cSrcweir {
133cdf0e10cSrcweir     Size    aDlgSize = GetOutputSizePixel();
134cdf0e10cSrcweir     long    nBtnWidth = 0;
135cdf0e10cSrcweir     long    nMaxHeight = 0;
136cdf0e10cSrcweir     long    nOffY = aDlgSize.Height();
137cdf0e10cSrcweir 
138cdf0e10cSrcweir     ImplWizButtonData* pBtnData = mpFirstBtn;
139cdf0e10cSrcweir     int j = 0;
140cdf0e10cSrcweir     while ( pBtnData )
141cdf0e10cSrcweir     {
142cdf0e10cSrcweir         if (j >= mnLeftAlignCount)
143cdf0e10cSrcweir         {
144cdf0e10cSrcweir             Size aBtnSize = pBtnData->mpButton->GetSizePixel();
145cdf0e10cSrcweir             long nBtnHeight = aBtnSize.Height();
146cdf0e10cSrcweir             if ( nBtnHeight > nMaxHeight )
147cdf0e10cSrcweir                 nMaxHeight = nBtnHeight;
148cdf0e10cSrcweir             nBtnWidth += aBtnSize.Width();
149cdf0e10cSrcweir             nBtnWidth += pBtnData->mnOffset;
150cdf0e10cSrcweir         }
151cdf0e10cSrcweir         pBtnData = pBtnData->mpNext;
152cdf0e10cSrcweir         j++;
153cdf0e10cSrcweir     }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir     if ( nMaxHeight )
156cdf0e10cSrcweir     {
157cdf0e10cSrcweir         long nOffX = aDlgSize.Width()-nBtnWidth-WIZARDDIALOG_BUTTON_DLGOFFSET_X;
158cdf0e10cSrcweir         long nOffLeftAlignX = LogicalCoordinateToPixel(6);
159cdf0e10cSrcweir         nOffY -= WIZARDDIALOG_BUTTON_OFFSET_Y+nMaxHeight;
160cdf0e10cSrcweir 
161cdf0e10cSrcweir         pBtnData = mpFirstBtn;
162cdf0e10cSrcweir         int i = 0;
163cdf0e10cSrcweir         while ( pBtnData )
164cdf0e10cSrcweir         {
165cdf0e10cSrcweir             Size aBtnSize = pBtnData->mpButton->GetSizePixel();
166cdf0e10cSrcweir             if (i >= mnLeftAlignCount)
167cdf0e10cSrcweir             {
168cdf0e10cSrcweir                 Point aPos( nOffX, nOffY+((nMaxHeight-aBtnSize.Height())/2) );
169cdf0e10cSrcweir                 pBtnData->mpButton->SetPosPixel( aPos );
170cdf0e10cSrcweir                 nOffX += aBtnSize.Width();
171cdf0e10cSrcweir                 nOffX += pBtnData->mnOffset;
172cdf0e10cSrcweir             }
173cdf0e10cSrcweir             else
174cdf0e10cSrcweir             {
175cdf0e10cSrcweir                 Point aPos( nOffLeftAlignX, nOffY+((nMaxHeight-aBtnSize.Height())/2) );
176cdf0e10cSrcweir                 pBtnData->mpButton->SetPosPixel( aPos );
177cdf0e10cSrcweir                 nOffLeftAlignX += aBtnSize.Width();
178cdf0e10cSrcweir                 nOffLeftAlignX += pBtnData->mnOffset;
179cdf0e10cSrcweir             }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir             pBtnData = pBtnData->mpNext;
182cdf0e10cSrcweir             i++;
183cdf0e10cSrcweir         }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir         nOffY -= WIZARDDIALOG_BUTTON_OFFSET_Y;
186cdf0e10cSrcweir     }
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     if ( mpFixedLine && mpFixedLine->IsVisible() )
189cdf0e10cSrcweir     {
190cdf0e10cSrcweir         nOffY -= mpFixedLine->GetSizePixel().Height();
191cdf0e10cSrcweir         mpFixedLine->SetPosSizePixel( 0, nOffY, aDlgSize.Width(), 0,
192cdf0e10cSrcweir                                       WINDOW_POSSIZE_POS | WINDOW_POSSIZE_WIDTH );
193cdf0e10cSrcweir     }
194cdf0e10cSrcweir 
195cdf0e10cSrcweir     if ( mpViewWindow && mpViewWindow->IsVisible() )
196cdf0e10cSrcweir     {
197cdf0e10cSrcweir         long    nViewOffX = 0;
198cdf0e10cSrcweir         long    nViewOffY = 0;
199cdf0e10cSrcweir         long    nViewWidth = 0;
200cdf0e10cSrcweir         long    nViewHeight = 0;
201cdf0e10cSrcweir         long    nDlgHeight = nOffY;
202cdf0e10cSrcweir         sal_uInt16  nViewPosFlags = WINDOW_POSSIZE_POS;
203cdf0e10cSrcweir         if ( meViewAlign == WINDOWALIGN_TOP )
204cdf0e10cSrcweir         {
205cdf0e10cSrcweir             nViewOffX       = WIZARDDIALOG_VIEW_DLGOFFSET_X;
206cdf0e10cSrcweir             nViewOffY       = WIZARDDIALOG_VIEW_DLGOFFSET_Y;
207cdf0e10cSrcweir             nViewWidth      = aDlgSize.Width()-(WIZARDDIALOG_VIEW_DLGOFFSET_X*2);
208cdf0e10cSrcweir             nViewPosFlags  |= WINDOW_POSSIZE_WIDTH;
209cdf0e10cSrcweir         }
210cdf0e10cSrcweir         else if ( meViewAlign == WINDOWALIGN_LEFT )
211cdf0e10cSrcweir         {
212cdf0e10cSrcweir             if ( mbEmptyViewMargin )
213cdf0e10cSrcweir             {
214cdf0e10cSrcweir                 nViewOffX       = 0;
215cdf0e10cSrcweir                 nViewOffY       = 0;
216cdf0e10cSrcweir                 nViewHeight     = nDlgHeight;
217cdf0e10cSrcweir             }
218cdf0e10cSrcweir             else
219cdf0e10cSrcweir             {
220cdf0e10cSrcweir                 nViewOffX       = WIZARDDIALOG_VIEW_DLGOFFSET_X;
221cdf0e10cSrcweir                 nViewOffY       = WIZARDDIALOG_VIEW_DLGOFFSET_Y;
222cdf0e10cSrcweir                 nViewHeight     = nDlgHeight-(WIZARDDIALOG_VIEW_DLGOFFSET_Y*2);
223cdf0e10cSrcweir             }
224cdf0e10cSrcweir             nViewPosFlags  |= WINDOW_POSSIZE_HEIGHT;
225cdf0e10cSrcweir         }
226cdf0e10cSrcweir         else if ( meViewAlign == WINDOWALIGN_BOTTOM )
227cdf0e10cSrcweir         {
228cdf0e10cSrcweir             nViewOffX       = WIZARDDIALOG_VIEW_DLGOFFSET_X;
229cdf0e10cSrcweir             nViewOffY       = nDlgHeight-mpViewWindow->GetSizePixel().Height()-WIZARDDIALOG_VIEW_DLGOFFSET_Y;
230cdf0e10cSrcweir             nViewWidth      = aDlgSize.Width()-(WIZARDDIALOG_VIEW_DLGOFFSET_X*2);
231cdf0e10cSrcweir             nViewPosFlags  |= WINDOW_POSSIZE_WIDTH;
232cdf0e10cSrcweir         }
233cdf0e10cSrcweir         else if ( meViewAlign == WINDOWALIGN_RIGHT )
234cdf0e10cSrcweir         {
235cdf0e10cSrcweir             nViewOffX       = aDlgSize.Width()-mpViewWindow->GetSizePixel().Width()-WIZARDDIALOG_VIEW_DLGOFFSET_X;
236cdf0e10cSrcweir             nViewOffY       = WIZARDDIALOG_VIEW_DLGOFFSET_Y;
237cdf0e10cSrcweir             nViewHeight     = nDlgHeight-(WIZARDDIALOG_VIEW_DLGOFFSET_Y*2);
238cdf0e10cSrcweir             nViewPosFlags  |= WINDOW_POSSIZE_HEIGHT;
239cdf0e10cSrcweir         }
240cdf0e10cSrcweir         mpViewWindow->SetPosSizePixel( nViewOffX, nViewOffY,
241cdf0e10cSrcweir                                        nViewWidth, nViewHeight,
242cdf0e10cSrcweir                                        nViewPosFlags );
243cdf0e10cSrcweir     }
244cdf0e10cSrcweir }
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 
LogicalCoordinateToPixel(int iCoordinate)247cdf0e10cSrcweir long WizardDialog::LogicalCoordinateToPixel(int iCoordinate){
248cdf0e10cSrcweir     Size aLocSize = LogicToPixel(Size( iCoordinate, 0 ), MAP_APPFONT );
249cdf0e10cSrcweir     int iPixelCoordinate =  aLocSize.Width();
250cdf0e10cSrcweir     return iPixelCoordinate;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 
254cdf0e10cSrcweir // -----------------------------------------------------------------------
255cdf0e10cSrcweir 
ImplPosTabPage()256cdf0e10cSrcweir void WizardDialog::ImplPosTabPage()
257cdf0e10cSrcweir {
258cdf0e10cSrcweir     if ( !mpCurTabPage )
259cdf0e10cSrcweir         return;
260cdf0e10cSrcweir 
261cdf0e10cSrcweir     if ( !IsInInitShow() )
262cdf0e10cSrcweir     {
263cdf0e10cSrcweir         // #100199# - On Unix initial size is equal to screen size, on Windows
264cdf0e10cSrcweir         // it's 0,0. One cannot calculate the size unless dialog is visible.
265cdf0e10cSrcweir         if ( !IsReallyVisible() )
266cdf0e10cSrcweir             return;
267cdf0e10cSrcweir     }
268cdf0e10cSrcweir 
269cdf0e10cSrcweir     // ButtonBar-Hoehe berechnen
270cdf0e10cSrcweir     long                nMaxHeight = 0;
271cdf0e10cSrcweir     ImplWizButtonData*  pBtnData = mpFirstBtn;
272cdf0e10cSrcweir     while ( pBtnData )
273cdf0e10cSrcweir     {
274cdf0e10cSrcweir         long nBtnHeight = pBtnData->mpButton->GetSizePixel().Height();
275cdf0e10cSrcweir         if ( nBtnHeight > nMaxHeight )
276cdf0e10cSrcweir             nMaxHeight = nBtnHeight;
277cdf0e10cSrcweir         pBtnData = pBtnData->mpNext;
278cdf0e10cSrcweir     }
279cdf0e10cSrcweir     if ( nMaxHeight )
280cdf0e10cSrcweir         nMaxHeight += WIZARDDIALOG_BUTTON_OFFSET_Y*2;
281cdf0e10cSrcweir     if ( mpFixedLine && mpFixedLine->IsVisible() )
282cdf0e10cSrcweir         nMaxHeight += mpFixedLine->GetSizePixel().Height();
283cdf0e10cSrcweir 
284cdf0e10cSrcweir     // TabPage positionieren
285cdf0e10cSrcweir     Size aDlgSize = GetOutputSizePixel();
286cdf0e10cSrcweir     aDlgSize.Height() -= nMaxHeight;
287cdf0e10cSrcweir     long nOffX = 0;
288cdf0e10cSrcweir     long nOffY = 0;
289cdf0e10cSrcweir     if ( mpViewWindow && mpViewWindow->IsVisible() )
290cdf0e10cSrcweir     {
291cdf0e10cSrcweir         Size aViewSize = mpViewWindow->GetSizePixel();
292cdf0e10cSrcweir         if ( meViewAlign == WINDOWALIGN_TOP )
293cdf0e10cSrcweir         {
294cdf0e10cSrcweir             nOffY += aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y;
295cdf0e10cSrcweir             aDlgSize.Height() -= aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y;
296cdf0e10cSrcweir         }
297cdf0e10cSrcweir         else if ( meViewAlign == WINDOWALIGN_LEFT )
298cdf0e10cSrcweir         {
299cdf0e10cSrcweir             long nViewOffset = mbEmptyViewMargin ? 0 : WIZARDDIALOG_VIEW_DLGOFFSET_X;
300cdf0e10cSrcweir             nOffX += aViewSize.Width() + nViewOffset;
301cdf0e10cSrcweir             aDlgSize.Width() -= nOffX;
302cdf0e10cSrcweir         }
303cdf0e10cSrcweir         else if ( meViewAlign == WINDOWALIGN_BOTTOM )
304cdf0e10cSrcweir             aDlgSize.Height() -= aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y;
305cdf0e10cSrcweir         else if ( meViewAlign == WINDOWALIGN_RIGHT )
306cdf0e10cSrcweir             aDlgSize.Width() -= aViewSize.Width()+WIZARDDIALOG_VIEW_DLGOFFSET_X;
307cdf0e10cSrcweir     }
308cdf0e10cSrcweir     Point aPos( nOffX, nOffY );
309cdf0e10cSrcweir     mpCurTabPage->SetPosSizePixel( aPos, aDlgSize );
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir // -----------------------------------------------------------------------
313cdf0e10cSrcweir 
ImplShowTabPage(TabPage * pTabPage)314cdf0e10cSrcweir void WizardDialog::ImplShowTabPage( TabPage* pTabPage )
315cdf0e10cSrcweir {
316cdf0e10cSrcweir     if ( mpCurTabPage == pTabPage )
317cdf0e10cSrcweir         return;
318cdf0e10cSrcweir 
319cdf0e10cSrcweir     TabPage* pOldTabPage = mpCurTabPage;
320cdf0e10cSrcweir     if ( pOldTabPage )
321cdf0e10cSrcweir         pOldTabPage->DeactivatePage();
322cdf0e10cSrcweir 
323cdf0e10cSrcweir     mpCurTabPage = pTabPage;
324cdf0e10cSrcweir     if ( pTabPage )
325cdf0e10cSrcweir     {
326cdf0e10cSrcweir         ImplPosTabPage();
327cdf0e10cSrcweir         pTabPage->ActivatePage();
328cdf0e10cSrcweir         pTabPage->Show();
329cdf0e10cSrcweir     }
330cdf0e10cSrcweir 
331cdf0e10cSrcweir     if ( pOldTabPage )
332cdf0e10cSrcweir         pOldTabPage->Hide();
333cdf0e10cSrcweir }
334cdf0e10cSrcweir 
335cdf0e10cSrcweir // -----------------------------------------------------------------------
336cdf0e10cSrcweir 
ImplGetPage(sal_uInt16 nLevel) const337cdf0e10cSrcweir TabPage* WizardDialog::ImplGetPage( sal_uInt16 nLevel ) const
338cdf0e10cSrcweir {
339cdf0e10cSrcweir     sal_uInt16              nTempLevel = 0;
340cdf0e10cSrcweir     ImplWizPageData*    pPageData = mpFirstPage;
341cdf0e10cSrcweir     while ( pPageData )
342cdf0e10cSrcweir     {
343cdf0e10cSrcweir         if ( (nTempLevel == nLevel) || !pPageData->mpNext )
344cdf0e10cSrcweir             break;
345cdf0e10cSrcweir 
346cdf0e10cSrcweir         nTempLevel++;
347cdf0e10cSrcweir         pPageData = pPageData->mpNext;
348cdf0e10cSrcweir     }
349cdf0e10cSrcweir 
350cdf0e10cSrcweir     if ( pPageData )
351cdf0e10cSrcweir         return pPageData->mpPage;
352cdf0e10cSrcweir     return NULL;
353cdf0e10cSrcweir }
354cdf0e10cSrcweir 
355cdf0e10cSrcweir // =======================================================================
356cdf0e10cSrcweir 
WizardDialog(Window * pParent,WinBits nStyle)357cdf0e10cSrcweir WizardDialog::WizardDialog( Window* pParent, WinBits nStyle ) :
358cdf0e10cSrcweir     ModalDialog( pParent, nStyle )
359cdf0e10cSrcweir {
360cdf0e10cSrcweir     ImplInitData();
361cdf0e10cSrcweir }
362cdf0e10cSrcweir 
363cdf0e10cSrcweir // -----------------------------------------------------------------------
364cdf0e10cSrcweir 
WizardDialog(Window * pParent,const ResId & rResId)365cdf0e10cSrcweir WizardDialog::WizardDialog( Window* pParent, const ResId& rResId ) :
366cdf0e10cSrcweir     ModalDialog( pParent, rResId )
367cdf0e10cSrcweir {
368cdf0e10cSrcweir     ImplInitData();
369cdf0e10cSrcweir }
370cdf0e10cSrcweir 
371cdf0e10cSrcweir // -----------------------------------------------------------------------
372cdf0e10cSrcweir 
~WizardDialog()373cdf0e10cSrcweir WizardDialog::~WizardDialog()
374cdf0e10cSrcweir {
375cdf0e10cSrcweir     if ( mpFixedLine )
376cdf0e10cSrcweir         delete mpFixedLine;
377cdf0e10cSrcweir 
378cdf0e10cSrcweir     // Remove all buttons
379cdf0e10cSrcweir     while ( mpFirstBtn )
380cdf0e10cSrcweir         RemoveButton( mpFirstBtn->mpButton );
381cdf0e10cSrcweir 
382cdf0e10cSrcweir     // Remove all pages
383cdf0e10cSrcweir     while ( mpFirstPage )
384cdf0e10cSrcweir         RemovePage( mpFirstPage->mpPage );
385cdf0e10cSrcweir }
386cdf0e10cSrcweir 
387cdf0e10cSrcweir // -----------------------------------------------------------------------
388cdf0e10cSrcweir 
Resize()389cdf0e10cSrcweir void WizardDialog::Resize()
390cdf0e10cSrcweir {
391cdf0e10cSrcweir     if ( IsReallyShown() && !IsInInitShow() )
392cdf0e10cSrcweir     {
393cdf0e10cSrcweir         ImplPosCtrls();
394cdf0e10cSrcweir         ImplPosTabPage();
395cdf0e10cSrcweir     }
396cdf0e10cSrcweir 
397cdf0e10cSrcweir     Dialog::Resize();
398cdf0e10cSrcweir }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir // -----------------------------------------------------------------------
401cdf0e10cSrcweir 
StateChanged(StateChangedType nType)402cdf0e10cSrcweir void WizardDialog::StateChanged( StateChangedType nType )
403cdf0e10cSrcweir {
404cdf0e10cSrcweir     if ( nType == STATE_CHANGE_INITSHOW )
405cdf0e10cSrcweir     {
406cdf0e10cSrcweir         if ( IsDefaultSize() )
407cdf0e10cSrcweir         {
408cdf0e10cSrcweir             Size aDlgSize = GetPageSizePixel();
409cdf0e10cSrcweir             if ( !aDlgSize.Width() || !aDlgSize.Height() )
410cdf0e10cSrcweir             {
411cdf0e10cSrcweir                 ImplWizPageData*  pPageData = mpFirstPage;
412cdf0e10cSrcweir                 while ( pPageData )
413cdf0e10cSrcweir                 {
414cdf0e10cSrcweir                     if ( pPageData->mpPage )
415cdf0e10cSrcweir                     {
416cdf0e10cSrcweir                         Size aPageSize = pPageData->mpPage->GetSizePixel();
417cdf0e10cSrcweir                         if ( aPageSize.Width() > aDlgSize.Width() )
418cdf0e10cSrcweir                             aDlgSize.Width() = aPageSize.Width();
419cdf0e10cSrcweir                         if ( aPageSize.Height() > aDlgSize.Height() )
420cdf0e10cSrcweir                             aDlgSize.Height() = aPageSize.Height();
421cdf0e10cSrcweir                     }
422cdf0e10cSrcweir 
423cdf0e10cSrcweir                     pPageData = pPageData->mpNext;
424cdf0e10cSrcweir                 }
425cdf0e10cSrcweir             }
426cdf0e10cSrcweir             ImplCalcSize( aDlgSize );
427cdf0e10cSrcweir             SetOutputSizePixel( aDlgSize );
428cdf0e10cSrcweir         }
429cdf0e10cSrcweir 
430cdf0e10cSrcweir         ImplPosCtrls();
431cdf0e10cSrcweir         ImplPosTabPage();
432cdf0e10cSrcweir         ImplShowTabPage( ImplGetPage( mnCurLevel ) );
433cdf0e10cSrcweir     }
434cdf0e10cSrcweir 
435cdf0e10cSrcweir     Dialog::StateChanged( nType );
436cdf0e10cSrcweir }
437cdf0e10cSrcweir 
438cdf0e10cSrcweir // -----------------------------------------------------------------------
439cdf0e10cSrcweir 
Notify(NotifyEvent & rNEvt)440cdf0e10cSrcweir long WizardDialog::Notify( NotifyEvent& rNEvt )
441cdf0e10cSrcweir {
442cdf0e10cSrcweir     if ( (rNEvt.GetType() == EVENT_KEYINPUT) && mpPrevBtn && mpNextBtn )
443cdf0e10cSrcweir     {
444cdf0e10cSrcweir         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
445cdf0e10cSrcweir         KeyCode         aKeyCode = pKEvt->GetKeyCode();
446cdf0e10cSrcweir         sal_uInt16          nKeyCode = aKeyCode.GetCode();
447cdf0e10cSrcweir 
448cdf0e10cSrcweir         if ( aKeyCode.IsMod1() )
449cdf0e10cSrcweir         {
450cdf0e10cSrcweir             if ( aKeyCode.IsShift() || (nKeyCode == KEY_PAGEUP) )
451cdf0e10cSrcweir             {
452cdf0e10cSrcweir                 if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEUP) )
453cdf0e10cSrcweir                 {
454cdf0e10cSrcweir                     if ( mpPrevBtn->IsVisible() &&
455cdf0e10cSrcweir                          mpPrevBtn->IsEnabled() && mpPrevBtn->IsInputEnabled() )
456cdf0e10cSrcweir                     {
457cdf0e10cSrcweir                         mpPrevBtn->SetPressed( sal_True );
458cdf0e10cSrcweir                         mpPrevBtn->SetPressed( sal_False );
459cdf0e10cSrcweir                         mpPrevBtn->Click();
460cdf0e10cSrcweir                     }
461cdf0e10cSrcweir                     return sal_True;
462cdf0e10cSrcweir                 }
463cdf0e10cSrcweir             }
464cdf0e10cSrcweir             else
465cdf0e10cSrcweir             {
466cdf0e10cSrcweir                 if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEDOWN) )
467cdf0e10cSrcweir                 {
468cdf0e10cSrcweir                     if ( mpNextBtn->IsVisible() &&
469cdf0e10cSrcweir                          mpNextBtn->IsEnabled() && mpNextBtn->IsInputEnabled() )
470cdf0e10cSrcweir                     {
471cdf0e10cSrcweir                         mpNextBtn->SetPressed( sal_True );
472cdf0e10cSrcweir                         mpNextBtn->SetPressed( sal_False );
473cdf0e10cSrcweir                         mpNextBtn->Click();
474cdf0e10cSrcweir                     }
475cdf0e10cSrcweir                     return sal_True;
476cdf0e10cSrcweir                 }
477cdf0e10cSrcweir             }
478cdf0e10cSrcweir         }
479cdf0e10cSrcweir     }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir     return Dialog::Notify( rNEvt );
482cdf0e10cSrcweir }
483cdf0e10cSrcweir 
484cdf0e10cSrcweir // -----------------------------------------------------------------------
485cdf0e10cSrcweir 
ActivatePage()486cdf0e10cSrcweir void WizardDialog::ActivatePage()
487cdf0e10cSrcweir {
488cdf0e10cSrcweir     maActivateHdl.Call( this );
489cdf0e10cSrcweir }
490cdf0e10cSrcweir 
491cdf0e10cSrcweir // -----------------------------------------------------------------------
492cdf0e10cSrcweir 
DeactivatePage()493cdf0e10cSrcweir long WizardDialog::DeactivatePage()
494cdf0e10cSrcweir {
495cdf0e10cSrcweir     if ( maDeactivateHdl.IsSet() )
496cdf0e10cSrcweir         return maDeactivateHdl.Call( this );
497cdf0e10cSrcweir     else
498cdf0e10cSrcweir         return sal_True;
499cdf0e10cSrcweir }
500cdf0e10cSrcweir 
501cdf0e10cSrcweir // -----------------------------------------------------------------------
502cdf0e10cSrcweir 
ShowNextPage()503cdf0e10cSrcweir sal_Bool WizardDialog::ShowNextPage()
504cdf0e10cSrcweir {
505cdf0e10cSrcweir     return ShowPage( mnCurLevel+1 );
506cdf0e10cSrcweir }
507cdf0e10cSrcweir 
508cdf0e10cSrcweir // -----------------------------------------------------------------------
509cdf0e10cSrcweir 
ShowPrevPage()510cdf0e10cSrcweir sal_Bool WizardDialog::ShowPrevPage()
511cdf0e10cSrcweir {
512cdf0e10cSrcweir     if ( !mnCurLevel )
513cdf0e10cSrcweir         return sal_False;
514cdf0e10cSrcweir     return ShowPage( mnCurLevel-1 );
515cdf0e10cSrcweir }
516cdf0e10cSrcweir 
517cdf0e10cSrcweir // -----------------------------------------------------------------------
518cdf0e10cSrcweir 
ShowPage(sal_uInt16 nLevel)519cdf0e10cSrcweir sal_Bool WizardDialog::ShowPage( sal_uInt16 nLevel )
520cdf0e10cSrcweir {
521cdf0e10cSrcweir     if ( DeactivatePage() )
522cdf0e10cSrcweir     {
523cdf0e10cSrcweir         mnCurLevel = nLevel;
524cdf0e10cSrcweir         ActivatePage();
525cdf0e10cSrcweir         ImplShowTabPage( ImplGetPage( mnCurLevel ) );
526cdf0e10cSrcweir         return sal_True;
527cdf0e10cSrcweir     }
528cdf0e10cSrcweir     else
529cdf0e10cSrcweir         return sal_False;
530cdf0e10cSrcweir }
531cdf0e10cSrcweir 
532cdf0e10cSrcweir // -----------------------------------------------------------------------
533cdf0e10cSrcweir 
Finnish(long nResult)534cdf0e10cSrcweir sal_Bool WizardDialog::Finnish( long nResult )
535cdf0e10cSrcweir {
536cdf0e10cSrcweir     if ( DeactivatePage() )
537cdf0e10cSrcweir     {
538cdf0e10cSrcweir         if ( mpCurTabPage )
539cdf0e10cSrcweir             mpCurTabPage->DeactivatePage();
540cdf0e10cSrcweir 
541cdf0e10cSrcweir         if ( IsInExecute() )
542cdf0e10cSrcweir             EndDialog( nResult );
543cdf0e10cSrcweir         else if ( GetStyle() & WB_CLOSEABLE )
544cdf0e10cSrcweir             Close();
545cdf0e10cSrcweir         return sal_True;
546cdf0e10cSrcweir     }
547cdf0e10cSrcweir     else
548cdf0e10cSrcweir         return sal_False;
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir // -----------------------------------------------------------------------
552cdf0e10cSrcweir 
AddPage(TabPage * pPage)553cdf0e10cSrcweir void WizardDialog::AddPage( TabPage* pPage )
554cdf0e10cSrcweir {
555cdf0e10cSrcweir     ImplWizPageData* pNewPageData = new ImplWizPageData;
556cdf0e10cSrcweir     pNewPageData->mpNext    = NULL;
557cdf0e10cSrcweir     pNewPageData->mpPage    = pPage;
558cdf0e10cSrcweir 
559cdf0e10cSrcweir     if ( !mpFirstPage )
560cdf0e10cSrcweir         mpFirstPage = pNewPageData;
561cdf0e10cSrcweir     else
562cdf0e10cSrcweir     {
563cdf0e10cSrcweir         ImplWizPageData* pPageData = mpFirstPage;
564cdf0e10cSrcweir         while ( pPageData->mpNext )
565cdf0e10cSrcweir             pPageData = pPageData->mpNext;
566cdf0e10cSrcweir         pPageData->mpNext = pNewPageData;
567cdf0e10cSrcweir     }
568cdf0e10cSrcweir }
569cdf0e10cSrcweir 
570cdf0e10cSrcweir // -----------------------------------------------------------------------
571cdf0e10cSrcweir 
RemovePage(TabPage * pPage)572cdf0e10cSrcweir void WizardDialog::RemovePage( TabPage* pPage )
573cdf0e10cSrcweir {
574cdf0e10cSrcweir     ImplWizPageData*  pPrevPageData = NULL;
575cdf0e10cSrcweir     ImplWizPageData*  pPageData = mpFirstPage;
576cdf0e10cSrcweir     while ( pPageData )
577cdf0e10cSrcweir     {
578cdf0e10cSrcweir         if ( pPageData->mpPage == pPage )
579cdf0e10cSrcweir         {
580cdf0e10cSrcweir             if ( pPrevPageData )
581cdf0e10cSrcweir                 pPrevPageData->mpNext = pPageData->mpNext;
582cdf0e10cSrcweir             else
583cdf0e10cSrcweir                 mpFirstPage = pPageData->mpNext;
584cdf0e10cSrcweir             if ( pPage == mpCurTabPage )
585cdf0e10cSrcweir                 mpCurTabPage = NULL;
586cdf0e10cSrcweir             delete pPageData;
587cdf0e10cSrcweir             return;
588cdf0e10cSrcweir         }
589cdf0e10cSrcweir 
590cdf0e10cSrcweir         pPrevPageData = pPageData;
591cdf0e10cSrcweir         pPageData = pPageData->mpNext;
592cdf0e10cSrcweir     }
593cdf0e10cSrcweir 
594cdf0e10cSrcweir     DBG_ERROR( "WizardDialog::RemovePage() - Page not in list" );
595cdf0e10cSrcweir }
596cdf0e10cSrcweir 
597cdf0e10cSrcweir // -----------------------------------------------------------------------
598cdf0e10cSrcweir 
SetPage(sal_uInt16 nLevel,TabPage * pPage)599cdf0e10cSrcweir void WizardDialog::SetPage( sal_uInt16 nLevel, TabPage* pPage )
600cdf0e10cSrcweir {
601cdf0e10cSrcweir     sal_uInt16              nTempLevel = 0;
602cdf0e10cSrcweir     ImplWizPageData*    pPageData = mpFirstPage;
603cdf0e10cSrcweir     while ( pPageData )
604cdf0e10cSrcweir     {
605cdf0e10cSrcweir         if ( (nTempLevel == nLevel) || !pPageData->mpNext )
606cdf0e10cSrcweir             break;
607cdf0e10cSrcweir 
608cdf0e10cSrcweir         nTempLevel++;
609cdf0e10cSrcweir         pPageData = pPageData->mpNext;
610cdf0e10cSrcweir     }
611cdf0e10cSrcweir 
612cdf0e10cSrcweir     if ( pPageData )
613cdf0e10cSrcweir     {
614cdf0e10cSrcweir         if ( pPageData->mpPage == mpCurTabPage )
615cdf0e10cSrcweir             mpCurTabPage = NULL;
616cdf0e10cSrcweir         pPageData->mpPage = pPage;
617cdf0e10cSrcweir     }
618cdf0e10cSrcweir }
619cdf0e10cSrcweir 
620cdf0e10cSrcweir // -----------------------------------------------------------------------
621cdf0e10cSrcweir 
GetPage(sal_uInt16 nLevel) const622cdf0e10cSrcweir TabPage* WizardDialog::GetPage( sal_uInt16 nLevel ) const
623cdf0e10cSrcweir {
624cdf0e10cSrcweir     sal_uInt16              nTempLevel = 0;
625cdf0e10cSrcweir     ImplWizPageData*    pPageData = mpFirstPage;
626cdf0e10cSrcweir     while ( pPageData )
627cdf0e10cSrcweir     {
628cdf0e10cSrcweir         if ( nTempLevel == nLevel )
629cdf0e10cSrcweir             return pPageData->mpPage;
630cdf0e10cSrcweir 
631cdf0e10cSrcweir         nTempLevel++;
632cdf0e10cSrcweir         pPageData = pPageData->mpNext;
633cdf0e10cSrcweir     }
634cdf0e10cSrcweir 
635cdf0e10cSrcweir     return NULL;
636cdf0e10cSrcweir }
637cdf0e10cSrcweir 
638cdf0e10cSrcweir // -----------------------------------------------------------------------
639cdf0e10cSrcweir 
AddButton(Button * pButton,long nOffset)640cdf0e10cSrcweir void WizardDialog::AddButton( Button* pButton, long nOffset )
641cdf0e10cSrcweir {
642cdf0e10cSrcweir     ImplWizButtonData* pNewBtnData = new ImplWizButtonData;
643cdf0e10cSrcweir     pNewBtnData->mpNext     = NULL;
644cdf0e10cSrcweir     pNewBtnData->mpButton   = pButton;
645cdf0e10cSrcweir     pNewBtnData->mnOffset   = nOffset;
646cdf0e10cSrcweir 
647cdf0e10cSrcweir     if ( !mpFirstBtn )
648cdf0e10cSrcweir         mpFirstBtn = pNewBtnData;
649cdf0e10cSrcweir     else
650cdf0e10cSrcweir     {
651cdf0e10cSrcweir         ImplWizButtonData* pBtnData = mpFirstBtn;
652cdf0e10cSrcweir         while ( pBtnData->mpNext )
653cdf0e10cSrcweir             pBtnData = pBtnData->mpNext;
654cdf0e10cSrcweir         pBtnData->mpNext = pNewBtnData;
655cdf0e10cSrcweir     }
656cdf0e10cSrcweir }
657cdf0e10cSrcweir 
658cdf0e10cSrcweir // -----------------------------------------------------------------------
659cdf0e10cSrcweir 
RemoveButton(Button * pButton)660cdf0e10cSrcweir void WizardDialog::RemoveButton( Button* pButton )
661cdf0e10cSrcweir {
662cdf0e10cSrcweir     ImplWizButtonData*  pPrevBtnData = NULL;
663cdf0e10cSrcweir     ImplWizButtonData*  pBtnData = mpFirstBtn;
664cdf0e10cSrcweir     while ( pBtnData )
665cdf0e10cSrcweir     {
666cdf0e10cSrcweir         if ( pBtnData->mpButton == pButton )
667cdf0e10cSrcweir         {
668cdf0e10cSrcweir             if ( pPrevBtnData )
669cdf0e10cSrcweir                 pPrevBtnData->mpNext = pBtnData->mpNext;
670cdf0e10cSrcweir             else
671cdf0e10cSrcweir                 mpFirstBtn = pBtnData->mpNext;
672cdf0e10cSrcweir             delete pBtnData;
673cdf0e10cSrcweir             return;
674cdf0e10cSrcweir         }
675cdf0e10cSrcweir 
676cdf0e10cSrcweir         pPrevBtnData = pBtnData;
677cdf0e10cSrcweir         pBtnData = pBtnData->mpNext;
678cdf0e10cSrcweir     }
679cdf0e10cSrcweir 
680cdf0e10cSrcweir     DBG_ERROR( "WizardDialog::RemoveButton() - Button not in list" );
681cdf0e10cSrcweir }
682cdf0e10cSrcweir 
683cdf0e10cSrcweir // -----------------------------------------------------------------------
684cdf0e10cSrcweir 
ShowButtonFixedLine(sal_Bool bVisible)685cdf0e10cSrcweir void WizardDialog::ShowButtonFixedLine( sal_Bool bVisible )
686cdf0e10cSrcweir {
687cdf0e10cSrcweir     if ( !mpFixedLine )
688cdf0e10cSrcweir     {
689cdf0e10cSrcweir         if ( !bVisible )
690cdf0e10cSrcweir             return;
691cdf0e10cSrcweir 
692cdf0e10cSrcweir         mpFixedLine = new FixedLine( this );
693cdf0e10cSrcweir     }
694cdf0e10cSrcweir 
695cdf0e10cSrcweir     mpFixedLine->Show( bVisible );
696cdf0e10cSrcweir }
697cdf0e10cSrcweir 
698cdf0e10cSrcweir // -----------------------------------------------------------------------
699cdf0e10cSrcweir 
IsButtonFixedLineVisible()700cdf0e10cSrcweir sal_Bool WizardDialog::IsButtonFixedLineVisible()
701cdf0e10cSrcweir {
702cdf0e10cSrcweir     return (mpFixedLine && mpFixedLine->IsVisible());
703cdf0e10cSrcweir }
704