]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/LazyParametrizedViewpoint.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.browsing.ui.graph.impl / src / org / simantics / browsing / ui / graph / impl / LazyParametrizedViewpoint.java
diff --git a/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/LazyParametrizedViewpoint.java b/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/LazyParametrizedViewpoint.java
new file mode 100644 (file)
index 0000000..443afb3
--- /dev/null
@@ -0,0 +1,201 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.browsing.ui.graph.impl;\r
+\r
+import java.util.function.Consumer;\r
+\r
+import org.simantics.browsing.ui.BuiltinKeys;\r
+import org.simantics.browsing.ui.DataSource;\r
+import org.simantics.browsing.ui.NodeContext;\r
+import org.simantics.browsing.ui.PrimitiveQueryUpdater;\r
+import org.simantics.browsing.ui.common.viewpoints.ViewpointStub;\r
+import org.simantics.browsing.ui.content.Viewpoint;\r
+import org.simantics.browsing.ui.graph.impl.request.ParametrizedResourceQuery;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.procedure.Listener;\r
+import org.simantics.utils.datastructures.Pair;\r
+\r
+/**\r
+ * Implement {@link #children(ReadGraph)} and {@link #hasChildren(ReadGraph)}.\r
+ * \r
+ * @author Tuukka Lehtonen\r
+ */\r
+public abstract class LazyParametrizedViewpoint extends ViewpointStub {\r
+\r
+       /**\r
+        * Needed for separating childQuery and hasChildQuery from each other in the\r
+        * equals sense.\r
+        */\r
+       private static final Object                              CHILDREN     = new Object();\r
+       private static final Object                              HAS_CHILDREN = new Object();\r
+\r
+       private final ParametrizedResourceQuery<NodeContext[]> childQuery;\r
+       private final ParametrizedResourceQuery<Boolean>        hasChildQuery;\r
+\r
+    private final Listener<NodeContext[]>              childQueryProcedure;\r
+    private final Listener<Boolean>                     hasChildQueryProcedure;\r
+\r
+    private final PrimitiveQueryUpdater                      updater;\r
+    private final NodeContext                               context;\r
+    private final BuiltinKeys.ViewpointKey                   key;\r
+\r
+       /**\r
+        * @return\r
+        */\r
+       public abstract NodeContext[] children(ReadGraph graph) throws DatabaseException;\r
+\r
+       /**\r
+        * @param graph\r
+        * @return\r
+        */\r
+       public abstract Boolean hasChildren(ReadGraph graph) throws DatabaseException;\r
+\r
+\r
+       public LazyParametrizedViewpoint(PrimitiveQueryUpdater updater, NodeContext context, BuiltinKeys.ViewpointKey key, Object... parameters) {\r
+               assert updater != null;\r
+               assert context != null;\r
+               assert key != null;\r
+\r
+               this.updater = updater;\r
+               this.context = context;\r
+               this.key = key;\r
+\r
+               this.childQuery = new ParametrizedResourceQuery<NodeContext[]>(Pair.make(getClass(), CHILDREN), context, parameters) {\r
+\r
+                       @Override\r
+                       public NodeContext[] perform(ReadGraph graph) throws DatabaseException {\r
+                               return  children(graph);\r
+                       }\r
+\r
+               };\r
+\r
+               this.childQueryProcedure = new Listener<NodeContext[]>() {\r
+\r
+                       @Override\r
+                       public void execute(NodeContext[] result) {\r
+                               replaceChildrenResult(result);\r
+                       }\r
+\r
+                       @Override\r
+                       public boolean isDisposed() {\r
+                               return LazyParametrizedViewpoint.this.updater.isDisposed();\r
+                       }\r
+\r
+                       public void exception(Throwable t) {\r
+                               System.out.print("LazyParametrizedViewpoint2.childQuery failed: ");\r
+                               t.printStackTrace();\r
+                       }\r
+\r
+               };\r
+\r
+               this.hasChildQuery = new ParametrizedResourceQuery<Boolean>(Pair.make(getClass(), HAS_CHILDREN), context, parameters) {\r
+\r
+                       @Override\r
+                       public Boolean perform(ReadGraph graph) throws DatabaseException {\r
+                               return hasChildren(graph);\r
+                       }\r
+\r
+               };\r
+\r
+               this.hasChildQueryProcedure = new Listener<Boolean>() {\r
+\r
+                       @Override\r
+                       public void execute(Boolean result) {\r
+                               replaceHasChildrenResult(result);\r
+                       }\r
+\r
+                       @Override\r
+                       public boolean isDisposed() {\r
+                               return LazyParametrizedViewpoint.this.updater.isDisposed();\r
+                       }\r
+\r
+                       public void exception(Throwable t) {\r
+                               System.out.print("LazyParametrizedViewpoint2.hasChildQuery failed: ");\r
+                               t.printStackTrace();\r
+                       }\r
+\r
+               };\r
+\r
+       }\r
+\r
+       public NodeContext getContext() {\r
+               return context;\r
+       }\r
+\r
+       @Override\r
+       public NodeContext[] getChildren() {\r
+               if (children == Viewpoint.PENDING_CHILDREN) {\r
+                       DataSource<ReadGraph> source = updater.getDataSource(ReadGraph.class);\r
+                       if (source != null) {\r
+                               source.schedule(graph -> graph.asyncRequest(childQuery, childQueryProcedure));\r
+                       }\r
+               }\r
+\r
+               return children;\r
+       }\r
+\r
+       @Override\r
+       public Boolean getHasChildren() {\r
+               if (hasChildren == Viewpoint.PENDING_HAS_CHILDREN) {\r
+                       DataSource<ReadGraph> source = updater.getDataSource(ReadGraph.class);\r
+                       if (source != null) {\r
+                               source.schedule(new Consumer<ReadGraph>() {\r
+                                       @Override\r
+                                       public void accept(ReadGraph source) {\r
+                                               source.asyncRequest(hasChildQuery, hasChildQueryProcedure);\r
+                                       }\r
+                               });\r
+                       }\r
+               }\r
+\r
+               return hasChildren;\r
+       }\r
+\r
+       protected void replaceChildrenResult(NodeContext[] result) {\r
+               setChildren(updater, result);\r
+               updater.scheduleReplace(context, key, this);\r
+       }\r
+\r
+       protected void replaceHasChildrenResult(Boolean result) {\r
+               setHasChildren(result);\r
+               updater.scheduleReplace(context, key, this);\r
+       }\r
+\r
+       /**\r
+        * @param <T>\r
+        * @param clazz\r
+        * @return input of the specified class\r
+        * @throws ClassCastException if the input class does not match the\r
+        *         specified class\r
+        * @throws NullPointerException if the input is null\r
+        */\r
+        protected <T> T getInput(Class<T> clazz) throws ClassCastException {\r
+                Object o = context.getConstant(BuiltinKeys.INPUT);\r
+                if (o == null)\r
+                        throw new NullPointerException("null input");\r
+                return clazz.cast(o);\r
+        }\r
+\r
+        /**\r
+         * @param <T>\r
+         * @param clazz\r
+         * @return <code>null</code> if input is <code>null</code> or if the class does not match\r
+         */\r
+        protected <T> T tryGetInput(Class<T> clazz) {\r
+                Object o = context.getConstant(BuiltinKeys.INPUT);\r
+                if (o != null && clazz.isInstance(o))\r
+                        return clazz.cast(o);\r
+                return null;\r
+        }\r
+\r
+}\r