1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_SVTOOLS_WIZDLG_HXX
21 #define INCLUDED_SVTOOLS_WIZDLG_HXX
23 #include <svtools/svtdllapi.h>
25 #include <vcl/dialog.hxx>
31 struct ImplWizPageData
;
32 struct ImplWizButtonData
;
34 /*************************************************************************
41 Diese Klasse dient als Basis fuer einen WizardDialog. Als
42 Basisfunktionalitaet wird das Anordnen der Controls angeboten und
43 Hilfesmethoden fuer das Umschalten von TabPages. Der Dialog
44 ordnet bei einer Groessenanderung die Controls auch wieder
47 --------------------------------------------------------------------------
49 Mit SetPageSizePixel() kann als Groesse die Groesse der groessten
50 TabPage vorgegeben werden. Wenn der Dialog angezeigt wird, wird
51 zu dem Zeitpunkt wenn noch keine Groesse gesetzt wurde, dafuer
52 die entsprechende Dialoggroesse berechnet und gesetzt. Wenn mit
53 SetPageSizePixel() keine Groesse gesetzt wurde, wird als Groesse
54 die maximale Groesse der zu diesem Zeitpunkt zugewiesenen TabPages
55 berechnet und genommen.
57 ShowPrevPage()/ShowNextPage() zeigt die vorherige/naechste TabPage
58 an. Dazu wird zuerst der Deactivate-Handler vom Dialog gerufen und
59 wenn dieser sal_True zurueckgegeben hat, wird der Acivate-Handler
60 vom Dialog gerufen und die entsprechende TabPage angezeigt.
61 Finnsh() kann gerufen werden, wenn der Finnish-Button betaetigt
62 wird. Dort wird dann auch noch der Deactivate-Page-Handler vom
63 Dialog und der aktuellen TabPage gerufen und dann der Dialog
64 beendet (Close() oder EndDialog()).
66 Mit AddPage()/RemovePage()/SetPage() koennen die TabPages dem Wizard
67 bekannt gemacht werden. Es wird immer die TabPage des aktuellen Levels
68 angezeigt, wenn fuer den aktuellen Level keine TabPage zugewiesen
69 ist, wird die TabPages des hoechsten Levels angezeigt. Somit kann auch
70 immer die aktuelle TabPage ausgetauscht werden, wobei zu
71 beruecksichtigen ist, das im Activate-Handler die aktuelle TabPage
72 nicht zerstoert werden darf.
74 Mit SetPrevButton()/SetNextButton() werden der Prev-Button und der
75 Next-Button dem Dialog bekannt gemacht. In dem Fall loest der
76 Dialog bei Ctr+Tab, Shift+Ctrl+Tab den entsprechenden Click-Handler
77 am zugewiesenen Button aus. Die Button werden nicht vom WizardDialog
78 disablte. Eine entsprechende Steuerung muss der Benutzer dieses
79 Dialoges selber programieren.
81 Mit AddButton()/RemoveButton() koennen Buttons dem Wizard bekannt
82 gemacht werden, die in der Reihenfolge der Hinzufuegung angeordnet
83 werden. Die Buttons werden unabhengig von ihrem sichtbarkeitsstatus
84 angeordnet, so das auch spaeter ein entsprechender Button angezeigt/
85 gehidet werden kann. Der Offset wird in Pixeln angegeben und bezieht
86 sich immer auf den nachfolgenden Button. Damit der Abstand zwischen
87 den Buttons bei allen Dialogen gleich ist, gibt es das Define
88 WIZARDDIALOG_BUTTON_STDOFFSET_X, welches als Standard-Offset genommen
91 Mit ShowButtonFixedLine() kann gesteuert werden, ob die zwischen den
92 Buttons und der TabPage eine Trennlinie angezeigt werden soll.
94 Mit SetViewWindow() und SetViewAlign() kann ein Control gesetzt werden,
95 welches als Preview-Window oder fuer die Anzeige von schoenen Bitmaps
98 --------------------------------------------------------------------------
100 Der ActivatePage()-Handler wird gerufen, wenn eine neue TabPages
101 angezeigt wird. In diesem Handler kann beispielsweise die neue
102 TabPage erzeugt werden, wenn diese zu diesem Zeitpunkt noch nicht
103 erzeugt wurde. Der Handler kann auch als Link gesetzt werden. Mit
104 GetCurLevel() kann die aktuelle ebene abgefragt werden, wobei
105 Level 0 die erste Seite ist.
107 Der DeactivatePage()-Handler wird gerufen, wenn eine neue TabPage
108 angezeigt werden soll. In diesem Handler kann noch eine Fehler-
109 ueberprufung stattfinden und das Umschalten gegebenenfalls verhindert
110 werden, indem sal_False zurueckgegeben wird. Der Handler kann auch als
111 Link gesetzt werden. Die Defaultimplementierung ruft den Link und
112 gibt den Rueckgabewert des Links zurueck und wenn kein Link gesetzt
113 ist, wird sal_True zurueckgegeben.
115 --------------------------------------------------------------------------
123 AddButton( &maHelpBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
124 AddButton( &maCancelBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
125 AddButton( &maPrevBtn );
126 AddButton( &maNextBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
127 AddButton( &maFinnishBtn );
128 SetPrevButton( &maPrevBtn );
129 SetNextButton( &maNextBtn );
132 maPrevBtn.SetClickHdl( LINK( this, MyWizardDlg, ImplPrevHdl ) );
133 maNextBtn.SetClickHdl( LINK( this, MyWizardDlg, ImplNextHdl ) );
136 SetViewWindow( &maPreview );
138 // Show line between Buttons and Page
139 ShowButtonFixedLine( sal_True );
141 // Call ActivatePage, because the first page should be created an activated
145 MyWizardDlg-ActivatePage-Handler
146 --------------------------------
148 void MyWizardDlg::ActivatePage()
150 WizardDialog::ActivatePage();
152 // Test, if Page is created already
153 if ( !GetPage( GetCurLevel() ) )
155 // Create and add new page
156 TabPage* pNewTabPage;
157 switch ( GetCurLevel() )
160 pNewTabPage = CreateIntroPage();
163 pNewTabPage = CreateSecondPage();
166 pNewTabPage = CreateThirdPage();
169 pNewTabPage = CreateFinnishedPage();
173 AddPage( pNewTabPage );
178 MyWizardDlg-Prev/Next-Handler
179 -----------------------------
181 IMPL_LINK( MyWizardDlg, ImplPrevHdl, PushButton*, pBtn )
184 if ( !GetCurLevel() )
189 IMPL_LINK( MyWizardDlg, ImplNextHdl, PushButton*, pBtn )
192 if ( GetCurLevel() < 3 )
197 *************************************************************************/
199 // ----------------------
200 // - WizardDialog-Types -
201 // ----------------------
203 #define WIZARDDIALOG_BUTTON_STDOFFSET_X 6
204 #define WIZARDDIALOG_BUTTON_SMALLSTDOFFSET_X 3
210 class SVT_DLLPUBLIC WizardDialog
: public ModalDialog
213 Timer maWizardLayoutTimer
;
215 ImplWizPageData
* mpFirstPage
;
216 ImplWizButtonData
* mpFirstBtn
;
217 FixedLine
* mpFixedLine
;
218 TabPage
* mpCurTabPage
;
219 PushButton
* mpPrevBtn
;
220 PushButton
* mpNextBtn
;
221 Window
* mpViewWindow
;
222 sal_uInt16 mnCurLevel
;
223 WindowAlign meViewAlign
;
225 Link maDeactivateHdl
;
226 sal_Int16 mnLeftAlignCount
;
227 bool mbEmptyViewMargin
;
229 DECL_DLLPRIVATE_LINK( ImplHandleWizardLayoutTimerHdl
, void* );
230 bool hasWizardPendingLayout() const;
233 long LogicalCoordinateToPixel(int iCoordinate
);
234 /**sets the number of buttons which should be left-aligned. Normally, buttons are right-aligned.
236 only to be used during construction, before any layouting happened
238 void SetLeftAlignedButtonCount( sal_Int16 _nCount
);
239 /** declares the view area to have an empty margin
241 Normally, the view area has a certain margin to the top/left/bottom/right of the
242 dialog. By calling this method, you can reduce this margin to 0.
244 void SetEmptyViewMargin();
247 SVT_DLLPRIVATE
void ImplInitData();
248 SVT_DLLPRIVATE
void ImplCalcSize( Size
& rSize
);
249 SVT_DLLPRIVATE
void ImplPosCtrls();
250 SVT_DLLPRIVATE
void ImplPosTabPage();
251 SVT_DLLPRIVATE
void ImplShowTabPage( TabPage
* pPage
);
252 SVT_DLLPRIVATE TabPage
* ImplGetPage( sal_uInt16 nLevel
) const;
255 WizardDialog( Window
* pParent
, WinBits nStyle
= WB_STDTABDIALOG
);
256 WizardDialog( Window
* pParent
, const ResId
& rResId
);
259 virtual void Resize();
260 virtual void StateChanged( StateChangedType nStateChange
);
261 virtual long Notify( NotifyEvent
& rNEvt
);
263 virtual void ActivatePage();
264 virtual long DeactivatePage();
266 virtual void queue_resize();
268 sal_Bool
ShowPrevPage();
269 sal_Bool
ShowNextPage();
270 sal_Bool
ShowPage( sal_uInt16 nLevel
);
271 sal_Bool
Finnish( long nResult
= 0 );
272 sal_uInt16
GetCurLevel() const { return mnCurLevel
; }
274 void AddPage( TabPage
* pPage
);
275 void RemovePage( TabPage
* pPage
);
276 void SetPage( sal_uInt16 nLevel
, TabPage
* pPage
);
277 TabPage
* GetPage( sal_uInt16 nLevel
) const;
279 void AddButton( Button
* pButton
, long nOffset
= 0 );
280 void RemoveButton( Button
* pButton
);
282 void SetPrevButton( PushButton
* pButton
) { mpPrevBtn
= pButton
; }
283 PushButton
* GetPrevButton() const { return mpPrevBtn
; }
284 void SetNextButton( PushButton
* pButton
) { mpNextBtn
= pButton
; }
285 PushButton
* GetNextButton() const { return mpNextBtn
; }
287 void ShowButtonFixedLine( sal_Bool bVisible
);
289 void SetViewWindow( Window
* pWindow
) { mpViewWindow
= pWindow
; }
290 Window
* GetViewWindow() const { return mpViewWindow
; }
291 void SetViewAlign( WindowAlign eAlign
) { meViewAlign
= eAlign
; }
292 WindowAlign
GetViewAlign() const { return meViewAlign
; }
294 void SetPageSizePixel( const Size
& rSize
) { maPageSize
= rSize
; }
295 const Size
& GetPageSizePixel() const { return maPageSize
; }
297 void SetActivatePageHdl( const Link
& rLink
) { maActivateHdl
= rLink
; }
298 const Link
& GetActivatePageHdl() const { return maActivateHdl
; }
299 void SetDeactivatePageHdl( const Link
& rLink
) { maDeactivateHdl
= rLink
; }
300 const Link
& GetDeactivatePageHdl() const { return maDeactivateHdl
; }
303 #endif // INCLUDED_SVTOOLS_WIZDLG_HXX
305 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */