Revision: 6196
          http://sourceforge.net/p/jump-pilot/code/6196
Author:   michaudm
Date:     2019-09-21 11:55:49 +0000 (Sat, 21 Sep 2019)
Log Message:
-----------
Improve performance of LayerNamePanel when it contains
    ColorThemingStyle with many items

Modified Paths:
--------------
    core/trunk/ChangeLog
    core/trunk/src/com/vividsolutions/jump/util/SimpleTreeModel.java
    core/trunk/src/com/vividsolutions/jump/workbench/model/LayerTreeModel.java
    core/trunk/src/com/vividsolutions/jump/workbench/ui/TreeLayerNamePanel.java
    core/trunk/src/com/vividsolutions/jump/workbench/ui/TreeUtil.java

Modified: core/trunk/ChangeLog
===================================================================
--- core/trunk/ChangeLog        2019-09-21 07:13:13 UTC (rev 6195)
+++ core/trunk/ChangeLog        2019-09-21 11:55:49 UTC (rev 6196)
@@ -5,6 +5,8 @@
 
 2019-09-21 mmichaud <m.michael.mich...@orange.fr>
   * PLUS : add new capabilities to SetAttributes extension 0.8
+  * #487 Improve performance of LayerNamePanel when it contains
+    ColorThemingStyle with many items
 
 2019-08-10 mmichaud <m.michael.mich...@orange.fr>
   * RasterLayerEditor can now apply a style to several layers (FR #263)

Modified: core/trunk/src/com/vividsolutions/jump/util/SimpleTreeModel.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/util/SimpleTreeModel.java    
2019-09-21 07:13:13 UTC (rev 6195)
+++ core/trunk/src/com/vividsolutions/jump/util/SimpleTreeModel.java    
2019-09-21 11:55:49 UTC (rev 6196)
@@ -60,7 +60,7 @@
         public int hashCode() {
             //JTree puts nodes in a Hashtable. To keep things simple, just 
return 0,
             //which will cause linear searches (fine for small trees). [Jon 
Aquino]
-            return 0;
+            return name.hashCode();
         }
         public boolean equals(Object other) {
             //Folders are value objects. [Jon Aquino]

Modified: 
core/trunk/src/com/vividsolutions/jump/workbench/model/LayerTreeModel.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/model/LayerTreeModel.java  
2019-09-21 07:13:13 UTC (rev 6195)
+++ core/trunk/src/com/vividsolutions/jump/workbench/model/LayerTreeModel.java  
2019-09-21 11:55:49 UTC (rev 6196)
@@ -32,10 +32,7 @@
 package com.vividsolutions.jump.workbench.model;
 
 import java.awt.Color;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import javax.swing.tree.TreePath;
 
@@ -44,6 +41,7 @@
 import com.vividsolutions.jump.util.SimpleTreeModel;
 import com.vividsolutions.jump.workbench.ui.renderer.style.BasicStyle;
 import com.vividsolutions.jump.workbench.ui.renderer.style.ColorThemingStyle;
+import org.apache.commons.collections.map.HashedMap;
 import org.openjump.core.rasterimage.RasterImageLayer;
 import org.openjump.core.rasterimage.RasterSymbology;
 
@@ -255,18 +253,22 @@
         if (parent instanceof Category) {
             return ((Category) parent).getLayerables();
         }
-        if (parent instanceof Layer
-                && ColorThemingStyle.get((Layer) parent).isEnabled()) {
-            Map<Object,BasicStyle> attributeValueToBasicStyleMap = 
ColorThemingStyle.get(
-                    (Layer) parent).getAttributeValueToBasicStyleMap();
-            Map<Object,String> attributeValueToLabelMap = ColorThemingStyle
-                    .get((Layer) parent).getAttributeValueToLabelMap();
-            List<ColorThemingValue> colorThemingValues = new ArrayList<>();
-            for (Map.Entry<Object,BasicStyle> entry : 
attributeValueToBasicStyleMap.entrySet()) {
-                colorThemingValues.add(new ColorThemingValue(entry.getKey(),
-                        entry.getValue(), 
attributeValueToLabelMap.get(entry.getKey())));
+        if (parent instanceof Layer) {
+            ColorThemingStyle colorThemingStyle = 
ColorThemingStyle.get((Layer) parent);
+            if (colorThemingStyle.isEnabled()) {
+                Map<Object, BasicStyle> attributeValueToBasicStyleMap =
+                        colorThemingStyle.getAttributeValueToBasicStyleMap();
+                // convert attributeValueToLabelMap to HashMap because it 
usually is
+                // a TreeMap, which has slower get access than HashMap
+                Map<Object, String> attributeValueToLabelMap = new HashMap<>(
+                        colorThemingStyle.getAttributeValueToLabelMap());
+                List<ColorThemingValue> colorThemingValues = new ArrayList<>();
+                for (Map.Entry<Object, BasicStyle> entry : 
attributeValueToBasicStyleMap.entrySet()) {
+                    colorThemingValues.add(new 
ColorThemingValue(entry.getKey(),
+                            entry.getValue(), 
attributeValueToLabelMap.get(entry.getKey())));
+                }
+                return colorThemingValues;
             }
-            return colorThemingValues;
         }
         if (parent instanceof ColorThemingValue) {
             return Collections.EMPTY_LIST;

Modified: 
core/trunk/src/com/vividsolutions/jump/workbench/ui/TreeLayerNamePanel.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/ui/TreeLayerNamePanel.java 
2019-09-21 07:13:13 UTC (rev 6195)
+++ core/trunk/src/com/vividsolutions/jump/workbench/ui/TreeLayerNamePanel.java 
2019-09-21 11:55:49 UTC (rev 6196)
@@ -766,7 +766,7 @@
   }
 
   protected void addSelectedLayer(Layer layer) {
-    tree.addSelectionPath(TreeUtil.findTreePath(layer, tree.getModel()));
+    tree.addSelectionPath(TreeUtil.findLayerTreePath(layer, tree.getModel()));
   }
 
   

Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/TreeUtil.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/ui/TreeUtil.java   
2019-09-21 07:13:13 UTC (rev 6195)
+++ core/trunk/src/com/vividsolutions/jump/workbench/ui/TreeUtil.java   
2019-09-21 11:55:49 UTC (rev 6196)
@@ -35,6 +35,8 @@
 
 import com.vividsolutions.jump.util.Block;
 import com.vividsolutions.jump.util.StringUtil;
+import com.vividsolutions.jump.workbench.model.Category;
+import com.vividsolutions.jump.workbench.model.Layer;
 
 import java.awt.Color;
 import java.awt.Component;
@@ -114,6 +116,29 @@
         }
     }
 
+    public static void visitCategoriesAndLayerables(TreeModel model, Visitor 
visitor) {
+        Stack path = new Stack();
+        path.push(model.getRoot());
+        visitCategoriesAndLayerables(model, path, visitor);
+    }
+
+    public static void visitCategoriesAndLayerables(TreeModel model, TreePath 
path, Visitor visitor) {
+        Stack stack = new Stack();
+        stack.addAll(Arrays.asList(path.getPath()));
+        visitCategoriesAndLayerables(model, stack, visitor);
+    }
+
+    private static void visitCategoriesAndLayerables(TreeModel model, Stack 
path, Visitor visitor) {
+        visitor.visit(path);
+        if (path.peek() instanceof Category) {
+            for (int i = 0; i < model.getChildCount(path.peek()); i++) {
+                path.push(model.getChild(path.peek(), i));
+                visit(model, path, visitor);
+                path.pop();
+            }
+        }
+    }
+
     public static TreeModelEvent createTreeModelEvent(final Object source,
         final Object node, final TreeModel model) {
         TreePath path = findTreePath(node, model);
@@ -160,6 +185,22 @@
         return treePath[0];
     }
 
+    public static TreePath findLayerTreePath(final Layer node, final TreeModel 
model) {
+        final TreePath[] treePath = new TreePath[] { null };
+        visitCategoriesAndLayerables(model,
+                new Visitor() {
+                    public void visit(Stack path) {
+                        if (path.peek() != node) {
+                            return;
+                        }
+
+                        treePath[0] = new TreePath(path.toArray());
+                    }
+                });
+
+        return treePath[0];
+    }
+
     public static boolean contains(TreeModel model, final Object node) {
         final boolean[] result = new boolean[] { false };
         visit(model,



_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to