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