--- /dev/null
+package org.simantics.document.linking.report.evaluator;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.simantics.objmap.graph.annotations.OrderedElementsAdd;\r
+import org.simantics.objmap.graph.annotations.OrderedElementsGet;\r
+import org.simantics.objmap.graph.annotations.OrderedElementsRem;\r
+\r
+public abstract class EvaluatorNode implements EvaluatorItem{\r
+ \r
+ EvaluatorNode parent;\r
+ \r
+ List<EvaluatorItem> children = new ArrayList<EvaluatorItem>();\r
+ \r
+ \r
+ @Override\r
+ public EvaluatorNode getParent() {\r
+ return parent;\r
+ }\r
+ \r
+ @Override\r
+ public void setParent(EvaluatorNode parent) {\r
+ this.parent = parent;\r
+ }\r
+ \r
+ @OrderedElementsGet\r
+ public List<EvaluatorItem> getChildren() {\r
+ return children;\r
+ }\r
+ \r
+ public boolean acceptChild(EvaluatorItem item) {\r
+ return true;\r
+ }\r
+ \r
+ public boolean acceptChild(int index, EvaluatorItem item) {\r
+ return true;\r
+ }\r
+ \r
+ public void addChild(EvaluatorItem item) {\r
+ children.add(item);\r
+ item.setParent(this);\r
+ }\r
+ \r
+ @OrderedElementsAdd\r
+ public void addChild(int index, EvaluatorItem item) {\r
+ children.add(index, item);\r
+ item.setParent(this);\r
+ }\r
+ \r
+ public int indexOf(EvaluatorItem item) {\r
+ return children.indexOf(item);\r
+ }\r
+ \r
+ @OrderedElementsRem\r
+ public void removeChild(EvaluatorItem item) {\r
+ children.remove(item);\r
+ item.setParent(null);\r
+ }\r
+ \r
+ \r
+ public List<Class<? extends EvaluatorItem>> getPossibleChildren(boolean add) {\r
+ List<Class<? extends EvaluatorItem>> classes = new ArrayList<Class<? extends EvaluatorItem>>();\r
+ classes.add(And.class);\r
+ classes.add(Or.class);\r
+ classes.add(If.class);\r
+ classes.add(Constant.class);\r
+ classes.add(Variable.class);\r
+ classes.add(Date.class);\r
+ classes.add(Path.class);\r
+ EvaluatorRoot root = getRoot();\r
+ if (root != null && root.isSupportStyles()) {\r
+ classes.add(TextSizeHint.class);\r
+ classes.add(AlignmentHint.class);\r
+ }\r
+ \r
+ return classes;\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ public <T extends EvaluatorItem> T createChild(Class<T> cls) {\r
+ EvaluatorItem child;\r
+ try {\r
+ child = cls.newInstance();\r
+ if (child instanceof EvaluatorNode)\r
+ ((EvaluatorNode)child).parent = this;\r
+ else if (child instanceof EvaluatorLeaf) {\r
+ ((EvaluatorLeaf)child).parent = this;\r
+ }\r
+ addChild(child);\r
+ return (T)child;\r
+ } catch (Exception e) {\r
+ \r
+ } \r
+ return null;\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ public <T extends EvaluatorItem> T createChild(int index, Class<T> cls) {\r
+ EvaluatorItem child;\r
+ try {\r
+ child = cls.newInstance();\r
+ if (child instanceof EvaluatorNode)\r
+ ((EvaluatorNode)child).parent = this;\r
+ else if (child instanceof EvaluatorLeaf) {\r
+ ((EvaluatorLeaf)child).parent = this;\r
+ }\r
+ addChild(child);\r
+ return (T)child;\r
+ } catch (Exception e) {\r
+ \r
+ } \r
+ return null;\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public EvaluatorRoot getRoot() {\r
+ if (parent == null)\r
+ return null;\r
+ return parent.getRoot();\r
+ }\r
+ \r
+ protected void copyChildren(EvaluatorNode copy) {\r
+ for (EvaluatorItem i : children) {\r
+ copy.addChild(i.copy());\r
+ }\r
+ }\r
+\r
+}\r