Ignore:
Timestamp:
2019-03-06T10:17:24+01:00 (5 years ago)
Author:
GerdP
Message:

fix #17401: create a SequenceCommand instead of adding single commands for each fixed error

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java

    r14836 r14845  
    3535import org.openstreetmap.josm.actions.relation.EditRelationAction;
    3636import org.openstreetmap.josm.command.Command;
     37import org.openstreetmap.josm.command.SequenceCommand;
    3738import org.openstreetmap.josm.data.UndoRedoHandler;
    3839import org.openstreetmap.josm.data.osm.DataSelectionListener;
     
    604605        protected void fixError(TestError error) throws InterruptedException, InvocationTargetException {
    605606            if (error.isFixable()) {
    606                 final Command fixCommand = error.getFix();
    607                 if (fixCommand != null) {
    608                     SwingUtilities.invokeAndWait(() -> UndoRedoHandler.getInstance().addNoRedraw(fixCommand));
    609                     fixCommands.add(fixCommand);
     607                if (error.getPrimitives().stream().noneMatch(OsmPrimitive::isDeleted)) {
     608                    final Command fixCommand = error.getFix();
     609                    if (fixCommand != null) {
     610                        SwingUtilities.invokeAndWait(fixCommand::executeCommand);
     611                        fixCommands.add(fixCommand);
     612                    }
    610613                }
    611614                // It is wanted to ignore an error if it said fixable, even if fixCommand was null
     
    638641                monitor.subTask(tr("Updating map ..."));
    639642                SwingUtilities.invokeAndWait(() -> {
    640                     UndoRedoHandler.getInstance().afterAdd(fixCommands);
     643                    if (!fixCommands.isEmpty()) {
     644                        UndoRedoHandler.getInstance().add(
     645                                fixCommands.size() > 1 ? new AutofixCommand(fixCommands) : fixCommands.get(0), false);
     646                    }
    641647                    invalidateValidatorLayers();
    642648                    tree.resetErrors();
    643649                });
    644             } catch (InterruptedException | InvocationTargetException e) {
     650            } catch (InterruptedException e) {
     651                tryUndo();
     652                throw new JosmRuntimeException(e);
     653            } catch (InvocationTargetException e) {
    645654                // FIXME: signature of realRun should have a generic checked exception we could throw here
    646655                throw new JosmRuntimeException(e);
    647656            } finally {
     657                if (monitor.isCanceled()) {
     658                    tryUndo();
     659                }
    648660                monitor.finishTask();
    649661            }
    650662        }
     663
     664        /**
     665         * Undo commands as they were not yet added to the UndoRedo Handler
     666         */
     667        private void tryUndo() {
     668            final DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
     669            int i = fixCommands.size() - 1;
     670            ds.beginUpdate();
     671            for (; i >= 0; i--) {
     672                fixCommands.get(i).undoCommand();
     673            }
     674            ds.endUpdate();
     675        }
     676
    651677    }
    652678
     
    663689        super.destroy();
    664690    }
     691
     692    private class AutofixCommand extends SequenceCommand {
     693        AutofixCommand(Collection<Command> sequenz) {
     694            super(tr("auto-fixed validator issues"), sequenz, true);
     695            setSequenceComplete(true);
     696        }
     697
     698        @Override
     699        public void undoCommand() {
     700            getAffectedDataSet().beginUpdate();
     701            super.undoCommand();
     702            getAffectedDataSet().endUpdate();
     703        }
     704
     705        @Override
     706        public boolean executeCommand() {
     707            getAffectedDataSet().beginUpdate();
     708            boolean rc = super.executeCommand();
     709            getAffectedDataSet().endUpdate();
     710            return rc;
     711        }
     712    }
    665713}
Note: See TracChangeset for help on using the changeset viewer.