Ticket #7449: shortcutSchemas.patch

File shortcutSchemas.patch, 10.1 KB (added by akks, 14 years ago)
  • org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java

     
    99import java.awt.Insets;
    1010import java.awt.Toolkit;
    1111
     12import java.awt.event.ActionEvent;
     13import java.awt.event.ActionListener;
    1214import static org.openstreetmap.josm.tools.I18n.marktr;
    1315import static org.openstreetmap.josm.tools.I18n.tr;
    1416
     
    1618import java.lang.reflect.Field;
    1719import java.util.ArrayList;
    1820import java.util.LinkedHashMap;
    19 import java.util.HashMap;
    2021import java.util.Map;
    2122
    2223import java.util.regex.PatternSyntaxException;
     
    2425import javax.swing.BorderFactory;
    2526import javax.swing.BoxLayout;
    2627import javax.swing.DefaultComboBoxModel;
     28import javax.swing.JButton;
    2729import javax.swing.JCheckBox;
    2830import javax.swing.JComboBox;
    29 import javax.swing.JEditorPane;
    3031import javax.swing.JLabel;
    3132import javax.swing.JPanel;
    3233import javax.swing.JScrollPane;
     
    4849import javax.swing.table.TableRowSorter;
    4950import org.openstreetmap.josm.Main;
    5051import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
     52import org.openstreetmap.josm.tools.GBC;
    5153import org.openstreetmap.josm.tools.Shortcut;
     54import org.openstreetmap.josm.tools.ImageProvider;
    5255
    5356/**
    5457 * This is the keyboard preferences content.
     
    138141    private JComboBox tfKey = new JComboBox();
    139142
    140143    JTable shortcutTable = new JTable();
     144   
     145    JComboBox<String> cboxSchema = new JComboBox<String>();
     146    JButton saveButton = new JButton(ImageProvider.get("save"));
     147    JButton loadButton = new JButton(ImageProvider.get("open"));
     148    JButton resetButton = new JButton(ImageProvider.get("undo"));
    141149
    142150    private JTextField filterField = new JTextField();
    143151
     
    247255        // copied from PluginPreference
    248256        JPanel pnl  = new JPanel(new GridBagLayout());
    249257        pnl.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
    250         GridBagConstraints gc = new GridBagConstraints();
    251 
    252         gc.anchor = GridBagConstraints.NORTHWEST;
    253         gc.fill = GridBagConstraints.HORIZONTAL;
    254         gc.weightx = 0.0;
    255         gc.insets = new Insets(0,0,0,5);
    256         pnl.add(new JLabel(tr("Search:")), gc);
    257 
    258         gc.gridx = 1;
    259         gc.weightx = 1.0;
    260         pnl.add(filterField, gc);
     258       
     259        pnl.add(new JLabel(tr("Search:")),GBC.std());
     260        pnl.add(filterField,GBC.std().fill(GBC.HORIZONTAL));
    261261        filterField.setToolTipText(tr("Enter a search expression"));
    262262        SelectAllOnFocusGainedDecorator.decorate(filterField);
    263263        filterField.getDocument().addDocumentListener(new FilterFieldAdapter());
    264         pnl.setMaximumSize(new Dimension(300,10));
     264        pnl.add(new JLabel(tr("Schema:")),GBC.std().insets(10,0,0,0));
     265       
     266        final String presetsFolder = Main.pref.getPreferencesDir();
     267        rebuildSchemaList(presetsFolder);
     268        pnl.add(cboxSchema,GBC.std().fill(GBC.HORIZONTAL).weight(0.5,1));
     269        pnl.add(loadButton,GBC.std().insets(10,0,0,0).weight(0.1, 1));
     270        pnl.add(saveButton,GBC.std().weight(0.1, 1));
     271        pnl.add(resetButton,GBC.std().weight(0.1, 1));
     272       
     273        loadButton.addActionListener(new ActionListener() {
     274            @Override
     275            public void actionPerformed(ActionEvent e) {
     276                if (cboxSchema.getSelectedItem()==null) return;
     277                ShortcutPresetsManager.resetShortcutsToDefaults();
     278                ShortcutPresetsManager.loadShortcutsFromFile(presetsFolder,cboxSchema.getSelectedItem().toString());
     279                model.fireTableDataChanged();   
     280            }});
     281
     282        saveButton.addActionListener(new ActionListener() {
     283            @Override
     284            public void actionPerformed(ActionEvent e) {
     285                System.out.println(cboxSchema.getSelectedItem());
     286                if (cboxSchema.getSelectedItem()==null) return;
     287                String sel = cboxSchema.getSelectedItem().toString().trim();
     288                if (sel.length()==0) return;
     289                if (cboxSchema.getSelectedIndex()<0) {
     290                    sel=sel+".scm";
     291                    ShortcutPresetsManager.saveShortcutsToFile(presetsFolder,sel);
     292                    rebuildSchemaList(presetsFolder);
     293                    cboxSchema.setSelectedItem(sel);
     294                } else {
     295                    ShortcutPresetsManager.saveShortcutsToFile(presetsFolder,sel);
     296                }
     297            }
     298        });
     299       
     300        resetButton.addActionListener(new ActionListener() {
     301            @Override
     302            public void actionPerformed(ActionEvent e) {
     303                ShortcutPresetsManager.resetShortcutsToDefaults();
     304                model.fireTableDataChanged();
     305            }
     306        });
     307       
     308        pnl.setMaximumSize(new Dimension(600,10));
    265309        return pnl;
    266310    }
    267311
     312    private void rebuildSchemaList(final String presetsFolder) {
     313        cboxSchema.setModel(new DefaultComboBoxModel<String>(
     314                ShortcutPresetsManager.getSchemaFileNames(presetsFolder)));
     315        cboxSchema.setEditable(true);
     316    }
     317
    268318    private void disableAllModifierCheckboxes() {
    269319        cbDefault.setEnabled(false);
    270320        cbDisable.setEnabled(false);
     
    317367            }
    318368        }
    319369        public void actionPerformed(java.awt.event.ActionEvent e) {
     370            // calls setAcssignedKey, setAdssignedUser, setAssignedModifier
    320371            ListSelectionModel lsm = panel.shortcutTable.getSelectionModel();
    321372            if (lsm != null && !lsm.isSelectionEmpty()) {
    322373                if (e != null) { // only if we've been called by a user action
     
    383434        public void insertUpdate(DocumentEvent arg0) {  filter(); }
    384435        public void removeUpdate(DocumentEvent arg0) { filter(); }
    385436    }
    386 
     437   
    387438}
  • org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPresetsManager.java

     
     1/*
     2 * To change this template, choose Tools | Templates
     3 * and open the template in the editor.
     4 */
     5package org.openstreetmap.josm.gui.preferences.shortcut;
     6
     7import java.io.*;
     8import java.util.ArrayList;
     9import org.openstreetmap.josm.tools.Shortcut;
     10
     11/**
     12 *
     13 * @author Alexei
     14 */
     15public class ShortcutPresetsManager {
     16
     17    public static void saveShortcutsToFile(String dir, String fileName) {
     18
     19        File f = new File(dir, fileName);
     20        PrintWriter fw = null;
     21        try {
     22            fw = new PrintWriter(f);
     23            for (Shortcut s : Shortcut.listAll()) {
     24                String txt = s.getSettingsText();
     25                if (txt != null) fw.println(txt);
     26            }
     27        } catch (IOException ex) {
     28            System.err.println("can not write file");
     29        } finally {
     30            try {
     31                if (fw != null) fw.close();
     32            } catch (Exception ex) {  }
     33        }
     34    }
     35   
     36   
     37    public static void loadShortcutsFromFile(String dir, String fileName) {
     38        ArrayList<String> items = new ArrayList<String>();
     39        BufferedReader fr = null;
     40        try {
     41            File f = new File(dir, fileName);
     42            fr = new BufferedReader(new FileReader(f));
     43            String s;
     44            while ((s = fr.readLine()) != null) {
     45                items.add(s);
     46            }
     47        } catch (IOException ex) {
     48            System.err.println("can not read file");
     49            return;
     50        } finally {
     51            try {
     52                if (fr != null)  fr.close();
     53            } catch (IOException ex2) {   }
     54        }
     55        for (String s : items) {
     56//            System.out.println(s);
     57            Shortcut.addOrModifyShortcutPreferences(s);
     58        }
     59    }
     60
     61    public static void resetShortcutsToDefaults() {
     62        for (Shortcut s: Shortcut.listAll()) {
     63                    s.setAssignedUser(false);
     64        }
     65    }
     66    public static String[] getSchemaFileNames(String dir) {
     67        return new File(dir).list(new FilenameFilter() {
     68            public boolean accept(File dir, String name) {
     69                return name.endsWith(".scm");
     70            }
     71        });
     72       
     73    }
     74   
     75}
  • org/openstreetmap/josm/tools/Shortcut.java

     
    184184            String.valueOf(assignedModifier), String.valueOf(assignedDefault), String.valueOf(assignedUser)}));
    185185        }
    186186    }
    187 
     187   
     188    public String getSettingsText() {
     189        if (getAutomatic() || getReset() || !getAssignedUser()) {
     190            return null;
     191        } else {
     192            return String.format("%s\t%s\t%d\t%d\t%d\t%d\t%s\t%s",shortText,longText,requestedKey,requestedGroup,assignedKey,assignedModifier, String.valueOf(assignedDefault), String.valueOf(assignedUser));
     193        }
     194    }
     195   
     196    public static void addOrModifyShortcutPreferences(String settingsText) {
     197        String elems[] = settingsText.split("\t");
     198        String shortText = elems[0];
     199        Shortcut s = shortcuts.get(shortText);
     200        s.longText = elems[1];
     201        s.requestedKey = Integer.parseInt(elems[2]);
     202        s.requestedGroup = Integer.parseInt(elems[3]);
     203        s.assignedKey = Integer.parseInt(elems[4]);
     204        s.assignedModifier = Integer.parseInt(elems[5]);
     205        s.assignedDefault = Boolean.parseBoolean(elems[6]);
     206        s.assignedUser = Boolean.parseBoolean(elems[7]);
     207    }
     208   
     209   
    188210    private boolean isSame(int isKey, int isModifier) {
    189211        // an unassigned shortcut is different from any other shortcut
    190212        return isKey == assignedKey && isModifier == assignedModifier && assignedModifier != getGroupModifier(NONE);