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