From 2b036a42c6b5ace47fba14ca9d09ee6e37bf6c5f Mon Sep 17 00:00:00 2001 From: Mathieu Date: Sun, 13 Nov 2022 09:35:36 +0100 Subject: [PATCH] Improve UX --- .../cms/ux/widgets/AbstractDataPart.java | 26 +++++++++---------- .../org/argeo/cms/ux/widgets/CmsDialog.java | 10 +++++++ .../src/org/argeo/cms/ux/widgets/Column.java | 6 ++--- .../org/argeo/cms/ux/widgets/DataPart.java | 19 +++++++++----- .../argeo/cms/e4/handlers/ChangePassword.java | 5 ++-- .../cms/jface/dialog/CmsWizardDialog.java | 5 ++-- .../cms/swt/dialogs/ChangePasswordDialog.java | 9 ++++--- .../argeo/cms/swt/dialogs/CmsFeedback.java | 3 ++- .../cms/swt/dialogs/CmsMessageDialog.java | 9 ++++--- .../cms/swt/dialogs/LightweightDialog.java | 20 ++++++-------- .../cms/swt/widgets/SwtGuidedFormDialog.java | 5 ++-- 11 files changed, 66 insertions(+), 51 deletions(-) create mode 100644 org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/CmsDialog.java diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractDataPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractDataPart.java index 49856efb5..04811af87 100644 --- a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractDataPart.java +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractDataPart.java @@ -3,12 +3,11 @@ package org.argeo.cms.ux.widgets; import java.util.IdentityHashMap; import java.util.function.Consumer; -public abstract class AbstractDataPart implements DataPart { +public abstract class AbstractDataPart implements DataPart { + private Consumer onSelected; + private Consumer onAction; - private Consumer onSelected; - private Consumer onAction; - - private IdentityHashMap, Object> views = new IdentityHashMap<>(); + private IdentityHashMap, Object> views = new IdentityHashMap<>(); private INPUT data; @@ -24,44 +23,43 @@ public abstract class AbstractDataPart implements DataPart { } @Override - public void onSelected(Consumer onSelected) { + public void onSelected(Consumer onSelected) { this.onSelected = onSelected; } @Override - public void onAction(Consumer onAction) { + public void onAction(Consumer onAction) { this.onAction = onAction; } - public Consumer getOnSelected() { + public Consumer getOnSelected() { return onSelected; } - public Consumer getOnAction() { + public Consumer getOnAction() { return onAction; } @Override public void refresh() { - for (DataView view : views.keySet()) { + for (DataView view : views.keySet()) { view.refresh(); } } protected void notifyItemCountChange() { - for (DataView view : views.keySet()) { + for (DataView view : views.keySet()) { view.notifyItemCountChange(); } } @Override - public void addView(DataView view) { + public void addView(DataView view) { views.put(view, new Object()); } @Override - public void removeView(DataView view) { + public void removeView(DataView view) { views.remove(view); } - } diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/CmsDialog.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/CmsDialog.java new file mode 100644 index 000000000..3b1630d29 --- /dev/null +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/CmsDialog.java @@ -0,0 +1,10 @@ +package org.argeo.cms.ux.widgets; + +public interface CmsDialog { + + // must be the same value as org.eclipse.jface.window.Window#OK + int OK = 0; + // must be the same value as org.eclipse.jface.window.Window#CANCEL + int CANCEL = 1; + +} diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/Column.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/Column.java index 9ee141c90..71cd263f8 100644 --- a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/Column.java +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/Column.java @@ -4,14 +4,14 @@ import org.argeo.api.cms.ux.CmsIcon; /** A column in a data representation. */ @FunctionalInterface -public interface Column { - String getText(T model); +public interface Column { + String getText(TYPE model); default int getWidth() { return 200; } - default CmsIcon getIcon(T model) { + default CmsIcon getIcon(TYPE model) { return null; } diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataPart.java index 11a12cf7b..9d3ca33ff 100644 --- a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataPart.java +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataPart.java @@ -2,22 +2,27 @@ package org.argeo.cms.ux.widgets; import java.util.function.Consumer; -public interface DataPart { +public interface DataPart { void setInput(INPUT data); INPUT getInput(); - void onSelected(Consumer onSelected); + void onSelected(Consumer onSelected); - Consumer getOnSelected(); + Consumer getOnSelected(); - void onAction(Consumer onAction); + void onAction(Consumer onAction); - Consumer getOnAction(); + Consumer getOnAction(); void refresh(); - void addView(DataView view); + void addView(DataView view); + + void removeView(DataView view); + +// void select(TYPE data); +// +// TYPE getSelected(); - void removeView(DataView view); } diff --git a/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java b/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java index 8309a42c5..9a23c36c4 100644 --- a/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java +++ b/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java @@ -17,6 +17,7 @@ import org.argeo.api.cms.transaction.WorkTransaction; import org.argeo.cms.CurrentUser; import org.argeo.cms.swt.dialogs.CmsFeedback; import org.argeo.cms.swt.dialogs.CmsMessageDialog; +import org.argeo.cms.ux.widgets.CmsDialog; import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.jface.dialogs.Dialog; @@ -45,7 +46,7 @@ public class ChangePassword { @Execute public void execute() { ChangePasswordDialog dialog = new ChangePasswordDialog(Display.getCurrent().getActiveShell(), userAdmin); - if (dialog.open() == Dialog.OK) { + if (dialog.open() == CmsDialog.OK) { new CmsMessageDialog(Display.getCurrent().getActiveShell(), passwordChanged.lead(), CmsMessageDialog.INFORMATION).open(); } @@ -117,7 +118,7 @@ public class ChangePassword { if (!newPassword1.getText().equals(newPassword2.getText())) throw new IllegalArgumentException("New passwords are different"); changePassword(oldPassword.getTextChars(), newPassword1.getTextChars()); - closeShell(OK); + closeShell(CmsDialog.OK); } catch (Exception e) { CmsFeedback.error("Cannot change password", e); } diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/jface/dialog/CmsWizardDialog.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/jface/dialog/CmsWizardDialog.java index 33841a1bb..ad347e6e8 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/jface/dialog/CmsWizardDialog.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/jface/dialog/CmsWizardDialog.java @@ -6,6 +6,7 @@ import org.argeo.cms.CmsMsg; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.Selected; import org.argeo.cms.swt.dialogs.LightweightDialog; +import org.argeo.cms.ux.widgets.CmsDialog; import org.argeo.eclipse.ui.EclipseUiUtils; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.wizard.IWizard; @@ -65,7 +66,7 @@ public class CmsWizardDialog extends LightweightDialog implements IWizardContain Button cancelButton = new Button(messageArea, SWT.FLAT); cancelButton.setText(CmsMsg.cancel.lead()); cancelButton.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false, 1, 3)); - cancelButton.addSelectionListener((Selected) (e) -> closeShell(CANCEL)); + cancelButton.addSelectionListener((Selected) (e) -> closeShell(CmsDialog.CANCEL)); message = new Label(messageArea, SWT.WRAP); message.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 2)); updateMessage(); @@ -207,7 +208,7 @@ public class CmsWizardDialog extends LightweightDialog implements IWizardContain protected void finishPressed() { if (wizard.performFinish()) - closeShell(OK); + closeShell(CmsDialog.OK); } private static void setSwitchingFormData(Composite composite) { diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/ChangePasswordDialog.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/ChangePasswordDialog.java index 296247094..abb8227cd 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/ChangePasswordDialog.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/ChangePasswordDialog.java @@ -8,6 +8,7 @@ import org.argeo.api.cms.directory.CmsUserManager; import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.CmsMsg; import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.ux.widgets.CmsDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; @@ -46,17 +47,17 @@ public class ChangePasswordDialog extends CmsMessageDialog { if (Arrays.equals(newPassword.getTextChars(), confirmPassword.getTextChars())) { try { cmsUserManager.changeOwnPassword(previousPassword.getTextChars(), newPassword.getTextChars()); - return OK; + return CmsDialog.OK; } catch (Exception e1) { log.error("Could not change password", e1); cancel(); CmsMessageDialog.openError(CmsMsg.invalidPassword.lead()); - return CANCEL; + return CmsDialog.CANCEL; } } else { cancel(); CmsMessageDialog.openError(CmsMsg.repeatNewPassword.lead()); - return CANCEL; + return CmsDialog.CANCEL; } }; @@ -67,7 +68,7 @@ public class ChangePasswordDialog extends CmsMessageDialog { @Override protected void okPressed() { Integer returnCode = cmsView.doAs(doIt); - if (returnCode.equals(OK)) { + if (returnCode.equals(CmsDialog.OK)) { super.okPressed(); CmsMessageDialog.openInformation(CmsMsg.passwordChanged.lead()); } diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsFeedback.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsFeedback.java index 91885c74b..2fed95199 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsFeedback.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsFeedback.java @@ -7,6 +7,7 @@ import java.io.StringWriter; import org.argeo.api.cms.CmsLog; import org.argeo.cms.CmsMsg; import org.argeo.cms.swt.Selected; +import org.argeo.cms.ux.widgets.CmsDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; @@ -85,7 +86,7 @@ public class CmsFeedback extends LightweightDialog { Button close = new Button(parent, SWT.FLAT); close.setText(CmsMsg.close.lead()); close.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false)); - close.addSelectionListener((Selected) (e) -> closeShell(OK)); + close.addSelectionListener((Selected) (e) -> closeShell(CmsDialog.OK)); if (exception != null) { stack = new Text(parent, SWT.MULTI | SWT.LEAD | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsMessageDialog.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsMessageDialog.java index 66e640595..21308824d 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsMessageDialog.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsMessageDialog.java @@ -3,6 +3,7 @@ package org.argeo.cms.swt.dialogs; import org.argeo.cms.CmsMsg; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.Selected; +import org.argeo.cms.ux.widgets.CmsDialog; import org.argeo.eclipse.ui.EclipseUiUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.TraverseEvent; @@ -80,7 +81,7 @@ public class CmsMessageDialog extends LightweightDialog { Button close = new Button(buttons, SWT.FLAT); close.setText(CmsMsg.close.lead()); close.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); - close.addSelectionListener((Selected) (e) -> closeShell(OK)); + close.addSelectionListener((Selected) (e) -> closeShell(CmsDialog.OK)); close.setFocus(); close.addTraverseListener(traverseListener); @@ -124,15 +125,15 @@ public class CmsMessageDialog extends LightweightDialog { } protected void okPressed() { - closeShell(OK); + closeShell(CmsDialog.OK); } protected void cancelPressed() { - closeShell(CANCEL); + closeShell(CmsDialog.CANCEL); } protected void cancel() { - closeShell(CANCEL); + closeShell(CmsDialog.CANCEL); } protected Point getInitialSize() { diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/LightweightDialog.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/LightweightDialog.java index d74be6aa2..3aec22a14 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/LightweightDialog.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/LightweightDialog.java @@ -1,6 +1,7 @@ package org.argeo.cms.swt.dialogs; import org.argeo.api.cms.CmsLog; +import org.argeo.cms.ux.widgets.CmsDialog; import org.argeo.eclipse.ui.EclipseUiException; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; @@ -20,11 +21,6 @@ import org.eclipse.swt.widgets.Shell; public class LightweightDialog { private final static CmsLog log = CmsLog.getLog(LightweightDialog.class); - // must be the same value as org.eclipse.jface.window.Window#OK - public final static int OK = 0; - // must be the same value as org.eclipse.jface.window.Window#CANCEL - public final static int CANCEL = 1; - private Shell parentShell; private Shell backgroundShell; private Shell foregoundShell; @@ -88,7 +84,7 @@ public class LightweightDialog { if (hasChildShells()) return; if (returnCode == null)// not yet closed - closeShell(CANCEL); + closeShell(CmsDialog.CANCEL); } @Override @@ -113,7 +109,7 @@ public class LightweightDialog { if (hasChildShells()) return; if (returnCode == null)// not yet closed - closeShell(CANCEL); + closeShell(CmsDialog.CANCEL); } }); backgroundShell.addDisposeListener((event) -> onClose()); @@ -122,7 +118,7 @@ public class LightweightDialog { block(); } if (returnCode == null) - returnCode = OK; + returnCode = CmsDialog.OK; return returnCode; } @@ -130,11 +126,11 @@ public class LightweightDialog { try { runEventLoop(foregoundShell); } catch (ThreadDeath t) { - returnCode = CANCEL; + returnCode = CmsDialog.CANCEL; if (log.isTraceEnabled()) log.error("Thread death, canceling dialog", t); } catch (Throwable t) { - returnCode = CANCEL; + returnCode = CmsDialog.CANCEL; log.error("Cannot open blocking lightweight dialog", t); } } @@ -162,13 +158,13 @@ public class LightweightDialog { private synchronized void notifyClose() { if (returnCode == null) - returnCode = CANCEL; + returnCode = CmsDialog.CANCEL; notifyAll(); } protected void closeShell(int returnCode) { this.returnCode = returnCode; - if (CANCEL == returnCode) + if (CmsDialog.CANCEL == returnCode) onCancel(); if (foregoundShell != null && !foregoundShell.isDisposed()) { foregoundShell.close(); diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtGuidedFormDialog.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtGuidedFormDialog.java index a7242b9a9..15d531de1 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtGuidedFormDialog.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtGuidedFormDialog.java @@ -6,6 +6,7 @@ import org.argeo.cms.CmsMsg; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.Selected; import org.argeo.cms.swt.dialogs.LightweightDialog; +import org.argeo.cms.ux.widgets.CmsDialog; import org.argeo.cms.ux.widgets.GuidedForm; import org.argeo.cms.ux.widgets.GuidedForm.Page; import org.argeo.eclipse.ui.EclipseUiUtils; @@ -65,7 +66,7 @@ public class SwtGuidedFormDialog extends LightweightDialog implements GuidedForm Button cancelButton = new Button(messageArea, SWT.FLAT); cancelButton.setText(CmsMsg.cancel.lead()); cancelButton.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false, 1, 3)); - cancelButton.addSelectionListener((Selected) (e) -> closeShell(CANCEL)); + cancelButton.addSelectionListener((Selected) (e) -> closeShell(CmsDialog.CANCEL)); message = new Label(messageArea, SWT.WRAP); message.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 2)); updateMessage(); @@ -191,7 +192,7 @@ public class SwtGuidedFormDialog extends LightweightDialog implements GuidedForm protected void finishPressed() { if (guidedForm.performFinish()) - closeShell(OK); + closeShell(CmsDialog.OK); } private static void setSwitchingFormData(Composite composite) { -- 2.30.2