]> git.argeo.org Git - lgpl/argeo-commons.git/blob - swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtGuidedFormDialog.java
Fix error message
[lgpl/argeo-commons.git] / swt / org.argeo.cms.swt / src / org / argeo / cms / swt / widgets / SwtGuidedFormDialog.java
1 package org.argeo.cms.swt.widgets;
2
3 import java.util.List;
4
5 import org.argeo.cms.CmsMsg;
6 import org.argeo.cms.swt.CmsSwtUtils;
7 import org.argeo.cms.swt.Selected;
8 import org.argeo.cms.swt.dialogs.LightweightDialog;
9 import org.argeo.cms.ux.widgets.GuidedForm;
10 import org.argeo.cms.ux.widgets.GuidedForm.Page;
11 import org.argeo.eclipse.ui.EclipseUiUtils;
12 import org.eclipse.swt.SWT;
13 import org.eclipse.swt.layout.FormAttachment;
14 import org.eclipse.swt.layout.FormData;
15 import org.eclipse.swt.layout.FormLayout;
16 import org.eclipse.swt.layout.GridData;
17 import org.eclipse.swt.layout.GridLayout;
18 import org.eclipse.swt.widgets.Button;
19 import org.eclipse.swt.widgets.Composite;
20 import org.eclipse.swt.widgets.Control;
21 import org.eclipse.swt.widgets.Label;
22 import org.eclipse.swt.widgets.Shell;
23
24 /** A wizard dialog based on {@link LightweightDialog}. */
25 public class SwtGuidedFormDialog extends LightweightDialog implements GuidedForm.View {
26 private GuidedForm guidedForm;
27 private GuidedForm.Page currentPage;
28 private int currentPageIndex;
29
30 private Label titleBar;
31 private Label message;
32 private Composite[] pageBodies;
33 private Composite buttons;
34 private Button back;
35 private Button next;
36 private Button finish;
37
38 public SwtGuidedFormDialog(Shell parentShell, GuidedForm guidedForm) {
39 super(parentShell);
40 this.guidedForm = guidedForm;
41 guidedForm.setView(this);
42 // create the pages
43 guidedForm.addPages();
44 for (Page page : guidedForm.getPages()) {
45 if (!(page instanceof SwtGuidedFormPage))
46 throw new IllegalArgumentException("Pages form must implement " + SwtGuidedFormPage.class);
47 }
48 currentPage = guidedForm.getStartingPage();
49 if (currentPage == null)
50 throw new IllegalArgumentException("At least one wizard page is required");
51 }
52
53 @Override
54 protected Control createDialogArea(Composite parent) {
55 updateWindowTitle();
56
57 Composite messageArea = new Composite(parent, SWT.NONE);
58 messageArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
59 {
60 messageArea.setLayout(CmsSwtUtils.noSpaceGridLayout(new GridLayout(2, false)));
61 titleBar = new Label(messageArea, SWT.WRAP);
62 titleBar.setFont(EclipseUiUtils.getBoldFont(parent));
63 titleBar.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, false));
64 updateTitleBar();
65 Button cancelButton = new Button(messageArea, SWT.FLAT);
66 cancelButton.setText(CmsMsg.cancel.lead());
67 cancelButton.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false, 1, 3));
68 cancelButton.addSelectionListener((Selected) (e) -> closeShell(CANCEL));
69 message = new Label(messageArea, SWT.WRAP);
70 message.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 2));
71 updateMessage();
72 }
73
74 Composite body = new Composite(parent, SWT.BORDER);
75 body.setLayout(new FormLayout());
76 body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
77 pageBodies = new Composite[guidedForm.getPageCount()];
78 List<GuidedForm.Page> pages = guidedForm.getPages();
79 for (int i = 0; i < pages.size(); i++) {
80 pageBodies[i] = new Composite(body, SWT.NONE);
81 pageBodies[i].setLayout(CmsSwtUtils.noSpaceGridLayout());
82 setSwitchingFormData(pageBodies[i]);
83 // !! SWT specific
84 SwtGuidedFormPage page = (SwtGuidedFormPage) pages.get(i);
85 page.createControl(pageBodies[i]);
86 }
87 showPage(currentPage);
88
89 buttons = new Composite(parent, SWT.NONE);
90 buttons.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
91 {
92 boolean singlePage = guidedForm.getPageCount() == 1;
93 // singlePage = false;// dev
94 GridLayout layout = new GridLayout(singlePage ? 1 : 3, true);
95 layout.marginWidth = 0;
96 layout.marginHeight = 0;
97 buttons.setLayout(layout);
98 // TODO revert order for right-to-left languages
99
100 if (!singlePage) {
101 back = new Button(buttons, SWT.PUSH);
102 back.setText(CmsMsg.wizardBack.lead());
103 back.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
104 back.addSelectionListener((Selected) (e) -> backPressed());
105
106 next = new Button(buttons, SWT.PUSH);
107 next.setText(CmsMsg.wizardNext.lead());
108 next.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
109 next.addSelectionListener((Selected) (e) -> nextPressed());
110 }
111 finish = new Button(buttons, SWT.PUSH);
112 finish.setText(CmsMsg.wizardFinish.lead());
113 finish.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
114 finish.addSelectionListener((Selected) (e) -> finishPressed());
115
116 updateButtons();
117 }
118 return body;
119 }
120
121 public GuidedForm.Page getCurrentPage() {
122 return currentPage;
123 }
124
125 public Shell getShell() {
126 return getForegoundShell();
127 }
128
129 public void showPage(GuidedForm.Page page) {
130 List<GuidedForm.Page> pages = guidedForm.getPages();
131 int index = -1;
132 for (int i = 0; i < pages.size(); i++) {
133 if (page == pages.get(i)) {
134 index = i;
135 break;
136 }
137 }
138 if (index < 0)
139 throw new IllegalArgumentException("Cannot find index of wizard page " + page);
140 pageBodies[index].moveAbove(pageBodies[currentPageIndex]);
141
142 // // clear
143 // for (Control c : body.getChildren())
144 // c.dispose();
145 // page.createControl(body);
146 // body.layout(true, true);
147 currentPageIndex = index;
148 currentPage = page;
149 }
150
151 @Override
152 public void updateButtons() {
153 if (back != null)
154 back.setEnabled(guidedForm.getPreviousPage(currentPage) != null);
155 if (next != null)
156 next.setEnabled(guidedForm.getNextPage(currentPage) != null && currentPage.canFlipToNextPage());
157 if (finish != null) {
158 finish.setEnabled(guidedForm.canFinish());
159 }
160 }
161
162 public void updateMessage() {
163 if (currentPage.getMessage() != null)
164 message.setText(currentPage.getMessage());
165 }
166
167 public void updateTitleBar() {
168 if (currentPage.getTitle() != null)
169 titleBar.setText(currentPage.getTitle());
170 }
171
172 public void updateWindowTitle() {
173 setTitle(guidedForm.getFormTitle());
174 }
175
176 protected boolean onCancel() {
177 return guidedForm.performCancel();
178 }
179
180 protected void nextPressed() {
181 GuidedForm.Page page = guidedForm.getNextPage(currentPage);
182 showPage(page);
183 updateButtons();
184 }
185
186 protected void backPressed() {
187 GuidedForm.Page page = guidedForm.getPreviousPage(currentPage);
188 showPage(page);
189 updateButtons();
190 }
191
192 protected void finishPressed() {
193 if (guidedForm.performFinish())
194 closeShell(OK);
195 }
196
197 private static void setSwitchingFormData(Composite composite) {
198 FormData fdLabel = new FormData();
199 fdLabel.top = new FormAttachment(0, 0);
200 fdLabel.left = new FormAttachment(0, 0);
201 fdLabel.right = new FormAttachment(100, 0);
202 fdLabel.bottom = new FormAttachment(100, 0);
203 composite.setLayoutData(fdLabel);
204 }
205
206 }