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 <[email protected]>
* 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 <[email protected]>
* 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel