Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #ifndef _SVT_WIZDLG_HXX
30 : : #define _SVT_WIZDLG_HXX
31 : :
32 : : #include "svtools/svtdllapi.h"
33 : :
34 : : #include <vcl/dialog.hxx>
35 : :
36 : : class TabPage;
37 : : class Button;
38 : : class PushButton;
39 : : class FixedLine;
40 : : struct ImplWizPageData;
41 : : struct ImplWizButtonData;
42 : :
43 : : /*************************************************************************
44 : :
45 : : Beschreibung
46 : : ============
47 : :
48 : : class WizardDialog
49 : :
50 : : Diese Klasse dient als Basis fuer einen WizardDialog. Als
51 : : Basisfunktionalitaet wird das Anordnen der Controls angeboten und
52 : : Hilfesmethoden fuer das Umschalten von TabPages. Der Dialog
53 : : ordnet bei einer Groessenanderung die Controls auch wieder
54 : : entsprechend an.
55 : :
56 : : --------------------------------------------------------------------------
57 : :
58 : : Mit SetPageSizePixel() kann als Groesse die Groesse der groessten
59 : : TabPage vorgegeben werden. Wenn der Dialog angezeigt wird, wird
60 : : zu dem Zeitpunkt wenn noch keine Groesse gesetzt wurde, dafuer
61 : : die entsprechende Dialoggroesse berechnet und gesetzt. Wenn mit
62 : : SetPageSizePixel() keine Groesse gesetzt wurde, wird als Groesse
63 : : die maximale Groesse der zu diesem Zeitpunkt zugewiesenen TabPages
64 : : berechnet und genommen.
65 : :
66 : : ShowPrevPage()/ShowNextPage() zeigt die vorherige/naechste TabPage
67 : : an. Dazu wird zuerst der Deactivate-Handler vom Dialog gerufen und
68 : : wenn dieser sal_True zurueckgegeben hat, wird der Acivate-Handler
69 : : vom Dialog gerufen und die entsprechende TabPage angezeigt.
70 : : Finnsh() kann gerufen werden, wenn der Finnish-Button betaetigt
71 : : wird. Dort wird dann auch noch der Deactivate-Page-Handler vom
72 : : Dialog und der aktuellen TabPage gerufen und dann der Dialog
73 : : beendet (Close() oder EndDialog()).
74 : :
75 : : Mit AddPage()/RemovePage()/SetPage() koennen die TabPages dem Wizard
76 : : bekannt gemacht werden. Es wird immer die TabPage des aktuellen Levels
77 : : angezeigt, wenn fuer den aktuellen Level keine TabPage zugewiesen
78 : : ist, wird die TabPages des hoechsten Levels angezeigt. Somit kann auch
79 : : immer die aktuelle TabPage ausgetauscht werden, wobei zu
80 : : beruecksichtigen ist, das im Activate-Handler die aktuelle TabPage
81 : : nicht zerstoert werden darf.
82 : :
83 : : Mit SetPrevButton()/SetNextButton() werden der Prev-Button und der
84 : : Next-Button dem Dialog bekannt gemacht. In dem Fall loest der
85 : : Dialog bei Ctr+Tab, Shift+Ctrl+Tab den entsprechenden Click-Handler
86 : : am zugewiesenen Button aus. Die Button werden nicht vom WizardDialog
87 : : disablte. Eine entsprechende Steuerung muss der Benutzer dieses
88 : : Dialoges selber programieren.
89 : :
90 : : Mit AddButton()/RemoveButton() koennen Buttons dem Wizard bekannt
91 : : gemacht werden, die in der Reihenfolge der Hinzufuegung angeordnet
92 : : werden. Die Buttons werden unabhengig von ihrem sichtbarkeitsstatus
93 : : angeordnet, so das auch spaeter ein entsprechender Button angezeigt/
94 : : gehidet werden kann. Der Offset wird in Pixeln angegeben und bezieht
95 : : sich immer auf den nachfolgenden Button. Damit der Abstand zwischen
96 : : den Buttons bei allen Dialogen gleich ist, gibt es das Define
97 : : WIZARDDIALOG_BUTTON_STDOFFSET_X, welches als Standard-Offset genommen
98 : : werden sollte.
99 : :
100 : : Mit ShowButtonFixedLine() kann gesteuert werden, ob die zwischen den
101 : : Buttons und der TabPage eine Trennlinie angezeigt werden soll.
102 : :
103 : : Mit SetViewWindow() und SetViewAlign() kann ein Control gesetzt werden,
104 : : welches als PreView-Window oder fuer die Anzeige von schoenen Bitmaps
105 : : genutzt werden kann.
106 : :
107 : : --------------------------------------------------------------------------
108 : :
109 : : Der ActivatePage()-Handler wird gerufen, wenn eine neue TabPages
110 : : angezeigt wird. In diesem Handler kann beispielsweise die neue
111 : : TabPage erzeugt werden, wenn diese zu diesem Zeitpunkt noch nicht
112 : : erzeugt wurde. Der Handler kann auch als Link gesetzt werden. Mit
113 : : GetCurLevel() kann die aktuelle ebene abgefragt werden, wobei
114 : : Level 0 die erste Seite ist.
115 : :
116 : : Der DeactivatePage()-Handler wird gerufen, wenn eine neue TabPage
117 : : angezeigt werden soll. In diesem Handler kann noch eine Fehler-
118 : : ueberprufung stattfinden und das Umschalten gegebenenfalls verhindert
119 : : werden, indem sal_False zurueckgegeben wird. Der Handler kann auch als
120 : : Link gesetzt werden. Die Defaultimplementierung ruft den Link und
121 : : gibt den Rueckgabewert des Links zurueck und wenn kein Link gesetzt
122 : : ist, wird sal_True zurueckgegeben.
123 : :
124 : : --------------------------------------------------------------------------
125 : :
126 : : Beispiel:
127 : :
128 : : MyWizardDlg-Ctor
129 : : ----------------
130 : :
131 : : // add buttons
132 : : AddButton( &maHelpBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
133 : : AddButton( &maCancelBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
134 : : AddButton( &maPrevBtn );
135 : : AddButton( &maNextBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
136 : : AddButton( &maFinnishBtn );
137 : : SetPrevButton( &maPrevBtn );
138 : : SetNextButton( &maNextBtn );
139 : :
140 : : // SetHandler
141 : : maPrevBtn.SetClickHdl( LINK( this, MyWizardDlg, ImplPrevHdl ) );
142 : : maNextBtn.SetClickHdl( LINK( this, MyWizardDlg, ImplNextHdl ) );
143 : :
144 : : // Set PreviewWindow
145 : : SetViewWindow( &maPreview );
146 : :
147 : : // Show line between Buttons and Page
148 : : ShowButtonFixedLine( sal_True );
149 : :
150 : : // Call ActivatePage, because the first page should be created an activated
151 : : ActivatePage();
152 : :
153 : :
154 : : MyWizardDlg-ActivatePage-Handler
155 : : --------------------------------
156 : :
157 : : void MyWizardDlg::ActivatePage()
158 : : {
159 : : WizardDialog::ActivatePage();
160 : :
161 : : // Test, if Page is created already
162 : : if ( !GetPage( GetCurLevel() ) )
163 : : {
164 : : // Create and add new page
165 : : TabPage* pNewTabPage;
166 : : switch ( GetCurLevel() )
167 : : {
168 : : case 0:
169 : : pNewTabPage = CreateIntroPage();
170 : : break;
171 : : case 1:
172 : : pNewTabPage = CreateSecondPage();
173 : : break;
174 : : case 2:
175 : : pNewTabPage = CreateThirdPage();
176 : : break;
177 : : case 3:
178 : : pNewTabPage = CreateFinnishedPage();
179 : : break;
180 : :
181 : : }
182 : : AddPage( pNewTabPage );
183 : : }
184 : : }
185 : :
186 : :
187 : : MyWizardDlg-Prev/Next-Handler
188 : : -----------------------------
189 : :
190 : : IMPL_LINK( MyWizardDlg, ImplPrevHdl, PushButton*, pBtn )
191 : : {
192 : : ShowPrevPage();
193 : : if ( !GetCurLevel() )
194 : : pBtn->Disable();
195 : : return 0;
196 : : }
197 : :
198 : : IMPL_LINK( MyWizardDlg, ImplNextHdl, PushButton*, pBtn )
199 : : {
200 : : ShowNextPage();
201 : : if ( GetCurLevel() < 3 )
202 : : pBtn->Disable();
203 : : return 0;
204 : : }
205 : :
206 : : *************************************************************************/
207 : :
208 : : // ----------------------
209 : : // - WizardDialog-Types -
210 : : // ----------------------
211 : :
212 : : #define WIZARDDIALOG_BUTTON_STDOFFSET_X 6
213 : : #define WIZARDDIALOG_BUTTON_SMALLSTDOFFSET_X 3
214 : :
215 : : // ----------------
216 : : // - WizardDialog -
217 : : // ----------------
218 : :
219 : : class SVT_DLLPUBLIC WizardDialog : public ModalDialog
220 : : {
221 : : private:
222 : : Size maPageSize;
223 : : ImplWizPageData* mpFirstPage;
224 : : ImplWizButtonData* mpFirstBtn;
225 : : FixedLine* mpFixedLine;
226 : : TabPage* mpCurTabPage;
227 : : PushButton* mpPrevBtn;
228 : : PushButton* mpNextBtn;
229 : : Window* mpViewWindow;
230 : : sal_uInt16 mnCurLevel;
231 : : WindowAlign meViewAlign;
232 : : Link maActivateHdl;
233 : : Link maDeactivateHdl;
234 : : sal_Int16 mnLeftAlignCount;
235 : : bool mbEmptyViewMargin;
236 : :
237 : : protected:
238 : : long LogicalCoordinateToPixel(int iCoordinate);
239 : : /**sets the number of buttons which should be left-aligned. Normally, buttons are right-aligned.
240 : :
241 : : only to be used during construction, before any layouting happened
242 : : */
243 : : void SetLeftAlignedButtonCount( sal_Int16 _nCount );
244 : : /** declares the view area to have an empty margin
245 : :
246 : : Normally, the view area has a certain margin to the top/left/bottom/right of the
247 : : dialog. By calling this method, you can reduce this margin to 0.
248 : : */
249 : : void SetEmptyViewMargin();
250 : :
251 : : #ifdef _SVT_WIZDLG_CXX
252 : : private:
253 : : SVT_DLLPRIVATE void ImplInitData();
254 : : SVT_DLLPRIVATE void ImplCalcSize( Size& rSize );
255 : : SVT_DLLPRIVATE void ImplPosCtrls();
256 : : SVT_DLLPRIVATE void ImplPosTabPage();
257 : : SVT_DLLPRIVATE void ImplShowTabPage( TabPage* pPage );
258 : : SVT_DLLPRIVATE TabPage* ImplGetPage( sal_uInt16 nLevel ) const;
259 : : #endif
260 : :
261 : : public:
262 : : WizardDialog( Window* pParent, WinBits nStyle = WB_STDTABDIALOG );
263 : : WizardDialog( Window* pParent, const ResId& rResId );
264 : : ~WizardDialog();
265 : :
266 : : virtual void Resize();
267 : : virtual void StateChanged( StateChangedType nStateChange );
268 : : virtual long Notify( NotifyEvent& rNEvt );
269 : :
270 : : virtual void ActivatePage();
271 : : virtual long DeactivatePage();
272 : :
273 : : sal_Bool ShowPrevPage();
274 : : sal_Bool ShowNextPage();
275 : : sal_Bool ShowPage( sal_uInt16 nLevel );
276 : : sal_Bool Finnish( long nResult = 0 );
277 : 0 : sal_uInt16 GetCurLevel() const { return mnCurLevel; }
278 : :
279 : : void AddPage( TabPage* pPage );
280 : : void RemovePage( TabPage* pPage );
281 : : void SetPage( sal_uInt16 nLevel, TabPage* pPage );
282 : : TabPage* GetPage( sal_uInt16 nLevel ) const;
283 : :
284 : : void AddButton( Button* pButton, long nOffset = 0 );
285 : : void RemoveButton( Button* pButton );
286 : :
287 : 0 : void SetPrevButton( PushButton* pButton ) { mpPrevBtn = pButton; }
288 : : PushButton* GetPrevButton() const { return mpPrevBtn; }
289 : 0 : void SetNextButton( PushButton* pButton ) { mpNextBtn = pButton; }
290 : : PushButton* GetNextButton() const { return mpNextBtn; }
291 : :
292 : : void ShowButtonFixedLine( sal_Bool bVisible );
293 : :
294 : 0 : void SetViewWindow( Window* pWindow ) { mpViewWindow = pWindow; }
295 : : Window* GetViewWindow() const { return mpViewWindow; }
296 : 0 : void SetViewAlign( WindowAlign eAlign ) { meViewAlign = eAlign; }
297 : : WindowAlign GetViewAlign() const { return meViewAlign; }
298 : :
299 : 0 : void SetPageSizePixel( const Size& rSize ) { maPageSize = rSize; }
300 : 0 : const Size& GetPageSizePixel() const { return maPageSize; }
301 : :
302 : 0 : void SetActivatePageHdl( const Link& rLink ) { maActivateHdl = rLink; }
303 : : const Link& GetActivatePageHdl() const { return maActivateHdl; }
304 : : void SetDeactivatePageHdl( const Link& rLink ) { maDeactivateHdl = rLink; }
305 : : const Link& GetDeactivatePageHdl() const { return maDeactivateHdl; }
306 : : };
307 : :
308 : : #endif // _SVT_WIZDLG_HXX
309 : :
310 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|