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