Ticket #17295: 17295-v2.patch

File 17295-v2.patch, 6.4 KB (added by GerdP, 7 years ago)
  • src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java

     
    8585    /** if true, buildTree() does nothing */
    8686    private boolean resetScheduled;
    8787
     88    private boolean buildingTree;
     89
     90    private boolean manualExpand;
     91
    8892    /**
    8993     * Constructor
    9094     * @param errors The list of errors
     
    149153    /**
    150154     * Builds the errors tree
    151155     */
    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() {
    153166        if (resetScheduled)
    154167            return;
    155168        final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode();
     
    156169
    157170        if (errors == null || errors.isEmpty()) {
    158171            GuiHelper.runInEDTAndWait(() -> valTreeModel.setRoot(rootNode));
     172            manualExpand = false;
    159173            return;
    160174        }
    161175
     
    165179
    166180        // Remember the currently expanded rows
    167181        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);
    181198                    }
    182                     oldExpandedRows.add(msg);
    183199                }
    184200            }
    185201        }
    186 
    187202        Predicate<TestError> filterToUse = e -> !e.isIgnored();
    188203        if (!ValidatorPrefHelper.PREF_OTHER.get()) {
    189204            filterToUse = filterToUse.and(e -> e.getSeverity() != Severity.OTHER);
     
    195210            = OsmValidator.getErrorsBySeverityMessageDescription(errors, filterToUse);
    196211
    197212        final List<TreePath> expandedPaths = new ArrayList<>();
     213        final List<TreePath> severityPaths = new ArrayList<>();
    198214        for (Entry<Severity, Map<String, Map<String, List<TestError>>>> entry: errorsBySeverityMessageDescription.entrySet()) {
    199215            Severity severity = entry.getKey();
    200216            Map<String, Map<String, List<TestError>>> errorsByMessageDescription = entry.getValue();
     
    202218            // Severity node
    203219            final DefaultMutableTreeNode severityNode = new GroupTreeNode(severity);
    204220            rootNode.add(severityNode);
     221            TreePath severityPath = new TreePath(new Object[] {rootNode, severityNode});
     222            severityPaths.add(severityPath);
    205223
    206224            if (oldExpandedRows.contains(severity)) {
    207                 expandedPaths.add(new TreePath(new Object[] {rootNode, severityNode}));
     225                expandedPaths.add(severityPath);
    208226            }
    209227
    210228            final Map<String, List<TestError>> errorsWithEmptyMessageByDescription = errorsByMessageDescription.get("");
     
    271289        }
    272290
    273291        valTreeModel.setRoot(rootNode);
     292        boolean hasExpanded = false;
    274293        for (TreePath path : expandedPaths) {
    275294            this.expandPath(path);
     295            hasExpanded = true;
    276296        }
    277297
     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.
    278307        if (selRow >= 0 && selRow < getRowCount()) {
    279308            setSelectionRow(selRow);
    280309            scrollRowToVisible(selRow);
    281310        }
    282 
    283311        invalidationListeners.fireEvent(Runnable::run);
    284312    }
    285313
     
    330358        this.errors = errors != null ? errors : new ArrayList<>();
    331359        sortErrors();
    332360        if (isVisible()) {
     361            manualExpand = false;
     362            clearSelection();
    333363            buildTree();
    334364        }
    335365    }
     
    367397    public void selectRelatedErrors(final Collection<OsmPrimitive> primitives) {
    368398        final List<TreePath> paths = new ArrayList<>();
    369399        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]));
    372402        // make sure that first path is visible
    373403        if (!paths.isEmpty()) {
    374404            scrollPathToVisible(paths.get(0));
     
    546576                error -> error.getPrimitives().stream().anyMatch(p -> p.isDeleted() || p.getDataSet() == null));
    547577    }
    548578
     579    @Override
     580    public void fireTreeExpanded(TreePath path) {
     581        super.fireTreeExpanded(path);
     582        if (!buildingTree) {
     583            manualExpand = true;
     584        }
     585    }
    549586}