Ticket #17412: 17412-v2.patch

File 17412-v2.patch, 3.9 KB (added by GerdP, 7 years ago)
  • src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java

     
    5959import org.openstreetmap.josm.gui.layer.ValidatorLayer;
    6060import org.openstreetmap.josm.gui.preferences.validator.ValidatorPreference;
    6161import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     62import org.openstreetmap.josm.gui.util.GuiHelper;
    6263import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
    6364import org.openstreetmap.josm.io.OsmTransferException;
    6465import org.openstreetmap.josm.spi.preferences.Config;
     
    626627                final DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
    627628                int i = 0;
    628629                SwingUtilities.invokeAndWait(ds::beginUpdate);
     630                tree.setResetScheduled();
    629631                try {
    630632                    for (TestError error: testErrors) {
    631633                        i++;
     
    645647                                fixCommands.size() > 1 ? new AutofixCommand(fixCommands) : fixCommands.get(0), false);
    646648                    }
    647649                    invalidateValidatorLayers();
    648                     tree.resetErrors();
    649650                });
    650651            } catch (InterruptedException e) {
    651652                tryUndo();
     
    657658                if (monitor.isCanceled()) {
    658659                    tryUndo();
    659660                }
     661                GuiHelper.runInEDTAndWait(tree::resetErrors);
    660662                monitor.finishTask();
    661663            }
    662664        }
  • src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java

     
    8080     */
    8181    private transient Set<? extends OsmPrimitive> filter;
    8282
    83     private final ListenerList<Runnable> invalidationListeners = ListenerList.create();
     83    private final transient ListenerList<Runnable> invalidationListeners = ListenerList.create();
    8484
     85    /** if true, buildTree() does nothing */
     86    private boolean resetScheduled;
     87
    8588    /**
    8689     * Constructor
    8790     * @param errors The list of errors
     
    147150     * Builds the errors tree
    148151     */
    149152    public void buildTree() {
     153        if (resetScheduled)
     154            return;
    150155        final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode();
    151156
    152157        if (errors == null || errors.isEmpty()) {
     
    401406     * Updates the current errors list
    402407     */
    403408    public void resetErrors() {
     409        resetScheduled = false;
     410        errors.removeIf(error -> error.getPrimitives().stream().anyMatch(OsmPrimitive::isDeleted));
    404411        setErrors(new ArrayList<>(errors));
    405412    }
    406413
     
    482489        // Remove purged primitives (fix #8639)
    483490        if (errors != null) {
    484491            final Set<? extends OsmPrimitive> deletedPrimitives = new HashSet<>(event.getPrimitives());
    485             errors.removeIf(error -> error.getPrimitives().stream().anyMatch(deletedPrimitives::contains));
     492            if (errors.removeIf(error -> error.getPrimitives().stream().anyMatch(deletedPrimitives::contains))) {
     493                buildTree();
     494            }
    486495        }
    487496    }
    488497
     
    511520    }
    512521
    513522    @Override public void dataChanged(DataChangedEvent event) {
    514         // Do nothing
     523        if (errors.removeIf(error -> error.getPrimitives().stream().anyMatch(OsmPrimitive::isDeleted))) {
     524            buildTree();
     525        }
    515526    }
     527
     528    /**
     529     * Can be called to suppress execution of buildTree() while doing multiple updates. Caller must
     530     * call resetErrors() to end this state.
     531     */
     532    public void setResetScheduled() {
     533        resetScheduled = true;
     534    }
    516535}