X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.browsing.ui.nattable%2Fsrc%2Forg%2Fsimantics%2Fbrowsing%2Fui%2Fnattable%2FGETreeLayer.java;fp=bundles%2Forg.simantics.browsing.ui.nattable%2Fsrc%2Forg%2Fsimantics%2Fbrowsing%2Fui%2Fnattable%2FGETreeLayer.java;h=309e4daa85f5bfa084416b043449d90be8250b65;hp=dbc30050ae63a0ac038bcc441cec4ddbb358bfa2;hb=145a2884933f2ffdd48d6835729e58f1152d274e;hpb=bd5bc6e45f700e755b61bd112631796631330ecb diff --git a/bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/GETreeLayer.java b/bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/GETreeLayer.java index dbc30050a..309e4daa8 100644 --- a/bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/GETreeLayer.java +++ b/bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/GETreeLayer.java @@ -1,9 +1,9 @@ package org.simantics.browsing.ui.nattable; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -31,7 +31,7 @@ import it.unimi.dsi.fastutil.ints.IntRBTreeSet; public class GETreeLayer extends TreeLayer2 { //Set collapsed = new HashSet(); - Set collapsed = new IdentityHashSet(); + Set expanded = new IdentityHashSet(); GETreeData treeData; Comparator comparator = new FirstElementComparator(); @@ -51,7 +51,7 @@ public class GETreeLayer extends TreeLayer2 { @Override public void collapseTreeRow(int parentIndex) { TreeNode task = treeData.getDataAtIndex(parentIndex); - collapsed.add(task); + expanded.remove(task); task.setExpanded(false); super.collapseTreeRow(parentIndex); } @@ -73,7 +73,7 @@ public class GETreeLayer extends TreeLayer2 { @Override public void expandTreeRow(int parentIndex) { TreeNode task = treeData.getDataAtIndex(parentIndex); - collapsed.remove(task); + expanded.add(task); task.setExpanded(true); super.expandTreeRow(parentIndex); } @@ -117,7 +117,7 @@ public class GETreeLayer extends TreeLayer2 { TreeNode task = treeData.getDataAtIndex(parentIndex); if (task != null) { task.setExpanded(false); - collapsed.add(task); + expanded.remove(task); } rowIndexes.addAll(getModel().collapse(parentIndex)); } @@ -145,7 +145,7 @@ public class GETreeLayer extends TreeLayer2 { if (parentIndex >= 0) { TreeNode task = treeData.getDataAtIndex(parentIndex); task.setExpanded(false); - collapsed.add(task); + expanded.remove(task); rowIndexes.addAll(getModel().collapse(parentIndex)); } } @@ -175,7 +175,7 @@ public class GETreeLayer extends TreeLayer2 { } t.setExpanded(false); - collapsed.add(t); + expanded.remove(t); getModel().collapse(i); } @@ -189,8 +189,9 @@ public class GETreeLayer extends TreeLayer2 { for (int parentIndex : parentIndices) { TreeNode task = treeData.getDataAtIndex(parentIndex); task.setExpanded(true); - collapsed.remove(task); + expanded.add(task); rowIndexes.addAll(getModel().expand(parentIndex)); + rowIndexes.add(parentIndex); } //Implementation uses tree set, so removing in reverse order is faster. @@ -207,7 +208,7 @@ public class GETreeLayer extends TreeLayer2 { for (int parentIndex : parentIndices) { TreeNode task = treeData.getDataAtIndex(parentIndex); task.setExpanded(true); - collapsed.remove(task); + expanded.add(task); rowIndexes.addAll(getModel().expand(parentIndex)); } @@ -220,20 +221,20 @@ public class GETreeLayer extends TreeLayer2 { fireLayerEvent(new ShowRowPositionsEvent(this, rowIndexes)); } - public void expandAllRows() { - Collection parentIndices = getHiddenRowIndexes(); - List rowIndexes = new ArrayList(); - for (int parentIndex : parentIndices) { - rowIndexes.addAll(getModel().expand(parentIndex)); - } - for (TreeNode t : collapsed) - t.setExpanded(true); - collapsed.clear(); - getHiddenRowIndexes().clear(); - ((GETreeRowModel)getModel()).clear(); - invalidateCache(); - fireLayerEvent(new ShowRowPositionsEvent(this, rowIndexes)); - } +// public void expandAllRows() { +// Collection parentIndices = getHiddenRowIndexes(); +// List rowIndexes = new ArrayList(); +// for (int parentIndex : parentIndices) { +// rowIndexes.addAll(getModel().expand(parentIndex)); +// } +// for (TreeNode t : collapsed) +// t.setExpanded(true); +// collapsed.clear(); +// getHiddenRowIndexes().clear(); +// ((GETreeRowModel)getModel()).clear(); +// invalidateCache(); +// fireLayerEvent(new ShowRowPositionsEvent(this, rowIndexes)); +// } @Override protected void invalidateCache() { @@ -242,6 +243,23 @@ public class GETreeLayer extends TreeLayer2 { hiddenPos.add(new int[]{0,0}); } + private void _collapseAllRows() { + int count = treeData.getElementCount(); + List rowIndexes = new ArrayList(count); + for (int i = 0; i < count; i++) { + TreeNode t = treeData.getDataAtIndex(i); + // we don't want to hide the roots of the tree + if (!treeData.isRoot(t)) { + rowIndexes.add(i); + + } + getModel().collapse(i); + + } + this.getHiddenRowIndexes().addAll(rowIndexes); + invalidateCache(); + } + @Override public void handleLayerEvent(ILayerEvent event) { // Currently sorting is implemented by sorting the underlaying list. @@ -251,31 +269,68 @@ public class GETreeLayer extends TreeLayer2 { // Another option would use some sort of sorting layers, so that the original data is kept intact, and // sorting layer would map the row indexes to sorted row positions. - // preserve collapsed nodes + // preserve expanded nodes Set coll = null; +// int hiddenCount = 0; if (event instanceof IStructuralChangeEvent) { IStructuralChangeEvent structuralChangeEvent = (IStructuralChangeEvent) event; if (structuralChangeEvent.isVerticalStructureChanged()) { - // expand old indices - ((GETreeRowModel)getModel()).clear(); + // store old indices + internalRefresh = true; + ((GETreeRowModel)getModel()).clear(); +// hiddenCount = getHiddenRowIndexes().size(); getHiddenRowIndexes().clear(); - coll = collapsed; + // store expanded nodes and clear disposed nodes. + coll = new HashSet<>(); + for (TreeNode n : expanded) + if (!n.isDisposed()) + coll.add(n); + expanded.clear(); + expanded.addAll(coll); + // filter hidden nodes (nodes that have collapsed ancestors) + coll.clear(); + for (TreeNode n : expanded) + if (!n.isHidden()) + coll.add(n); } } super.handleLayerEvent(event); if (coll != null) { - // collapse new indices + _collapseAllRows(); + // expand new indices int ind[] = new int[coll.size()]; Iterator iter = coll.iterator(); for (int i = 0; i < ind.length; i++) { ind[i] = treeData.indexOf(iter.next()); } - collapseTreeRow(ind); + expandTreeRow(ind); +// if (getHiddenRowIndexes().size() != hiddenCount) { +// System.out.println(getHiddenRowIndexes().size() + " != " + hiddenCount); +// ((GETreeRowModel)getModel()).clear(); +// getHiddenRowIndexes().clear(); +// _collapseAllRows(); +// //collapseAll(); +// // expand new indices +// iter = coll.iterator(); +// for (int i = 0; i < ind.length; i++) { +// ind[i] = treeData.indexOf(iter.next()); +// } +// expandTreeRow(ind); +// } + internalRefresh = false; } } - public Set getCollapsed() { - return collapsed; + private boolean internalRefresh = false; + + public void fireLayerEvent(ILayerEvent event) { + if (!internalRefresh) + super.fireLayerEvent(event); + + } + + public Set getExpanded() { + return expanded; } List hiddenPos;