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