Changeset 4615 in josm


Ignore:
Timestamp:
2011-11-27T15:58:09+01:00 (12 years ago)
Author:
jttt
Message:

Use different way to center popup menu title to prevent blank menu on Windows 7, add shortcuts to enable/hiding of filters (see #5515)

Location:
trunk/src/org/openstreetmap/josm
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java

    r4363 r4615  
    1111import java.awt.event.KeyEvent;
    1212import java.awt.event.MouseEvent;
     13import java.util.ArrayList;
    1314import java.util.Arrays;
    1415import java.util.Collection;
    1516import java.util.HashSet;
     17import java.util.List;
    1618import java.util.Set;
    1719import java.util.Stack;
    1820
     21import javax.swing.AbstractAction;
    1922import javax.swing.JCheckBox;
    2023import javax.swing.JTable;
     24import javax.swing.KeyStroke;
    2125import javax.swing.ListSelectionModel;
    2226import javax.swing.SwingUtilities;
     
    4448import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
    4549import org.openstreetmap.josm.gui.SideButton;
     50import org.openstreetmap.josm.tools.MultikeyActionsHandler;
     51import org.openstreetmap.josm.tools.MultikeyShortcutAction;
    4652import org.openstreetmap.josm.tools.Shortcut;
    4753
     
    6571                Shortcut.registerShortcut("subwindow:filter", tr("Toggle: {0}", tr("Filter")), KeyEvent.VK_F, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 162);
    6672        build();
     73
     74        MultikeyActionsHandler.getInstance().addAction(new EnableFilterAction());
     75        MultikeyActionsHandler.getInstance().addAction(new HidingFilterAction());
    6776    }
    6877
     
    8089    }
    8190
    82     protected String[] columnToolTips = {
    83             tr("Enable filter"),
    84             tr("Hide elements"),
     91    private static final KeyStroke ENABLE_FILTER_SHORTCUT
     92    = Shortcut.registerShortcut("core_multikey:enableFilter", "", 'E', Shortcut.GROUP_DIRECT, KeyEvent.CTRL_DOWN_MASK + KeyEvent.ALT_DOWN_MASK).getKeyStroke();
     93
     94    private static final KeyStroke HIDING_FILTER_SHORTCUT
     95    = Shortcut.registerShortcut("core_multikey:hidingFilter", "", 'H', Shortcut.GROUP_DIRECT, KeyEvent.CTRL_DOWN_MASK + KeyEvent.ALT_DOWN_MASK).getKeyStroke();
     96
     97
     98    protected final String[] columnToolTips = {
     99            tr("Enable filter ({0}+{1})", KeyEvent.getKeyModifiersText(ENABLE_FILTER_SHORTCUT.getModifiers()), KeyEvent.getKeyText(ENABLE_FILTER_SHORTCUT.getKeyCode())),
     100            tr("Hiding filter ({0}+{1})", KeyEvent.getKeyModifiersText(HIDING_FILTER_SHORTCUT.getModifiers()), KeyEvent.getKeyText(HIDING_FILTER_SHORTCUT.getKeyCode())),
    85101            null,
    86102            tr("Inverse filter"),
     
    172188
    173189        createLayout(userTable, true, Arrays.asList(new SideButton[] {
    174             addButton, editButton, deleteButton, upButton, downButton
     190                addButton, editButton, deleteButton, upButton, downButton
    175191        }));
    176192    }
     
    277293        filterModel.executeFilters(getAffectedPrimitives(event.getPrimitives()));
    278294    }
     295
     296    abstract class AbstractFilterAction extends AbstractAction implements MultikeyShortcutAction {
     297
     298        protected Filter lastFilter;
     299
     300        @Override
     301        public void actionPerformed(ActionEvent e) {
     302            throw new UnsupportedOperationException();
     303        }
     304
     305        @Override
     306        public List<MultikeyInfo> getMultikeyCombinations() {
     307            List<MultikeyInfo> result = new ArrayList<MultikeyShortcutAction.MultikeyInfo>();
     308
     309            for (int i=0; i<filterModel.getRowCount(); i++) {
     310                Filter filter = filterModel.getFilter(i);
     311                MultikeyInfo info = new MultikeyInfo(i, filter.text);
     312                result.add(info);
     313            }
     314
     315            return result;
     316        }
     317
     318        protected boolean isLastFilterValid() {
     319            return lastFilter != null && filterModel.getFilters().contains(lastFilter);
     320        }
     321
     322        @Override
     323        public MultikeyInfo getLastMultikeyAction() {
     324            if (isLastFilterValid())
     325                return new MultikeyInfo(-1, lastFilter.text);
     326            else
     327                return null;
     328        }
     329
     330    }
     331
     332    private class EnableFilterAction extends AbstractFilterAction  {
     333
     334        EnableFilterAction() {
     335            putValue(SHORT_DESCRIPTION, tr("Enable filter"));
     336            putValue(ACCELERATOR_KEY, ENABLE_FILTER_SHORTCUT);
     337        }
     338
     339        @Override
     340        public void executeMultikeyAction(int index, boolean repeatLastAction) {
     341            if (index >= 0 && index < filterModel.getRowCount()) {
     342                Filter filter = filterModel.getFilter(index);
     343                filterModel.setValueAt(!filter.enable, index, FilterTableModel.COL_ENABLED);
     344                lastFilter = filter;
     345            } else if (repeatLastAction && isLastFilterValid()) {
     346                filterModel.setValueAt(!lastFilter.enable, filterModel.getFilters().indexOf(lastFilter), FilterTableModel.COL_ENABLED);
     347            }
     348        }
     349    }
     350
     351    private class HidingFilterAction extends AbstractFilterAction {
     352
     353        public HidingFilterAction() {
     354            putValue(SHORT_DESCRIPTION, tr("Hiding filter"));
     355            putValue(ACCELERATOR_KEY, HIDING_FILTER_SHORTCUT);
     356        }
     357
     358        @Override
     359        public void executeMultikeyAction(int index, boolean repeatLastAction) {
     360            if (index >= 0 && index < filterModel.getRowCount()) {
     361                Filter filter = filterModel.getFilter(index);
     362                filterModel.setValueAt(!filter.hiding, index, FilterTableModel.COL_HIDING);
     363                lastFilter = filter;
     364            } else if (repeatLastAction && isLastFilterValid()) {
     365                filterModel.setValueAt(!lastFilter.hiding, filterModel.getFilters().indexOf(lastFilter), FilterTableModel.COL_HIDING);
     366            }
     367        }
     368
     369    }
    279370}
  • trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java

    r3926 r4615  
    3636 */
    3737public class FilterTableModel extends AbstractTableModel {
     38
     39    public static final int COL_ENABLED = 0;
     40    public static final int COL_HIDING = 1;
     41    public static final int COL_TEXT = 2;
     42    public static final int COL_INVERTED = 3;
    3843
    3944    // number of primitives that are disabled but not hidden
     
    293298        Filter f = filters.get(row);
    294299        switch (column) {
    295         case 0:
     300        case COL_ENABLED:
    296301            f.enable = (Boolean) aValue;
    297302            savePrefs();
     
    299304            fireTableRowsUpdated(row, row);
    300305            break;
    301         case 1:
     306        case COL_HIDING:
    302307            f.hiding = (Boolean) aValue;
    303308            savePrefs();
    304309            updateFilters();
    305310            break;
    306         case 2:
     311        case COL_TEXT:
    307312            f.text = (String) aValue;
    308313            savePrefs();
    309314            break;
    310         case 3:
     315        case COL_INVERTED:
    311316            f.inverted = (Boolean) aValue;
    312317            savePrefs();
     
    322327        Filter f = filters.get(row);
    323328        switch (column) {
    324         case 0:
     329        case COL_ENABLED:
    325330            return f.enable;
    326         case 1:
     331        case COL_HIDING:
    327332            return f.hiding;
    328         case 2:
     333        case COL_TEXT:
    329334            return f.text;
    330         case 3:
     335        case COL_INVERTED:
    331336            return f.inverted;
    332337        case 4:
     
    397402        g.translate(-dx, -dy);
    398403    }
     404
     405    public List<Filter> getFilters() {
     406        return filters;
     407    }
    399408}
  • trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java

    r4604 r4615  
    1515import javax.swing.Action;
    1616import javax.swing.JMenuItem;
     17import javax.swing.JPanel;
    1718import javax.swing.JPopupMenu;
    1819import javax.swing.KeyStroke;
     20import javax.swing.event.PopupMenuEvent;
     21import javax.swing.event.PopupMenuListener;
    1922
    2023import org.openstreetmap.josm.Main;
     
    131134
    132135        JMenuItem lbTitle = new JMenuItem((String) action.action.getValue(Action.SHORT_DESCRIPTION));
    133         lbTitle.setHorizontalAlignment(JMenuItem.CENTER);
    134136        lbTitle.setEnabled(false);
    135         layers.add(lbTitle);
     137        JPanel pnTitle = new JPanel();
     138        pnTitle.add(lbTitle);
     139        layers.add(pnTitle);
    136140
    137141        char repeatKey = (char) action.shortcut.getKeyCode();
     
    150154                @Override
    151155                public void actionPerformed(ActionEvent e) {
    152                     Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
    153156                    action.action.executeMultikeyAction(info.getIndex(), false);
    154157                }
     
    167170                    @Override
    168171                    public void actionPerformed(ActionEvent e) {
    169                         Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
    170172                        action.action.executeMultikeyAction(-1, true);
    171173                    }
     
    174176            }
    175177        }
     178        layers.addPopupMenuListener(new PopupMenuListener() {
     179
     180            @Override
     181            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
     182
     183            @Override
     184            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
     185                Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
     186            }
     187
     188            @Override
     189            public void popupMenuCanceled(PopupMenuEvent e) {}
     190        });
    176191
    177192        layers.show(Main.parent, Integer.MAX_VALUE, Integer.MAX_VALUE);
Note: See TracChangeset for help on using the changeset viewer.