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