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 , 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 8 8 import java.awt.Font; 9 9 import java.awt.GridBagLayout; 10 10 import java.awt.Point; 11 import java.awt.TextField; 11 12 import java.awt.event.ActionEvent; 12 13 import java.awt.event.InputEvent; 13 14 import java.awt.event.KeyEvent; 14 15 import java.awt.event.MouseAdapter; 15 16 import java.awt.event.MouseEvent; 17 import java.beans.PropertyChangeEvent; 18 import java.beans.PropertyChangeListener; 16 19 import java.net.HttpURLConnection; 17 20 import java.net.URI; 18 21 import java.net.URISyntaxException; … … 41 44 import javax.swing.JTable; 42 45 import javax.swing.KeyStroke; 43 46 import javax.swing.ListSelectionModel; 47 import javax.swing.RowFilter; 44 48 import javax.swing.event.ListSelectionEvent; 45 49 import javax.swing.event.ListSelectionListener; 46 50 import javax.swing.table.DefaultTableCellRenderer; 47 51 import javax.swing.table.DefaultTableModel; 48 52 import javax.swing.table.TableColumnModel; 49 53 import javax.swing.table.TableModel; 54 import javax.swing.table.TableRowSorter; 50 55 51 56 import org.openstreetmap.josm.Main; 52 57 import org.openstreetmap.josm.actions.JosmAction; … … 56 61 import org.openstreetmap.josm.actions.relation.SelectMembersAction; 57 62 import org.openstreetmap.josm.actions.relation.SelectRelationAction; 58 63 import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting; 64 import org.openstreetmap.josm.actions.search.SearchCompiler; 59 65 import org.openstreetmap.josm.command.ChangeCommand; 60 66 import org.openstreetmap.josm.command.ChangePropertyCommand; 61 67 import org.openstreetmap.josm.command.Command; … … 67 73 import org.openstreetmap.josm.data.osm.Relation; 68 74 import org.openstreetmap.josm.data.osm.RelationMember; 69 75 import org.openstreetmap.josm.data.osm.Tag; 76 import org.openstreetmap.josm.data.osm.Tagged; 70 77 import org.openstreetmap.josm.data.osm.Way; 71 78 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; 72 79 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter; … … 84 91 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor; 85 92 import org.openstreetmap.josm.gui.help.HelpUtil; 86 93 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 87 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;88 94 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset; 95 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler; 89 96 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType; 90 97 import org.openstreetmap.josm.gui.util.GuiHelper; 91 98 import org.openstreetmap.josm.gui.util.HighlightHelper; 99 import org.openstreetmap.josm.gui.widgets.CompileSearchTextDecorator; 100 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField; 101 import org.openstreetmap.josm.gui.widgets.JosmTextField; 92 102 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 93 103 import org.openstreetmap.josm.tools.GBC; 94 104 import org.openstreetmap.josm.tools.ImageProvider; … … 127 137 /** 128 138 * The tag data of selected objects. 129 139 */ 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; 131 143 132 144 /** 133 145 * The membership data of selected objects. … … public PropertiesDialog() { 242 254 setupMembershipMenu(); 243 255 buildMembershipTable(); 244 256 257 tagTableFilter = setupFilter(); 258 245 259 // combine both tables and wrap them in a scrollPane 246 260 boolean top = Main.pref.getBoolean("properties.presets.top", true); 247 261 bothTables.setLayout(new GridBagLayout()); … … public PropertiesDialog() { 251 265 bothTables.add(pluginHook, GBC.eol().insets(0, 1, 1, 1).anchor(GBC.NORTHEAST).weight(epsilon, epsilon)); 252 266 } 253 267 bothTables.add(selectSth, GBC.eol().fill().insets(10, 10, 10, 10)); 268 bothTables.add(tagTableFilter, GBC.eol().fill(GBC.HORIZONTAL)); 254 269 bothTables.add(tagTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL)); 255 270 bothTables.add(tagTable, GBC.eol().fill(GBC.BOTH)); 256 271 bothTables.add(membershipTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL)); … … private void buildTagsTable() { 293 308 PropertiesCellRenderer cellRenderer = new PropertiesCellRenderer(); 294 309 tagTable.getColumnModel().getColumn(0).setCellRenderer(cellRenderer); 295 310 tagTable.getColumnModel().getColumn(1).setCellRenderer(cellRenderer); 311 tagTable.setRowSorter(tagRowSorter); 296 312 } 297 313 298 314 private void buildMembershipTable() { … … private void setupTagsMenu() { 455 471 tagTable.addMouseListener(new PopupMenuLauncher(tagMenu)); 456 472 } 457 473 474 public void setFilter(final SearchCompiler.Match filter) { 475 this.tagRowSorter.setRowFilter(new SearchBasedRowFilter(filter)); 476 } 477 458 478 /** 459 479 * Assigns all needed keys like Enter and Spacebar to most important actions. 460 480 */ … … private void setupKeyboardShortcuts() { 499 519 getActionMap().put("onHelp", helpAction); 500 520 } 501 521 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 502 535 /** 503 536 * This simply fires up an {@link RelationEditor} for the relation shown; everything else 504 537 * is the editor's business. … … public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) { 685 718 deleteAction.setEnabled(hasTags || hasMemberships); 686 719 tagTable.setVisible(hasTags); 687 720 tagTable.getTableHeader().setVisible(hasTags); 721 tagTableFilter.setVisible(hasTags); 688 722 selectSth.setVisible(!hasSelection); 689 723 pluginHook.setVisible(hasSelection); 690 724 -
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. 2 package org.openstreetmap.josm.gui.dialogs.properties; 3 4 import java.util.Collection; 5 import java.util.Collections; 6 import java.util.Map; 7 8 import javax.swing.RowFilter; 9 import javax.swing.table.TableModel; 10 11 import org.openstreetmap.josm.actions.search.SearchCompiler; 12 import org.openstreetmap.josm.data.osm.Tagged; 13 14 public 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 }
