]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtGuidedFormDialog.java
1 package org
.argeo
.cms
.swt
.widgets
;
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
;
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
;
31 private Label titleBar
;
32 private Label message
;
33 private Composite
[] pageBodies
;
34 private Composite buttons
;
37 private Button finish
;
39 public SwtGuidedFormDialog(Shell parentShell
, GuidedForm guidedForm
) {
41 this.guidedForm
= guidedForm
;
42 guidedForm
.setView(this);
44 guidedForm
.addPages();
45 for (Page page
: guidedForm
.getPages()) {
46 if (!(page
instanceof SwtGuidedFormPage
))
47 throw new IllegalArgumentException("Pages form must implement " + SwtGuidedFormPage
.class);
49 currentPage
= guidedForm
.getStartingPage();
50 if (currentPage
== null)
51 throw new IllegalArgumentException("At least one wizard page is required");
55 protected Control
createDialogArea(Composite parent
) {
58 Composite messageArea
= new Composite(parent
, SWT
.NONE
);
59 messageArea
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, false));
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));
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));
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
]);
85 SwtGuidedFormPage page
= (SwtGuidedFormPage
) pages
.get(i
);
86 page
.createControl(pageBodies
[i
]);
88 showPage(currentPage
);
90 buttons
= new Composite(parent
, SWT
.NONE
);
91 buttons
.setLayoutData(new GridData(SWT
.END
, SWT
.FILL
, true, false));
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
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());
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());
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());
122 public GuidedForm
.Page
getCurrentPage() {
126 public Shell
getShell() {
127 return getForegoundShell();
130 public void showPage(GuidedForm
.Page page
) {
131 List
<GuidedForm
.Page
> pages
= guidedForm
.getPages();
133 for (int i
= 0; i
< pages
.size(); i
++) {
134 if (page
== pages
.get(i
)) {
140 throw new IllegalArgumentException("Cannot find index of wizard page " + page
);
141 pageBodies
[index
].moveAbove(pageBodies
[currentPageIndex
]);
144 // for (Control c : body.getChildren())
146 // page.createControl(body);
147 // body.layout(true, true);
148 currentPageIndex
= index
;
153 public void updateButtons() {
155 back
.setEnabled(guidedForm
.getPreviousPage(currentPage
) != null);
157 next
.setEnabled(guidedForm
.getNextPage(currentPage
) != null && currentPage
.canFlipToNextPage());
158 if (finish
!= null) {
159 finish
.setEnabled(guidedForm
.canFinish());
163 public void updateMessage() {
164 if (currentPage
.getMessage() != null)
165 message
.setText(currentPage
.getMessage());
168 public void updateTitleBar() {
169 if (currentPage
.getTitle() != null)
170 titleBar
.setText(currentPage
.getTitle());
173 public void updateWindowTitle() {
174 setTitle(guidedForm
.getFormTitle());
177 protected boolean onCancel() {
178 return guidedForm
.performCancel();
181 protected void nextPressed() {
182 GuidedForm
.Page page
= guidedForm
.getNextPage(currentPage
);
187 protected void backPressed() {
188 GuidedForm
.Page page
= guidedForm
.getPreviousPage(currentPage
);
193 protected void finishPressed() {
194 if (guidedForm
.performFinish())
195 closeShell(CmsDialog
.OK
);
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
);