Ignore:
Timestamp:
2016-01-09T12:00:51+01:00 (8 years ago)
Author:
simon04
Message:

fix #12224 - Dialog for "Search menu items"

This places the "Search menu items" functionality in the help menu
instead of placing a text field at the very right of the main menu.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java

    r9304 r9347  
    88import java.awt.Dimension;
    99import java.awt.event.ActionEvent;
    10 import java.awt.event.ActionListener;
    1110import java.awt.event.ItemEvent;
    1211import java.awt.event.ItemListener;
    13 import java.awt.event.KeyAdapter;
    14 import java.awt.event.KeyEvent;
    15 import java.awt.event.MouseAdapter;
    16 import java.awt.event.MouseEvent;
    1712import java.util.ArrayList;
    1813import java.util.Collection;
     
    2722
    2823import javax.swing.AbstractAction;
    29 import javax.swing.AbstractListModel;
    3024import javax.swing.Action;
    3125import javax.swing.BoxLayout;
     
    3731import javax.swing.JPanel;
    3832import javax.swing.JPopupMenu;
    39 import javax.swing.JScrollPane;
    4033import javax.swing.ListCellRenderer;
    41 import javax.swing.event.DocumentEvent;
    42 import javax.swing.event.DocumentListener;
    4334import javax.swing.event.ListSelectionEvent;
    4435import javax.swing.event.ListSelectionListener;
     
    5445import org.openstreetmap.josm.gui.tagging.presets.items.Roles;
    5546import org.openstreetmap.josm.gui.tagging.presets.items.Roles.Role;
    56 import org.openstreetmap.josm.gui.widgets.JosmTextField;
    5747import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
     48import org.openstreetmap.josm.gui.widgets.SearchTextResultListPanel;
    5849import org.openstreetmap.josm.tools.Predicate;
    5950import org.openstreetmap.josm.tools.Utils;
     
    6354 * @since 6068
    6455 */
    65 public class TaggingPresetSelector extends JPanel implements SelectionChangedListener {
     56public class TaggingPresetSelector extends SearchTextResultListPanel<TaggingPreset> implements SelectionChangedListener {
    6657
    6758    private static final int CLASSIFICATION_IN_FAVORITES = 300;
     
    7364    private static final BooleanProperty ONLY_APPLICABLE  = new BooleanProperty("taggingpreset.dialog.only-applicable-to-selection", true);
    7465
    75     private final JosmTextField edSearchText;
    76     private final JList<TaggingPreset> lsResult;
    7766    private final JCheckBox ckOnlyApplicable;
    7867    private final JCheckBox ckSearchInTags;
     
    8069    private boolean typesInSelectionDirty = true;
    8170    private final transient PresetClassifications classifications = new PresetClassifications();
    82     private final ResultListModel lsResultModel = new ResultListModel();
    83 
    84     private final transient List<ListSelectionListener> listSelectionListeners = new ArrayList<>();
    85 
    86     private transient ActionListener dblClickListener;
    87     private transient ActionListener clickListener;
    8871
    8972    private static class ResultListCellRenderer implements ListCellRenderer<TaggingPreset> {
     
    9679            result.setIcon((Icon) tp.getValue(Action.SMALL_ICON));
    9780            return result;
    98         }
    99     }
    100 
    101     private static class ResultListModel extends AbstractListModel<TaggingPreset> {
    102 
    103         private transient List<PresetClassification> presets = new ArrayList<>();
    104 
    105         public synchronized void setPresets(List<PresetClassification> presets) {
    106             this.presets = presets;
    107             fireContentsChanged(this, 0, Integer.MAX_VALUE);
    108         }
    109 
    110         @Override
    111         public synchronized TaggingPreset getElementAt(int index) {
    112             return presets.get(index).preset;
    113         }
    114 
    115         @Override
    116         public synchronized int getSize() {
    117             return presets.size();
    118         }
    119 
    120         public synchronized boolean isEmpty() {
    121             return presets.isEmpty();
    12281        }
    12382    }
     
    219178     */
    220179    public TaggingPresetSelector(boolean displayOnlyApplicable, boolean displaySearchInTags) {
    221         super(new BorderLayout());
     180        super();
     181        lsResult.setCellRenderer(new ResultListCellRenderer());
    222182        classifications.loadPresets(TaggingPresets.getTaggingPresets());
    223 
    224         edSearchText = new JosmTextField();
    225         edSearchText.getDocument().addDocumentListener(new DocumentListener() {
    226             @Override
    227             public void removeUpdate(DocumentEvent e) {
    228                 filterPresets();
    229             }
    230 
    231             @Override
    232             public void insertUpdate(DocumentEvent e) {
    233                 filterPresets();
    234             }
    235 
    236             @Override
    237             public void changedUpdate(DocumentEvent e) {
    238                 filterPresets();
    239             }
    240         });
    241         edSearchText.addKeyListener(new KeyAdapter() {
    242             @Override
    243             public void keyPressed(KeyEvent e) {
    244                 switch (e.getKeyCode()) {
    245                 case KeyEvent.VK_DOWN:
    246                     selectPreset(lsResult.getSelectedIndex() + 1);
    247                     break;
    248                 case KeyEvent.VK_UP:
    249                     selectPreset(lsResult.getSelectedIndex() - 1);
    250                     break;
    251                 case KeyEvent.VK_PAGE_DOWN:
    252                     selectPreset(lsResult.getSelectedIndex() + 10);
    253                     break;
    254                 case KeyEvent.VK_PAGE_UP:
    255                     selectPreset(lsResult.getSelectedIndex() - 10);
    256                     break;
    257                 case KeyEvent.VK_HOME:
    258                     selectPreset(0);
    259                     break;
    260                 case KeyEvent.VK_END:
    261                     selectPreset(lsResultModel.getSize());
    262                     break;
    263                 }
    264             }
    265         });
    266         add(edSearchText, BorderLayout.NORTH);
    267 
    268         lsResult = new JList<>(lsResultModel);
    269         lsResult.setCellRenderer(new ResultListCellRenderer());
    270         lsResult.addMouseListener(new MouseAdapter() {
    271             @Override
    272             public void mouseClicked(MouseEvent e) {
    273                 if (e.getClickCount() > 1) {
    274                     if (dblClickListener != null)
    275                         dblClickListener.actionPerformed(null);
    276                 } else {
    277                     if (clickListener != null)
    278                         clickListener.actionPerformed(null);
    279                 }
    280             }
    281         });
    282         add(new JScrollPane(lsResult), BorderLayout.CENTER);
    283183
    284184        JPanel pnChecks = new JPanel();
     
    292192                @Override
    293193                public void itemStateChanged(ItemEvent e) {
    294                     filterPresets();
     194                    filterItems();
    295195                }
    296196            });
     
    306206                @Override
    307207                public void itemStateChanged(ItemEvent e) {
    308                     filterPresets();
     208                    filterItems();
    309209                }
    310210            });
     
    317217
    318218        setPreferredSize(new Dimension(400, 300));
    319         filterPresets();
     219        filterItems();
    320220        JPopupMenu popupMenu = new JPopupMenu();
    321221        popupMenu.add(new AbstractAction(tr("Add toolbar button")) {
     
    331231    }
    332232
    333     private synchronized void selectPreset(int newIndex) {
    334         if (newIndex < 0) {
    335             newIndex = 0;
    336         }
    337         if (newIndex > lsResultModel.getSize() - 1) {
    338             newIndex = lsResultModel.getSize() - 1;
    339         }
    340         lsResult.setSelectedIndex(newIndex);
    341         lsResult.ensureIndexIsVisible(newIndex);
    342     }
    343 
    344233    /**
    345234     * Search expression can be in form: "group1/group2/name" where names can contain multiple words
    346235     */
    347     private synchronized void filterPresets() {
     236    @Override
     237    protected synchronized void filterItems() {
    348238        //TODO Save favorites to file
    349239        String text = edSearchText.getText().toLowerCase(Locale.ENGLISH);
     
    357247
    358248        final TaggingPreset oldPreset = lsResult.getSelectedValue();
    359         lsResultModel.setPresets(result);
     249        lsResultModel.setItems(Utils.transform(result, new Utils.Function<PresetClassification, TaggingPreset>() {
     250            @Override
     251            public TaggingPreset apply(PresetClassification x) {
     252                return x.preset;
     253            }
     254        }));
    360255        final TaggingPreset newPreset = lsResult.getSelectedValue();
    361256        if (!Objects.equals(oldPreset, newPreset)) {
     
    491386    }
    492387
     388    @Override
    493389    public synchronized void init() {
    494390        if (ckOnlyApplicable != null) {
     
    496392            ckOnlyApplicable.setSelected(!getTypesInSelection().isEmpty() && ONLY_APPLICABLE.get());
    497393        }
    498         listSelectionListeners.clear();
    499         edSearchText.setText("");
    500         filterPresets();
     394        super.init();
    501395    }
    502396
     
    505399        classifications.loadPresets(presets);
    506400        init();
    507     }
    508 
    509     public synchronized void clearSelection() {
    510         lsResult.getSelectionModel().clearSelection();
    511401    }
    512402
     
    547437        lsResult.setSelectedValue(p, true);
    548438    }
    549 
    550     public synchronized int getItemCount() {
    551         return lsResultModel.getSize();
    552     }
    553 
    554     public void setDblClickListener(ActionListener dblClickListener) {
    555         this.dblClickListener = dblClickListener;
    556     }
    557 
    558     public void setClickListener(ActionListener clickListener) {
    559         this.clickListener = clickListener;
    560     }
    561 
    562     /**
    563      * Adds a selection listener to the presets list.
    564      * @param selectListener The list selection listener
    565      * @since 7412
    566      */
    567     public synchronized void addSelectionListener(ListSelectionListener selectListener) {
    568         lsResult.getSelectionModel().addListSelectionListener(selectListener);
    569         listSelectionListeners.add(selectListener);
    570     }
    571 
    572     /**
    573      * Removes a selection listener from the presets list.
    574      * @param selectListener The list selection listener
    575      * @since 7412
    576      */
    577     public synchronized void removeSelectionListener(ListSelectionListener selectListener) {
    578         listSelectionListeners.remove(selectListener);
    579         lsResult.getSelectionModel().removeListSelectionListener(selectListener);
    580     }
    581439}
Note: See TracChangeset for help on using the changeset viewer.