001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.preferences.shortcut;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.List;
007
008import javax.swing.JPanel;
009import javax.swing.table.AbstractTableModel;
010
011import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
012import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
013import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
014import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
015import org.openstreetmap.josm.tools.GBC;
016import org.openstreetmap.josm.tools.Shortcut;
017
018public final class ShortcutPreference extends DefaultTabPreferenceSetting {
019
020    private String defaultFilter;
021
022    public static class Factory implements PreferenceSettingFactory {
023        @Override
024        public PreferenceSetting createPreferenceSetting() {
025            return new ShortcutPreference();
026        }
027    }
028
029    private ShortcutPreference() {
030        // icon source: http://www.iconfinder.net/index.php?q=key&page=icondetails&iconid=8553&size=128&q=key&s12=on&s16=on&s22=on&s32=on&s48=on&s64=on&s128=on
031        // icon licence: GPL
032        // icon designer: Paolino, http://www.paolinoland.it/
033        // icon original filename: keyboard.png
034        // icon original size: 128x128
035        // modifications: icon was cropped, then resized
036        super("shortcuts", tr("Keyboard Shortcuts"), tr("Changing keyboard shortcuts manually."));
037    }
038
039    @Override
040    public void addGui(PreferenceTabbedPane gui) {
041        JPanel p = gui.createPreferenceTab(this);
042
043        PrefJPanel prefpanel = new PrefJPanel(new ScListModel());
044        p.add(prefpanel, GBC.eol().fill(GBC.BOTH));
045        if (defaultFilter!=null) prefpanel.filter(defaultFilter);
046    }
047
048    @Override
049    public boolean ok() {
050        return Shortcut.savePrefs();
051    }
052
053    public void setDefaultFilter(String substring) {
054        defaultFilter = substring;
055    }
056
057    // Maybe move this to prefPanel? There's no need for it to be here.
058    private static class ScListModel extends AbstractTableModel {
059        private String[] columnNames = new String[]{tr("Action"), tr("Shortcut")};
060        private List<Shortcut> data;
061
062        public ScListModel() {
063            data = Shortcut.listAll();
064        }
065        @Override
066        public int getColumnCount() {
067            return columnNames.length;
068        }
069        @Override
070        public int getRowCount() {
071            return data.size();
072        }
073        @Override
074        public String getColumnName(int col) {
075            return columnNames[col];
076        }
077        @Override
078        public Object getValueAt(int row, int col) {
079            return (col==0)?  data.get(row).getLongText() : data.get(row);
080        }
081        @Override
082        public boolean isCellEditable(int row, int col) {
083            return false;
084        }
085    }
086}