Ticket #3061: add-search-to-plugin-preferences.patch

File add-search-to-plugin-preferences.patch, 6.3 KB (added by avarab@…, 15 years ago)

A patch to add search to plugin preferences

  • src/org/openstreetmap/josm/plugins/PluginSelection.java

     
    3030import javax.swing.JEditorPane;
    3131import javax.swing.JOptionPane;
    3232import javax.swing.JPanel;
     33import javax.swing.JTextField;
    3334import javax.swing.UIManager;
    3435import javax.swing.event.HyperlinkEvent;
    3536import javax.swing.event.HyperlinkListener;
     
    4546    private Map<String, PluginInformation> availablePlugins;
    4647    private Map<String, PluginInformation> localPlugins;
    4748
     49    private JTextField txtFilter = null;
     50
    4851    public void updateDescription(JPanel pluginPanel) {
    4952        int count = PluginDownloader.downloadDescription();
    5053        if (count > 0) {
     
    6265                    JOptionPane.ERROR_MESSAGE
    6366            );
    6467        }
    65         drawPanel(pluginPanel);
     68        drawPanel(pluginPanel, null);
    6669    }
    6770
    6871    public void update(JPanel pluginPanel) {
    6972        // refresh description
    7073        int num = PluginDownloader.downloadDescription();
    7174        Boolean done = false;
    72         drawPanel(pluginPanel);
     75        drawPanel(pluginPanel, null);
    7376
    7477        Set<PluginInformation> toUpdate = new HashSet<PluginInformation>();
    7578        StringBuilder toUpdateStr = new StringBuilder();
     
    111114        if (done && num >= 1) {
    112115            Main.pref.put("pluginmanager.lastupdate", Long.toString(System.currentTimeMillis()));
    113116        }
    114         drawPanel(pluginPanel);
     117        drawPanel(pluginPanel, null);
    115118    }
    116119
    117120    public boolean finish() {
     
    160163    }
    161164
    162165    /* return true when plugin list changed */
    163     public void drawPanel(JPanel pluginPanel) {
     166    public void drawPanel(JPanel pluginPanel, JTextField filter) {
    164167        loadPlugins();
    165168        Collection<String> enabledPlugins = Main.pref.getCollection("plugins", null);
    166169
     170        if (filter != null) {
     171            txtFilter = filter;
     172        }
     173
    167174        if (pluginMap == null) {
    168175            pluginMap = new HashMap<String, Boolean>();
    169176        } else {
     
    188195
    189196        int row = 0;
    190197        for (final PluginInformation plugin : availablePlugins.values()) {
     198            if (txtFilter.getText() != null) {
     199                /* This is not the plugin you're looking for */
     200                final String name = plugin.name;
     201                final String desc = plugin.getLinkDescription();
     202                if (!filterNameAndDescription(txtFilter, name, desc)) {
     203                    continue;
     204                }
     205            }
     206
     207
    191208            boolean enabled = (enabledPlugins != null) && enabledPlugins.contains(plugin.name);
    192209            if (pluginMap.get(plugin.name) == null) {
    193210                pluginMap.put(plugin.name, enabled);
     
    254271        pluginPanel.updateUI();
    255272    }
    256273
     274    private static boolean filterNameAndDescription(JTextField filter, final String name, final String description) {
     275        final String input[] = filter.getText().split("\\s+");
     276        boolean canHas = true;
     277
     278        // Make 'foo bar' search for 'bar' or 'foo' in both name and description
     279        for (String bit : input) {
     280            String lc_bit = bit.toLowerCase();
     281            if (!name.toLowerCase().contains(lc_bit) && !description.toLowerCase().contains(lc_bit)) {
     282                canHas = false;
     283            }
     284        }
     285
     286        return canHas;
     287    }
     288
    257289    private void loadPlugins() {
    258290        availablePlugins = new TreeMap<String, PluginInformation>(new Comparator<String>(){
    259291            public int compare(String o1, String o2) {
  • src/org/openstreetmap/josm/gui/preferences/PluginPreference.java

     
    1616import javax.swing.JButton;
    1717import javax.swing.JLabel;
    1818import javax.swing.JList;
     19import javax.swing.JTextField;
    1920import javax.swing.JOptionPane;
    2021import javax.swing.JPanel;
    2122import javax.swing.JScrollPane;
    2223import javax.swing.Scrollable;
     24import javax.swing.event.DocumentEvent;
     25import javax.swing.event.DocumentListener;
    2326
    2427import org.openstreetmap.josm.Main;
    2528import org.openstreetmap.josm.plugins.PluginDownloader;
     
    3942    private PreferenceDialog gui;
    4043    private JScrollPane pluginPane;
    4144    private PluginSelection selection = new PluginSelection();
     45    private JTextField txtFilter;
    4246
    4347    public void addGui(final PreferenceDialog gui) {
    4448        this.gui = gui;
    4549        plugin = gui.createPreferenceTab("plugin", tr("Plugins"), tr("Configure available plugins."), false);
     50
     51        txtFilter = new JTextField();
     52        JLabel lbFilter = new JLabel(tr("Search: "));
     53        lbFilter.setLabelFor(txtFilter);
     54        plugin.add(lbFilter);
     55        plugin.add(txtFilter, GBC.eol().fill(GBC.HORIZONTAL));
     56        txtFilter.getDocument().addDocumentListener(new DocumentListener(){
     57            public void changedUpdate(DocumentEvent e) {
     58                action();
     59            }
     60
     61            public void insertUpdate(DocumentEvent e) {
     62                action();
     63            }
     64
     65            public void removeUpdate(DocumentEvent e) {
     66                action();
     67            }
     68
     69            private void action() {
     70                selection.drawPanel(pluginPanel, txtFilter);
     71            }
     72        });
     73        plugin.add(GBC.glue(0,10), GBC.eol());
     74
     75        /* main plugin area */
    4676        pluginPane = new JScrollPane(pluginPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    4777        pluginPane.setBorder(null);
    4878        plugin.add(pluginPane, GBC.eol().fill(GBC.BOTH));
    4979        plugin.add(GBC.glue(0,10), GBC.eol());
     80
     81        /* buttons at the bottom */
    5082        JButton morePlugins = new JButton(tr("Download List"));
    5183        morePlugins.addActionListener(new ActionListener(){
    5284            public void actionPerformed(ActionEvent e) {
     
    71103        });
    72104        plugin.add(configureSites, GBC.std());
    73105
    74         selection.drawPanel(pluginPanel);
     106        selection.drawPanel(pluginPanel, txtFilter);
    75107    }
    76108
    77109    private void configureSites() {