Ignore:
Timestamp:
2019-07-07T18:36:38+02:00 (5 years ago)
Author:
Don-vip
Message:

fix #14208 - add dedicated buttons in filter dialog to sort/reverse filters order.

Major overhaul/harmonization of our reorderable/sortable models.

File:
1 edited

Legend:

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

    r15176 r15226  
    1212import java.util.Arrays;
    1313import java.util.List;
     14import java.util.stream.Collectors;
    1415
    1516import javax.swing.AbstractAction;
    1617import javax.swing.DefaultCellEditor;
     18import javax.swing.DefaultListSelectionModel;
    1719import javax.swing.JCheckBox;
    1820import javax.swing.JTable;
     
    6264
    6365    private JTable userTable;
    64     private final FilterTableModel filterModel = new FilterTableModel();
    65 
    66     private final EnableFilterAction enableFilterAction;
    67     private final HidingFilterAction hidingFilterAction;
     66    private final FilterTableModel filterModel = new FilterTableModel(new DefaultListSelectionModel());
     67
     68    private final AddAction addAction = new AddAction();
     69    private final EditAction editAction = new EditAction();
     70    private final DeleteAction deleteAction = new DeleteAction();
     71    private final MoveUpAction moveUpAction = new MoveUpAction();
     72    private final MoveDownAction moveDownAction = new MoveDownAction();
     73    private final SortAction sortAction = new SortAction();
     74    private final ReverseAction reverseAction = new ReverseAction();
     75    private final EnableFilterAction enableFilterAction = new EnableFilterAction();
     76    private final HidingFilterAction hidingFilterAction = new HidingFilterAction();
    6877
    6978    /**
     
    7584                        KeyEvent.VK_F, Shortcut.ALT_SHIFT), 162);
    7685        build();
    77         enableFilterAction = new EnableFilterAction();
    78         hidingFilterAction = new HidingFilterAction();
    7986        MultikeyActionsHandler.getInstance().addAction(enableFilterAction);
    8087        MultikeyActionsHandler.getInstance().addAction(hidingFilterAction);
     
    112119    };
    113120
     121    private abstract class FilterAction extends AbstractAction implements IEnabledStateUpdating {
     122
     123        FilterAction(String name, String description, String icon) {
     124            putValue(NAME, name);
     125            putValue(SHORT_DESCRIPTION, description);
     126            new ImageProvider("dialogs", icon).getResource().attachImageIcon(this, true);
     127        }
     128
     129        @Override
     130        public void updateEnabledState() {
     131            setEnabled(!filterModel.getSelectionModel().isSelectionEmpty());
     132        }
     133    }
     134
     135    private class AddAction extends FilterAction {
     136        AddAction() {
     137            super(tr("Add"), tr("Add filter."), /* ICON(dialogs/) */ "add");
     138        }
     139
     140        @Override
     141        public void actionPerformed(ActionEvent e) {
     142            SearchSetting searchSetting = SearchAction.showSearchDialog(new Filter());
     143            if (searchSetting != null) {
     144                filterModel.addFilter(new Filter(searchSetting));
     145            }
     146        }
     147
     148        @Override
     149        public void updateEnabledState() {
     150            // Do nothing
     151        }
     152    }
     153
     154    private class EditAction extends FilterAction {
     155        EditAction() {
     156            super(tr("Edit"), tr("Edit filter."), /* ICON(dialogs/) */ "edit");
     157        }
     158
     159        @Override
     160        public void actionPerformed(ActionEvent e) {
     161            int index = filterModel.getSelectionModel().getMinSelectionIndex();
     162            if (index < 0) return;
     163            Filter f = filterModel.getValue(index);
     164            SearchSetting searchSetting = SearchAction.showSearchDialog(f);
     165            if (searchSetting != null) {
     166                filterModel.setValue(index, new Filter(searchSetting));
     167            }
     168        }
     169    }
     170
     171    private class DeleteAction extends FilterAction {
     172        DeleteAction() {
     173            super(tr("Delete"), tr("Delete filter."), /* ICON(dialogs/) */ "delete");
     174        }
     175
     176        @Override
     177        public void actionPerformed(ActionEvent e) {
     178            int index = filterModel.getSelectionModel().getMinSelectionIndex();
     179            if (index >= 0) {
     180                filterModel.removeFilter(index);
     181            }
     182        }
     183    }
     184
     185    private class MoveUpAction extends FilterAction {
     186        MoveUpAction() {
     187            super(tr("Up"), tr("Move filter up."), /* ICON(dialogs/) */ "up");
     188        }
     189
     190        @Override
     191        public void actionPerformed(ActionEvent e) {
     192            int index = userTable.convertRowIndexToModel(userTable.getSelectionModel().getMinSelectionIndex());
     193            if (index >= 0 && filterModel.moveUp(index)) {
     194                filterModel.getSelectionModel().setSelectionInterval(index-1, index-1);
     195            }
     196        }
     197
     198        @Override
     199        public void updateEnabledState() {
     200            setEnabled(filterModel.canMoveUp());
     201        }
     202    }
     203
     204    private class MoveDownAction extends FilterAction {
     205        MoveDownAction() {
     206            super(tr("Down"), tr("Move filter down."), /* ICON(dialogs/) */ "down");
     207        }
     208
     209        @Override
     210        public void actionPerformed(ActionEvent e) {
     211            int index = userTable.convertRowIndexToModel(userTable.getSelectionModel().getMinSelectionIndex());
     212            if (index >= 0 && filterModel.moveDown(index)) {
     213                filterModel.getSelectionModel().setSelectionInterval(index+1, index+1);
     214            }
     215        }
     216
     217        @Override
     218        public void updateEnabledState() {
     219            setEnabled(filterModel.canMoveDown());
     220        }
     221    }
     222
     223    private class SortAction extends FilterAction {
     224        SortAction() {
     225            super(tr("Sort"), tr("Sort filters."), /* ICON(dialogs/) */ "sort");
     226        }
     227
     228        @Override
     229        public void actionPerformed(ActionEvent e) {
     230            filterModel.sort();
     231        }
     232
     233        @Override
     234        public void updateEnabledState() {
     235            setEnabled(filterModel.getRowCount() > 1);
     236        }
     237    }
     238
     239    private class ReverseAction extends FilterAction {
     240        ReverseAction() {
     241            super(tr("Reverse"), tr("Reverse the filters order."), /* ICON(dialogs/) */ "reverse");
     242        }
     243
     244        @Override
     245        public void actionPerformed(ActionEvent e) {
     246            filterModel.reverse();
     247        }
     248
     249        @Override
     250        public void updateEnabledState() {
     251            setEnabled(filterModel.getRowCount() > 1);
     252        }
     253    }
     254
    114255    /**
    115256     * Builds the GUI.
     
    120261        userTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
    121262        userTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    122         userTable.setAutoCreateRowSorter(true);
     263        userTable.setSelectionModel(filterModel.getSelectionModel());
    123264
    124265        TableHelper.adjustColumnWidth(userTable, 0, false);
     
    130271        userTable.setDefaultRenderer(String.class, new StringRenderer());
    131272        userTable.setDefaultEditor(String.class, new DefaultCellEditor(new DisableShortcutsOnFocusGainedTextField()));
    132 
    133         SideButton addButton = new SideButton(new AbstractAction() {
    134             {
    135                 putValue(NAME, tr("Add"));
    136                 putValue(SHORT_DESCRIPTION, tr("Add filter."));
    137                 new ImageProvider("dialogs", "add").getResource().attachImageIcon(this, true);
    138             }
    139 
    140             @Override
    141             public void actionPerformed(ActionEvent e) {
    142                 SearchSetting searchSetting = SearchAction.showSearchDialog(new Filter());
    143                 if (searchSetting != null) {
    144                     filterModel.addFilter(new Filter(searchSetting));
    145                 }
    146             }
    147         });
    148         SideButton editButton = new SideButton(new AbstractAction() {
    149             {
    150                 putValue(NAME, tr("Edit"));
    151                 putValue(SHORT_DESCRIPTION, tr("Edit filter."));
    152                 new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this, true);
    153             }
    154 
    155             @Override
    156             public void actionPerformed(ActionEvent e) {
    157                 int index = userTable.getSelectionModel().getMinSelectionIndex();
    158                 if (index < 0) return;
    159                 Filter f = filterModel.getFilter(index);
    160                 SearchSetting searchSetting = SearchAction.showSearchDialog(f);
    161                 if (searchSetting != null) {
    162                     filterModel.setFilter(index, new Filter(searchSetting));
    163                 }
    164             }
    165         });
    166         SideButton deleteButton = new SideButton(new AbstractAction() {
    167             {
    168                 putValue(NAME, tr("Delete"));
    169                 putValue(SHORT_DESCRIPTION, tr("Delete filter."));
    170                 new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this, true);
    171             }
    172 
    173             @Override
    174             public void actionPerformed(ActionEvent e) {
    175                 int index = userTable.getSelectionModel().getMinSelectionIndex();
    176                 if (index >= 0) {
    177                     filterModel.removeFilter(index);
    178                 }
    179             }
    180         });
    181         SideButton upButton = new SideButton(new AbstractAction() {
    182             {
    183                 putValue(NAME, tr("Up"));
    184                 putValue(SHORT_DESCRIPTION, tr("Move filter up."));
    185                 new ImageProvider("dialogs", "up").getResource().attachImageIcon(this, true);
    186             }
    187 
    188             @Override
    189             public void actionPerformed(ActionEvent e) {
    190                 int index = userTable.getSelectionModel().getMinSelectionIndex();
    191                 if (index >= 0) {
    192                     filterModel.moveUpFilter(index);
    193                     userTable.getSelectionModel().setSelectionInterval(index-1, index-1);
    194                 }
    195             }
    196         });
    197         SideButton downButton = new SideButton(new AbstractAction() {
    198             {
    199                 putValue(NAME, tr("Down"));
    200                 putValue(SHORT_DESCRIPTION, tr("Move filter down."));
    201                 new ImageProvider("dialogs", "down").getResource().attachImageIcon(this, true);
    202             }
    203 
    204             @Override
    205             public void actionPerformed(ActionEvent e) {
    206                 int index = userTable.getSelectionModel().getMinSelectionIndex();
    207                 if (index >= 0) {
    208                     filterModel.moveDownFilter(index);
    209                     userTable.getSelectionModel().setSelectionInterval(index+1, index+1);
    210                 }
    211             }
    212         });
    213273
    214274        // Toggle filter "enabled" on Enter
     
    218278                int index = userTable.getSelectedRow();
    219279                if (index >= 0) {
    220                     Filter filter = filterModel.getFilter(index);
     280                    Filter filter = filterModel.getValue(index);
    221281                    filterModel.setValueAt(!filter.enable, index, FilterTableModel.COL_ENABLED);
    222282                }
     
    230290                int index = userTable.getSelectedRow();
    231291                if (index >= 0) {
    232                     Filter filter = filterModel.getFilter(index);
     292                    Filter filter = filterModel.getValue(index);
    233293                    filterModel.setValueAt(!filter.hiding, index, FilterTableModel.COL_HIDING);
    234294                }
     
    236296        });
    237297
    238         createLayout(userTable, true, Arrays.asList(
    239                 addButton, editButton, deleteButton, upButton, downButton
    240         ));
     298        List<FilterAction> actions = Arrays.asList(addAction, editAction, deleteAction, moveUpAction, moveDownAction, sortAction, reverseAction);
     299        for (FilterAction action : actions) {
     300            TableHelper.adaptTo(action, filterModel);
     301            TableHelper.adaptTo(action, filterModel.getSelectionModel());
     302            action.updateEnabledState();
     303        }
     304        createLayout(userTable, true, actions.stream().map(a -> new SideButton(a, false)).collect(Collectors.toList()));
    241305    }
    242306
     
    384448
    385449            for (int i = 0; i < filterModel.getRowCount(); i++) {
    386                 Filter filter = filterModel.getFilter(i);
    387                 MultikeyInfo info = new MultikeyInfo(i, filter.text);
    388                 result.add(info);
     450                result.add(new MultikeyInfo(i, filterModel.getValue(i).text));
    389451            }
    390452
     
    420482        public void executeMultikeyAction(int index, boolean repeatLastAction) {
    421483            if (index >= 0 && index < filterModel.getRowCount()) {
    422                 Filter filter = filterModel.getFilter(index);
     484                Filter filter = filterModel.getValue(index);
    423485                filterModel.setValueAt(!filter.enable, index, FilterTableModel.COL_ENABLED);
    424486                lastFilter = filter;
     
    444506        public void executeMultikeyAction(int index, boolean repeatLastAction) {
    445507            if (index >= 0 && index < filterModel.getRowCount()) {
    446                 Filter filter = filterModel.getFilter(index);
     508                Filter filter = filterModel.getValue(index);
    447509                filterModel.setValueAt(!filter.hiding, index, FilterTableModel.COL_HIDING);
    448510                lastFilter = filter;
Note: See TracChangeset for help on using the changeset viewer.