Ticket #9463: 0002-fix-9463-Properties-dialog-add-text-field-for-tag-fi.patch

File 0002-fix-9463-Properties-dialog-add-text-field-for-tag-fi.patch, 9.3 KB (added by simon04, 11 years ago)
  • src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java

    From 2b77243b1a6c750ca283e192efa2caf7d8e86ae4 Mon Sep 17 00:00:00 2001
    From: Simon Legner <Simon.Legner@gmail.com>
    Date: Sun, 18 Oct 2015 20:39:06 +0200
    Subject: [PATCH 2/2] fix #9463 - Properties dialog: add text field for tag
     filtering
    
    ---
     .../gui/dialogs/properties/PropertiesDialog.java   | 38 ++++++++++-
     .../dialogs/properties/SearchBasedRowFilter.java   | 78 ++++++++++++++++++++++
     2 files changed, 114 insertions(+), 2 deletions(-)
     create mode 100644 src/org/openstreetmap/josm/gui/dialogs/properties/SearchBasedRowFilter.java
    
    diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
    index 6142c9f..26d18dc 100644
    a b  
    88import java.awt.Font;
    99import java.awt.GridBagLayout;
    1010import java.awt.Point;
     11import java.awt.TextField;
    1112import java.awt.event.ActionEvent;
    1213import java.awt.event.InputEvent;
    1314import java.awt.event.KeyEvent;
    1415import java.awt.event.MouseAdapter;
    1516import java.awt.event.MouseEvent;
     17import java.beans.PropertyChangeEvent;
     18import java.beans.PropertyChangeListener;
    1619import java.net.HttpURLConnection;
    1720import java.net.URI;
    1821import java.net.URISyntaxException;
     
    4144import javax.swing.JTable;
    4245import javax.swing.KeyStroke;
    4346import javax.swing.ListSelectionModel;
     47import javax.swing.RowFilter;
    4448import javax.swing.event.ListSelectionEvent;
    4549import javax.swing.event.ListSelectionListener;
    4650import javax.swing.table.DefaultTableCellRenderer;
    4751import javax.swing.table.DefaultTableModel;
    4852import javax.swing.table.TableColumnModel;
    4953import javax.swing.table.TableModel;
     54import javax.swing.table.TableRowSorter;
    5055
    5156import org.openstreetmap.josm.Main;
    5257import org.openstreetmap.josm.actions.JosmAction;
     
    5661import org.openstreetmap.josm.actions.relation.SelectMembersAction;
    5762import org.openstreetmap.josm.actions.relation.SelectRelationAction;
    5863import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
     64import org.openstreetmap.josm.actions.search.SearchCompiler;
    5965import org.openstreetmap.josm.command.ChangeCommand;
    6066import org.openstreetmap.josm.command.ChangePropertyCommand;
    6167import org.openstreetmap.josm.command.Command;
     
    6773import org.openstreetmap.josm.data.osm.Relation;
    6874import org.openstreetmap.josm.data.osm.RelationMember;
    6975import org.openstreetmap.josm.data.osm.Tag;
     76import org.openstreetmap.josm.data.osm.Tagged;
    7077import org.openstreetmap.josm.data.osm.Way;
    7178import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
    7279import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter;
     
    8491import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
    8592import org.openstreetmap.josm.gui.help.HelpUtil;
    8693import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    87 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;
    8894import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
     95import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;
    8996import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
    9097import org.openstreetmap.josm.gui.util.GuiHelper;
    9198import org.openstreetmap.josm.gui.util.HighlightHelper;
     99import org.openstreetmap.josm.gui.widgets.CompileSearchTextDecorator;
     100import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
     101import org.openstreetmap.josm.gui.widgets.JosmTextField;
    92102import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
    93103import org.openstreetmap.josm.tools.GBC;
    94104import org.openstreetmap.josm.tools.ImageProvider;
     
    127137    /**
    128138     * The tag data of selected objects.
    129139     */
    130     private final DefaultTableModel tagData = new ReadOnlyTableModel();
     140    private final ReadOnlyTableModel tagData = new ReadOnlyTableModel();
     141    private final TableRowSorter<ReadOnlyTableModel> tagRowSorter = new TableRowSorter<>(tagData);
     142    private final JosmTextField tagTableFilter;
    131143
    132144    /**
    133145     * The membership data of selected objects.
    public PropertiesDialog() {  
    242254        setupMembershipMenu();
    243255        buildMembershipTable();
    244256
     257        tagTableFilter = setupFilter();
     258
    245259        // combine both tables and wrap them in a scrollPane
    246260        boolean top = Main.pref.getBoolean("properties.presets.top", true);
    247261        bothTables.setLayout(new GridBagLayout());
    public PropertiesDialog() {  
    251265            bothTables.add(pluginHook, GBC.eol().insets(0, 1, 1, 1).anchor(GBC.NORTHEAST).weight(epsilon, epsilon));
    252266        }
    253267        bothTables.add(selectSth, GBC.eol().fill().insets(10, 10, 10, 10));
     268        bothTables.add(tagTableFilter, GBC.eol().fill(GBC.HORIZONTAL));
    254269        bothTables.add(tagTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL));
    255270        bothTables.add(tagTable, GBC.eol().fill(GBC.BOTH));
    256271        bothTables.add(membershipTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL));
    private void buildTagsTable() {  
    293308        PropertiesCellRenderer cellRenderer = new PropertiesCellRenderer();
    294309        tagTable.getColumnModel().getColumn(0).setCellRenderer(cellRenderer);
    295310        tagTable.getColumnModel().getColumn(1).setCellRenderer(cellRenderer);
     311        tagTable.setRowSorter(tagRowSorter);
    296312    }
    297313
    298314    private void buildMembershipTable() {
    private void setupTagsMenu() {  
    455471        tagTable.addMouseListener(new PopupMenuLauncher(tagMenu));
    456472    }
    457473
     474    public void setFilter(final SearchCompiler.Match filter) {
     475        this.tagRowSorter.setRowFilter(new SearchBasedRowFilter(filter));
     476    }
     477
    458478    /**
    459479     * Assigns all needed keys like Enter and Spacebar to most important actions.
    460480     */
    private void setupKeyboardShortcuts() {  
    499519        getActionMap().put("onHelp", helpAction);
    500520    }
    501521
     522    private JosmTextField setupFilter() {
     523        final JosmTextField f = new DisableShortcutsOnFocusGainedTextField();
     524        f.setToolTipText(tr("Tag filter"));
     525        final CompileSearchTextDecorator decorator = CompileSearchTextDecorator.decorate(f);
     526        f.addPropertyChangeListener("filter", new PropertyChangeListener() {
     527            @Override
     528            public void propertyChange(PropertyChangeEvent evt) {
     529                setFilter(decorator.getMatch());
     530            }
     531        });
     532        return f;
     533    }
     534
    502535     /**
    503536     * This simply fires up an {@link RelationEditor} for the relation shown; everything else
    504537     * is the editor's business.
    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {  
    685718        deleteAction.setEnabled(hasTags || hasMemberships);
    686719        tagTable.setVisible(hasTags);
    687720        tagTable.getTableHeader().setVisible(hasTags);
     721        tagTableFilter.setVisible(hasTags);
    688722        selectSth.setVisible(!hasSelection);
    689723        pluginHook.setVisible(hasSelection);
    690724
  • new file src/org/openstreetmap/josm/gui/dialogs/properties/SearchBasedRowFilter.java

    diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/SearchBasedRowFilter.java b/src/org/openstreetmap/josm/gui/dialogs/properties/SearchBasedRowFilter.java
    new file mode 100644
    index 0000000..f14c527
    - +  
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.gui.dialogs.properties;
     3
     4import java.util.Collection;
     5import java.util.Collections;
     6import java.util.Map;
     7
     8import javax.swing.RowFilter;
     9import javax.swing.table.TableModel;
     10
     11import org.openstreetmap.josm.actions.search.SearchCompiler;
     12import org.openstreetmap.josm.data.osm.Tagged;
     13
     14public class SearchBasedRowFilter extends RowFilter<TableModel, Integer> {
     15
     16    final SearchCompiler.Match filter;
     17
     18    public SearchBasedRowFilter(SearchCompiler.Match filter) {
     19        this.filter = filter;
     20    }
     21
     22    @Override
     23    public boolean include(Entry entry) {
     24        final String key = entry.getStringValue(0);
     25        final String value = entry.getStringValue(1);
     26        return filter.match(new OneKeyValue(key, value));
     27    }
     28
     29    static class OneKeyValue implements Tagged {
     30        private final String key;
     31        private final String value;
     32
     33        public OneKeyValue(String key, String value) {
     34            this.key = key;
     35            this.value = value;
     36        }
     37
     38        @Override
     39        public void setKeys(Map<String, String> keys) {
     40            throw new UnsupportedOperationException();
     41        }
     42
     43        @Override
     44        public Map<String, String> getKeys() {
     45            return Collections.singletonMap(key, value);
     46        }
     47
     48        @Override
     49        public void put(String key, String value) {
     50            throw new UnsupportedOperationException();
     51        }
     52
     53        @Override
     54        public String get(String k) {
     55            return key.equals(k) ? value : null;
     56        }
     57
     58        @Override
     59        public void remove(String key) {
     60            throw new UnsupportedOperationException();
     61        }
     62
     63        @Override
     64        public boolean hasKeys() {
     65            return true;
     66        }
     67
     68        @Override
     69        public Collection<String> keySet() {
     70            return Collections.singleton(key);
     71        }
     72
     73        @Override
     74        public void removeAll() {
     75            throw new UnsupportedOperationException();
     76        }
     77    }
     78}