Ticket #17295: 17295-v3.patch

File 17295-v3.patch, 5.1 KB (added by GerdP, 6 years ago)

adapted to r14899

  • src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java

     
    1313import java.util.Map;
    1414import java.util.Map.Entry;
    1515import java.util.Set;
     16import java.util.concurrent.atomic.AtomicBoolean;
    1617import java.util.function.Consumer;
    1718import java.util.function.Predicate;
    1819
     
    8586    /** if true, buildTree() does nothing */
    8687    private boolean resetScheduled;
    8788
     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
    8895    /**
    8996     * Constructor
    9097     * @param errors The list of errors
     
    157164     * Builds the errors tree
    158165     * @param expandAgain if true, try to expand the same rows as before
    159166     */
    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) {
    161179        if (resetScheduled)
    162180            return;
    163181        final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode();
     
    164182
    165183        if (errors == null || errors.isEmpty()) {
    166184            GuiHelper.runInEDTAndWait(() -> valTreeModel.setRoot(rootNode));
     185            manualTreeChange = false;
    167186            return;
    168187        }
    169188
     
    205224            = OsmValidator.getErrorsBySeverityMessageDescription(errors, filterToUse);
    206225
    207226        final List<TreePath> expandedPaths = new ArrayList<>();
     227        final List<TreePath> severityPaths = new ArrayList<>();
     228
    208229        for (Entry<Severity, Map<String, Map<String, List<TestError>>>> entry: errorsBySeverityMessageDescription.entrySet()) {
    209230            Severity severity = entry.getKey();
    210231            Map<String, Map<String, List<TestError>>> errorsByMessageDescription = entry.getValue();
     
    212233            // Severity node
    213234            final DefaultMutableTreeNode severityNode = new GroupTreeNode(severity);
    214235            rootNode.add(severityNode);
     236            TreePath severityPath = new TreePath(new Object[] {rootNode, severityNode});
     237            severityPaths.add(severityPath);
    215238
    216239            if (oldExpandedRows.contains(severity)) {
    217                 expandedPaths.add(new TreePath(new Object[] {rootNode, severityNode}));
     240                expandedPaths.add(severityPath);
    218241            }
    219242
    220243            final Map<String, List<TestError>> errorsWithEmptyMessageByDescription = errorsByMessageDescription.get("");
     
    281304        }
    282305
    283306        valTreeModel.setRoot(rootNode);
     307        AtomicBoolean wasExpanded = new AtomicBoolean();
    284308        for (TreePath path : expandedPaths) {
    285309            this.expandPath(path);
     310            wasExpanded.set(true);
    286311        }
    287312
    288313        if (selPath != null) {
     
    325350                    TreePath path = new TreePath(n.getPath());
    326351                    setSelectionPath(path);
    327352                    scrollPathToVisible(path);
     353                    wasExpanded.set(true);
    328354                }
    329355            });
    330356        }
     357
    331358        if (selRow >= 0 && selRow < getRowCount() && getSelectionCount() == 0) {
    332359            // fall back: if we cannot find the previously selected entry, select the row by position
    333360            setSelectionRow(selRow);
    334361            scrollRowToVisible(selRow);
     362            wasExpanded.set(true);
    335363        }
    336364
     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
    337375        invalidationListeners.fireEvent(Runnable::run);
    338376    }
    339377
     
    389427            //TODO: If list is changed because another layer was activated it would be good to store/restore
    390428            // the expanded / selected paths.
    391429            clearSelection();
     430            manualTreeChange = false;
    392431            buildTree(false);
    393432        }
    394433    }
     
    605644                error -> error.getPrimitives().stream().anyMatch(p -> p.isDeleted() || p.getDataSet() == null));
    606645    }
    607646
     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    }
    608664}