]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.browsing.ui.nattable/src/org/simantics/browsing/ui/nattable/GETreeLayer.java
Sync git svn branch with SVN repository r33334.
[simantics/platform.git] / bundles / org.simantics.browsing.ui.nattable / src / org / simantics / browsing / ui / nattable / GETreeLayer.java
index dbc30050ae63a0ac038bcc441cec4ddbb358bfa2..309e4daa85f5bfa084416b043449d90be8250b65 100644 (file)
@@ -1,9 +1,9 @@
 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
@@ -31,7 +31,7 @@ import it.unimi.dsi.fastutil.ints.IntRBTreeSet;
 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
@@ -51,7 +51,7 @@ public class GETreeLayer  extends TreeLayer2 {
        @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
@@ -73,7 +73,7 @@ public class GETreeLayer  extends TreeLayer2 {
        @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
@@ -117,7 +117,7 @@ public class GETreeLayer  extends TreeLayer2 {
                                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
@@ -145,7 +145,7 @@ public class GETreeLayer  extends TreeLayer2 {
                        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
@@ -175,7 +175,7 @@ public class GETreeLayer  extends TreeLayer2 {
                                \r
                        } \r
                        t.setExpanded(false);\r
-                       collapsed.add(t);\r
+                       expanded.remove(t);\r
                        getModel().collapse(i);\r
                        \r
                }\r
@@ -189,8 +189,9 @@ public class GETreeLayer  extends TreeLayer2 {
                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
@@ -207,7 +208,7 @@ public class GETreeLayer  extends TreeLayer2 {
                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
@@ -220,20 +221,20 @@ public class GETreeLayer  extends TreeLayer2 {
                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
@@ -242,6 +243,23 @@ public class GETreeLayer  extends TreeLayer2 {
                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
@@ -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\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