--- /dev/null
+package org.argeo.cms.ui;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.jcr.acr.JcrContent;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.jcr.JcrException;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Stateless factory building an SWT user interface given a JCR context. */
+public interface CmsUiProvider extends SwtUiProvider {
+ /**
+ * Initialises a user interface.
+ *
+ * @param parent the parent composite
+ * @param context a context node (holding the JCR underlying session), or null
+ */
+ default Control createUi(Composite parent, Node context) throws RepositoryException {
+ // does nothing by default
+ return null;
+ }
+
+ default Control createUiPart(Composite parent, Node context) {
+ try {
+ return createUi(parent, context);
+ } catch (RepositoryException e) {
+ throw new JcrException("Cannot create UI for context " + context, e);
+ }
+ }
+
+ @Override
+ default Control createUiPart(Composite parent, Content context) {
+ if (context == null)
+ return createUiPart(parent, (Node) null);
+ if (context instanceof JcrContent) {
+ Node node = ((JcrContent) context).getJcrNode();
+ return createUiPart(parent, node);
+ } else {
+// CmsLog.getLog(CmsUiProvider.class)
+// .warn("In " + getClass() + ", content " + context + " is not compatible with JCR.");
+// return createUiPart(parent, (Node) null);
+
+ throw new IllegalArgumentException(
+ "In " + getClass() + ", content " + context + " is not compatible with JCR");
+ }
+ }
+
+}