Ticket #2423: filter_preferences.patch

File filter_preferences.patch, 8.2 KB (added by Igor Shubovych <igor.shubovych@…>, 17 years ago)
  • src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java

    ### Eclipse Workspace Patch 1.0
    #P JOSM
     
    1111import java.awt.event.MouseAdapter;
    1212import java.awt.event.MouseEvent;
    1313import java.util.Map;
     14import java.util.TreeMap;
    1415import java.util.TreeSet;
    1516import java.util.Map.Entry;
    1617
     
    2223import javax.swing.JScrollPane;
    2324import javax.swing.JTable;
    2425import javax.swing.JTextField;
     26import javax.swing.event.DocumentEvent;
     27import javax.swing.event.DocumentListener;
    2528import javax.swing.table.DefaultTableCellRenderer;
    2629import javax.swing.table.DefaultTableModel;
    2730
     
    3336    private Map<String,String> orig;
    3437    private Map<String,String> defaults;
    3538    private DefaultTableModel model;
     39    protected Map<String, String> data;
     40    protected JTextField txtFilter;
    3641
    3742    public void addGui(final PreferenceDialog gui) {
    3843        JPanel p = gui.createPreferenceTab("advanced", tr("Advanced Preferences"),
    3944                tr("Setting Preference entries directly. Use with caution!"), false);
     45       
     46        txtFilter = new JTextField();
     47        JLabel lbFilter = new JLabel(tr("Search: "));
     48        lbFilter.setLabelFor(txtFilter);
     49        p.add(lbFilter);
     50        p.add(txtFilter, GBC.eol().fill(GBC.HORIZONTAL));
     51        txtFilter.getDocument().addDocumentListener(new DocumentListener(){
     52            public void changedUpdate(DocumentEvent e) {
     53                action();
     54            }
     55           
     56            public void insertUpdate(DocumentEvent e) {
     57                action();
     58            }
     59           
     60            public void removeUpdate(DocumentEvent e) {
     61                action();
     62            }
     63           
     64            private void action() {
     65                dataToModel();
     66            }
     67        });
    4068
    4169        model = new DefaultTableModel(new String[]{tr("Key"), tr("Value")},0) {
    4270            @Override public boolean isCellEditable(int row, int column) {
     
    72100        defaults = Main.pref.getDefaults();
    73101        orig.remove("osm-server.password");
    74102        defaults.remove("osm-server.password");
    75         TreeSet<String> ts = new TreeSet<String>(orig.keySet());
    76         for (String s : defaults.keySet())
    77         {
    78             if(!ts.contains(s))
    79                 ts.add(s);
    80         }
    81 
    82         for (String s : ts)
    83         {
    84             String val = Main.pref.get(s);
    85             if(val == null) val = "";
    86             model.addRow(new String[]{s, val});
    87         }
     103        prepareData();
     104        dataToModel();
    88105
    89106        JButton add = new JButton(tr("Add"));
    90107        p.add(Box.createHorizontalGlue(), GBC.std().fill(GBC.HORIZONTAL));
    91108        p.add(add, GBC.std().insets(0,5,0,0));
    92109        add.addActionListener(new ActionListener(){
    93110            public void actionPerformed(ActionEvent e) {
    94                 JPanel p = new JPanel(new GridBagLayout());
    95                 p.add(new JLabel(tr("Key")), GBC.std().insets(0,0,5,0));
    96                 JTextField key = new JTextField(10);
    97                 JTextField value = new JTextField(10);
    98                 p.add(key, GBC.eop().insets(5,0,0,0).fill(GBC.HORIZONTAL));
    99                 p.add(new JLabel(tr("Value")), GBC.std().insets(0,0,5,0));
    100                 p.add(value, GBC.eol().insets(5,0,0,0).fill(GBC.HORIZONTAL));
    101                 int answer = JOptionPane.showConfirmDialog(gui, p, tr("Enter a new key/value pair"), JOptionPane.OK_CANCEL_OPTION);
    102                 if (answer == JOptionPane.OK_OPTION)
    103                     model.addRow(new String[]{key.getText(), value.getText()});
     111                addPreference(gui);
    104112            }
    105113        });
    106114
     
    108116        p.add(edit, GBC.std().insets(5,5,5,0));
    109117        edit.addActionListener(new ActionListener(){
    110118            public void actionPerformed(ActionEvent e) {
    111                 edit(gui, list);
     119                editPreference(gui, list);
    112120            }
    113121        });
    114122
     
    116124        p.add(delete, GBC.std().insets(0,5,0,0));
    117125        delete.addActionListener(new ActionListener(){
    118126            public void actionPerformed(ActionEvent e) {
    119                 if (list.getSelectedRowCount() == 0) {
    120                     JOptionPane.showMessageDialog(gui, tr("Please select the row to delete."));
    121                     return;
    122                 }
    123                 for(int row: list.getSelectedRows())
    124                     model.setValueAt("", row, 1);
     127                removePreference(gui, list);
    125128            }
    126129        });
    127130
    128131        list.addMouseListener(new MouseAdapter(){
    129132            @Override public void mouseClicked(MouseEvent e) {
    130133                if (e.getClickCount() == 2)
    131                     edit(gui, list);
     134                    editPreference(gui, list);
    132135            }
    133136        });
    134137    }
    135138
     139    private void prepareData() {
     140        TreeSet<String> ts = new TreeSet<String>(orig.keySet());
     141        for (String s : defaults.keySet())
     142        {
     143            if(!ts.contains(s))
     144                ts.add(s);
     145        }
     146        data = new TreeMap<String, String>();
     147        for (String s : ts)
     148        {
     149            String val = Main.pref.get(s);
     150            if(val == null) val = "";
     151            data.put(s, val);
     152        }
     153    }
     154   
     155    private void dataToModel() {
     156        while (model.getRowCount() > 0) {
     157            model.removeRow(0);
     158        }
     159        for (String prefKey : data.keySet()) {
     160            String prefValue = data.get(prefKey);
     161            if (prefKey.contains(txtFilter.getText()) ||
     162                    prefValue.contains(txtFilter.getText())) {
     163                model.addRow(new String[] {prefKey, prefValue});
     164            }
     165        }
     166    }
     167
    136168    public boolean ok() {
    137         for (int i = 0; i < model.getRowCount(); ++i) {
    138             String value = model.getValueAt(i,1).toString();
     169        for (String key : data.keySet()) {
     170            String value = data.get(key);
    139171            if(value.length() != 0)
    140172            {
    141                 String key = model.getValueAt(i,0).toString();
    142173                String origValue = orig.get(key);
    143174                if (origValue == null || !origValue.equals(value))
    144175                    Main.pref.put(key, value);
     
    151182    }
    152183
    153184
    154     private void edit(final PreferenceDialog gui, final JTable list) {
     185    private void editPreference(final PreferenceDialog gui, final JTable list) {
    155186        if (list.getSelectedRowCount() != 1) {
    156187            JOptionPane.showMessageDialog(gui, tr("Please select the row to edit."));
    157188            return;
    158189        }
    159190        String v = JOptionPane.showInputDialog(tr("New value for {0}", model.getValueAt(list.getSelectedRow(), 0)), model.getValueAt(list.getSelectedRow(), 1));
    160         if (v != null)
     191        if (v != null) {
     192            data.put((String) model.getValueAt(list.getSelectedRow(), 0), v);
    161193            model.setValueAt(v, list.getSelectedRow(), 1);
     194        }
     195    }
     196
     197    private void removePreference(final PreferenceDialog gui, final JTable list) {
     198        if (list.getSelectedRowCount() == 0) {
     199            JOptionPane.showMessageDialog(gui, tr("Please select the row to delete."));
     200            return;
     201        }
     202        for(int row: list.getSelectedRows()) {
     203            data.put((String) model.getValueAt(row, 0), "");
     204            model.setValueAt("", row, 1);
     205        }
     206    }
     207
     208    private void addPreference(final PreferenceDialog gui) {
     209        JPanel p = new JPanel(new GridBagLayout());
     210        p.add(new JLabel(tr("Key")), GBC.std().insets(0,0,5,0));
     211        JTextField key = new JTextField(10);
     212        JTextField value = new JTextField(10);
     213        p.add(key, GBC.eop().insets(5,0,0,0).fill(GBC.HORIZONTAL));
     214        p.add(new JLabel(tr("Value")), GBC.std().insets(0,0,5,0));
     215        p.add(value, GBC.eol().insets(5,0,0,0).fill(GBC.HORIZONTAL));
     216        int answer = JOptionPane.showConfirmDialog(gui, p, tr("Enter a new key/value pair"), JOptionPane.OK_CANCEL_OPTION);
     217        if (answer == JOptionPane.OK_OPTION) {
     218            data.put(key.getText(), value.getText());
     219            model.addRow(new String[]{key.getText(), value.getText()});
     220        }
    162221    }
    163222}