import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import org.argeo.node.MvcProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/** Stateless factory building an SWT user interface given a JCR context. */
@FunctionalInterface
-public interface CmsUiProvider {
+public interface CmsUiProvider extends MvcProvider<Composite, Node, Control> {
/**
* Initialises a user interface.
*
- * @param parent
- * the parent composite
- * @param context
- * a context node (holding the JCR underlying session), or null
+ * @param parent the parent composite
+ * @param context a context node (holding the JCR underlying session), or null
*/
public Control createUi(Composite parent, Node context) throws RepositoryException;
+
+ @Override
+ public default Control apply(Composite parent, Node context) {
+ try {
+ return createUi(parent, context);
+ } catch (RepositoryException e) {
+ throw new IllegalStateException("Cannot create UI for context " + context, e);
+ }
+ }
+
}
--- /dev/null
+package org.argeo.node;
+
+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
+public interface MvcProvider<V, M, W> extends BiFunction<V, M, W> {
+ /**
+ * 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 createUiPart(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 apply(parent, context);
+ }
+}