Improve UX
authorMathieu <mbaudier@argeo.org>
Sun, 13 Nov 2022 08:35:36 +0000 (09:35 +0100)
committerMathieu <mbaudier@argeo.org>
Sun, 13 Nov 2022 08:35:36 +0000 (09:35 +0100)
org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractDataPart.java
org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/CmsDialog.java [new file with mode: 0644]
org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/Column.java
org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataPart.java
swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java
swt/org.argeo.cms.swt/src/org/argeo/cms/jface/dialog/CmsWizardDialog.java
swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/ChangePasswordDialog.java
swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsFeedback.java
swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/CmsMessageDialog.java
swt/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/LightweightDialog.java
swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtGuidedFormDialog.java

index 49856efb53d0c5e587eaaf0b7c32af9872c45193..04811af8753199ce6948b63d6651152c038d4955 100644 (file)
@@ -3,12 +3,11 @@ package org.argeo.cms.ux.widgets;
 import java.util.IdentityHashMap;
 import java.util.function.Consumer;
 
-public abstract class AbstractDataPart<INPUT, T> implements DataPart<INPUT, T> {
+public abstract class AbstractDataPart<INPUT, TYPE> implements DataPart<INPUT, TYPE> {
+       private Consumer<TYPE> onSelected;
+       private Consumer<TYPE> onAction;
 
-       private Consumer<T> onSelected;
-       private Consumer<T> onAction;
-
-       private IdentityHashMap<DataView<INPUT, T>, Object> views = new IdentityHashMap<>();
+       private IdentityHashMap<DataView<INPUT, TYPE>, Object> views = new IdentityHashMap<>();
 
        private INPUT data;
 
@@ -24,44 +23,43 @@ public abstract class AbstractDataPart<INPUT, T> implements DataPart<INPUT, T> {
        }
 
        @Override
-       public void onSelected(Consumer<T> onSelected) {
+       public void onSelected(Consumer<TYPE> onSelected) {
                this.onSelected = onSelected;
        }
 
        @Override
-       public void onAction(Consumer<T> onAction) {
+       public void onAction(Consumer<TYPE> onAction) {
                this.onAction = onAction;
        }
 
-       public Consumer<T> getOnSelected() {
+       public Consumer<TYPE> getOnSelected() {
                return onSelected;
        }
 
-       public Consumer<T> getOnAction() {
+       public Consumer<TYPE> getOnAction() {
                return onAction;
        }
 
        @Override
        public void refresh() {
-               for (DataView<INPUT, T> view : views.keySet()) {
+               for (DataView<INPUT, TYPE> view : views.keySet()) {
                        view.refresh();
                }
        }
 
        protected void notifyItemCountChange() {
-               for (DataView<INPUT, T> view : views.keySet()) {
+               for (DataView<INPUT, TYPE> view : views.keySet()) {
                        view.notifyItemCountChange();
                }
        }
 
        @Override
-       public void addView(DataView<INPUT, T> view) {
+       public void addView(DataView<INPUT, TYPE> view) {
                views.put(view, new Object());
        }
 
        @Override
-       public void removeView(DataView<INPUT, T> view) {
+       public void removeView(DataView<INPUT, TYPE> 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 (file)
index 0000000..3b1630d
--- /dev/null
@@ -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;
+
+}
index 9ee141c9040b0b60d39318f00534855f41cc327e..71cd263f89b302f7717a268df44f1788e9c1be28 100644 (file)
@@ -4,14 +4,14 @@ import org.argeo.api.cms.ux.CmsIcon;
 
 /** A column in a data representation. */
 @FunctionalInterface
-public interface Column<T> {
-       String getText(T model);
+public interface Column<TYPE> {
+       String getText(TYPE model);
 
        default int getWidth() {
                return 200;
        }
 
-       default CmsIcon getIcon(T model) {
+       default CmsIcon getIcon(TYPE model) {
                return null;
        }
 
index 11a12cf7bfc77cf83bb41093cf25e464b883fc2e..9d3ca33ff1ab6e046904b1abe3327483de1788b5 100644 (file)
@@ -2,22 +2,27 @@ package org.argeo.cms.ux.widgets;
 
 import java.util.function.Consumer;
 
-public interface DataPart<INPUT, T> {
+public interface DataPart<INPUT, TYPE> {
        void setInput(INPUT data);
 
        INPUT getInput();
 
-       void onSelected(Consumer<T> onSelected);
+       void onSelected(Consumer<TYPE> onSelected);
 
-       Consumer<T> getOnSelected();
+       Consumer<TYPE> getOnSelected();
 
-       void onAction(Consumer<T> onAction);
+       void onAction(Consumer<TYPE> onAction);
 
-       Consumer<T> getOnAction();
+       Consumer<TYPE> getOnAction();
 
        void refresh();
 
-       void addView(DataView<INPUT, T> view);
+       void addView(DataView<INPUT, TYPE> view);
+
+       void removeView(DataView<INPUT, TYPE> view);
+
+//     void select(TYPE data);
+//
+//     TYPE getSelected();
 
-       void removeView(DataView<INPUT, T> view);
 }
index 8309a42c5b7f9d96d1a1cddd9e24ddbdf2f95d5a..9a23c36c459a18d955df928f844508d8df021218 100644 (file)
@@ -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);
                        }
index 33841a1bb97bfa498e009b1e423dc9e1309338b9..ad347e6e87e267ccff55c5d0ed19d957253cb37a 100644 (file)
@@ -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) {
index 296247094b4d1f863629f490a6d1ab765f41eee0..abb8227cd7de150f3421986370d9371c4231ef7f 100644 (file)
@@ -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());
                }
index 91885c74b21deddf70c28a066cc283721e0e0c51..2fed951992f41c55d937012eff89f44ca683f260 100644 (file)
@@ -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);
index 66e640595de128a69a6a6bfc73b4189a5ac639ba..21308824d4fc570886df9c0dee6bfb185c6e7513 100644 (file)
@@ -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() {
index d74be6aa20c59c3ba4348c56f680f438a3514987..3aec22a14eb791843c912c11057acb810081dacc 100644 (file)
@@ -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();
index a7242b9a976b2315a0cb2212c2336f00611337cb..15d531de1870be2e86b6a7278401d02bc39bb2d9 100644 (file)
@@ -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) {