Changeset 3210 in josm
- Timestamp:
- 2010-04-26T23:25:10+02:00 (13 years ago)
- Location:
- trunk/src/org/openstreetmap/josm
- Files:
-
- 1 deleted
- 20 edited
- 3 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
r3190 r3210 19 19 import org.openstreetmap.josm.data.osm.RelationMember; 20 20 import org.openstreetmap.josm.data.osm.Way; 21 22 /** 23 * A ReverseWayTagCorrector handles necessary corrections of tags 24 * when a way is reversed. E.g. oneway=yes needs to be changed 25 * to oneway=-1 and vice versa. 26 * 27 * The Corrector offers the automatic resolution in an dialog 28 * for the user to confirm. 29 */ 21 30 22 31 public class ReverseWayTagCorrector extends TagCorrector<Way> { -
trunk/src/org/openstreetmap/josm/corrector/TagCorrection.java
r3083 r3210 2 2 package org.openstreetmap.josm.corrector; 3 3 4 /** 5 * TagCorrection reprepresents a change of a single 6 * tag. Both key and value can be subject of this change. 7 */ 4 8 public class TagCorrection implements Correction { 5 9 -
trunk/src/org/openstreetmap/josm/corrector/TagCorrector.java
r3083 r3210 34 34 import org.openstreetmap.josm.tools.ImageProvider; 35 35 36 /** 37 * Abstract base class for automatic tag corrections. 38 * 39 * Subclasses call applyCorrections() with maps of the requested 40 * corrections and a dialog is pesented to the user to 41 * confirm these changes. 42 */ 43 36 44 public abstract class TagCorrector<P extends OsmPrimitive> { 37 45 -
trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
r3207 r3210 28 28 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent; 29 29 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; 30 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 30 31 import org.openstreetmap.josm.tools.Predicate; 31 32 … … 68 69 public int getHighlightUpdateCount() { 69 70 return highlightUpdateCount; 71 } 72 73 /** 74 * Maintain a list of used tags for autocompletion 75 */ 76 private AutoCompletionManager autocomplete; 77 78 public AutoCompletionManager getAutoCompletionManager() { 79 if (autocomplete == null) { 80 autocomplete = new AutoCompletionManager(this); 81 addDataSetListener(autocomplete); 82 } 83 return autocomplete; 70 84 } 71 85 -
trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java
r3083 r3210 1 package org.openstreetmap.josm.data.osm.event; 1 2 /* 2 3 * JOSMng - a Java Open Street Map editor, the next generation. … … 19 20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 20 21 */ 21 22 package org.openstreetmap.josm.data.osm.event;23 22 24 23 /** -
trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java
r3083 r3210 33 33 import org.openstreetmap.josm.data.osm.OsmPrimitive; 34 34 import org.openstreetmap.josm.gui.JMultilineLabel; 35 import org.openstreetmap.josm.gui.tagging.AutoCompletingTextField; 36 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 35 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 37 36 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 37 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 38 38 import org.openstreetmap.josm.tools.ImageProvider; 39 39 … … 183 183 184 184 public void prepareForEditing() { 185 AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).initFromDataSet();186 185 AutoCompletionList acList = new AutoCompletionList(); 187 AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(acList);186 Main.main.getEditLayer().data.getAutoCompletionManager().populateWithMemberRoles(acList); 188 187 tfRole.setAutoCompletionList(acList); 189 188 AutoCompletingTextField editor = (AutoCompletingTextField) tblResolver.getColumnModel().getColumn(2).getCellEditor(); … … 192 191 } 193 192 AutoCompletionList acList2 = new AutoCompletionList(); 194 AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithKeys(acList2, false /* don'tappend */);193 Main.main.getEditLayer().data.getAutoCompletionManager().populateWithKeys(acList2); 195 194 tfKey.setAutoCompletionList(acList2); 196 195 } -
trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverColumnModel.java
r3083 r3210 8 8 9 9 import org.openstreetmap.josm.gui.OsmPrimitivRenderer; 10 import org.openstreetmap.josm.gui.tagging. AutoCompletingTextField;10 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 11 11 12 12 public class RelationMemberConflictResolverColumnModel extends DefaultTableColumnModel{ -
trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
r3202 r3210 23 23 import java.util.Collection; 24 24 import java.util.Collections; 25 import java.util.Comparator; 25 26 import java.util.HashMap; 26 27 import java.util.HashSet; … … 79 80 import org.openstreetmap.josm.gui.preferences.TaggingPresetPreference; 80 81 import org.openstreetmap.josm.gui.tagging.TaggingPreset; 81 import org.openstreetmap.josm.gui.widgets.AutoCompleteComboBox; 82 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox; 83 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 82 84 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 83 85 import org.openstreetmap.josm.tools.GBC; … … 145 147 146 148 private final Map<String, Map<String, Integer>> valueCount = new TreeMap<String, Map<String, Integer>>(); 147 private final ListOfUsedTags listOfUsedTags = new ListOfUsedTags(); 149 150 Comparator<String> defaultKeyComparator = String.CASE_INSENSITIVE_ORDER; 151 Comparator<String> defaultValueComparator = String.CASE_INSENSITIVE_ORDER; 148 152 149 153 private DataSetListenerAdapter dataChangedAdapter = new DataSetListenerAdapter(this); … … 151 155 @Override 152 156 public void showNotify() { 153 DatasetEventManager.getInstance().addDatasetListener(listOfUsedTags, FireMode.IMMEDIATELY);154 157 DatasetEventManager.getInstance().addDatasetListener(dataChangedAdapter, FireMode.IN_EDT_CONSOLIDATED); 155 listOfUsedTags.rebuildNecessary();156 158 SelectionEventManager.getInstance().addSelectionListener(this, FireMode.IN_EDT_CONSOLIDATED); 157 159 MapView.addEditLayerChangeListener(this); … … 161 163 @Override 162 164 public void hideNotify() { 163 DatasetEventManager.getInstance().removeDatasetListener(listOfUsedTags);164 165 DatasetEventManager.getInstance().removeDatasetListener(dataChangedAdapter); 165 166 SelectionEventManager.getInstance().removeSelectionListener(this); … … 189 190 panel.add(p, BorderLayout.CENTER); 190 191 191 final AutoCompleteComboBox keys = new AutoCompleteComboBox(); 192 keys.setPossibleItems(listOfUsedTags.getUsedKeys()); 192 AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager(); 193 194 final AutoCompletingComboBox keys = new AutoCompletingComboBox(); 195 keys.setPossibleItems(autocomplete.getKeys(defaultKeyComparator)); 193 196 keys.setEditable(true); 194 197 keys.setSelectedItem(key); … … 198 201 p.add(keys, GBC.eol().fill(GBC.HORIZONTAL)); 199 202 200 final AutoComplet eComboBox values = new AutoCompleteComboBox();203 final AutoCompletingComboBox values = new AutoCompletingComboBox(); 201 204 values.setRenderer(new DefaultListCellRenderer() { 202 205 @Override public Component getListCellRendererComponent(JList list, … … 220 223 }); 221 224 values.setEditable(true); 222 values.setPossibleItems( listOfUsedTags.getUsedValues(key));225 values.setPossibleItems(autocomplete.getValues(key, defaultValueComparator)); 223 226 Map<String, Integer> m=(Map<String, Integer>)propertyData.getValueAt(row, 1); 224 227 final String selection= m.size()!=1?tr("<different>"):m.entrySet().iterator().next().getKey(); … … 228 231 p.add(Box.createHorizontalStrut(10), GBC.std()); 229 232 p.add(values, GBC.eol().fill(GBC.HORIZONTAL)); 230 addFocusAdapter(row, keys, values );233 addFocusAdapter(row, keys, values, autocomplete); 231 234 232 235 final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION) { … … 339 342 "This will change up to {0} objects.", sel.size(),sel.size()) 340 343 +"<br><br>"+tr("Please select a key")), BorderLayout.NORTH); 341 final AutoCompleteComboBox keys = new AutoCompleteComboBox(); 342 List<String> usedKeys = new ArrayList<String>(listOfUsedTags.getUsedKeys()); 344 final AutoCompletingComboBox keys = new AutoCompletingComboBox(); 345 AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager(); 346 List<String> usedKeys = 347 new ArrayList<String>(autocomplete.getKeys(defaultKeyComparator)); 343 348 for (int i = 0; i < propertyData.getRowCount(); ++i) { 344 349 usedKeys.remove(propertyData.getValueAt(i, 0)); … … 352 357 p.add(p2, BorderLayout.SOUTH); 353 358 p2.add(new JLabel(tr("Please select a value")), BorderLayout.NORTH); 354 final AutoComplet eComboBox values = new AutoCompleteComboBox();359 final AutoCompletingComboBox values = new AutoCompletingComboBox(); 355 360 values.setEditable(true); 356 361 p2.add(values, BorderLayout.CENTER); 357 362 358 addFocusAdapter(-1, keys, values); 363 FocusAdapter focus = addFocusAdapter(-1, keys, values, autocomplete); 364 // fire focus event in advance or otherwise the popup list will be too small at first 365 focus.focusGained(null); 366 359 367 JOptionPane pane = new JOptionPane(p, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION){ 360 368 @Override public void selectInitialValue() { … … 381 389 * @param values 382 390 */ 383 private void addFocusAdapter(final int row, final AutoCompleteComboBox keys, final AutoCompleteComboBox values) {391 private FocusAdapter addFocusAdapter(final int row, final AutoCompletingComboBox keys, final AutoCompletingComboBox values, final AutoCompletionManager autocomplete) { 384 392 // get the combo box' editor component 385 393 JTextComponent editor = (JTextComponent)values.getEditor() 386 394 .getEditorComponent(); 387 395 // Refresh the values model when focus is gained 388 editor.addFocusListener(new FocusAdapter() {396 FocusAdapter focus = new FocusAdapter() { 389 397 @Override public void focusGained(FocusEvent e) { 390 398 String key = keys.getEditor().getItem().toString(); 391 values.setPossibleItems( listOfUsedTags.getUsedValues(key));399 values.setPossibleItems(autocomplete.getValues(key, defaultValueComparator)); 392 400 objKey=key; 393 401 } 394 }); 402 }; 403 editor.addFocusListener(focus); 404 return focus; 395 405 } 396 406 private String objKey; -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
r3202 r3210 66 66 import org.openstreetmap.josm.gui.help.HelpUtil; 67 67 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 68 import org.openstreetmap.josm.gui.tagging.AutoCompletingTextField;69 68 import org.openstreetmap.josm.gui.tagging.TagEditorPanel; 70 import org.openstreetmap.josm.gui.tagging.ac.AutoCompleti onCache;69 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 71 70 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 71 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 72 72 import org.openstreetmap.josm.tools.ImageProvider; 73 73 import org.openstreetmap.josm.tools.Shortcut; … … 111 111 setRememberWindowGeometry(getClass().getName() + ".geometry", 112 112 WindowGeometry.centerInWindow(Main.parent, new Dimension(700, 650))); 113 114 // initialize the autocompletion infrastructure115 //116 AutoCompletionCache.getCacheForLayer(getLayer()).initFromDataSet();117 113 118 114 // init the various models … … 310 306 public void focusGained(FocusEvent e) { 311 307 AutoCompletionList list = tfRole.getAutoCompletionList(); 312 AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(list);308 getLayer().data.getAutoCompletionManager().populateWithMemberRoles(list); 313 309 } 314 310 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java
r3083 r3210 10 10 11 11 import org.openstreetmap.josm.Main; 12 import org.openstreetmap.josm.gui.tagging.AutoCompletingTextField; 13 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 12 import org.openstreetmap.josm.data.osm.DataSet; 13 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 14 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 14 15 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 15 16 … … 19 20 20 21 private AutoCompletingTextField editor = null; 22 private DataSet ds; 21 23 22 24 /** user input is matched against this list of auto completion items */ … … 26 28 * constructor 27 29 */ 28 public MemberRoleCellEditor() { 30 public MemberRoleCellEditor(DataSet ds) { 31 this.ds = ds; 29 32 editor = new AutoCompletingTextField(); 30 33 autoCompletionList = new AutoCompletionList(); … … 40 43 String role = (String)value; 41 44 editor.setText(role); 42 AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(autoCompletionList);45 ds.getAutoCompletionManager().populateWithMemberRoles(autoCompletionList); 43 46 return editor; 44 47 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
r3083 r3210 48 48 */ 49 49 public MemberTable(OsmDataLayer layer, MemberTableModel model) { 50 super(model, new MemberTableColumnModel( ), model.getSelectionModel());50 super(model, new MemberTableColumnModel(layer.data), model.getSelectionModel()); 51 51 this.layer = layer; 52 52 model.addMemberModelListener(this); -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableColumnModel.java
r3083 r3210 7 7 import javax.swing.table.TableColumn; 8 8 9 import org.openstreetmap.josm.data.osm.DataSet; 10 9 11 public class MemberTableColumnModel extends DefaultTableColumnModel { 10 12 11 public MemberTableColumnModel( ) {13 public MemberTableColumnModel(DataSet ds) { 12 14 TableColumn col = null; 13 15 … … 18 20 col.setPreferredWidth(100); 19 21 col.setCellRenderer(new MemberTableRoleCellRenderer()); 20 col.setCellEditor(new MemberRoleCellEditor( ));22 col.setCellEditor(new MemberRoleCellEditor(ds)); 21 23 addColumn(col); 22 24 -
trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java
r2946 r3210 21 21 import org.openstreetmap.josm.gui.tagging.TaggingPresetMenu; 22 22 import org.openstreetmap.josm.gui.tagging.TaggingPresetSeparator; 23 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletion Cache;23 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 24 24 import org.openstreetmap.josm.tools.GBC; 25 25 … … 88 88 else 89 89 { 90 AutoCompletion Cache.cachePresets(taggingPresets);90 AutoCompletionManager.cachePresets(taggingPresets); 91 91 HashMap<TaggingPresetMenu,JMenu> submenus = new HashMap<TaggingPresetMenu,JMenu>(); 92 92 for (final TaggingPreset p : taggingPresets) -
trunk/src/org/openstreetmap/josm/gui/tagging/TagCellEditor.java
r3083 r3210 9 9 import javax.swing.table.TableCellEditor; 10 10 11 import org.openstreetmap.josm.gui.tagging.ac.AutoCompleti onCache;11 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 12 12 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 13 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 13 14 14 15 /** … … 26 27 27 28 /** the cache of auto completion items derived from the current JOSM data set */ 28 protected AutoCompletion Cache acCache = null;29 protected AutoCompletionManager autocomplete = null; 29 30 30 31 /** user input is matched against this list of auto completion items */ … … 36 37 public TagCellEditor() { 37 38 editor = new AutoCompletingTextField(); 38 acCache = new AutoCompletionCache();39 39 } 40 40 … … 58 58 // add the list of keys in the current data set 59 59 // 60 a cCache.populateWithKeys(autoCompletionList, true);60 autocomplete.populateWithKeys(autoCompletionList); 61 61 62 62 // remove the keys already present in the current tag model … … 83 83 return; 84 84 } 85 acCache.populateWithTagValues(autoCompletionList, forKey, false); 85 autoCompletionList.clear(); 86 autocomplete.populateWithTagValues(autoCompletionList, forKey); 86 87 } 87 88 … … 137 138 } 138 139 139 public void setAutoCompletion Cache(AutoCompletionCache acCache) {140 this.a cCache = acCache;140 public void setAutoCompletionManager(AutoCompletionManager autocomplete) { 141 this.autocomplete = autocomplete; 141 142 } 142 143 -
trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java
r3141 r3210 14 14 15 15 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 16 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache;17 16 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 17 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 18 18 import org.openstreetmap.josm.tools.CheckParameterUtil; 19 19 … … 33 33 private TagTable tagTable; 34 34 35 private AutoCompletion Cache acCache;35 private AutoCompletionManager autocomplete; 36 36 private AutoCompletionList acList; 37 37 … … 141 141 public void initAutoCompletion(OsmDataLayer layer) throws IllegalArgumentException{ 142 142 CheckParameterUtil.ensureParameterNotNull(layer, "layer"); 143 // initialize the autocompletion infrastructure 144 // 145 acCache = AutoCompletionCache.getCacheForLayer(layer); 146 acCache.initFromDataSet(); 143 144 autocomplete = layer.data.getAutoCompletionManager(); 147 145 acList = new AutoCompletionList(); 148 146 149 147 TagCellEditor editor = ((TagCellEditor) tagTable.getColumnModel().getColumn(0).getCellEditor()); 150 editor.setAutoCompletion Cache(acCache);148 editor.setAutoCompletionManager(autocomplete); 151 149 editor.setAutoCompletionList(acList); 152 150 editor = ((TagCellEditor) tagTable.getColumnModel().getColumn(1).getCellEditor()); 153 editor.setAutoCompletion Cache(acCache);151 editor.setAutoCompletionManager(autocomplete); 154 152 editor.setAutoCompletionList(acList); 155 153 } -
trunk/src/org/openstreetmap/josm/gui/tagging/TagTable.java
r3141 r3210 41 41 42 42 import org.openstreetmap.josm.gui.dialogs.relation.RunnableAction; 43 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletion Cache;43 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 44 44 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 45 45 import org.openstreetmap.josm.tools.ImageProvider; … … 406 406 } 407 407 408 public void setAutoCompletion Cache(AutoCompletionCache acCache) {409 if (a cCache == null) {410 logger.warning("argument a cCache should not be null. Aborting.");408 public void setAutoCompletionManager(AutoCompletionManager autocomplete) { 409 if (autocomplete == null) { 410 logger.warning("argument autocomplete should not be null. Aborting."); 411 411 return; 412 412 } 413 413 if (editor != null) { 414 editor.setAutoCompletion Cache(acCache);414 editor.setAutoCompletionManager(autocomplete); 415 415 } 416 416 } -
trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
r3024 r3210 51 51 import org.openstreetmap.josm.gui.layer.Layer; 52 52 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 53 import org.openstreetmap.josm.gui.tagging.ac.AutoCompleti onCache;53 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 54 54 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionItemPritority; 55 55 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 56 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 56 57 import org.openstreetmap.josm.io.MirroredInputStream; 57 58 import org.openstreetmap.josm.tools.GBC; … … 82 83 if (layer == null) return; 83 84 AutoCompletionList list = new AutoCompletionList(); 84 AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithTagValues(list, key, false);85 Main.main.getEditLayer().data.getAutoCompletionManager().populateWithTagValues(list, key); 85 86 field.setAutoCompletionList(list); 86 87 } … … 696 697 return null; 697 698 OsmDataLayer layer = Main.main.getEditLayer(); 698 if (layer != null) {699 AutoCompletionCache.getCacheForLayer(layer).initFromDataSet();700 }701 699 PresetPanel p = new PresetPanel(); 702 700 LinkedList<Item> l = new LinkedList<Item>(); -
trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java
r3208 r3210 1 1 // License: GPL. Copyright 2007 by Immanuel Scholz and others 2 package org.openstreetmap.josm.gui. widgets;2 package org.openstreetmap.josm.gui.tagging.ac; 3 3 4 4 import java.awt.event.FocusEvent; … … 17 17 * @author guilhem.bonnefille@gmail.com 18 18 */ 19 public class AutoComplet eComboBox extends JComboBox {19 public class AutoCompletingComboBox extends JComboBox { 20 20 21 21 private boolean autocompleteEnabled = true; … … 26 26 * Inspired by http://www.orbital-computer.de/JComboBox/ 27 27 */ 28 class AutoComplet eComboBoxDocument extends PlainDocument {28 class AutoCompletingComboBoxDocument extends PlainDocument { 29 29 private JComboBox comboBox; 30 30 private boolean selecting = false; 31 31 32 public AutoComplet eComboBoxDocument(final JComboBox comboBox) {32 public AutoCompletingComboBoxDocument(final JComboBox comboBox) { 33 33 this.comboBox = comboBox; 34 34 } … … 98 98 } 99 99 100 public AutoComplet eComboBox() {100 public AutoCompletingComboBox() { 101 101 final JTextComponent editor = (JTextComponent) this.getEditor().getEditorComponent(); 102 editor.setDocument(new AutoComplet eComboBoxDocument(this));102 editor.setDocument(new AutoCompletingComboBoxDocument(this)); 103 103 editor.addFocusListener( 104 104 new FocusListener() { -
trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingTextField.java
r3208 r3210 1 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.gui.tagging ;2 package org.openstreetmap.josm.gui.tagging.ac; 3 3 4 4 import java.awt.Component; -
trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionList.java
r3083 r3210 1 // License: GPL. For details, see LICENSE file. 1 2 package org.openstreetmap.josm.gui.tagging.ac; 2 3 … … 297 298 System.out.println("---------------------------------"); 298 299 for (AutoCompletionListItem item: list) { 299 System.out.println(item .getValue());300 System.out.println(item); 300 301 } 301 302 System.out.println("---------------------------------"); -
trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionListItem.java
r3083 r3210 72 72 @Override public String toString() { 73 73 StringBuilder sb = new StringBuilder(); 74 sb.append("<AutoCompletionItemPritority: "); 75 sb.append("value='"); 74 sb.append("<val='"); 76 75 sb.append(value); 77 76 sb.append("',"); 78 sb.append("priority='");79 77 sb.append(priority.toString()); 80 sb.append(" '>");78 sb.append(">"); 81 79 return sb.toString(); 82 80 } -
trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java
r3208 r3210 1 // License: GPL. For details, see LICENSE file. 1 2 package org.openstreetmap.josm.gui.tagging.ac; 2 3 3 4 import java.util.ArrayList; 4 5 import java.util.Collection; 5 import java.util.HashMap; 6 import java.util.Comparator; 7 import java.util.Collections; 6 8 import java.util.HashSet; 7 9 import java.util.List; 10 import java.util.Map; 11 import java.util.Map.Entry; 8 12 import java.util.Set; 13 import java.util.TreeSet; 9 14 import java.util.logging.Logger; 10 15 … … 13 18 import org.openstreetmap.josm.data.osm.Relation; 14 19 import org.openstreetmap.josm.data.osm.RelationMember; 20 import org.openstreetmap.josm.data.osm.DataSet; 21 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; 22 import org.openstreetmap.josm.data.osm.event.DataChangedEvent; 23 import org.openstreetmap.josm.data.osm.event.DataSetListener; 24 import org.openstreetmap.josm.data.osm.event.NodeMovedEvent; 25 import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent; 26 import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent; 27 import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent; 28 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent; 29 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; 15 30 import org.openstreetmap.josm.gui.MapView; 16 31 import org.openstreetmap.josm.gui.layer.Layer; … … 20 35 21 36 /** 22 * AutoCompletion Cache temporarilyholds a cache of keys with a list of37 * AutoCompletionManager holds a cache of keys with a list of 23 38 * possible auto completion values for each key. 24 39 * 25 * The cache can initialize itself from the current JOSM data setsuch that40 * Each DataSet is assigned one AutoCompletionManager instance such that 26 41 * <ol> 27 42 * <li>any key used in a tag in the data set is part of the key list in the cache</li> … … 35 50 * field is not efficient enough, hence this cache. 36 51 * 52 * TODO: respect the relation type for member role autocompletion 37 53 */ 38 public class AutoCompletionCache { 39 @SuppressWarnings("unused") 40 static private final Logger logger = Logger.getLogger(AutoCompletionCache.class.getName()); 41 42 private static HashMap<OsmDataLayer, AutoCompletionCache> caches; 43 44 static { 45 caches = new HashMap<OsmDataLayer, AutoCompletionCache>(); 46 MapView.addLayerChangeListener(new MapView.LayerChangeListener() { 47 public void activeLayerChange(Layer oldLayer, Layer newLayer) { 48 // do nothing 49 } 50 51 public void layerAdded(Layer newLayer) { 52 // do noting 53 } 54 55 public void layerRemoved(Layer oldLayer) { 56 if (oldLayer instanceof OsmDataLayer) { 57 caches.remove(oldLayer); 58 } 59 } 60 } 61 ); 62 } 63 64 static public AutoCompletionCache getCacheForLayer(OsmDataLayer layer) { 65 AutoCompletionCache cache = caches.get(layer); 66 if (cache == null) { 67 cache = new AutoCompletionCache(layer); 68 caches.put(layer, cache); 69 } 70 return cache; 71 } 72 73 /** the cached tags given by a tag key and a list of values for this tag */ 74 private MultiMap<String, String> tagCache; 75 /** the layer this cache is built for */ 76 private OsmDataLayer layer; 77 /** the same as tagCache but for the preset keys and values */ 78 private static MultiMap<String, String> presetTagCache = new MultiMap<String, String>(); 79 /** the cached list of member roles */ 80 private Set<String> roleCache; 81 82 /** 83 * constructor 84 */ 85 public AutoCompletionCache(OsmDataLayer layer) { 54 public class AutoCompletionManager implements DataSetListener { 55 56 /** If the dirty flag is set true, a rebuild is necessary. */ 57 protected boolean dirty; 58 /** The data set that is managed */ 59 protected DataSet ds; 60 61 /** 62 * the cached tags given by a tag key and a list of values for this tag 63 * only accessed by getTagCache(), rebuild() and cachePrimitiveTags() 64 * use getTagCache() accessor 65 */ 66 protected MultiMap<String, String> tagCache; 67 /** 68 * the same as tagCache but for the preset keys and values 69 * can be accessed directly 70 */ 71 protected static MultiMap<String, String> presetTagCache = new MultiMap<String, String>(); 72 /** 73 * the cached list of member roles 74 * only accessed by getRoleCache(), rebuild() and cacheRelationMemberRoles() 75 * use getRoleCache() accessor 76 */ 77 protected Set<String> roleCache; 78 79 public AutoCompletionManager(DataSet ds) { 80 this.ds = ds; 81 dirty = true; 82 } 83 84 protected MultiMap<String, String> getTagCache() { 85 if (dirty) { 86 rebuild(); 87 dirty = false; 88 } 89 return tagCache; 90 } 91 92 protected Set<String> getRoleCache() { 93 if (dirty) { 94 rebuild(); 95 dirty = false; 96 } 97 return roleCache; 98 } 99 100 /** 101 * initializes the cache from the primitives in the dataset 102 * 103 */ 104 protected void rebuild() { 86 105 tagCache = new MultiMap<String, String>(); 87 106 roleCache = new HashSet<String>(); 88 this.layer = layer; 89 } 90 91 public AutoCompletionCache() { 92 this(null); 107 cachePrimitives(ds.allNonDeletedCompletePrimitives()); 108 } 109 110 protected void cachePrimitives(Collection<? extends OsmPrimitive> primitives) { 111 for (OsmPrimitive primitive : primitives) { 112 cachePrimitiveTags(primitive); 113 if (primitive instanceof Relation) { 114 cacheRelationMemberRoles((Relation) primitive); 115 } 116 } 93 117 } 94 118 … … 99 123 * @param primitive an OSM primitive 100 124 */ 101 protected void cachePrimitive (OsmPrimitive primitive) {125 protected void cachePrimitiveTags(OsmPrimitive primitive) { 102 126 for (String key: primitive.keySet()) { 103 127 String value = primitive.get(key); … … 113 137 protected void cacheRelationMemberRoles(Relation relation){ 114 138 for (RelationMember m: relation.getMembers()) { 115 if (m.hasRole() && !roleCache.contains(m.getRole())) {139 if (m.hasRole()) { 116 140 roleCache.add(m.getRole()); 117 141 } 118 }119 }120 121 /**122 * initializes the cache from the primitives in the dataset of123 * {@see #layer}124 *125 */126 public void initFromDataSet() {127 tagCache = new MultiMap<String, String>();128 if (layer == null)129 return;130 Collection<OsmPrimitive> ds = layer.data.allNonDeletedPrimitives();131 for (OsmPrimitive primitive : ds) {132 cachePrimitive(primitive);133 }134 for (Relation relation : layer.data.getRelations()) {135 if (relation.isIncomplete() || relation.isDeleted()) {136 continue;137 }138 cacheRelationMemberRoles(relation);139 142 } 140 143 } … … 187 190 */ 188 191 protected List<String> getDataKeys() { 189 return new ArrayList<String>( tagCache.keySet());192 return new ArrayList<String>(getTagCache().keySet()); 190 193 } 191 194 … … 194 197 } 195 198 199 public TreeSet<String> getKeys(Comparator<String> c) { 200 TreeSet<String> ret = new TreeSet<String>(c); 201 ret.addAll(getDataKeys()); 202 ret.addAll(getPresetKeys()); 203 return ret; 204 } 205 196 206 /** 197 207 * replies the auto completion values allowed for a specific key. Replies … … 202 212 */ 203 213 protected List<String> getDataValues(String key) { 204 return new ArrayList<String>( tagCache.getValues(key));214 return new ArrayList<String>(getTagCache().getValues(key)); 205 215 } 206 216 … … 209 219 } 210 220 221 public TreeSet<String> getValues(String key, Comparator<String> c) { 222 TreeSet<String> ret = new TreeSet<String>(c); 223 ret.addAll(getDataValues(key)); 224 ret.addAll(getPresetValues(key)); 225 return ret; 226 } 227 211 228 /** 212 229 * Replies the list of member roles … … 215 232 */ 216 233 public List<String> getMemberRoles() { 217 return new ArrayList<String>( roleCache);234 return new ArrayList<String>(getRoleCache()); 218 235 } 219 236 … … 226 243 public void populateWithMemberRoles(AutoCompletionList list) { 227 244 list.clear(); 228 list.add( roleCache, AutoCompletionItemPritority.IS_IN_DATASET);245 list.add(getRoleCache(), AutoCompletionItemPritority.IS_IN_DATASET); 229 246 } 230 247 … … 238 255 * in the list by the tag values 239 256 */ 240 public void populateWithTagValues(AutoCompletionList list, String key, boolean append) { 241 if (!append) { 242 list.clear(); 243 } 257 public void populateWithTagValues(AutoCompletionList list, String key) { 244 258 list.add(getDataValues(key), AutoCompletionItemPritority.IS_IN_DATASET); 245 259 list.add(getPresetValues(key), AutoCompletionItemPritority.IS_IN_STANDARD); … … 254 268 * in the list by the keys in the cache 255 269 */ 256 public void populateWithKeys(AutoCompletionList list, boolean append) { 257 if (!append) { 258 list.clear(); 259 } 270 public void populateWithKeys(AutoCompletionList list) { 260 271 list.add(getDataKeys(), AutoCompletionItemPritority.IS_IN_DATASET); 261 272 list.add(getPresetKeys(), AutoCompletionItemPritority.IS_IN_STANDARD); 262 273 } 274 275 /********************************************************* 276 * Implementation of the DataSetListener interface 277 * 278 **/ 279 280 public void primtivesAdded(PrimitivesAddedEvent event) { 281 cachePrimitives(event.getPrimitives()); 282 } 283 284 public void primtivesRemoved(PrimitivesRemovedEvent event) { 285 dirty = true; 286 } 287 288 public void tagsChanged(TagsChangedEvent event) { 289 Map<String, String> newKeys = event.getPrimitive().getKeys(); 290 Map<String, String> oldKeys = event.getOriginalKeys(); 291 292 if (!newKeys.keySet().containsAll(oldKeys.keySet())) { 293 // Some keys removed, might be the last instance of key, rebuild necessary 294 dirty = true; 295 } else { 296 for (Entry<String, String> oldEntry: oldKeys.entrySet()) { 297 if (!oldEntry.getValue().equals(newKeys.get(oldEntry.getKey()))) { 298 // Value changed, might be last instance of value, rebuild necessary 299 dirty = true; 300 return; 301 } 302 } 303 cachePrimitives(Collections.singleton(event.getPrimitive())); 304 } 305 } 306 307 public void nodeMoved(NodeMovedEvent event) {/* ignored */} 308 309 public void wayNodesChanged(WayNodesChangedEvent event) {/* ignored */} 310 311 public void relationMembersChanged(RelationMembersChangedEvent event) { 312 dirty = true; // TODO: not necessary to rebuid if a member is added 313 } 314 315 public void otherDatasetChange(AbstractDatasetChangedEvent event) {/* ignored */} 316 317 public void dataChanged(DataChangedEvent event) { 318 dirty = true; 319 } 263 320 } -
trunk/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java
r3083 r3210 6 6 import javax.swing.text.JTextComponent; 7 7 8 public class HistoryComboBox extends AutoCompleteComboBox { 8 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox; 9 10 public class HistoryComboBox extends AutoCompletingComboBox { 9 11 private ComboBoxHistory model; 10 12
Note: See TracChangeset
for help on using the changeset viewer.