1 package org
.argeo
.cms
.ui
.dialogs
;
3 import java
.lang
.reflect
.InvocationTargetException
;
5 import org
.argeo
.cms
.CmsMsg
;
6 import org
.argeo
.cms
.ui
.util
.CmsUiUtils
;
7 import org
.argeo
.eclipse
.ui
.EclipseUiUtils
;
8 import org
.argeo
.eclipse
.ui
.Selected
;
9 import org
.eclipse
.jface
.operation
.IRunnableWithProgress
;
10 import org
.eclipse
.jface
.wizard
.IWizard
;
11 import org
.eclipse
.jface
.wizard
.IWizardContainer2
;
12 import org
.eclipse
.jface
.wizard
.IWizardPage
;
13 import org
.eclipse
.swt
.SWT
;
14 import org
.eclipse
.swt
.layout
.FormAttachment
;
15 import org
.eclipse
.swt
.layout
.FormData
;
16 import org
.eclipse
.swt
.layout
.FormLayout
;
17 import org
.eclipse
.swt
.layout
.GridData
;
18 import org
.eclipse
.swt
.layout
.GridLayout
;
19 import org
.eclipse
.swt
.widgets
.Button
;
20 import org
.eclipse
.swt
.widgets
.Composite
;
21 import org
.eclipse
.swt
.widgets
.Control
;
22 import org
.eclipse
.swt
.widgets
.Label
;
23 import org
.eclipse
.swt
.widgets
.Shell
;
25 /** A wizard dialog based on {@link LightweightDialog}. */
26 public class CmsWizardDialog
extends LightweightDialog
implements IWizardContainer2
{
27 private static final long serialVersionUID
= -2123153353654812154L;
29 private IWizard wizard
;
30 private IWizardPage currentPage
;
31 private int currentPageIndex
;
33 private Label titleBar
;
34 private Label message
;
35 private Composite
[] pageBodies
;
36 private Composite buttons
;
39 private Button finish
;
41 public CmsWizardDialog(Shell parentShell
, IWizard wizard
) {
44 wizard
.setContainer(this);
47 currentPage
= wizard
.getStartingPage();
48 if (currentPage
== null)
49 throw new IllegalArgumentException("At least one wizard page is required");
53 protected Control
createDialogArea(Composite parent
) {
56 Composite messageArea
= new Composite(parent
, SWT
.NONE
);
57 messageArea
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, false));
59 messageArea
.setLayout(CmsUiUtils
.noSpaceGridLayout(new GridLayout(2, false)));
60 titleBar
= new Label(messageArea
, SWT
.WRAP
);
61 titleBar
.setFont(EclipseUiUtils
.getBoldFont(parent
));
62 titleBar
.setLayoutData(new GridData(SWT
.BEGINNING
, SWT
.FILL
, true, false));
64 Button cancelButton
= new Button(messageArea
, SWT
.FLAT
);
65 cancelButton
.setText(CmsMsg
.cancel
.lead());
66 cancelButton
.setLayoutData(new GridData(SWT
.END
, SWT
.TOP
, false, false, 1, 3));
67 cancelButton
.addSelectionListener((Selected
) (e
) -> closeShell(CANCEL
));
68 message
= new Label(messageArea
, SWT
.WRAP
);
69 message
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, false, 1, 2));
73 Composite body
= new Composite(parent
, SWT
.BORDER
);
74 body
.setLayout(new FormLayout());
75 body
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
76 pageBodies
= new Composite
[wizard
.getPageCount()];
77 IWizardPage
[] pages
= wizard
.getPages();
78 for (int i
= 0; i
< pages
.length
; i
++) {
79 pageBodies
[i
] = new Composite(body
, SWT
.NONE
);
80 pageBodies
[i
].setLayout(CmsUiUtils
.noSpaceGridLayout());
81 setSwitchingFormData(pageBodies
[i
]);
82 pages
[i
].createControl(pageBodies
[i
]);
84 showPage(currentPage
);
86 buttons
= new Composite(parent
, SWT
.NONE
);
87 buttons
.setLayoutData(new GridData(SWT
.END
, SWT
.FILL
, true, false));
89 boolean singlePage
= wizard
.getPageCount() == 1;
90 // singlePage = false;// dev
91 GridLayout layout
= new GridLayout(singlePage ?
1 : 3, true);
92 layout
.marginWidth
= 0;
93 layout
.marginHeight
= 0;
94 buttons
.setLayout(layout
);
95 // TODO revert order for right-to-left languages
98 back
= new Button(buttons
, SWT
.PUSH
);
99 back
.setText(CmsMsg
.wizardBack
.lead());
100 back
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, false, false));
101 back
.addSelectionListener((Selected
) (e
) -> backPressed());
103 next
= new Button(buttons
, SWT
.PUSH
);
104 next
.setText(CmsMsg
.wizardNext
.lead());
105 next
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, false, false));
106 next
.addSelectionListener((Selected
) (e
) -> nextPressed());
108 finish
= new Button(buttons
, SWT
.PUSH
);
109 finish
.setText(CmsMsg
.wizardFinish
.lead());
110 finish
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, false, false));
111 finish
.addSelectionListener((Selected
) (e
) -> finishPressed());
119 public IWizardPage
getCurrentPage() {
124 public Shell
getShell() {
125 return getForegoundShell();
129 public void showPage(IWizardPage page
) {
130 IWizardPage
[] pages
= wizard
.getPages();
132 for (int i
= 0; i
< pages
.length
; i
++) {
133 if (page
== pages
[i
]) {
139 throw new IllegalArgumentException("Cannot find index of wizard page " + page
);
140 pageBodies
[index
].moveAbove(pageBodies
[currentPageIndex
]);
143 // for (Control c : body.getChildren())
145 // page.createControl(body);
146 // body.layout(true, true);
147 currentPageIndex
= index
;
152 public void updateButtons() {
154 back
.setEnabled(wizard
.getPreviousPage(currentPage
) != null);
156 next
.setEnabled(wizard
.getNextPage(currentPage
) != null && currentPage
.canFlipToNextPage());
157 if (finish
!= null) {
158 finish
.setEnabled(wizard
.canFinish());
163 public void updateMessage() {
164 if (currentPage
.getMessage() != null)
165 message
.setText(currentPage
.getMessage());
169 public void updateTitleBar() {
170 if (currentPage
.getTitle() != null)
171 titleBar
.setText(currentPage
.getTitle());
175 public void updateWindowTitle() {
176 setTitle(wizard
.getWindowTitle());
180 public void run(boolean fork
, boolean cancelable
, IRunnableWithProgress runnable
)
181 throws InvocationTargetException
, InterruptedException
{
186 public void updateSize() {
190 protected boolean onCancel() {
191 return wizard
.performCancel();
194 protected void nextPressed() {
195 IWizardPage page
= wizard
.getNextPage(currentPage
);
200 protected void backPressed() {
201 IWizardPage page
= wizard
.getPreviousPage(currentPage
);
206 protected void finishPressed() {
207 if (wizard
.performFinish())
211 private static void setSwitchingFormData(Composite composite
) {
212 FormData fdLabel
= new FormData();
213 fdLabel
.top
= new FormAttachment(0, 0);
214 fdLabel
.left
= new FormAttachment(0, 0);
215 fdLabel
.right
= new FormAttachment(100, 0);
216 fdLabel
.bottom
= new FormAttachment(100, 0);
217 composite
.setLayoutData(fdLabel
);