X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.ui%2Fsrc%2Forg%2Fargeo%2Fcms%2Fui%2Futil%2FCmsUiUtils.java;h=75cff0fff6dd541ff047df25de8be948657c6b53;hb=80b00cede8c528131c7c767a6f64c94415d3f89f;hp=316e7859f92d796104e2b58665254cf370e870fe;hpb=5b3108fe285bca50565b58b63fa4feddc96c0765;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java index 316e7859f..75cff0fff 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/util/CmsUiUtils.java @@ -4,6 +4,11 @@ import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.StringTokenizer; import javax.jcr.Node; import javax.jcr.RepositoryException; @@ -11,20 +16,25 @@ import javax.servlet.http.HttpServletRequest; import org.argeo.api.NodeConstants; import org.argeo.api.NodeUtils; -import org.argeo.cms.CmsException; import org.argeo.cms.ui.CmsConstants; import org.argeo.cms.ui.CmsView; -import org.argeo.eclipse.ui.specific.UiContext; +import org.argeo.eclipse.ui.Selected; +import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils; +import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.service.ResourceManager; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowData; +import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; @@ -38,12 +48,41 @@ import org.eclipse.swt.widgets.Widget; public class CmsUiUtils implements CmsConstants { // private final static Log log = LogFactory.getLog(CmsUiUtils.class); + /* + * CMS VIEW + */ + + /** Sends an event via {@link CmsView#sendEvent(String, Map)}. */ + public static void sendEventOnSelect(Control control, String topic, Map properties) { + SelectionListener listener = (Selected) (e) -> { + CmsView.getCmsView(control.getParent()).sendEvent(topic, properties); + }; + if (control instanceof Button) { + ((Button) control).addSelectionListener(listener); + } else + throw new UnsupportedOperationException("Control type " + control.getClass() + " is not supported."); + } + + /** + * Convenience method to sends an event via + * {@link CmsView#sendEvent(String, Map)}. + */ + public static void sendEventOnSelect(Control control, String topic, String key, Object value) { + Map properties = new HashMap<>(); + properties.put(key, value); + sendEventOnSelect(control, topic, properties); + } + /** * The CMS view related to this display, or null if none is available from this * call. + * + * @deprecated Use {@link CmsView#getCmsView(Composite)} instead. */ + @Deprecated public static CmsView getCmsView() { - return UiContext.getData(CmsView.KEY); +// return UiContext.getData(CmsView.class.getName()); + return CmsView.getCmsView(Display.getCurrent().getActiveShell()); } public static StringBuilder getServerBaseUrl(HttpServletRequest request) { @@ -55,7 +94,7 @@ public class CmsUiUtils implements CmsConstants { buf.append(':').append(url.getPort()); return buf; } catch (MalformedURLException e) { - throw new CmsException("Cannot extract server base URL from " + request.getRequestURL(), e); + throw new IllegalArgumentException("Cannot extract server base URL from " + request.getRequestURL(), e); } } @@ -66,23 +105,45 @@ public class CmsUiUtils implements CmsConstants { buf.append(getDataPath(node)); return new URL(buf.toString()).toString(); } catch (MalformedURLException e) { - throw new CmsException("Cannot build data URL for " + node, e); + throw new IllegalArgumentException("Cannot build data URL for " + node, e); } } /** A path in the node repository */ public static String getDataPath(Node node) throws RepositoryException { - return getDataPath(NodeConstants.NODE, node); + return getDataPath(NodeConstants.EGO_REPOSITORY, node); } public static String getDataPath(String cn, Node node) throws RepositoryException { return NodeUtils.getDataPath(cn, node); } + /** Clean reserved URL characters for use in HTTP links. */ + public static String getDataPathForUrl(Node node) throws RepositoryException { + return cleanPathForUrl(getDataPath(node)); + } + + /** Clean reserved URL characters for use in HTTP links. */ + public static String cleanPathForUrl(String path) throws RepositoryException { + StringTokenizer st = new StringTokenizer(path, "/"); + StringBuilder sb = new StringBuilder(); + while (st.hasMoreElements()) { + sb.append('/'); + String encoded = URLEncoder.encode(st.nextToken(), StandardCharsets.UTF_8); + encoded = encoded.replace("+", "%20"); + sb.append(encoded); + + } + return sb.toString(); + } + /** @deprecated Use rowData16px() instead. GridData should not be reused. */ @Deprecated public static RowData ROW_DATA_16px = new RowData(16, 16); + /* + * GRID LAYOUT + */ public static GridLayout noSpaceGridLayout() { return noSpaceGridLayout(new GridLayout()); } @@ -91,6 +152,7 @@ public class CmsUiUtils implements CmsConstants { return noSpaceGridLayout(new GridLayout(columns, false)); } + /** @return the same layout, with spaces removed. */ public static GridLayout noSpaceGridLayout(GridLayout layout) { layout.horizontalSpacing = 0; layout.verticalSpacing = 0; @@ -99,61 +161,136 @@ public class CmsUiUtils implements CmsConstants { return layout; } - // - // GRID DATA - // - public static GridData fillWidth() { - return grabWidth(SWT.FILL, SWT.FILL); - } - public static GridData fillAll() { return new GridData(SWT.FILL, SWT.FILL, true, true); } + public static GridData fillWidth() { + return grabWidth(SWT.FILL, SWT.FILL); + } + public static GridData grabWidth(int horizontalAlignment, int verticalAlignment) { return new GridData(horizontalAlignment, horizontalAlignment, true, false); } + public static GridData fillHeight() { + return grabHeight(SWT.FILL, SWT.FILL); + } + + public static GridData grabHeight(int horizontalAlignment, int verticalAlignment) { + return new GridData(horizontalAlignment, horizontalAlignment, false, true); + } + + /* + * ROW LAYOUT + */ + /** @return the same layout, with margins removed. */ + public static RowLayout noMarginsRowLayout(RowLayout rowLayout) { + rowLayout.marginTop = 0; + rowLayout.marginBottom = 0; + rowLayout.marginLeft = 0; + rowLayout.marginRight = 0; + return rowLayout; + } + + public static RowLayout noMarginsRowLayout(int type) { + return noMarginsRowLayout(new RowLayout(type)); + } + public static RowData rowData16px() { return new RowData(16, 16); } + /* + * FORM LAYOUT + */ + + public static FormData coverAll() { + FormData fdLabel = new FormData(); + fdLabel.top = new FormAttachment(0, 0); + fdLabel.left = new FormAttachment(0, 0); + fdLabel.right = new FormAttachment(100, 0); + fdLabel.bottom = new FormAttachment(100, 0); + return fdLabel; + } + + /* + * STYLING + */ + /** Style widget */ public static T style(T widget, String style) { - widget.setData(CmsConstants.STYLE, style); + if (style == null) + return widget;// does nothing + EclipseUiSpecificUtils.setStyleData(widget, style); + if (widget instanceof Control) { + CmsView.getCmsView((Control) widget).applyStyles(widget); + } return widget; } + /** Style widget */ + public static T style(T widget, CmsStyle style) { + return style(widget, style.toStyleClass()); + } + /** Enable markups on widget */ public static T markup(T widget) { - widget.setData(CmsConstants.MARKUP, true); + EclipseUiSpecificUtils.setMarkupData(widget); + return widget; + } + + /** Disable markup validation. */ + public static T disableMarkupValidation(T widget) { + EclipseUiSpecificUtils.setMarkupValidationDisabledData(widget); return widget; } /** * Apply markup and set text on {@link Label}, {@link Button}, {@link Text}. * + * @param widget the widget to style and to use in order to display text + * @param txt the object to display via its toString() method. + * This argument should not be null, but if it is null and + * assertions are disabled "" is displayed instead; if + * assertions are enabled the call will fail. + * * @see #markup(Widget) */ - public static T text(T widget, String txt) { + public static T text(T widget, Object txt) { + assert txt != null; + String str = txt != null ? txt.toString() : ""; markup(widget); if (widget instanceof Label) - ((Label) widget).setText(txt); + ((Label) widget).setText(str); else if (widget instanceof Button) - ((Button) widget).setText(txt); + ((Button) widget).setText(str); else if (widget instanceof Text) - ((Text) widget).setText(txt); + ((Text) widget).setText(str); else throw new IllegalArgumentException("Unsupported widget type " + widget.getClass()); return widget; } + /** A {@link Label} with markup activated. */ + public static Label lbl(Composite parent, Object txt) { + return text(new Label(parent, SWT.NONE), txt); + } + + /** A read-only {@link Text} whose content can be copy/pasted. */ + public static Text txt(Composite parent, Object txt) { + return text(new Text(parent, SWT.NONE), txt); + } + + @Deprecated public static void setItemHeight(Table table, int height) { table.setData(CmsConstants.ITEM_HEIGHT, height); } /** Dispose all children of a Composite */ public static void clear(Composite composite) { + if (composite.isDisposed()) + return; for (Control child : composite.getChildren()) child.dispose(); } @@ -189,6 +326,21 @@ public class CmsUiUtils implements CmsConstants { } // IMAGES + public static String img(Node fileNode, String width, String height) { + return img(null, fileNode, width, height); + } + + public static String img(String serverBase, Node fileNode, String width, String height) { +// String src = (serverBase != null ? serverBase : "") + NodeUtils.getDataPath(fileNode); + String src; + try { + src = (serverBase != null ? serverBase : "") + getDataPathForUrl(fileNode); + } catch (RepositoryException e) { + throw new JcrException("Cannot get URL data path for " + fileNode, e); + } + return imgBuilder(src, width, height).append("/>").toString(); + } + public static String img(String src, String width, String height) { return imgBuilder(src, width, height).append("/>").toString(); } @@ -245,4 +397,5 @@ public class CmsUiUtils implements CmsConstants { /** Singleton. */ private CmsUiUtils() { } + }