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;
import javax.servlet.http.HttpServletRequest;
import org.argeo.api.NodeConstants;
-import org.argeo.api.NodeUtils;
-import org.argeo.cms.CmsException;
+import org.argeo.cms.jcr.CmsJcrUtils;
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;
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<String, Object> 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<String, Object> 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) {
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);
}
}
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);
}
}
}
public static String getDataPath(String cn, Node node) throws RepositoryException {
- return NodeUtils.getDataPath(cn, node);
+ return CmsJcrUtils.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());
}
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;
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 extends Widget> 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 cmsView = CmsView.getCmsView((Control) widget);
+ if (cmsView != null)
+ cmsView.applyStyles(widget);
+ }
return widget;
}
+ /** Style widget */
+ public static <T extends Widget> T style(T widget, CmsStyle style) {
+ return style(widget, style.toStyleClass());
+ }
+
/** Enable markups on widget */
public static <T extends Widget> T markup(T widget) {
- widget.setData(CmsConstants.MARKUP, true);
+ EclipseUiSpecificUtils.setMarkupData(widget);
+ return widget;
+ }
+
+ /** Disable markup validation. */
+ public static <T extends Widget> 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 <code>toString()</code> method.
+ * This argument should not be null, but if it is null and
+ * assertions are disabled "<null>" is displayed instead; if
+ * assertions are enabled the call will fail.
+ *
* @see #markup(Widget)
*/
- public static <T extends Widget> T text(T widget, String txt) {
+ public static <T extends Widget> T text(T widget, Object txt) {
+ assert txt != null;
+ String str = txt != null ? txt.toString() : "<null>";
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();
}
}
// 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();
}
/** Singleton. */
private CmsUiUtils() {
}
+
}