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.Comparator;\r
+import java.util.HashSet;\r
import java.util.Iterator;\r
import java.util.List;\r
import java.util.Set;\r
public class GETreeLayer extends TreeLayer2 {\r
\r
//Set<IEcoReportTask> collapsed = new HashSet<IEcoReportTask>();\r
- Set<TreeNode> collapsed = new IdentityHashSet<TreeNode>();\r
+ Set<TreeNode> expanded = new IdentityHashSet<TreeNode>();\r
GETreeData treeData;\r
Comparator<int[]> comparator = new FirstElementComparator();\r
\r
@Override\r
public void collapseTreeRow(int parentIndex) {\r
TreeNode task = treeData.getDataAtIndex(parentIndex);\r
- collapsed.add(task);\r
+ expanded.remove(task);\r
task.setExpanded(false);\r
super.collapseTreeRow(parentIndex);\r
}\r
@Override\r
public void expandTreeRow(int parentIndex) {\r
TreeNode task = treeData.getDataAtIndex(parentIndex);\r
- collapsed.remove(task);\r
+ expanded.add(task);\r
task.setExpanded(true);\r
super.expandTreeRow(parentIndex);\r
}\r
TreeNode task = treeData.getDataAtIndex(parentIndex);\r
if (task != null) {\r
task.setExpanded(false);\r
- collapsed.add(task);\r
+ expanded.remove(task);\r
}\r
rowIndexes.addAll(getModel().collapse(parentIndex));\r
}\r
if (parentIndex >= 0) {\r
TreeNode task = treeData.getDataAtIndex(parentIndex);\r
task.setExpanded(false);\r
- collapsed.add(task);\r
+ expanded.remove(task);\r
rowIndexes.addAll(getModel().collapse(parentIndex));\r
}\r
}\r
\r
} \r
t.setExpanded(false);\r
- collapsed.add(t);\r
+ expanded.remove(t);\r
getModel().collapse(i);\r
\r
}\r
for (int parentIndex : parentIndices) {\r
TreeNode task = treeData.getDataAtIndex(parentIndex);\r
task.setExpanded(true);\r
- collapsed.remove(task);\r
+ expanded.add(task);\r
rowIndexes.addAll(getModel().expand(parentIndex));\r
+ rowIndexes.add(parentIndex);\r
}\r
\r
//Implementation uses tree set, so removing in reverse order is faster.\r
for (int parentIndex : parentIndices) {\r
TreeNode task = treeData.getDataAtIndex(parentIndex);\r
task.setExpanded(true);\r
- collapsed.remove(task);\r
+ expanded.add(task);\r
rowIndexes.addAll(getModel().expand(parentIndex));\r
}\r
\r
fireLayerEvent(new ShowRowPositionsEvent(this, rowIndexes));\r
}\r
\r
- public void expandAllRows() {\r
- Collection<Integer> parentIndices = getHiddenRowIndexes();\r
- List<Integer> rowIndexes = new ArrayList<Integer>();\r
- for (int parentIndex : parentIndices) {\r
- rowIndexes.addAll(getModel().expand(parentIndex));\r
- }\r
- for (TreeNode t : collapsed)\r
- t.setExpanded(true);\r
- collapsed.clear();\r
- getHiddenRowIndexes().clear();\r
- ((GETreeRowModel)getModel()).clear();\r
- invalidateCache();\r
- fireLayerEvent(new ShowRowPositionsEvent(this, rowIndexes));\r
- }\r
+// public void expandAllRows() {\r
+// Collection<Integer> parentIndices = getHiddenRowIndexes();\r
+// List<Integer> rowIndexes = new ArrayList<Integer>();\r
+// for (int parentIndex : parentIndices) {\r
+// rowIndexes.addAll(getModel().expand(parentIndex));\r
+// }\r
+// for (TreeNode t : collapsed)\r
+// t.setExpanded(true);\r
+// collapsed.clear();\r
+// getHiddenRowIndexes().clear();\r
+// ((GETreeRowModel)getModel()).clear();\r
+// invalidateCache();\r
+// fireLayerEvent(new ShowRowPositionsEvent(this, rowIndexes));\r
+// }\r
\r
@Override\r
protected void invalidateCache() {\r
hiddenPos.add(new int[]{0,0});\r
}\r
\r
+ private void _collapseAllRows() {\r
+ int count = treeData.getElementCount();\r
+ List <Integer> rowIndexes = new ArrayList<Integer>(count);\r
+ for (int i = 0; i < count; i++) {\r
+ TreeNode t = treeData.getDataAtIndex(i);\r
+ // we don't want to hide the roots of the tree\r
+ if (!treeData.isRoot(t)) { \r
+ rowIndexes.add(i);\r
+ \r
+ } \r
+ getModel().collapse(i);\r
+ \r
+ }\r
+ this.getHiddenRowIndexes().addAll(rowIndexes);\r
+ invalidateCache();\r
+ }\r
+ \r
@Override\r
public void handleLayerEvent(ILayerEvent event) {\r
// Currently sorting is implemented by sorting the underlaying list.\r
// Another option would use some sort of sorting layers, so that the original data is kept intact, and\r
// sorting layer would map the row indexes to sorted row positions.\r
\r
- // preserve collapsed nodes \r
+ // preserve expanded nodes \r
Set<TreeNode> coll = null;\r
+// int hiddenCount = 0;\r
if (event instanceof IStructuralChangeEvent) {\r
IStructuralChangeEvent structuralChangeEvent = (IStructuralChangeEvent) event;\r
if (structuralChangeEvent.isVerticalStructureChanged()) {\r
- // expand old indices\r
- ((GETreeRowModel)getModel()).clear();\r
+ // store old indices\r
+ internalRefresh = true;\r
+ ((GETreeRowModel<?>)getModel()).clear();\r
+// hiddenCount = getHiddenRowIndexes().size();\r
getHiddenRowIndexes().clear();\r
- coll = collapsed;\r
+ // store expanded nodes and clear disposed nodes.\r
+ coll = new HashSet<>();\r
+ for (TreeNode n : expanded)\r
+ if (!n.isDisposed())\r
+ coll.add(n);\r
+ expanded.clear();\r
+ expanded.addAll(coll);\r
+ // filter hidden nodes (nodes that have collapsed ancestors)\r
+ coll.clear();\r
+ for (TreeNode n : expanded)\r
+ if (!n.isHidden())\r
+ coll.add(n);\r
}\r
}\r
super.handleLayerEvent(event);\r
if (coll != null) {\r
- // collapse new indices\r
+ _collapseAllRows();\r
+ // expand new indices\r
int ind[] = new int[coll.size()];\r
Iterator<TreeNode> iter = coll.iterator();\r
for (int i = 0; i < ind.length; i++) {\r
ind[i] = treeData.indexOf(iter.next());\r
}\r
- collapseTreeRow(ind);\r
+ expandTreeRow(ind);\r
+// if (getHiddenRowIndexes().size() != hiddenCount) {\r
+// System.out.println(getHiddenRowIndexes().size() + " != " + hiddenCount);\r
+// ((GETreeRowModel<?>)getModel()).clear();\r
+// getHiddenRowIndexes().clear();\r
+// _collapseAllRows();\r
+// //collapseAll();\r
+// // expand new indices\r
+// iter = coll.iterator();\r
+// for (int i = 0; i < ind.length; i++) {\r
+// ind[i] = treeData.indexOf(iter.next());\r
+// }\r
+// expandTreeRow(ind);\r
+// }\r
+ internalRefresh = false;\r
}\r
}\r
\r
- public Set<TreeNode> getCollapsed() {\r
- return collapsed;\r
+ private boolean internalRefresh = false;\r
+ \r
+ public void fireLayerEvent(ILayerEvent event) {\r
+ if (!internalRefresh)\r
+ super.fireLayerEvent(event);\r
+ \r
+ }\r
+ \r
+ public Set<TreeNode> getExpanded() {\r
+ return expanded;\r
}\r
\r
List<int[]> hiddenPos;\r