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}