Ticket #17295: 17295-v3.patch
File 17295-v3.patch, 5.1 KB (added by , 6 years ago) |
---|
-
src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
13 13 import java.util.Map; 14 14 import java.util.Map.Entry; 15 15 import java.util.Set; 16 import java.util.concurrent.atomic.AtomicBoolean; 16 17 import java.util.function.Consumer; 17 18 import java.util.function.Predicate; 18 19 … … 85 86 /** if true, buildTree() does nothing */ 86 87 private boolean resetScheduled; 87 88 89 /** if true, (re-) build is in progress */ 90 private boolean buildInProgress; 91 92 /** if true, user expanded or collapsed a node */ 93 private boolean manualTreeChange; 94 88 95 /** 89 96 * Constructor 90 97 * @param errors The list of errors … … 157 164 * Builds the errors tree 158 165 * @param expandAgain if true, try to expand the same rows as before 159 166 */ 160 public void buildTree(boolean expandAgain) { 167 private void buildTree(boolean expandAgain) { 168 buildInProgress = true; 169 buildTreeImpl(expandAgain && manualTreeChange); 170 buildInProgress = false; 171 } 172 173 174 /** 175 * Builds the errors tree 176 * @param expandAgain if true, try to expand the same rows as before 177 */ 178 private void buildTreeImpl(boolean expandAgain) { 161 179 if (resetScheduled) 162 180 return; 163 181 final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(); … … 164 182 165 183 if (errors == null || errors.isEmpty()) { 166 184 GuiHelper.runInEDTAndWait(() -> valTreeModel.setRoot(rootNode)); 185 manualTreeChange = false; 167 186 return; 168 187 } 169 188 … … 205 224 = OsmValidator.getErrorsBySeverityMessageDescription(errors, filterToUse); 206 225 207 226 final List<TreePath> expandedPaths = new ArrayList<>(); 227 final List<TreePath> severityPaths = new ArrayList<>(); 228 208 229 for (Entry<Severity, Map<String, Map<String, List<TestError>>>> entry: errorsBySeverityMessageDescription.entrySet()) { 209 230 Severity severity = entry.getKey(); 210 231 Map<String, Map<String, List<TestError>>> errorsByMessageDescription = entry.getValue(); … … 212 233 // Severity node 213 234 final DefaultMutableTreeNode severityNode = new GroupTreeNode(severity); 214 235 rootNode.add(severityNode); 236 TreePath severityPath = new TreePath(new Object[] {rootNode, severityNode}); 237 severityPaths.add(severityPath); 215 238 216 239 if (oldExpandedRows.contains(severity)) { 217 expandedPaths.add( new TreePath(new Object[] {rootNode, severityNode}));240 expandedPaths.add(severityPath); 218 241 } 219 242 220 243 final Map<String, List<TestError>> errorsWithEmptyMessageByDescription = errorsByMessageDescription.get(""); … … 281 304 } 282 305 283 306 valTreeModel.setRoot(rootNode); 307 AtomicBoolean wasExpanded = new AtomicBoolean(); 284 308 for (TreePath path : expandedPaths) { 285 309 this.expandPath(path); 310 wasExpanded.set(true); 286 311 } 287 312 288 313 if (selPath != null) { … … 325 350 TreePath path = new TreePath(n.getPath()); 326 351 setSelectionPath(path); 327 352 scrollPathToVisible(path); 353 wasExpanded.set(true); 328 354 } 329 355 }); 330 356 } 357 331 358 if (selRow >= 0 && selRow < getRowCount() && getSelectionCount() == 0) { 332 359 // fall back: if we cannot find the previously selected entry, select the row by position 333 360 setSelectionRow(selRow); 334 361 scrollRowToVisible(selRow); 362 wasExpanded.set(true); 335 363 } 336 364 365 if (!wasExpanded.get() && !severityPaths.isEmpty()) { 366 // nothing was expanded until now, try to expand severity 367 manualTreeChange = false; 368 for (TreePath path : severityPaths) { 369 expandPath(path); 370 if (getRowCount() > getVisibleRowCount()) 371 break; 372 } 373 } 374 337 375 invalidationListeners.fireEvent(Runnable::run); 338 376 } 339 377 … … 389 427 //TODO: If list is changed because another layer was activated it would be good to store/restore 390 428 // the expanded / selected paths. 391 429 clearSelection(); 430 manualTreeChange = false; 392 431 buildTree(false); 393 432 } 394 433 } … … 605 644 error -> error.getPrimitives().stream().anyMatch(p -> p.isDeleted() || p.getDataSet() == null)); 606 645 } 607 646 647 @Override 648 public void fireTreeExpanded(TreePath path) { 649 super.fireTreeExpanded(path); 650 // #17295 651 if (!buildInProgress) { 652 manualTreeChange = true; 653 } 654 } 655 656 @Override 657 public void fireTreeCollapsed(TreePath path) { 658 super.fireTreeCollapsed(path); 659 // #17295 660 if (!buildInProgress) { 661 manualTreeChange = true; 662 } 663 } 608 664 }