Ticket #17268: clear_ignored_errors_v11.patch

File clear_ignored_errors_v11.patch, 8.9 KB (added by taylor.smock, 6 years ago)

Default to disabled if nothing can be done, add some functionality to the ignoreErrors to call the resetignorelistButton.

  • src/org/openstreetmap/josm/data/validation/OsmValidator.java

     
    77import java.io.File;
    88import java.io.FileNotFoundException;
    99import java.io.IOException;
    10 import java.io.PrintWriter;
    1110import java.nio.charset.StandardCharsets;
    1211import java.nio.file.Files;
    1312import java.nio.file.Path;
     
    8988    private static double griddetail;
    9089
    9190    private static final Collection<String> ignoredErrors = new TreeSet<>();
     91    /**
     92     * The preference value for the validator's ignorederrors list
     93     */
     94    public static final String prefIgnoredErrors = "validator.ignorederrors";
    9295
    9396    /**
    9497     * All registered tests
     
    204207    private static void loadIgnoredErrors() {
    205208        ignoredErrors.clear();
    206209        if (ValidatorPrefHelper.PREF_USE_IGNORE.get()) {
     210            ignoredErrors.addAll(Config.getPref().getList(prefIgnoredErrors));
    207211            Path path = Paths.get(getValidatorDir()).resolve("ignorederrors");
    208212            try {
    209213                if (path.toFile().exists()) {
    210214                    try {
    211215                        ignoredErrors.addAll(Files.readAllLines(path, StandardCharsets.UTF_8));
     216                        saveIgnoredErrors();
     217                        Files.deleteIfExists(path);
    212218                    } catch (FileNotFoundException e) {
    213219                        Logging.debug(Logging.getErrorMessage(e));
    214220                    } catch (IOException e) {
     
    241247    }
    242248
    243249    /**
     250     * Get the list of all ignored errors
     251     * @return The <code>Collection&ltString&gt</code> of errors that are ignored
     252     */
     253    public static Collection<String> getIgnoredErrors() {
     254        return ignoredErrors;
     255    }
     256
     257    /**
     258     * Reset the error list by deleting ignorederrors
     259     */
     260    public static void resetErrorList() {
     261        saveIgnoredErrors();
     262        backupErrorList();
     263        Config.getPref().putList(prefIgnoredErrors, null);
     264        OsmValidator.initialize();
     265    }
     266
     267    /**
     268     * Restore the error list by copying ignorederrors.bak to ignorederrors
     269     */
     270    public static void restoreErrorList() {
     271        saveIgnoredErrors();
     272        List<String> tlist = Config.getPref().getList(prefIgnoredErrors + ".bak");
     273        backupErrorList();
     274        Config.getPref().putList(prefIgnoredErrors, tlist);
     275        OsmValidator.initialize();
     276    }
     277
     278    private static void backupErrorList() {
     279        List<String> tlist = Config.getPref().getList(prefIgnoredErrors);
     280        if (tlist.isEmpty()) tlist = null;
     281        Config.getPref().putList(prefIgnoredErrors + ".bak", tlist);
     282    }
     283
     284    /**
    244285     * Saves the names of the ignored errors to a file
    245286     */
    246287    public static void saveIgnoredErrors() {
    247         try (PrintWriter out = new PrintWriter(new File(getValidatorDir(), "ignorederrors"), StandardCharsets.UTF_8.name())) {
    248             for (String e : ignoredErrors) {
    249                 out.println(e);
    250             }
    251         } catch (IOException e) {
    252             Logging.error(e);
    253         }
     288        List<String> list = new ArrayList<>(ignoredErrors);
     289        Collections.sort(list);
     290        Config.getPref().putList(prefIgnoredErrors, list);
    254291    }
    255292
    256293    /**
  • src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java

     
    4646import org.openstreetmap.josm.data.validation.OsmValidator;
    4747import org.openstreetmap.josm.data.validation.TestError;
    4848import org.openstreetmap.josm.data.validation.ValidatorVisitor;
     49import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
    4950import org.openstreetmap.josm.gui.MainApplication;
     51import org.openstreetmap.josm.gui.MapFrame;
    5052import org.openstreetmap.josm.gui.PleaseWaitRunnable;
    5153import org.openstreetmap.josm.gui.PopupMenuHandler;
    5254import org.openstreetmap.josm.gui.SideButton;
     
    8587    private final SideButton fixButton;
    8688    /** The ignore button */
    8789    private final SideButton ignoreButton;
     90    /** The reset ignorelist button */
     91    private final SideButton resetignorelistButton;
    8892    /** The select button */
    8993    private final SideButton selectButton;
    9094    /** The lookup button */
     
    174178            });
    175179            ignoreButton.setEnabled(false);
    176180            buttons.add(ignoreButton);
     181            resetignorelistButton = new SideButton(new AbstractAction() {
     182                int reset;
     183                {
     184                    toggle();
     185                }
     186
     187                public void toggle() {
     188                    this.setEnabled(true);
     189                    if (!OsmValidator.getIgnoredErrors().isEmpty()) {
     190                        putValue(NAME, tr("Clear Ignore"));
     191                        putValue(SHORT_DESCRIPTION, tr("Clear ignore list"));
     192                        new ImageProvider("dialogs", "fix").getResource().attachImageIcon(this, true);
     193                        reset = 1;
     194                    } else {
     195                        List<String> ignoredErrors = Config.getPref().getList(OsmValidator.prefIgnoredErrors + ".bak");
     196                        if (!ignoredErrors.isEmpty()) {
     197                            putValue(NAME, tr("Restore Ignore"));
     198                            putValue(SHORT_DESCRIPTION, tr("Restore ignore list"));
     199                            new ImageProvider("copy").getResource().attachImageIcon(this, true);
     200                            reset = 2;
     201                        } else if (!OsmValidator.getIgnoredErrors().isEmpty()) {
     202                            putValue(NAME, tr("Save Ignore"));
     203                            putValue(SHORT_DESCRIPTION, tr("Save ignore list"));
     204                            new ImageProvider("save").getResource().attachImageIcon(this, true);
     205                            reset = 3;
     206                        } else {
     207                            putValue(NAME, tr("Ignore list modification"));
     208                            putValue(SHORT_DESCRIPTION, tr("Clear/Restore/Save the ignore list, depending upon various conditions"));
     209                            new ImageProvider("dialogs", "validator").getResource().attachImageIcon(this, true);
     210                            this.setEnabled(false);
     211                        }
     212                    }
     213                }
     214
     215                @Override
     216                public void actionPerformed(ActionEvent e) {
     217                    if (e != null) {
     218                        if (reset == 1) {
     219                            OsmValidator.resetErrorList();
     220                        } else if (reset == 2) {
     221                            OsmValidator.restoreErrorList();
     222                        } else if (reset == 3 && !OsmValidator.getIgnoredErrors().isEmpty()) {
     223                            OsmValidator.saveIgnoredErrors();
     224                        }
     225                        if (reset == 1 || reset == 2) rerunValidatorPrompt();
     226                    }
     227                    toggle();
     228                }
     229            });
     230            buttons.add(resetignorelistButton);
    177231        } else {
    178232            ignoreButton = null;
     233            resetignorelistButton = null;
    179234        }
     235
    180236        createLayout(tree, true, buttons);
    181237    }
    182238
     
    280336        if (changed.get()) {
    281337            tree.resetErrors();
    282338            OsmValidator.saveIgnoredErrors();
     339            if (resetignorelistButton != null) {
     340                resetignorelistButton.getAction().actionPerformed(null);
     341            }
    283342            invalidateValidatorLayers();
    284343        }
    285344    }
    286345
    287346    /**
     347     * Prompt to rerun the validator when the ignore list changes
     348     */
     349    public void rerunValidatorPrompt() {
     350        MapFrame map = MainApplication.getMap();
     351        List<TestError> errors = map.validatorDialog.tree.getErrors();
     352        if (!validateAction.isEnabled() || errors == null || errors.isEmpty()) return;
     353        final int answer = ConditionalOptionPaneUtil.showOptionDialog(
     354                "rerun_validation_when_ignorelist_changed",
     355                MainApplication.getMainFrame(),
     356                "<hmtl><h3>" + tr("Should the validation be rerun?") + "</h3></html>",
     357                tr("Ignored error filter changed"),
     358                JOptionPane.YES_NO_CANCEL_OPTION,
     359                JOptionPane.QUESTION_MESSAGE,
     360                null,
     361                null);
     362        if (answer == JOptionPane.YES_OPTION) {
     363            validateAction.doValidate(true);
     364        }
     365    }
     366
     367    /**
    288368     * Sets the selection of the map to the current selected items.
    289369     */
    290     @SuppressWarnings("unchecked")
    291370    private void setSelectedItems() {
    292371        DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
    293372        if (tree == null || ds == null)