Ticket #17295: 17295-v2.patch
| File 17295-v2.patch, 6.4 KB (added by , 7 years ago) |
|---|
-
src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
85 85 /** if true, buildTree() does nothing */ 86 86 private boolean resetScheduled; 87 87 88 private boolean buildingTree; 89 90 private boolean manualExpand; 91 88 92 /** 89 93 * Constructor 90 94 * @param errors The list of errors … … 149 153 /** 150 154 * Builds the errors tree 151 155 */ 152 public void buildTree() { 156 private void buildTree() { 157 buildingTree = true; 158 buildTree2(); 159 buildingTree = false; 160 } 161 162 /** 163 * Builds the errors tree 164 */ 165 private void buildTree2() { 153 166 if (resetScheduled) 154 167 return; 155 168 final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(); … … 156 169 157 170 if (errors == null || errors.isEmpty()) { 158 171 GuiHelper.runInEDTAndWait(() -> valTreeModel.setRoot(rootNode)); 172 manualExpand = false; 159 173 return; 160 174 } 161 175 … … 165 179 166 180 // Remember the currently expanded rows 167 181 Set<Object> oldExpandedRows = new HashSet<>(); 168 Enumeration<TreePath> expanded = getExpandedDescendants(new TreePath(getRoot())); 169 if (expanded != null) { 170 while (expanded.hasMoreElements()) { 171 TreePath path = expanded.nextElement(); 172 DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); 173 Object userObject = node.getUserObject(); 174 if (userObject instanceof Severity) { 175 oldExpandedRows.add(userObject); 176 } else if (userObject instanceof String) { 177 String msg = (String) userObject; 178 int index = msg.lastIndexOf(" ("); 179 if (index > 0) { 180 msg = msg.substring(0, index); 182 if (manualExpand) { 183 Enumeration<TreePath> expanded = getExpandedDescendants(new TreePath(getRoot())); 184 if (expanded != null) { 185 while (expanded.hasMoreElements()) { 186 TreePath path = expanded.nextElement(); 187 DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); 188 Object userObject = node.getUserObject(); 189 if (userObject instanceof Severity) { 190 oldExpandedRows.add(userObject); 191 } else if (userObject instanceof String) { 192 String msg = (String) userObject; 193 int index = msg.lastIndexOf(" ("); 194 if (index > 0) { 195 msg = msg.substring(0, index); 196 } 197 oldExpandedRows.add(msg); 181 198 } 182 oldExpandedRows.add(msg);183 199 } 184 200 } 185 201 } 186 187 202 Predicate<TestError> filterToUse = e -> !e.isIgnored(); 188 203 if (!ValidatorPrefHelper.PREF_OTHER.get()) { 189 204 filterToUse = filterToUse.and(e -> e.getSeverity() != Severity.OTHER); … … 195 210 = OsmValidator.getErrorsBySeverityMessageDescription(errors, filterToUse); 196 211 197 212 final List<TreePath> expandedPaths = new ArrayList<>(); 213 final List<TreePath> severityPaths = new ArrayList<>(); 198 214 for (Entry<Severity, Map<String, Map<String, List<TestError>>>> entry: errorsBySeverityMessageDescription.entrySet()) { 199 215 Severity severity = entry.getKey(); 200 216 Map<String, Map<String, List<TestError>>> errorsByMessageDescription = entry.getValue(); … … 202 218 // Severity node 203 219 final DefaultMutableTreeNode severityNode = new GroupTreeNode(severity); 204 220 rootNode.add(severityNode); 221 TreePath severityPath = new TreePath(new Object[] {rootNode, severityNode}); 222 severityPaths.add(severityPath); 205 223 206 224 if (oldExpandedRows.contains(severity)) { 207 expandedPaths.add( new TreePath(new Object[] {rootNode, severityNode}));225 expandedPaths.add(severityPath); 208 226 } 209 227 210 228 final Map<String, List<TestError>> errorsWithEmptyMessageByDescription = errorsByMessageDescription.get(""); … … 271 289 } 272 290 273 291 valTreeModel.setRoot(rootNode); 292 boolean hasExpanded = false; 274 293 for (TreePath path : expandedPaths) { 275 294 this.expandPath(path); 295 hasExpanded = true; 276 296 } 277 297 298 if (!hasExpanded && !severityPaths.isEmpty()) { 299 manualExpand = false; 300 for (TreePath path : severityPaths) { 301 expandPath(path); 302 if (getRowCount() > getVisibleRowCount()) 303 break; 304 } 305 } 306 // try to reselect previously selected row. May not work if tree structure changed too much. 278 307 if (selRow >= 0 && selRow < getRowCount()) { 279 308 setSelectionRow(selRow); 280 309 scrollRowToVisible(selRow); 281 310 } 282 283 311 invalidationListeners.fireEvent(Runnable::run); 284 312 } 285 313 … … 330 358 this.errors = errors != null ? errors : new ArrayList<>(); 331 359 sortErrors(); 332 360 if (isVisible()) { 361 manualExpand = false; 362 clearSelection(); 333 363 buildTree(); 334 364 } 335 365 } … … 367 397 public void selectRelatedErrors(final Collection<OsmPrimitive> primitives) { 368 398 final List<TreePath> paths = new ArrayList<>(); 369 399 walkAndSelectRelatedErrors(new TreePath(getRoot()), new HashSet<>(primitives)::contains, paths); 370 getSelectionModel().clearSelection();371 getSelectionModel().setSelectionPaths(paths.toArray(new TreePath[0]));400 clearSelection(); 401 setSelectionPaths(paths.toArray(new TreePath[0])); 372 402 // make sure that first path is visible 373 403 if (!paths.isEmpty()) { 374 404 scrollPathToVisible(paths.get(0)); … … 546 576 error -> error.getPrimitives().stream().anyMatch(p -> p.isDeleted() || p.getDataSet() == null)); 547 577 } 548 578 579 @Override 580 public void fireTreeExpanded(TreePath path) { 581 super.fireTreeExpanded(path); 582 if (!buildingTree) { 583 manualExpand = true; 584 } 585 } 549 586 }
