From: Mathieu Baudier Date: Thu, 23 Jun 2022 05:00:34 +0000 (+0200) Subject: Refactor CMS UX API X-Git-Tag: v2.3.10~170 X-Git-Url: https://git.argeo.org/?a=commitdiff_plain;h=df60fd8de17590b8f4ab32fd0278e57aaaedbfa2;p=lgpl%2Fargeo-commons.git Refactor CMS UX API --- diff --git a/eclipse/org.argeo.cms.e4/src/org/argeo/cms/e4/maintenance/Browse.java b/eclipse/org.argeo.cms.e4/src/org/argeo/cms/e4/maintenance/Browse.java index 260a114cd..40a3c4e8b 100644 --- a/eclipse/org.argeo.cms.e4/src/org/argeo/cms/e4/maintenance/Browse.java +++ b/eclipse/org.argeo.cms.e4/src/org/argeo/cms/e4/maintenance/Browse.java @@ -15,7 +15,7 @@ import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Value; -import org.argeo.api.cms.Cms2DSize; +import org.argeo.api.cms.ux.Cms2DSize; import org.argeo.cms.CmsException; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.ui.CmsUiProvider; diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsIcon.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsIcon.java deleted file mode 100644 index 4ff89f27a..000000000 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsIcon.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.argeo.cms.swt; - -import org.argeo.api.cms.CmsTheme; -import org.eclipse.swt.graphics.Image; - -/** Can be applied to {@link Enum}s in order to generated {@link Image}s. */ -public interface CmsIcon { - String name(); - - default Image getSmallIcon(CmsTheme theme) { - return ((CmsSwtTheme) theme).getIcon(name(), getSmallIconSize()); - } - - default Image getBigIcon(CmsTheme theme) { - return ((CmsSwtTheme) theme).getIcon(name(), getBigIconSize()); - } - - default Integer getSmallIconSize() { - return 16; - } - - default Integer getBigIconSize() { - return 32; - } -} diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtTheme.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtTheme.java index b40c2a06c..7669b1554 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtTheme.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtTheme.java @@ -1,6 +1,7 @@ package org.argeo.cms.swt; -import org.argeo.api.cms.CmsTheme; +import org.argeo.api.cms.ux.CmsIcon; +import org.argeo.api.cms.ux.CmsTheme; import org.eclipse.swt.graphics.Image; /** SWT specific {@link CmsTheme}. */ @@ -18,4 +19,7 @@ public interface CmsSwtTheme extends CmsTheme { */ Image getIcon(String name, Integer preferredSize); + Image getSmallIcon(CmsIcon icon); + + Image getBigIcon(CmsIcon icon); } diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java index 75fa19749..2fb79f443 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java @@ -1,6 +1,6 @@ package org.argeo.cms.swt; -import org.argeo.api.cms.CmsUi; +import org.argeo.api.cms.ux.CmsUi; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUtils.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUtils.java index 784d03173..5d964090b 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUtils.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUtils.java @@ -6,12 +6,14 @@ import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; -import org.argeo.api.cms.CmsStyle; -import org.argeo.api.cms.CmsTheme; -import org.argeo.api.cms.CmsView; +import org.argeo.api.cms.ux.CmsIcon; +import org.argeo.api.cms.ux.CmsStyle; +import org.argeo.api.cms.ux.CmsTheme; +import org.argeo.api.cms.ux.CmsView; import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; @@ -30,19 +32,18 @@ import org.eclipse.swt.widgets.Widget; /** SWT utilities. */ public class CmsSwtUtils { + /* + * THEME AND VIEW + */ - /** Singleton. */ - private CmsSwtUtils() { - } - - public static CmsTheme getCmsTheme(Composite parent) { - CmsTheme theme = (CmsTheme) parent.getData(CmsTheme.class.getName()); + public static CmsSwtTheme getCmsTheme(Composite parent) { + CmsSwtTheme theme = (CmsSwtTheme) parent.getData(CmsTheme.class.getName()); if (theme == null) { // find parent shell Shell topShell = parent.getShell(); while (topShell.getParent() != null) topShell = (Shell) topShell.getParent(); - theme = (CmsTheme) topShell.getData(CmsTheme.class.getName()); + theme = (CmsSwtTheme) topShell.getData(CmsTheme.class.getName()); parent.setData(CmsTheme.class.getName(), theme); } return theme; @@ -83,6 +84,10 @@ public class CmsSwtUtils { shell.setData(CmsView.class.getName(), view); } + /* + * EVENTS + */ + /** Sends an event via {@link CmsView#sendEvent(String, Map)}. */ public static void sendEventOnSelect(Control control, String topic, Map properties) { SelectionListener listener = (Selected) (e) -> { @@ -104,6 +109,19 @@ public class CmsSwtUtils { sendEventOnSelect(control, topic, properties); } + /* + * ICONS + */ + /** Get a small icon from this theme. */ + public static Image getSmallIcon(CmsTheme theme, CmsIcon icon) { + return ((CmsSwtTheme) theme).getSmallIcon(icon); + } + + /** Get a big icon from this theme. */ + public static Image getBigIcon(CmsTheme theme, CmsIcon icon) { + return ((CmsSwtTheme) theme).getBigIcon(icon); + } + /* * LAYOUT INDEPENDENT */ @@ -285,8 +303,13 @@ public class CmsSwtUtils { String encoded = URLEncoder.encode(st.nextToken(), StandardCharsets.UTF_8); encoded = encoded.replace("+", "%20"); sb.append(encoded); - + } return sb.toString(); } + + /** Singleton. */ + private CmsSwtUtils() { + } + } diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/SimpleSwtUxContext.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/SimpleSwtUxContext.java index 9c55e8b10..e468c6d52 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/SimpleSwtUxContext.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/SimpleSwtUxContext.java @@ -1,6 +1,6 @@ package org.argeo.cms.swt; -import org.argeo.api.cms.UxContext; +import org.argeo.api.cms.ux.UxContext; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/app/CmsUserApp.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/app/CmsUserApp.java index 2eb2ce5dd..add6e9edb 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/app/CmsUserApp.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/app/CmsUserApp.java @@ -6,8 +6,8 @@ import java.util.Set; import org.argeo.api.acr.Content; import org.argeo.api.acr.ContentRepository; import org.argeo.api.cms.CmsContext; -import org.argeo.api.cms.CmsUi; -import org.argeo.api.cms.CmsView; +import org.argeo.api.cms.ux.CmsUi; +import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.AbstractCmsApp; import org.argeo.cms.swt.CmsSwtUi; import org.argeo.cms.swt.CmsSwtUtils; diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/auth/CmsLogin.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/auth/CmsLogin.java index 43e57396b..afd1b5499 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/auth/CmsLogin.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/auth/CmsLogin.java @@ -20,7 +20,7 @@ import javax.security.auth.login.LoginException; import org.argeo.api.cms.CmsAuth; import org.argeo.api.cms.CmsContext; import org.argeo.api.cms.CmsLog; -import org.argeo.api.cms.CmsView; +import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.CmsMsg; import org.argeo.cms.LocaleUtils; import org.argeo.cms.auth.RemoteAuthCallback; diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/auth/CmsLoginShell.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/auth/CmsLoginShell.java index a4d7c0770..39cf82afc 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/auth/CmsLoginShell.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/auth/CmsLoginShell.java @@ -1,7 +1,7 @@ package org.argeo.cms.swt.auth; import org.argeo.api.cms.CmsContext; -import org.argeo.api.cms.CmsView; +import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.swt.CmsSwtUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Control; diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/ChangePasswordDialog.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/ChangePasswordDialog.java index 8ff086283..06e4d0f9f 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/ChangePasswordDialog.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/dialogs/ChangePasswordDialog.java @@ -3,8 +3,8 @@ package org.argeo.cms.swt.dialogs; import java.security.PrivilegedAction; import java.util.Arrays; -import org.argeo.api.cms.CmsView; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.CmsMsg; import org.argeo.cms.CmsUserManager; import org.argeo.cms.swt.CmsSwtUtils; diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/osgi/BundleCmsSwtTheme.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/osgi/BundleCmsSwtTheme.java index c37a5b744..b3fec78ec 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/osgi/BundleCmsSwtTheme.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/osgi/BundleCmsSwtTheme.java @@ -5,6 +5,7 @@ import java.io.InputStream; import java.util.HashMap; import java.util.Map; +import org.argeo.api.cms.ux.CmsIcon; import org.argeo.cms.osgi.BundleCmsTheme; import org.argeo.cms.swt.CmsSwtTheme; import org.eclipse.swt.graphics.Image; @@ -39,11 +40,11 @@ public class BundleCmsSwtTheme extends BundleCmsTheme implements CmsSwtTheme { * * @param name An icon file name without path and extension. * @param preferredSize the preferred size, if null, - * {@link #getDefaultIconSize()} will be tried. + * {@link #getSmallIconSize()} will be tried. */ public Image getIcon(String name, Integer preferredSize) { if (preferredSize == null) - preferredSize = getDefaultIconSize(); + preferredSize = getSmallIconSize(); Map subCache; if (!iconPaths.containsKey(name)) subCache = new HashMap<>(); @@ -97,4 +98,14 @@ public class BundleCmsSwtTheme extends BundleCmsTheme implements CmsSwtTheme { return image; } + @Override + public Image getSmallIcon(CmsIcon icon) { + return getIcon(icon.name(), getSmallIconSize()); + } + + @Override + public Image getBigIcon(CmsIcon icon) { + return getIcon(icon.name(), getBigIconSize()); + } + } diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsUiConstants.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsUiConstants.java index 9df61dcca..c6a62e9e0 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsUiConstants.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsUiConstants.java @@ -1,6 +1,6 @@ package org.argeo.cms.ui; -import org.argeo.api.cms.Cms2DSize; +import org.argeo.api.cms.ux.Cms2DSize; /** Commons constants */ @Deprecated diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormEditorHeader.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormEditorHeader.java index f3a56f7b9..a75c19150 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormEditorHeader.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormEditorHeader.java @@ -5,7 +5,7 @@ import java.util.Observer; import javax.jcr.Node; -import org.argeo.api.cms.CmsEditable; +import org.argeo.api.cms.ux.CmsEditable; import org.argeo.cms.swt.CmsSwtUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormPageViewer.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormPageViewer.java index cc732d49d..3b1daf0aa 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormPageViewer.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormPageViewer.java @@ -14,10 +14,10 @@ import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.ValueFormatException; -import org.argeo.api.cms.Cms2DSize; -import org.argeo.api.cms.CmsEditable; -import org.argeo.api.cms.CmsImageManager; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.Cms2DSize; +import org.argeo.api.cms.ux.CmsEditable; +import org.argeo.api.cms.ux.CmsImageManager; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.ui.viewers.AbstractPageViewer; import org.argeo.cms.ui.viewers.EditablePart; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormStyle.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormStyle.java index 24067eaaa..709ecd024 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormStyle.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormStyle.java @@ -1,6 +1,6 @@ package org.argeo.cms.ui.forms; -import org.argeo.api.cms.CmsStyle; +import org.argeo.api.cms.ux.CmsStyle; /** Syles used */ public enum FormStyle implements CmsStyle { diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormUtils.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormUtils.java index 1a445bd76..d5914d209 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormUtils.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormUtils.java @@ -9,8 +9,8 @@ import java.util.GregorianCalendar; import javax.jcr.Node; import javax.jcr.RepositoryException; -import org.argeo.api.cms.CmsView; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.CmsException; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.eclipse.ui.EclipseUiUtils; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/JcrFileUploadReceiver.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/JcrFileUploadReceiver.java index c8582f0c1..60bb42b46 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/JcrFileUploadReceiver.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/JcrFileUploadReceiver.java @@ -11,7 +11,7 @@ import javax.jcr.RepositoryException; import javax.jcr.nodetype.NodeType; import org.apache.commons.io.FilenameUtils; -import org.argeo.api.cms.CmsImageManager; +import org.argeo.api.cms.ux.CmsImageManager; import org.argeo.cms.ui.widgets.Img; import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/SimpleEditableImage.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/SimpleEditableImage.java index c5c1a01a2..5e938d818 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/SimpleEditableImage.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/SimpleEditableImage.java @@ -2,7 +2,7 @@ package org.argeo.cms.ui.internal; import javax.jcr.RepositoryException; -import org.argeo.api.cms.Cms2DSize; +import org.argeo.api.cms.ux.Cms2DSize; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.cms.ui.widgets.EditableImage; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsLink.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsLink.java index 3821e6045..e91f9ba48 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsLink.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsLink.java @@ -8,8 +8,8 @@ import java.net.URL; import javax.jcr.Node; import javax.jcr.RepositoryException; -import org.argeo.api.cms.CmsStyle; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.CmsStyle; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.jcr.CmsJcrUtils; import org.argeo.cms.swt.CmsSwtUtils; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java index 73c545d0d..178fbcf24 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java @@ -9,9 +9,9 @@ import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.servlet.http.HttpServletRequest; -import org.argeo.api.cms.Cms2DSize; -import org.argeo.api.cms.CmsView; import org.argeo.api.cms.CmsConstants; +import org.argeo.api.cms.ux.Cms2DSize; +import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.jcr.CmsJcrUtils; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.ui.CmsUiConstants; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java index 1fc9bd1be..1ec2622b0 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java @@ -18,9 +18,9 @@ import javax.jcr.Property; import javax.jcr.RepositoryException; import org.apache.commons.io.IOUtils; -import org.argeo.api.cms.Cms2DSize; -import org.argeo.api.cms.CmsImageManager; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.Cms2DSize; +import org.argeo.api.cms.ux.CmsImageManager; import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.eclipse.rap.rwt.RWT; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/SimpleStyle.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/SimpleStyle.java index 8ed06a292..b5fca2699 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/SimpleStyle.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/util/SimpleStyle.java @@ -1,6 +1,6 @@ package org.argeo.cms.ui.util; -import org.argeo.api.cms.CmsStyle; +import org.argeo.api.cms.ux.CmsStyle; /** Simple styles used by the CMS UI utilities. */ public enum SimpleStyle implements CmsStyle { diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/viewers/AbstractPageViewer.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/viewers/AbstractPageViewer.java index ef24ee0d5..1d0c9620a 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/viewers/AbstractPageViewer.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/viewers/AbstractPageViewer.java @@ -11,8 +11,8 @@ import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.security.auth.Subject; -import org.argeo.api.cms.CmsEditable; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.CmsEditable; import org.argeo.cms.ui.widgets.ScrolledPage; import org.argeo.jcr.JcrException; import org.eclipse.jface.viewers.ContentViewer; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/viewers/JcrVersionCmsEditable.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/viewers/JcrVersionCmsEditable.java index 11162e87f..07724f4b1 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/viewers/JcrVersionCmsEditable.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/viewers/JcrVersionCmsEditable.java @@ -8,7 +8,7 @@ import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.version.VersionManager; -import org.argeo.api.cms.CmsEditable; +import org.argeo.api.cms.ux.CmsEditable; import org.argeo.cms.CmsException; import org.argeo.cms.ui.CmsEditionEvent; import org.eclipse.rap.rwt.RWT; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/EditableImage.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/EditableImage.java index c2393f267..95d9e8ee9 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/EditableImage.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/EditableImage.java @@ -3,8 +3,8 @@ package org.argeo.cms.ui.widgets; import javax.jcr.Node; import javax.jcr.RepositoryException; -import org.argeo.api.cms.Cms2DSize; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.Cms2DSize; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.ui.util.CmsUiUtils; import org.eclipse.swt.graphics.Point; diff --git a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/Img.java b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/Img.java index 3a4a60c9f..41063fa47 100644 --- a/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/Img.java +++ b/jcr/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/Img.java @@ -3,8 +3,8 @@ package org.argeo.cms.ui.widgets; import javax.jcr.Node; import javax.jcr.RepositoryException; -import org.argeo.api.cms.Cms2DSize; -import org.argeo.api.cms.CmsImageManager; +import org.argeo.api.cms.ux.Cms2DSize; +import org.argeo.api.cms.ux.CmsImageManager; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.ui.internal.JcrFileUploadReceiver; import org.argeo.cms.ui.viewers.NodePart; diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/Cms2DSize.java b/org.argeo.api.cms/src/org/argeo/api/cms/Cms2DSize.java deleted file mode 100644 index 30b3d8100..000000000 --- a/org.argeo.api.cms/src/org/argeo/api/cms/Cms2DSize.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.argeo.api.cms; - -/** A 2D size. */ -public class Cms2DSize { - private Integer width; - private Integer height; - - public Cms2DSize() { - - } - - public Cms2DSize(Integer width, Integer height) { - super(); - this.width = width; - this.height = height; - } - - public Integer getWidth() { - return width; - } - - public void setWidth(Integer width) { - this.width = width; - } - - public Integer getHeight() { - return height; - } - - public void setHeight(Integer height) { - this.height = height; - } - -} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsApp.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsApp.java index 99c619c80..745e5a400 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsApp.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/CmsApp.java @@ -2,6 +2,9 @@ package org.argeo.api.cms; import java.util.Set; +import org.argeo.api.cms.ux.CmsTheme; +import org.argeo.api.cms.ux.CmsUi; + /** An extensible user interface base on the CMS backend. */ public interface CmsApp { /** diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsEditable.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsEditable.java deleted file mode 100644 index 2deca018e..000000000 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsEditable.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.argeo.api.cms; - -/** Abstraction of a simple edition life cycle. */ -public interface CmsEditable { - - /** Whether the calling thread can edit, the value is immutable */ - public Boolean canEdit(); - - public Boolean isEditing(); - - public void startEditing(); - - public void stopEditing(); - - public static CmsEditable NON_EDITABLE = new CmsEditable() { - - @Override - public void stopEditing() { - } - - @Override - public void startEditing() { - } - - @Override - public Boolean isEditing() { - return false; - } - - @Override - public Boolean canEdit() { - return false; - } - }; - - public static CmsEditable ALWAYS_EDITING = new CmsEditable() { - - @Override - public void stopEditing() { - } - - @Override - public void startEditing() { - } - - @Override - public Boolean isEditing() { - return true; - } - - @Override - public Boolean canEdit() { - return true; - } - }; - -} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsEvent.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsEvent.java index b5dccbe9c..047717275 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsEvent.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/CmsEvent.java @@ -1,5 +1,7 @@ package org.argeo.api.cms; +import org.argeo.api.cms.ux.CmsView; + /** * Can be applied to {@link Enum}s in order to define events used by * {@link CmsView#sendEvent(String, java.util.Map)}. diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsImageManager.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsImageManager.java deleted file mode 100644 index 8c637b8cb..000000000 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsImageManager.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.argeo.api.cms; - -import java.io.InputStream; - -/** Read and write access to images. */ -public interface CmsImageManager { - /** Load image in control */ - public Boolean load(M node, V control, Cms2DSize size); - - /** @return (0,0) if not available */ - public Cms2DSize getImageSize(M node); - - /** - * The related <img> tag, with src, width and height set. - * - * @return null if not available - */ - public String getImageTag(M node); - - /** - * The related <img> tag, with url, width and height set. Caller must - * close the tag (or add additional attributes). - * - * @return null if not available - */ - public StringBuilder getImageTagBuilder(M node, Cms2DSize size); - - /** - * Returns the remotely accessible URL of the image (registering it if - * needed) @return null if not available - */ - public String getImageUrl(M node); - -// public Binary getImageBinary(Node node) throws RepositoryException; - -// public Image getSwtImage(Node node) throws RepositoryException; - - /** @return URL */ - public String uploadImage(M context, M uploadFolder, String fileName, InputStream in, String contentType); - - @Deprecated - default String uploadImage(M uploadFolder, String fileName, InputStream in) { - System.err.println("Context must be provided to " + CmsImageManager.class.getName()); - return uploadImage(null, uploadFolder, fileName, in, null); - } -} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsStyle.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsStyle.java deleted file mode 100644 index 8444e2fc5..000000000 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsStyle.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.argeo.api.cms; - -/** Can be applied to {@link Enum}s in order to generate (CSS) class names. */ -public interface CmsStyle { - String name(); - - /** @deprecated use {@link #style()} instead. */ - @Deprecated - default String toStyleClass() { - return style(); - } - - default String style() { - String classPrefix = getClassPrefix(); - return "".equals(classPrefix) ? name() : classPrefix + "-" + name(); - } - - default String getClassPrefix() { - return ""; - } - -} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsTheme.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsTheme.java deleted file mode 100644 index 50c3b1f25..000000000 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsTheme.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.argeo.api.cms; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Set; - -/** A CMS theme which can be applied to web apps as well as desktop apps. */ -public interface CmsTheme { - /** Unique ID of this theme. */ - String getThemeId(); - - /** - * Load a resource as an input stream, base don its relative path, or - * null if not found - */ - InputStream getResourceAsStream(String resourceName) throws IOException; - - /** Relative paths to standard web CSS. */ - Set getWebCssPaths(); - - /** Relative paths to RAP specific CSS. */ - Set getRapCssPaths(); - - /** Relative paths to SWT specific CSS. */ - Set getSwtCssPaths(); - - /** Relative paths to images such as icons. */ - Set getImagesPaths(); - - /** Relative paths to fonts. */ - Set getFontsPaths(); - - /** Tags to be added to the header section of the HTML page. */ - String getHtmlHeaders(); - - /** The HTML body to use. */ - String getBodyHtml(); - - /** The default icon size (typically the smallest). */ - Integer getDefaultIconSize(); - - /** Loads one of the relative path provided by the other methods. */ - InputStream loadPath(String path) throws IOException; - -} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsUi.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsUi.java deleted file mode 100644 index fd91c6e34..000000000 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsUi.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.argeo.api.cms; - -public interface CmsUi { - Object getData(String key); - void setData(String key, Object value); - -} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsView.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsView.java deleted file mode 100644 index c7ca1e90c..000000000 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsView.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.argeo.api.cms; - -import java.security.PrivilegedAction; -import java.util.HashMap; -import java.util.Map; - -import javax.security.auth.login.LoginContext; - -/** Provides interaction with the CMS system. */ -public interface CmsView { - final static String CMS_VIEW_UID_PROPERTY = "argeo.cms.view.uid"; - // String KEY = "org.argeo.cms.ui.view"; - - String getUid(); - - UxContext getUxContext(); - - // NAVIGATION - void navigateTo(String state); - - // SECURITY - void authChange(LoginContext loginContext); - - void logout(); - - // void registerCallbackHandler(CallbackHandler callbackHandler); - - // SERVICES - void exception(Throwable e); - - CmsImageManager getImageManager(); - - boolean isAnonymous(); - - /** - * Send an event to this topic. Does nothing by default., but if implemented it - * MUST set the {@link #CMS_VIEW_UID_PROPERTY} in the properties. - */ - default void sendEvent(String topic, Map properties) { - - } - - /** - * Convenience methods for when {@link #sendEvent(String, Map)} only requires - * one single parameter. - */ - default void sendEvent(String topic, String param, Object value) { - Map properties = new HashMap<>(); - properties.put(param, value); - sendEvent(topic, properties); - } - - default void applyStyles(Object widget) { - - } - - default T doAs(PrivilegedAction action) { - throw new UnsupportedOperationException(); - } - - default Void runAs(Runnable runnable) { - return doAs(new PrivilegedAction() { - - @Override - public Void run() { - if (runnable != null) - runnable.run(); - return null; - } - }); - } - - default void stateChanged(String state, String title) { - } - - default CmsSession getCmsSession() { - throw new UnsupportedOperationException(); - } - - default Object getData(String key) { - throw new UnsupportedOperationException(); - } - - @SuppressWarnings("unchecked") - default T getUiContext(Class clss) { - return (T) getData(clss.getName()); - } - - default void setUiContext(Class clss, T instance) { - setData(clss.getName(), instance); - } - - default void setData(String key, Object value) { - throw new UnsupportedOperationException(); - } - -} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/MvcProvider.java b/org.argeo.api.cms/src/org/argeo/api/cms/MvcProvider.java deleted file mode 100644 index 92864ea5c..000000000 --- a/org.argeo.api.cms/src/org/argeo/api/cms/MvcProvider.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.argeo.api.cms; - -import java.util.function.BiFunction; - -/** - * Stateless UI part creator. Takes a parent view (V) and a model context (M) in - * order to create a view part (W) which can then be further configured. Such - * object can be used as services and reference other part of the model which - * are relevant for all created UI part. - */ -@FunctionalInterface -@Deprecated -public interface MvcProvider extends BiFunction { - W createUiPart(V parent, M context); - - /** - * Whether this parent view is supported. - * - * @return true by default. - */ - default boolean isViewSupported(V parent) { - return true; - } - - /** - * Whether this context is supported. - * - * @return true by default. - */ - default boolean isModelSupported(M context) { - return true; - } - - default W apply(V parent, M context) { - if (!isViewSupported(parent)) - throw new IllegalArgumentException("Parent view " + parent + "is not supported."); - if (!isModelSupported(context)) - throw new IllegalArgumentException("Model context " + context + "is not supported."); - return createUiPart(parent, context); - } - - default W createUiPart(V parent) { - return createUiPart(parent, null); - } -} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/UxContext.java b/org.argeo.api.cms/src/org/argeo/api/cms/UxContext.java deleted file mode 100644 index fb99178ee..000000000 --- a/org.argeo.api.cms/src/org/argeo/api/cms/UxContext.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.argeo.api.cms; - -public interface UxContext { - boolean isPortrait(); - - boolean isLandscape(); - - boolean isSquare(); - - boolean isSmall(); - - /** - * Is a production environment (must be false by default, and be explicitly - * set during the CMS deployment). When false, it can activate additional UI - * capabilities in order to facilitate QA. - */ - boolean isMasterData(); -} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/Cms2DSize.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/Cms2DSize.java new file mode 100644 index 000000000..9667e8352 --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/Cms2DSize.java @@ -0,0 +1,34 @@ +package org.argeo.api.cms.ux; + +/** A 2D size. */ +public class Cms2DSize { + private Integer width; + private Integer height; + + public Cms2DSize() { + + } + + public Cms2DSize(Integer width, Integer height) { + super(); + this.width = width; + this.height = height; + } + + public Integer getWidth() { + return width; + } + + public void setWidth(Integer width) { + this.width = width; + } + + public Integer getHeight() { + return height; + } + + public void setHeight(Integer height) { + this.height = height; + } + +} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsEditable.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsEditable.java new file mode 100644 index 000000000..9047004ba --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsEditable.java @@ -0,0 +1,57 @@ +package org.argeo.api.cms.ux; + +/** Abstraction of a simple edition life cycle. */ +public interface CmsEditable { + + /** Whether the calling thread can edit, the value is immutable */ + public Boolean canEdit(); + + public Boolean isEditing(); + + public void startEditing(); + + public void stopEditing(); + + public static CmsEditable NON_EDITABLE = new CmsEditable() { + + @Override + public void stopEditing() { + } + + @Override + public void startEditing() { + } + + @Override + public Boolean isEditing() { + return false; + } + + @Override + public Boolean canEdit() { + return false; + } + }; + + public static CmsEditable ALWAYS_EDITING = new CmsEditable() { + + @Override + public void stopEditing() { + } + + @Override + public void startEditing() { + } + + @Override + public Boolean isEditing() { + return true; + } + + @Override + public Boolean canEdit() { + return true; + } + }; + +} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsIcon.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsIcon.java new file mode 100644 index 000000000..d4f86b207 --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsIcon.java @@ -0,0 +1,10 @@ +package org.argeo.api.cms.ux; + +/** + * Marker interface to be applied to {@link Enum}s in order to find or generate + * icons. + */ +public interface CmsIcon { + String name(); + +} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsImageManager.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsImageManager.java new file mode 100644 index 000000000..1ec54a9d9 --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsImageManager.java @@ -0,0 +1,46 @@ +package org.argeo.api.cms.ux; + +import java.io.InputStream; + +/** Read and write access to images. */ +public interface CmsImageManager { + /** Load image in control */ + public Boolean load(M node, V control, Cms2DSize size); + + /** @return (0,0) if not available */ + public Cms2DSize getImageSize(M node); + + /** + * The related <img> tag, with src, width and height set. + * + * @return null if not available + */ + public String getImageTag(M node); + + /** + * The related <img> tag, with url, width and height set. Caller must + * close the tag (or add additional attributes). + * + * @return null if not available + */ + public StringBuilder getImageTagBuilder(M node, Cms2DSize size); + + /** + * Returns the remotely accessible URL of the image (registering it if + * needed) @return null if not available + */ + public String getImageUrl(M node); + +// public Binary getImageBinary(Node node) throws RepositoryException; + +// public Image getSwtImage(Node node) throws RepositoryException; + + /** @return URL */ + public String uploadImage(M context, M uploadFolder, String fileName, InputStream in, String contentType); + + @Deprecated + default String uploadImage(M uploadFolder, String fileName, InputStream in) { + System.err.println("Context must be provided to " + CmsImageManager.class.getName()); + return uploadImage(null, uploadFolder, fileName, in, null); + } +} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsStyle.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsStyle.java new file mode 100644 index 000000000..e3f2e771d --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsStyle.java @@ -0,0 +1,22 @@ +package org.argeo.api.cms.ux; + +/** Can be applied to {@link Enum}s in order to generate (CSS) class names. */ +public interface CmsStyle { + String name(); + + /** @deprecated use {@link #style()} instead. */ + @Deprecated + default String toStyleClass() { + return style(); + } + + default String style() { + String classPrefix = getClassPrefix(); + return "".equals(classPrefix) ? name() : classPrefix + "-" + name(); + } + + default String getClassPrefix() { + return ""; + } + +} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsTheme.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsTheme.java new file mode 100644 index 000000000..3a4a78ed3 --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsTheme.java @@ -0,0 +1,51 @@ +package org.argeo.api.cms.ux; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Set; + +/** A CMS theme which can be applied to web apps as well as desktop apps. */ +public interface CmsTheme { + /** Unique ID of this theme. */ + String getThemeId(); + + /** + * Load a resource as an input stream, base don its relative path, or + * null if not found + */ + InputStream getResourceAsStream(String resourceName) throws IOException; + + /** Relative paths to standard web CSS. */ + Set getWebCssPaths(); + + /** Relative paths to RAP specific CSS. */ + Set getRapCssPaths(); + + /** Relative paths to SWT specific CSS. */ + Set getSwtCssPaths(); + + /** Relative paths to images such as icons. */ + Set getImagesPaths(); + + /** Relative paths to fonts. */ + Set getFontsPaths(); + + /** Tags to be added to the header section of the HTML page. */ + String getHtmlHeaders(); + + /** The HTML body to use. */ + String getBodyHtml(); + + /** The default icon size (typically the smallest). */ + default int getDefaultIconSize() { + return getSmallIconSize(); + } + + int getSmallIconSize(); + + int getBigIconSize(); + + /** Loads one of the relative path provided by the other methods. */ + InputStream loadPath(String path) throws IOException; + +} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java new file mode 100644 index 000000000..011cc1deb --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java @@ -0,0 +1,7 @@ +package org.argeo.api.cms.ux; + +public interface CmsUi { + Object getData(String key); + void setData(String key, Object value); + +} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsView.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsView.java new file mode 100644 index 000000000..45629fba5 --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsView.java @@ -0,0 +1,99 @@ +package org.argeo.api.cms.ux; + +import java.security.PrivilegedAction; +import java.util.HashMap; +import java.util.Map; + +import javax.security.auth.login.LoginContext; + +import org.argeo.api.cms.CmsSession; + +/** Provides interaction with the CMS system. */ +public interface CmsView { + final static String CMS_VIEW_UID_PROPERTY = "argeo.cms.view.uid"; + // String KEY = "org.argeo.cms.ui.view"; + + String getUid(); + + UxContext getUxContext(); + + // NAVIGATION + void navigateTo(String state); + + // SECURITY + void authChange(LoginContext loginContext); + + void logout(); + + // void registerCallbackHandler(CallbackHandler callbackHandler); + + // SERVICES + void exception(Throwable e); + + CmsImageManager getImageManager(); + + boolean isAnonymous(); + + /** + * Send an event to this topic. Does nothing by default., but if implemented it + * MUST set the {@link #CMS_VIEW_UID_PROPERTY} in the properties. + */ + default void sendEvent(String topic, Map properties) { + + } + + /** + * Convenience methods for when {@link #sendEvent(String, Map)} only requires + * one single parameter. + */ + default void sendEvent(String topic, String param, Object value) { + Map properties = new HashMap<>(); + properties.put(param, value); + sendEvent(topic, properties); + } + + default void applyStyles(Object widget) { + + } + + default T doAs(PrivilegedAction action) { + throw new UnsupportedOperationException(); + } + + default Void runAs(Runnable runnable) { + return doAs(new PrivilegedAction() { + + @Override + public Void run() { + if (runnable != null) + runnable.run(); + return null; + } + }); + } + + default void stateChanged(String state, String title) { + } + + default CmsSession getCmsSession() { + throw new UnsupportedOperationException(); + } + + default Object getData(String key) { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("unchecked") + default T getUiContext(Class clss) { + return (T) getData(clss.getName()); + } + + default void setUiContext(Class clss, T instance) { + setData(clss.getName(), instance); + } + + default void setData(String key, Object value) { + throw new UnsupportedOperationException(); + } + +} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/MvcProvider.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/MvcProvider.java new file mode 100644 index 000000000..3556edecf --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/MvcProvider.java @@ -0,0 +1,45 @@ +package org.argeo.api.cms.ux; + +import java.util.function.BiFunction; + +/** + * Stateless UI part creator. Takes a parent view (V) and a model context (M) in + * order to create a view part (W) which can then be further configured. Such + * object can be used as services and reference other part of the model which + * are relevant for all created UI part. + */ +@FunctionalInterface +@Deprecated +public interface MvcProvider extends BiFunction { + W createUiPart(V parent, M context); + + /** + * Whether this parent view is supported. + * + * @return true by default. + */ + default boolean isViewSupported(V parent) { + return true; + } + + /** + * Whether this context is supported. + * + * @return true by default. + */ + default boolean isModelSupported(M context) { + return true; + } + + default W apply(V parent, M context) { + if (!isViewSupported(parent)) + throw new IllegalArgumentException("Parent view " + parent + "is not supported."); + if (!isModelSupported(context)) + throw new IllegalArgumentException("Model context " + context + "is not supported."); + return createUiPart(parent, context); + } + + default W createUiPart(V parent) { + return createUiPart(parent, null); + } +} diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/UxContext.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/UxContext.java new file mode 100644 index 000000000..adb41d366 --- /dev/null +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/UxContext.java @@ -0,0 +1,18 @@ +package org.argeo.api.cms.ux; + +public interface UxContext { + boolean isPortrait(); + + boolean isLandscape(); + + boolean isSquare(); + + boolean isSmall(); + + /** + * Is a production environment (must be false by default, and be explicitly + * set during the CMS deployment). When false, it can activate additional UI + * capabilities in order to facilitate QA. + */ + boolean isMasterData(); +} diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/CmsUxUtils.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/CmsUxUtils.java index 1b2b0e940..015f35db1 100644 --- a/org.argeo.cms.ux/src/org/argeo/cms/ux/CmsUxUtils.java +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/CmsUxUtils.java @@ -3,7 +3,7 @@ package org.argeo.cms.ux; import org.argeo.api.acr.Content; import org.argeo.api.acr.ContentRepository; import org.argeo.api.acr.ContentSession; -import org.argeo.api.cms.CmsView; +import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.auth.CurrentUser; public class CmsUxUtils { 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 5890fc4f8..9bfa9620a 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 @@ -6,4 +6,5 @@ public interface Column { default int getWidth() { return 200; } + } diff --git a/org.argeo.cms/src/org/argeo/cms/AbstractCmsApp.java b/org.argeo.cms/src/org/argeo/cms/AbstractCmsApp.java index c2d52f3d0..cefdb86b3 100644 --- a/org.argeo.cms/src/org/argeo/cms/AbstractCmsApp.java +++ b/org.argeo.cms/src/org/argeo/cms/AbstractCmsApp.java @@ -9,7 +9,7 @@ import java.util.Map; import org.argeo.api.cms.CmsApp; import org.argeo.api.cms.CmsAppListener; import org.argeo.api.cms.CmsContext; -import org.argeo.api.cms.CmsTheme; +import org.argeo.api.cms.ux.CmsTheme; /** Base class for {@link CmsApp}s. */ public abstract class AbstractCmsApp implements CmsApp { diff --git a/org.argeo.cms/src/org/argeo/cms/osgi/BundleCmsTheme.java b/org.argeo.cms/src/org/argeo/cms/osgi/BundleCmsTheme.java index 3312d72f9..3ab799f71 100644 --- a/org.argeo.cms/src/org/argeo/cms/osgi/BundleCmsTheme.java +++ b/org.argeo.cms/src/org/argeo/cms/osgi/BundleCmsTheme.java @@ -18,7 +18,7 @@ import java.util.TreeSet; import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; -import org.argeo.api.cms.CmsTheme; +import org.argeo.api.cms.ux.CmsTheme; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -64,7 +64,8 @@ public class BundleCmsTheme implements CmsTheme { // private String swtCssPath; private Bundle themeBundle; - private Integer defaultIconSize = 16; + private Integer smallIconSize = 16; + private Integer bigIconSize = 32; public BundleCmsTheme() { @@ -320,8 +321,13 @@ public class BundleCmsTheme implements CmsTheme { } @Override - public Integer getDefaultIconSize() { - return defaultIconSize; + public int getSmallIconSize() { + return smallIconSize; + } + + @Override + public int getBigIconSize() { + return bigIconSize; } @Override diff --git a/rap/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java b/rap/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java index 95be53d5f..471cdeca5 100644 --- a/rap/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java +++ b/rap/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java @@ -8,10 +8,10 @@ import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import org.argeo.api.cms.CmsAuth; -import org.argeo.api.cms.CmsImageManager; -import org.argeo.api.cms.CmsView; import org.argeo.api.cms.CmsLog; -import org.argeo.api.cms.UxContext; +import org.argeo.api.cms.ux.CmsImageManager; +import org.argeo.api.cms.ux.CmsView; +import org.argeo.api.cms.ux.UxContext; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.SimpleSwtUxContext; diff --git a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/ui/script/CmsScriptApp.java b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/ui/script/CmsScriptApp.java index edf558e9c..a2b944064 100644 --- a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/ui/script/CmsScriptApp.java +++ b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/ui/script/CmsScriptApp.java @@ -20,8 +20,8 @@ import javax.script.ScriptEngine; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.argeo.api.cms.CmsTheme; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.CmsTheme; import org.argeo.cms.CmsException; import org.argeo.cms.ui.CmsUiConstants; import org.argeo.cms.ui.CmsUiProvider; diff --git a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/AbstractCmsEntryPoint.java b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/AbstractCmsEntryPoint.java index a4d04568e..be1f30eb1 100644 --- a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/AbstractCmsEntryPoint.java +++ b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/AbstractCmsEntryPoint.java @@ -21,8 +21,8 @@ import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import javax.servlet.http.HttpServletRequest; -import org.argeo.api.cms.CmsView; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.CmsView; import org.argeo.api.cms.CmsAuth; import org.argeo.cms.CmsException; import org.argeo.cms.auth.CurrentUser; diff --git a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsThemeResourceLoader.java b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsThemeResourceLoader.java index 5de0f9103..102a4e103 100644 --- a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsThemeResourceLoader.java +++ b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsThemeResourceLoader.java @@ -3,7 +3,7 @@ package org.argeo.cms.web; import java.io.IOException; import java.io.InputStream; -import org.argeo.api.cms.CmsTheme; +import org.argeo.api.cms.ux.CmsTheme; import org.eclipse.rap.rwt.service.ResourceLoader; /** A RAP {@link ResourceLoader} based on a {@link CmsTheme}. */ diff --git a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebApp.java b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebApp.java index 68fd803b9..a1d54cfef 100644 --- a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebApp.java +++ b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebApp.java @@ -8,8 +8,8 @@ import java.util.Set; import org.argeo.api.cms.CmsApp; import org.argeo.api.cms.CmsAppListener; import org.argeo.api.cms.CmsLog; -import org.argeo.api.cms.CmsTheme; -import org.argeo.api.cms.CmsView; +import org.argeo.api.cms.ux.CmsTheme; +import org.argeo.api.cms.ux.CmsView; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.util.LangUtils; import org.eclipse.rap.rwt.RWT; diff --git a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java index 2236870f6..9e407366d 100644 --- a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java +++ b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java @@ -14,12 +14,12 @@ import javax.security.auth.login.LoginException; import org.argeo.api.cms.CmsApp; import org.argeo.api.cms.CmsAuth; -import org.argeo.api.cms.CmsImageManager; import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsSession; -import org.argeo.api.cms.CmsUi; -import org.argeo.api.cms.CmsView; -import org.argeo.api.cms.UxContext; +import org.argeo.api.cms.ux.CmsImageManager; +import org.argeo.api.cms.ux.CmsUi; +import org.argeo.api.cms.ux.CmsView; +import org.argeo.api.cms.ux.UxContext; import org.argeo.cms.LocaleUtils; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.auth.RemoteAuthCallbackHandler; diff --git a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/SimpleErgonomics.java b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/SimpleErgonomics.java index 26ca3705f..1b50c19b7 100644 --- a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/SimpleErgonomics.java +++ b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/SimpleErgonomics.java @@ -7,9 +7,9 @@ import javax.jcr.Node; import javax.jcr.Repository; import javax.jcr.RepositoryException; -import org.argeo.api.cms.CmsImageManager; import org.argeo.api.cms.CmsLog; -import org.argeo.api.cms.UxContext; +import org.argeo.api.cms.ux.CmsImageManager; +import org.argeo.api.cms.ux.UxContext; import org.argeo.cms.CmsException; import org.argeo.cms.swt.CmsStyles; import org.argeo.cms.swt.CmsSwtUtils; diff --git a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/WebThemeUtils.java b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/WebThemeUtils.java index ea2ebdfb4..e51644b9f 100644 --- a/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/WebThemeUtils.java +++ b/rap/org.argeo.cms.ui.rap/src/org/argeo/cms/web/WebThemeUtils.java @@ -1,7 +1,7 @@ package org.argeo.cms.web; -import org.argeo.api.cms.CmsTheme; import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.CmsTheme; import org.eclipse.rap.rwt.application.Application; import org.eclipse.rap.rwt.service.ResourceLoader; diff --git a/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java b/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java index a708af13f..a13c0170f 100644 --- a/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java +++ b/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java @@ -8,9 +8,9 @@ import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import org.argeo.api.cms.CmsAuth; -import org.argeo.api.cms.CmsImageManager; -import org.argeo.api.cms.CmsView; -import org.argeo.api.cms.UxContext; +import org.argeo.api.cms.ux.CmsImageManager; +import org.argeo.api.cms.ux.CmsView; +import org.argeo.api.cms.ux.UxContext; import org.argeo.cms.CmsException; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.swt.CmsSwtUtils; diff --git a/rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java b/rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java index ed019d706..e6a24b92b 100644 --- a/rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java +++ b/rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java @@ -13,13 +13,13 @@ import javax.security.auth.login.LoginException; import org.argeo.api.cms.CmsApp; import org.argeo.api.cms.CmsAuth; -import org.argeo.api.cms.CmsImageManager; import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsSession; -import org.argeo.api.cms.CmsTheme; -import org.argeo.api.cms.CmsUi; -import org.argeo.api.cms.CmsView; -import org.argeo.api.cms.UxContext; +import org.argeo.api.cms.ux.CmsImageManager; +import org.argeo.api.cms.ux.CmsTheme; +import org.argeo.api.cms.ux.CmsUi; +import org.argeo.api.cms.ux.CmsView; +import org.argeo.api.cms.ux.UxContext; import org.argeo.cms.swt.CmsSwtUtils; import org.eclipse.e4.ui.css.core.engine.CSSEngine; import org.eclipse.e4.ui.css.core.engine.CSSErrorHandler;