Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 : #ifndef INCLUDED_SVTOOLS_WIZDLG_HXX
21 : #define INCLUDED_SVTOOLS_WIZDLG_HXX
22 :
23 : #include <svtools/svtdllapi.h>
24 :
25 : #include <vcl/dialog.hxx>
26 :
27 : class TabPage;
28 : class Button;
29 : class PushButton;
30 : struct ImplWizPageData;
31 : struct ImplWizButtonData;
32 :
33 : /*************************************************************************
34 :
35 : Beschreibung
36 : ============
37 :
38 : class WizardDialog
39 :
40 : This class is the base for WizardDialog. The basic functionality is to
41 : order the Controls. Besides it's a helper method for switching the TabPages.
42 : The dialog orders the Controls when their size changed.
43 :
44 : --------------------------------------------------------------------------
45 :
46 : SetPageSizePixel() sets the biggest TabPage size. When the dialog
47 : should be displayed, first the dialog size is calculated and set.
48 : If there is no size set with SetPageSizePixel(), max size of the
49 : current TabPage is set as default.
50 :
51 : ShowPrevPage()/ShowNextPage() shows the previous/next TabPage.
52 : First the Deactivate-Handler is called by dialog and if the return
53 : value is sal_True the Active-Handler is called by dialog and the
54 : corresponding TabPage is showed. Finnish() can only be called
55 : if the Finnish-Button is activated. Then the Deactivate-Page-Handler
56 : is called by dialog and by the current TabPage. Now the dialog ends
57 : (Close() or EndDialog()).
58 :
59 : Mit AddPage()/RemovePage()/SetPage() koennen die TabPages dem Wizard
60 : bekannt gemacht werden. Es wird immer die TabPage des aktuellen Levels
61 : angezeigt, wenn fuer den aktuellen Level keine TabPage zugewiesen
62 : ist, wird die TabPages des hoechsten Levels angezeigt. Somit kann auch
63 : immer die aktuelle TabPage ausgetauscht werden, wobei zu
64 : beruecksichtigen ist, das im Activate-Handler die aktuelle TabPage
65 : nicht zerstoert werden darf.
66 :
67 : Mit SetPrevButton()/SetNextButton() werden der Prev-Button und der
68 : Next-Button dem Dialog bekannt gemacht. In dem Fall loest der
69 : Dialog bei Ctr+Tab, Shift+Ctrl+Tab den entsprechenden Click-Handler
70 : am zugewiesenen Button aus. Die Button werden nicht vom WizardDialog
71 : disablte. Eine entsprechende Steuerung muss der Benutzer dieses
72 : Dialoges selber programieren.
73 :
74 : Mit AddButton()/RemoveButton() koennen Buttons dem Wizard bekannt
75 : gemacht werden, die in der Reihenfolge der Hinzufuegung angeordnet
76 : werden. Die Buttons werden unabhengig von ihrem sichtbarkeitsstatus
77 : angeordnet, so das auch spaeter ein entsprechender Button angezeigt/
78 : gehidet werden kann. Der Offset wird in Pixeln angegeben und bezieht
79 : sich immer auf den nachfolgenden Button. Damit der Abstand zwischen
80 : den Buttons bei allen Dialogen gleich ist, gibt es das Define
81 : WIZARDDIALOG_BUTTON_STDOFFSET_X, welches als Standard-Offset genommen
82 : werden sollte.
83 :
84 : Mit SetViewWindow() und SetViewAlign() kann ein Control gesetzt werden,
85 : welches als Preview-Window oder fuer die Anzeige von schoenen Bitmaps
86 : genutzt werden kann.
87 :
88 : --------------------------------------------------------------------------
89 :
90 : Der ActivatePage()-Handler wird gerufen, wenn eine neue TabPages
91 : angezeigt wird. In diesem Handler kann beispielsweise die neue
92 : TabPage erzeugt werden, wenn diese zu diesem Zeitpunkt noch nicht
93 : erzeugt wurde. Der Handler kann auch als Link gesetzt werden. Mit
94 : GetCurLevel() kann die aktuelle ebene abgefragt werden, wobei
95 : Level 0 die erste Seite ist.
96 :
97 : Der DeactivatePage()-Handler wird gerufen, wenn eine neue TabPage
98 : angezeigt werden soll. In diesem Handler kann noch eine Fehler-
99 : ueberprufung stattfinden und das Umschalten gegebenenfalls verhindert
100 : werden, indem sal_False zurueckgegeben wird. Der Handler kann auch als
101 : Link gesetzt werden. Die Defaultimplementierung ruft den Link und
102 : gibt den Rueckgabewert des Links zurueck und wenn kein Link gesetzt
103 : ist, wird sal_True zurueckgegeben.
104 :
105 : --------------------------------------------------------------------------
106 :
107 : Beispiel:
108 :
109 : MyWizardDlg-Ctor
110 : ----------------
111 :
112 : // add buttons
113 : AddButton( &maHelpBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
114 : AddButton( &maCancelBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
115 : AddButton( &maPrevBtn );
116 : AddButton( &maNextBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
117 : AddButton( &maFinnishBtn );
118 : SetPrevButton( &maPrevBtn );
119 : SetNextButton( &maNextBtn );
120 :
121 : // SetHandler
122 : maPrevBtn.SetClickHdl( LINK( this, MyWizardDlg, ImplPrevHdl ) );
123 : maNextBtn.SetClickHdl( LINK( this, MyWizardDlg, ImplNextHdl ) );
124 :
125 : // Set PreviewWindow
126 : SetViewWindow( &maPreview );
127 :
128 : // Call ActivatePage, because the first page should be created an activated
129 : ActivatePage();
130 :
131 :
132 : MyWizardDlg-ActivatePage-Handler
133 : --------------------------------
134 :
135 : void MyWizardDlg::ActivatePage()
136 : {
137 : WizardDialog::ActivatePage();
138 :
139 : // Test, if Page is created already
140 : if ( !GetPage( GetCurLevel() ) )
141 : {
142 : // Create and add new page
143 : TabPage* pNewTabPage;
144 : switch ( GetCurLevel() )
145 : {
146 : case 0:
147 : pNewTabPage = CreateIntroPage();
148 : break;
149 : case 1:
150 : pNewTabPage = CreateSecondPage();
151 : break;
152 : case 2:
153 : pNewTabPage = CreateThirdPage();
154 : break;
155 : case 3:
156 : pNewTabPage = CreateFinnishedPage();
157 : break;
158 :
159 : }
160 : AddPage( pNewTabPage );
161 : }
162 : }
163 :
164 :
165 : MyWizardDlg-Prev/Next-Handler
166 : -----------------------------
167 :
168 : IMPL_LINK( MyWizardDlg, ImplPrevHdl, PushButton*, pBtn )
169 : {
170 : ShowPrevPage();
171 : if ( !GetCurLevel() )
172 : pBtn->Disable();
173 : return 0;
174 : }
175 :
176 : IMPL_LINK( MyWizardDlg, ImplNextHdl, PushButton*, pBtn )
177 : {
178 : ShowNextPage();
179 : if ( GetCurLevel() < 3 )
180 : pBtn->Disable();
181 : return 0;
182 : }
183 :
184 : *************************************************************************/
185 :
186 :
187 : // - WizardDialog-Types -
188 :
189 :
190 : #define WIZARDDIALOG_BUTTON_STDOFFSET_X 6
191 : #define WIZARDDIALOG_BUTTON_SMALLSTDOFFSET_X 3
192 :
193 :
194 : // - WizardDialog -
195 :
196 :
197 : class SVT_DLLPUBLIC WizardDialog : public ModalDialog
198 : {
199 : private:
200 : Timer maWizardLayoutTimer;
201 : Size maPageSize;
202 : ImplWizPageData* mpFirstPage;
203 : ImplWizButtonData* mpFirstBtn;
204 : TabPage* mpCurTabPage;
205 : PushButton* mpPrevBtn;
206 : PushButton* mpNextBtn;
207 : vcl::Window* mpViewWindow;
208 : sal_uInt16 mnCurLevel;
209 : WindowAlign meViewAlign;
210 : Link maActivateHdl;
211 : Link maDeactivateHdl;
212 : sal_Int16 mnLeftAlignCount;
213 : bool mbEmptyViewMargin;
214 :
215 : DECL_DLLPRIVATE_LINK( ImplHandleWizardLayoutTimerHdl, void* );
216 : bool hasWizardPendingLayout() const;
217 :
218 : protected:
219 : long LogicalCoordinateToPixel(int iCoordinate);
220 : /**sets the number of buttons which should be left-aligned. Normally, buttons are right-aligned.
221 :
222 : only to be used during construction, before any layouting happened
223 : */
224 : void SetLeftAlignedButtonCount( sal_Int16 _nCount );
225 : /** declares the view area to have an empty margin
226 :
227 : Normally, the view area has a certain margin to the top/left/bottom/right of the
228 : dialog. By calling this method, you can reduce this margin to 0.
229 : */
230 : void SetEmptyViewMargin();
231 :
232 : private:
233 : SVT_DLLPRIVATE void ImplInitData();
234 : SVT_DLLPRIVATE void ImplCalcSize( Size& rSize );
235 : SVT_DLLPRIVATE void ImplPosCtrls();
236 : SVT_DLLPRIVATE void ImplPosTabPage();
237 : SVT_DLLPRIVATE void ImplShowTabPage( TabPage* pPage );
238 : SVT_DLLPRIVATE TabPage* ImplGetPage( sal_uInt16 nLevel ) const;
239 :
240 : public:
241 : WizardDialog( vcl::Window* pParent, WinBits nStyle = WB_STDTABDIALOG );
242 : WizardDialog( vcl::Window* pParent, const OString& rID, const OUString& rUIXMLDescription );
243 : virtual ~WizardDialog();
244 :
245 : virtual void Resize() SAL_OVERRIDE;
246 : virtual void StateChanged( StateChangedType nStateChange ) SAL_OVERRIDE;
247 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
248 :
249 : virtual void ActivatePage();
250 : virtual long DeactivatePage();
251 :
252 : virtual void queue_resize(StateChangedType eReason = StateChangedType::LAYOUT) SAL_OVERRIDE;
253 :
254 : bool ShowPrevPage();
255 : bool ShowNextPage();
256 : bool ShowPage( sal_uInt16 nLevel );
257 : bool Finish( long nResult = 0 );
258 0 : sal_uInt16 GetCurLevel() const { return mnCurLevel; }
259 :
260 : void AddPage( TabPage* pPage );
261 : void RemovePage( TabPage* pPage );
262 : void SetPage( sal_uInt16 nLevel, TabPage* pPage );
263 : TabPage* GetPage( sal_uInt16 nLevel ) const;
264 :
265 : void AddButton( Button* pButton, long nOffset = 0 );
266 : void RemoveButton( Button* pButton );
267 :
268 0 : void SetPrevButton( PushButton* pButton ) { mpPrevBtn = pButton; }
269 : PushButton* GetPrevButton() const { return mpPrevBtn; }
270 0 : void SetNextButton( PushButton* pButton ) { mpNextBtn = pButton; }
271 : PushButton* GetNextButton() const { return mpNextBtn; }
272 :
273 0 : void SetViewWindow( vcl::Window* pWindow ) { mpViewWindow = pWindow; }
274 : vcl::Window* GetViewWindow() const { return mpViewWindow; }
275 0 : void SetViewAlign( WindowAlign eAlign ) { meViewAlign = eAlign; }
276 : WindowAlign GetViewAlign() const { return meViewAlign; }
277 :
278 0 : void SetPageSizePixel( const Size& rSize ) { maPageSize = rSize; }
279 0 : const Size& GetPageSizePixel() const { return maPageSize; }
280 :
281 0 : void SetActivatePageHdl( const Link& rLink ) { maActivateHdl = rLink; }
282 : const Link& GetActivatePageHdl() const { return maActivateHdl; }
283 : void SetDeactivatePageHdl( const Link& rLink ) { maDeactivateHdl = rLink; }
284 : const Link& GetDeactivatePageHdl() const { return maDeactivateHdl; }
285 : };
286 :
287 : #endif // INCLUDED_SVTOOLS_WIZDLG_HXX
288 :
289 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|