Changeset 5616 in josm for trunk/src/org/openstreetmap/josm


Ignore:
Timestamp:
2012-12-09T23:35:59+01:00 (11 years ago)
Author:
simon04
Message:

Filtering for relation toggle dialog.

TODO: Disable shortcuts like a, s, when entering text to filter text field.

File:
1 edited

Legend:

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

    r5517 r5616  
    66import static org.openstreetmap.josm.tools.I18n.trn;
    77
     8import java.awt.BorderLayout;
     9import java.awt.Color;
    810import java.awt.Point;
    911import java.awt.event.ActionEvent;
     
    2830import javax.swing.JList;
    2931import javax.swing.JMenuItem;
     32import javax.swing.JPanel;
     33import javax.swing.JScrollPane;
     34import javax.swing.JTextField;
    3035import javax.swing.KeyStroke;
    3136import javax.swing.ListSelectionModel;
    3237import javax.swing.SwingUtilities;
     38import javax.swing.UIManager;
     39import javax.swing.event.DocumentEvent;
     40import javax.swing.event.DocumentListener;
    3341import javax.swing.event.ListSelectionEvent;
    3442import javax.swing.event.ListSelectionListener;
     
    3644
    3745import org.openstreetmap.josm.Main;
     46import org.openstreetmap.josm.actions.search.SearchCompiler;
    3847import org.openstreetmap.josm.command.Command;
    3948import org.openstreetmap.josm.command.SequenceCommand;
     
    6877import org.openstreetmap.josm.tools.ImageProvider;
    6978import org.openstreetmap.josm.tools.InputMapUtils;
     79import org.openstreetmap.josm.tools.Predicate;
    7080import org.openstreetmap.josm.tools.Shortcut;
     81import org.openstreetmap.josm.tools.Utils;
    7182
    7283/**
     
    142153        displaylist.addListSelectionListener(selectAction);
    143154
    144         createLayout(displaylist, true, Arrays.asList(new SideButton[] {
     155        final JTextField filter = new JTextField();
     156        filter.setToolTipText(tr("Relation list filter"));
     157        filter.getDocument().addDocumentListener(new DocumentListener() {
     158
     159            private void setFilter() {
     160                try {
     161                    filter.setBackground(UIManager.getColor("TextField.background"));
     162                    filter.setToolTipText(tr("Relation list filter"));
     163                    model.setFilter(SearchCompiler.compile(filter.getText(), false, false));
     164                } catch (SearchCompiler.ParseError ex) {
     165                    filter.setBackground(new Color(255, 224, 224));
     166                    filter.setToolTipText(ex.getMessage());
     167                    model.setFilter(new SearchCompiler.Always());
     168                }
     169            }
     170
     171            @Override
     172            public void insertUpdate(DocumentEvent e) {
     173                setFilter();
     174            }
     175
     176            @Override
     177            public void removeUpdate(DocumentEvent e) {
     178                setFilter();
     179            }
     180
     181            @Override
     182            public void changedUpdate(DocumentEvent e) {
     183                setFilter();
     184            }
     185        });
     186
     187        JPanel pane = new JPanel(new BorderLayout());
     188        pane.add(filter, BorderLayout.NORTH);
     189        pane.add(new JScrollPane(displaylist), BorderLayout.CENTER);
     190        createLayout(pane, false, Arrays.asList(new SideButton[]{
    145191                new SideButton(newAction, false),
    146192                new SideButton(editAction, false),
     
    643689    private class RelationListModel extends AbstractListModel {
    644690        private final ArrayList<Relation> relations = new ArrayList<Relation>();
     691        private ArrayList<Relation> filteredRelations;
    645692        private DefaultListSelectionModel selectionModel;
     693        private SearchCompiler.Match filter;
    646694
    647695        public RelationListModel(DefaultListSelectionModel selectionModel) {
     
    760808        }
    761809
     810        public void setFilter(final SearchCompiler.Match filter) {
     811            this.filter = filter;
     812            this.filteredRelations = new ArrayList<Relation>(Utils.filter(relations, new Predicate<Relation>() {
     813                @Override
     814                public boolean evaluate(Relation r) {
     815                    return filter.match(r);
     816                }
     817            }));
     818            List<Relation> sel = getSelectedRelations();
     819            fireContentsChanged(this, 0, getSize());
     820            setSelectedRelations(sel);
     821            updateTitle();
     822        }
     823
     824        private List<Relation> getVisibleRelations() {
     825            return filteredRelations == null ? relations : filteredRelations;
     826        }
     827
     828        @Override
    762829        public Object getElementAt(int index) {
    763             if (index < 0 || index >= relations.size()) return null;
    764             return relations.get(index);
    765         }
    766 
     830            if (index < 0 || index >= getVisibleRelations().size()) return null;
     831            return getVisibleRelations().get(index);
     832        }
     833
     834        @Override
    767835        public int getSize() {
    768             return relations.size();
     836            return getVisibleRelations().size();
    769837        }
    770838
     
    837905
    838906        public void updateTitle() {
    839             if (getSize() > 0) {
     907            if (relations.size() > 0 && relations.size() != getSize()) {
     908                RelationListDialog.this.setTitle(tr("Relations: {0}/{1}", getSize(), relations.size()));
     909            } else if (getSize() > 0) {
    840910                RelationListDialog.this.setTitle(tr("Relations: {0}", getSize()));
    841911            } else {
Note: See TracChangeset for help on using the changeset viewer.