source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/imagery/WMSLayerTree.java@ 19050

Last change on this file since 19050 was 19050, checked in by taylor.smock, 4 weeks ago

Revert most var changes from r19048, fix most new compile warnings and checkstyle issues

Also, document why various ErrorProne checks were originally disabled and fix
generic SonarLint issues.

  • Property svn:eol-style set to native
File size: 5.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences.imagery;
3
4import java.awt.Component;
5import java.util.Collection;
6import java.util.Comparator;
7import java.util.LinkedList;
8import java.util.List;
9
10import javax.swing.JTree;
11import javax.swing.event.TreeSelectionEvent;
12import javax.swing.event.TreeSelectionListener;
13import javax.swing.tree.DefaultMutableTreeNode;
14import javax.swing.tree.DefaultTreeCellRenderer;
15import javax.swing.tree.DefaultTreeModel;
16import javax.swing.tree.MutableTreeNode;
17import javax.swing.tree.TreePath;
18
19import org.openstreetmap.josm.data.coor.LatLon;
20import org.openstreetmap.josm.data.imagery.LayerDetails;
21import org.openstreetmap.josm.io.imagery.WMSImagery;
22
23/**
24 * The layer tree of a WMS server.
25 */
26public class WMSLayerTree {
27 private final MutableTreeNode treeRootNode = new DefaultMutableTreeNode();
28 private final DefaultTreeModel treeData = new DefaultTreeModel(treeRootNode);
29 private final JTree layerTree = new JTree(treeData);
30 private final List<LayerDetails> selectedLayers = new LinkedList<>();
31 private LatLon checkBounds;
32
33 /**
34 * Returns the root node.
35 * @return The root node
36 */
37 public MutableTreeNode getTreeRootNode() {
38 return treeRootNode;
39 }
40
41 /**
42 * Returns the {@code JTree}.
43 * @return The {@code JTree}
44 */
45 public JTree getLayerTree() {
46 return layerTree;
47 }
48
49 /**
50 * Returns the list of selected layers.
51 * @return the list of selected layers
52 */
53 public List<LayerDetails> getSelectedLayers() {
54 return selectedLayers;
55 }
56
57 /**
58 * Constructs a new {@code WMSLayerTree}.
59 */
60 public WMSLayerTree() {
61 layerTree.setCellRenderer(new LayerTreeCellRenderer());
62 layerTree.addTreeSelectionListener(new WMSTreeSelectionListener());
63 }
64
65 /**
66 * Set coordinate to check {@linkplain LayerDetails#getBounds() layer bounds}
67 * when {@linkplain #updateTree updating the tree}.
68 * @param checkBounds the coordinate
69 */
70 public void setCheckBounds(LatLon checkBounds) {
71 this.checkBounds = checkBounds;
72 }
73
74 void addLayersToTreeData(MutableTreeNode parent, Collection<LayerDetails> layers) {
75 for (LayerDetails layerDetails : layers.stream()
76 .filter(l -> checkBounds == null || l.getBounds() == null || l.getBounds().contains(checkBounds))
77 .sorted(Comparator.comparing(LayerDetails::toString).reversed())
78 .toArray(LayerDetails[]::new)
79 ) {
80 DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(layerDetails);
81 addLayersToTreeData(treeNode, layerDetails.getChildren());
82 treeData.insertNodeInto(treeNode, parent, 0);
83 }
84 }
85
86 /**
87 * Updates the whole tree with the given WMS imagery info. All previous content is removed
88 * @param wms The imagery info for a given WMS server
89 */
90 public void updateTree(WMSImagery wms) {
91 while (treeRootNode.getChildCount() > 0) {
92 treeRootNode.remove(0);
93 }
94 treeRootNode.setUserObject(wms.buildRootUrl());
95 updateTreeList(wms.getLayers());
96 }
97
98 /**
99 * Updates the list of WMS layers.
100 * @param layers The list of layers to add to the root node
101 */
102 public void updateTreeList(Collection<LayerDetails> layers) {
103 addLayersToTreeData(getTreeRootNode(), layers);
104 treeData.nodeStructureChanged(getTreeRootNode());
105 getLayerTree().expandRow(0);
106 getLayerTree().expandRow(1);
107 }
108
109 private static final class LayerTreeCellRenderer extends DefaultTreeCellRenderer {
110 @Override
111 public Component getTreeCellRendererComponent(JTree tree, Object value,
112 boolean sel, boolean expanded, boolean leaf, int row,
113 boolean hasFocus) {
114 super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
115 row, hasFocus);
116 DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value;
117 Object userObject = treeNode.getUserObject();
118 if (userObject instanceof LayerDetails) {
119 LayerDetails ld = (LayerDetails) userObject;
120 setEnabled(ld.isSelectable());
121 }
122 return this;
123 }
124 }
125
126 private final class WMSTreeSelectionListener implements TreeSelectionListener {
127
128 @Override
129 public void valueChanged(TreeSelectionEvent e) {
130 TreePath[] selectionRows = layerTree.getSelectionPaths();
131 if (selectionRows == null) {
132 return;
133 }
134
135 selectedLayers.clear();
136 for (TreePath i : selectionRows) {
137 Object userObject = ((DefaultMutableTreeNode) i.getLastPathComponent()).getUserObject();
138 if (userObject instanceof LayerDetails) {
139 LayerDetails detail = (LayerDetails) userObject;
140 if (detail.isSelectable()) {
141 selectedLayers.add(detail);
142 }
143 }
144 }
145 layerTree.firePropertyChange("selectedLayers", /*dummy values*/ false, true);
146 }
147 }
148}
Note: See TracBrowser for help on using the repository browser.