001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.preferences.validator;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.GridBagLayout;
007import java.awt.event.ActionListener;
008import java.util.ArrayList;
009import java.util.Collection;
010import java.util.LinkedList;
011import java.util.List;
012
013import javax.swing.BorderFactory;
014import javax.swing.JCheckBox;
015import javax.swing.JLabel;
016import javax.swing.JPanel;
017
018import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
019import org.openstreetmap.josm.data.validation.OsmValidator;
020import org.openstreetmap.josm.data.validation.Test;
021import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
022import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
023import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
024import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
025import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
026import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
027import org.openstreetmap.josm.gui.util.GuiHelper;
028import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
029import org.openstreetmap.josm.spi.preferences.Config;
030import org.openstreetmap.josm.tools.GBC;
031
032/**
033 * The general validator preferences, allowing to enable/disable tests.
034 * @since 6666
035 */
036public class ValidatorTestsPreference implements SubPreferenceSetting {
037
038    /**
039     * Factory used to create a new {@code ValidatorTestsPreference}.
040     */
041    public static class Factory implements PreferenceSettingFactory {
042        @Override
043        public PreferenceSetting createPreferenceSetting() {
044            return new ValidatorTestsPreference();
045        }
046    }
047
048    private JCheckBox prefUseIgnore;
049    private JCheckBox prefUseLayer;
050    private JCheckBox prefOtherUpload;
051    private JCheckBox prefOther;
052
053    /** The list of all tests */
054    private Collection<Test> allTests;
055
056    @Override
057    public void addGui(PreferenceTabbedPane gui) {
058        JPanel testPanel = new VerticallyScrollablePanel(new GridBagLayout());
059        testPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
060
061        prefUseIgnore = new JCheckBox(tr("Use ignore list."), ValidatorPrefHelper.PREF_USE_IGNORE.get());
062        prefUseIgnore.setToolTipText(tr("Use the ignore list to suppress warnings."));
063        testPanel.add(prefUseIgnore, GBC.eol());
064
065        prefUseLayer = new JCheckBox(tr("Use error layer."), ValidatorPrefHelper.PREF_LAYER.get());
066        prefUseLayer.setToolTipText(tr("Use the error layer to display problematic elements."));
067        testPanel.add(prefUseLayer, GBC.eol());
068
069        prefOther = new JCheckBox(tr("Show informational level."), ValidatorPrefHelper.PREF_OTHER.get());
070        prefOther.setToolTipText(tr("Show the informational tests."));
071        testPanel.add(prefOther, GBC.eol());
072
073        prefOtherUpload = new JCheckBox(tr("Show informational level on upload."),
074                ValidatorPrefHelper.PREF_OTHER_UPLOAD.get());
075        prefOtherUpload.setToolTipText(tr("Show the informational tests in the upload check windows."));
076        testPanel.add(prefOtherUpload, GBC.eol());
077
078        ActionListener otherUploadEnabled = e -> prefOtherUpload.setEnabled(prefOther.isSelected());
079        prefOther.addActionListener(otherUploadEnabled);
080        otherUploadEnabled.actionPerformed(null);
081
082        GBC a = GBC.eol().insets(-5, 0, 0, 0);
083        a.anchor = GBC.EAST;
084        testPanel.add(new JLabel(tr("On demand")), GBC.std());
085        testPanel.add(new JLabel(tr("On upload")), a);
086
087        allTests = OsmValidator.getTests();
088        for (Test test: allTests) {
089            test.addGui(testPanel);
090        }
091
092        gui.getValidatorPreference().addSubTab(this, tr("Tests"),
093                GuiHelper.embedInVerticalScrollPane(testPanel),
094                tr("Choose tests to enable"));
095    }
096
097    @Override
098    public boolean ok() {
099        List<String> tests = new LinkedList<>();
100        List<String> testsBeforeUpload = new LinkedList<>();
101
102        for (Test test : allTests) {
103            test.ok();
104            String name = test.getClass().getName();
105            if (!test.enabled)
106                tests.add(name);
107            if (!test.testBeforeUpload)
108                testsBeforeUpload.add(name);
109        }
110
111        // Initializes all tests but MapCSSTagChecker because it is initialized
112        // later in ValidatorTagCheckerRulesPreference.ok(),
113        // after its list of rules has been saved to preferences
114        List<Test> testsToInitialize = new ArrayList<>(allTests);
115        testsToInitialize.remove(OsmValidator.getTest(MapCSSTagChecker.class));
116        OsmValidator.initializeTests(testsToInitialize);
117
118        Config.getPref().putList(ValidatorPrefHelper.PREF_SKIP_TESTS, tests);
119        Config.getPref().putList(ValidatorPrefHelper.PREF_SKIP_TESTS_BEFORE_UPLOAD, testsBeforeUpload);
120        ValidatorPrefHelper.PREF_USE_IGNORE.put(prefUseIgnore.isSelected());
121        ValidatorPrefHelper.PREF_OTHER.put(prefOther.isSelected());
122        ValidatorPrefHelper.PREF_OTHER_UPLOAD.put(prefOtherUpload.isSelected());
123        ValidatorPrefHelper.PREF_LAYER.put(prefUseLayer.isSelected());
124        return false;
125    }
126
127    @Override
128    public boolean isExpert() {
129        return false;
130    }
131
132    @Override
133    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
134        return gui.getValidatorPreference();
135    }
136}