]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/GETreeRowModel.java
Sync git svn branch with SVN repository r33144.
[simantics/platform.git] / bundles / org.simantics.browsing.ui.nattable / src / org / simantics / browsing / ui / nattable / GETreeRowModel.java
diff --git a/bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/GETreeRowModel.java b/bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/GETreeRowModel.java
new file mode 100644 (file)
index 0000000..ebfb962
--- /dev/null
@@ -0,0 +1,242 @@
+package org.simantics.browsing.ui.nattable;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+\r
+import org.eclipse.nebula.widgets.nattable.tree.ITreeData;\r
+import org.eclipse.nebula.widgets.nattable.tree.ITreeRowModel;\r
+import org.eclipse.nebula.widgets.nattable.tree.ITreeRowModelListener;\r
+\r
+import it.unimi.dsi.fastutil.ints.IntOpenHashSet;\r
+\r
+/**\r
+ * ITreeRowModel that does not automatically expand all child nodes (as TreeRowModel does). \r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ * @param <T>\r
+ */\r
+public class GETreeRowModel<T> implements ITreeRowModel<T>{\r
+       //private final HashSet<Integer> parentIndexes = new HashSet<Integer>();\r
+       //private final TIntHashSet parentIndexes = new TIntHashSet(1000, 0.8f);\r
+       private final IntOpenHashSet parentIndexes = new IntOpenHashSet();\r
+\r
+       private final Collection<ITreeRowModelListener> listeners = new HashSet<ITreeRowModelListener>();\r
+\r
+       private final ITreeData<T> treeData;\r
+\r
+       public GETreeRowModel(ITreeData<T> treeData) {\r
+               this.treeData = treeData;\r
+       }\r
+\r
+       public void registerRowGroupModelListener(ITreeRowModelListener listener) {\r
+               this.listeners.add(listener);\r
+       }\r
+\r
+       public void notifyListeners() {\r
+               for (ITreeRowModelListener listener : this.listeners) {\r
+                       listener.treeRowModelChanged();\r
+               }\r
+       }\r
+\r
+       public int depth(int index) {\r
+               return this.treeData.getDepthOfData(this.treeData.getDataAtIndex(index));\r
+       }\r
+\r
+       public boolean isLeaf(int index) {\r
+               return !hasChildren(index);\r
+       }\r
+\r
+       public String getObjectAtIndexAndDepth(int index, int depth) {\r
+               return this.treeData.formatDataForDepth(depth,this.treeData.getDataAtIndex(index));\r
+       }\r
+\r
+       public boolean hasChildren(int index) {\r
+               return this.treeData.hasChildren(this.treeData.getDataAtIndex(index));\r
+       }\r
+       \r
+       public boolean isCollapsed(int index) {\r
+               return this.parentIndexes.contains(index);\r
+       }\r
+\r
+       public void clear() {\r
+               this.parentIndexes.clear();\r
+       }\r
+       \r
+       @Override\r
+       public boolean isCollapsible(int index) {\r
+               return hasChildren(index);\r
+       }\r
+\r
+       @Override\r
+       public List<Integer> collapse(int index) {\r
+               this.parentIndexes.add(index);\r
+               notifyListeners();\r
+               return getChildIndexes(index);\r
+       }\r
+       \r
+       \r
+\r
+       @Override\r
+       public List<Integer> expand(int index) {\r
+               this.parentIndexes.remove(index);\r
+               notifyListeners();\r
+               List<Integer> children = getExpandedChildIndexes(index);\r
+               return children;\r
+       }\r
+       \r
+       @Override\r
+       public List<Integer> collapseAll() {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+       \r
+       \r
+       @Override\r
+       public List<Integer> expandToLevel(int level) {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+       \r
+       @Override\r
+       public List<Integer> expandToLevel(T object, int level) {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+       \r
+       @Override\r
+       public List<Integer> expandAll() {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+       \r
+       @Override\r
+       public List<Integer> expandToLevel(int parentIndex, int level) {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+       \r
+       @Override\r
+       public List<T> getChildren(int parentIndex) {\r
+               T t = treeData.getDataAtIndex(parentIndex);\r
+               return treeData.getChildren(t,true);\r
+       }\r
+       \r
+       @Override\r
+       public List<T> getDirectChildren(int parentIndex) {\r
+               return treeData.getChildren(parentIndex);\r
+       }\r
+       \r
+       \r
+       @Override\r
+       public List<Integer> collapse(T object) {\r
+               int index = treeData.indexOf(object);\r
+               return collapse(index);\r
+       }\r
+       \r
+       @Override\r
+       public List<Integer> expand(T object) {\r
+               int index = treeData.indexOf(object);\r
+               return expand(index);\r
+       }\r
+       \r
+       @Override\r
+       public boolean isCollapsed(T object) {\r
+               int index = treeData.indexOf(object);\r
+               return isCollapsed(index);\r
+       }\r
+       \r
+\r
+       @SuppressWarnings("unchecked")\r
+       public List<Integer> getChildIndexes(int parentIndex) {\r
+               List<Integer> result = new ArrayList<Integer>();\r
+               T t = this.treeData.getDataAtIndex(parentIndex);\r
+               if (t == null)\r
+                       return Collections.EMPTY_LIST;\r
+               List<T> children = this.treeData.getChildren(t);\r
+               for (T child : children) {\r
+                       int index = this.treeData.indexOf(child);\r
+                       if (index >= 0) {\r
+                               result.add(index);\r
+                               result.addAll(getChildIndexes(index));\r
+                       } else {\r
+                               result.addAll(getChildIndexes(child));\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+       \r
+       public List<Integer> getChildIndexes(T t) {\r
+               List<Integer> result = new ArrayList<Integer>();\r
+               List<T> children = this.treeData.getChildren(t);\r
+               for (T child : children) {\r
+                       int index = this.treeData.indexOf(child);\r
+                       if (index >= 0) {\r
+                               result.add(index);\r
+                               result.addAll(getChildIndexes(index));\r
+                       } else {\r
+                               result.addAll(getChildIndexes(child));\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+       \r
+       @SuppressWarnings("unchecked")\r
+       public List<Integer> getExpandedChildIndexes(int parentIndex) {\r
+               List<Integer> result = new ArrayList<Integer>();\r
+               T t = this.treeData.getDataAtIndex(parentIndex);\r
+               if (t == null)\r
+                       return Collections.EMPTY_LIST;\r
+               List<T> children = this.treeData.getChildren(t);\r
+               for (T child : children) {\r
+                       int index = this.treeData.indexOf(child);\r
+                       if (index >= 0) {\r
+                               result.add(index);\r
+                               if (!parentIndexes.contains(index))\r
+                                       result.addAll(getExpandedChildIndexes(index));\r
+                       } else {\r
+                               result.addAll(getExpandedChildIndexes(child));\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+       \r
+       public List<Integer> getExpandedChildIndexes(T t) {\r
+               List<Integer> result = new ArrayList<Integer>();\r
+               List<T> children = this.treeData.getChildren(t);\r
+               for (T child : children) {\r
+                       int index = this.treeData.indexOf(child);\r
+                       if (index >= 0) {\r
+                               result.add(index);\r
+                               if (!parentIndexes.contains(index))\r
+                                       result.addAll(getExpandedChildIndexes(index));\r
+                       } else {\r
+                               result.addAll(getExpandedChildIndexes(child));\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+       \r
+       @Override\r
+       public List<Integer> getDirectChildIndexes(int parentIndex) {\r
+               List<Integer> result = new ArrayList<Integer>();\r
+               T t = this.treeData.getDataAtIndex(parentIndex);\r
+               if (t == null)\r
+                       return Collections.EMPTY_LIST;\r
+               List<T> children = this.treeData.getChildren(t);\r
+               for (T child : children) {\r
+                       int index = this.treeData.indexOf(child);\r
+                       if (index >= 0) {\r
+                               result.add(index);\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+       \r
+       public ITreeData<T> getTreeData() {\r
+               return treeData;\r
+       }\r
+}\r