Changeset 3210 in josm


Ignore:
Timestamp:
26.04.2010 23:25:10 (2 years ago)
Author:
bastiK
Message:

autocompletion rework; breaks tageditor plugin and possibly other plugins
(merged the 2 autocompletion systems; adds presets values for the properties dialog )

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  
    1919import org.openstreetmap.josm.data.osm.RelationMember; 
    2020import 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 */ 
    2130 
    2231public class ReverseWayTagCorrector extends TagCorrector<Way> { 
  • trunk/src/org/openstreetmap/josm/corrector/TagCorrection.java

    r3083 r3210  
    22package org.openstreetmap.josm.corrector; 
    33 
     4/** 
     5 * TagCorrection reprepresents a change of a single 
     6 * tag. Both key and value can be subject of this change. 
     7 */ 
    48public class TagCorrection implements Correction { 
    59 
  • trunk/src/org/openstreetmap/josm/corrector/TagCorrector.java

    r3083 r3210  
    3434import org.openstreetmap.josm.tools.ImageProvider; 
    3535 
     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  
    3644public abstract class TagCorrector<P extends OsmPrimitive> { 
    3745 
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r3207 r3210  
    2828import org.openstreetmap.josm.data.osm.event.TagsChangedEvent; 
    2929import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; 
     30import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    3031import org.openstreetmap.josm.tools.Predicate; 
    3132 
     
    6869    public int getHighlightUpdateCount() { 
    6970        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; 
    7084    } 
    7185 
  • trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java

    r3083 r3210  
     1package org.openstreetmap.josm.data.osm.event; 
    12/* 
    23 *  JOSMng - a Java Open Street Map editor, the next generation. 
     
    1920 *  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA 
    2021 */ 
    21  
    22 package org.openstreetmap.josm.data.osm.event; 
    2322 
    2423/** 
  • trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java

    r3083 r3210  
    3333import org.openstreetmap.josm.data.osm.OsmPrimitive; 
    3434import org.openstreetmap.josm.gui.JMultilineLabel; 
    35 import org.openstreetmap.josm.gui.tagging.AutoCompletingTextField; 
    36 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
     35import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 
    3736import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 
     37import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    3838import org.openstreetmap.josm.tools.ImageProvider; 
    3939 
     
    183183 
    184184    public void prepareForEditing() { 
    185         AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).initFromDataSet(); 
    186185        AutoCompletionList acList = new AutoCompletionList(); 
    187         AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(acList); 
     186        Main.main.getEditLayer().data.getAutoCompletionManager().populateWithMemberRoles(acList); 
    188187        tfRole.setAutoCompletionList(acList); 
    189188        AutoCompletingTextField editor = (AutoCompletingTextField) tblResolver.getColumnModel().getColumn(2).getCellEditor(); 
     
    192191        } 
    193192        AutoCompletionList acList2 = new AutoCompletionList(); 
    194         AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithKeys(acList2, false /* don'tappend */); 
     193        Main.main.getEditLayer().data.getAutoCompletionManager().populateWithKeys(acList2); 
    195194        tfKey.setAutoCompletionList(acList2); 
    196195    } 
  • trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverColumnModel.java

    r3083 r3210  
    88 
    99import org.openstreetmap.josm.gui.OsmPrimitivRenderer; 
    10 import org.openstreetmap.josm.gui.tagging.AutoCompletingTextField; 
     10import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 
    1111 
    1212public class RelationMemberConflictResolverColumnModel extends DefaultTableColumnModel{ 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java

    r3202 r3210  
    2323import java.util.Collection; 
    2424import java.util.Collections; 
     25import java.util.Comparator; 
    2526import java.util.HashMap; 
    2627import java.util.HashSet; 
     
    7980import org.openstreetmap.josm.gui.preferences.TaggingPresetPreference; 
    8081import org.openstreetmap.josm.gui.tagging.TaggingPreset; 
    81 import org.openstreetmap.josm.gui.widgets.AutoCompleteComboBox; 
     82import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox; 
     83import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    8284import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 
    8385import org.openstreetmap.josm.tools.GBC; 
     
    145147 
    146148    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; 
    148152 
    149153    private DataSetListenerAdapter dataChangedAdapter = new DataSetListenerAdapter(this); 
     
    151155    @Override 
    152156    public void showNotify() { 
    153         DatasetEventManager.getInstance().addDatasetListener(listOfUsedTags, FireMode.IMMEDIATELY); 
    154157        DatasetEventManager.getInstance().addDatasetListener(dataChangedAdapter, FireMode.IN_EDT_CONSOLIDATED); 
    155         listOfUsedTags.rebuildNecessary(); 
    156158        SelectionEventManager.getInstance().addSelectionListener(this, FireMode.IN_EDT_CONSOLIDATED); 
    157159        MapView.addEditLayerChangeListener(this); 
     
    161163    @Override 
    162164    public void hideNotify() { 
    163         DatasetEventManager.getInstance().removeDatasetListener(listOfUsedTags); 
    164165        DatasetEventManager.getInstance().removeDatasetListener(dataChangedAdapter); 
    165166        SelectionEventManager.getInstance().removeSelectionListener(this); 
     
    189190        panel.add(p, BorderLayout.CENTER); 
    190191 
    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)); 
    193196        keys.setEditable(true); 
    194197        keys.setSelectedItem(key); 
     
    198201        p.add(keys, GBC.eol().fill(GBC.HORIZONTAL)); 
    199202 
    200         final AutoCompleteComboBox values = new AutoCompleteComboBox(); 
     203        final AutoCompletingComboBox values = new AutoCompletingComboBox(); 
    201204        values.setRenderer(new DefaultListCellRenderer() { 
    202205            @Override public Component getListCellRendererComponent(JList list, 
     
    220223        }); 
    221224        values.setEditable(true); 
    222         values.setPossibleItems(listOfUsedTags.getUsedValues(key)); 
     225        values.setPossibleItems(autocomplete.getValues(key, defaultValueComparator)); 
    223226        Map<String, Integer> m=(Map<String, Integer>)propertyData.getValueAt(row, 1); 
    224227        final String selection= m.size()!=1?tr("<different>"):m.entrySet().iterator().next().getKey(); 
     
    228231        p.add(Box.createHorizontalStrut(10), GBC.std()); 
    229232        p.add(values, GBC.eol().fill(GBC.HORIZONTAL)); 
    230         addFocusAdapter(row, keys, values); 
     233        addFocusAdapter(row, keys, values, autocomplete); 
    231234 
    232235        final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION) { 
     
    339342                "This will change up to {0} objects.", sel.size(),sel.size()) 
    340343                +"<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)); 
    343348        for (int i = 0; i < propertyData.getRowCount(); ++i) { 
    344349            usedKeys.remove(propertyData.getValueAt(i, 0)); 
     
    352357        p.add(p2, BorderLayout.SOUTH); 
    353358        p2.add(new JLabel(tr("Please select a value")), BorderLayout.NORTH); 
    354         final AutoCompleteComboBox values = new AutoCompleteComboBox(); 
     359        final AutoCompletingComboBox values = new AutoCompletingComboBox(); 
    355360        values.setEditable(true); 
    356361        p2.add(values, BorderLayout.CENTER); 
    357362 
    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 
    359367        JOptionPane pane = new JOptionPane(p, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION){ 
    360368            @Override public void selectInitialValue() { 
     
    381389     * @param values 
    382390     */ 
    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) { 
    384392        // get the combo box' editor component 
    385393        JTextComponent editor = (JTextComponent)values.getEditor() 
    386394        .getEditorComponent(); 
    387395        // Refresh the values model when focus is gained 
    388         editor.addFocusListener(new FocusAdapter() { 
     396        FocusAdapter focus = new FocusAdapter() { 
    389397            @Override public void focusGained(FocusEvent e) { 
    390398                String key = keys.getEditor().getItem().toString(); 
    391                 values.setPossibleItems(listOfUsedTags.getUsedValues(key)); 
     399                values.setPossibleItems(autocomplete.getValues(key, defaultValueComparator)); 
    392400                objKey=key; 
    393401            } 
    394         }); 
     402        }; 
     403        editor.addFocusListener(focus); 
     404        return focus; 
    395405    } 
    396406    private String objKey; 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    r3202 r3210  
    6666import org.openstreetmap.josm.gui.help.HelpUtil; 
    6767import org.openstreetmap.josm.gui.layer.OsmDataLayer; 
    68 import org.openstreetmap.josm.gui.tagging.AutoCompletingTextField; 
    6968import org.openstreetmap.josm.gui.tagging.TagEditorPanel; 
    70 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
     69import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 
    7170import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 
     71import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    7272import org.openstreetmap.josm.tools.ImageProvider; 
    7373import org.openstreetmap.josm.tools.Shortcut; 
     
    111111        setRememberWindowGeometry(getClass().getName() + ".geometry", 
    112112                WindowGeometry.centerInWindow(Main.parent, new Dimension(700, 650))); 
    113  
    114         // initialize the autocompletion infrastructure 
    115         // 
    116         AutoCompletionCache.getCacheForLayer(getLayer()).initFromDataSet(); 
    117113 
    118114        // init the various models 
     
    310306                    public void focusGained(FocusEvent e) { 
    311307                        AutoCompletionList list = tfRole.getAutoCompletionList(); 
    312                         AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(list); 
     308                        getLayer().data.getAutoCompletionManager().populateWithMemberRoles(list); 
    313309                    } 
    314310                } 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java

    r3083 r3210  
    1010 
    1111import org.openstreetmap.josm.Main; 
    12 import org.openstreetmap.josm.gui.tagging.AutoCompletingTextField; 
    13 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
     12import org.openstreetmap.josm.data.osm.DataSet; 
     13import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 
     14import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    1415import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 
    1516 
     
    1920 
    2021    private AutoCompletingTextField editor = null; 
     22    private DataSet ds; 
    2123 
    2224    /** user input is matched against this list of auto completion items */ 
     
    2628     * constructor 
    2729     */ 
    28     public MemberRoleCellEditor() { 
     30    public MemberRoleCellEditor(DataSet ds) { 
     31        this.ds = ds; 
    2932        editor = new AutoCompletingTextField(); 
    3033        autoCompletionList = new AutoCompletionList(); 
     
    4043        String role = (String)value; 
    4144        editor.setText(role); 
    42         AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(autoCompletionList); 
     45        ds.getAutoCompletionManager().populateWithMemberRoles(autoCompletionList); 
    4346        return editor; 
    4447    } 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java

    r3083 r3210  
    4848     */ 
    4949    public MemberTable(OsmDataLayer layer, MemberTableModel model) { 
    50         super(model, new MemberTableColumnModel(), model.getSelectionModel()); 
     50        super(model, new MemberTableColumnModel(layer.data), model.getSelectionModel()); 
    5151        this.layer = layer; 
    5252        model.addMemberModelListener(this); 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableColumnModel.java

    r3083 r3210  
    77import javax.swing.table.TableColumn; 
    88 
     9import org.openstreetmap.josm.data.osm.DataSet; 
     10 
    911public class MemberTableColumnModel extends DefaultTableColumnModel { 
    1012 
    11     public MemberTableColumnModel() { 
     13    public MemberTableColumnModel(DataSet ds) { 
    1214        TableColumn col = null; 
    1315 
     
    1820        col.setPreferredWidth(100); 
    1921        col.setCellRenderer(new MemberTableRoleCellRenderer()); 
    20         col.setCellEditor(new MemberRoleCellEditor()); 
     22        col.setCellEditor(new MemberRoleCellEditor(ds)); 
    2123        addColumn(col); 
    2224 
  • trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java

    r2946 r3210  
    2121import org.openstreetmap.josm.gui.tagging.TaggingPresetMenu; 
    2222import org.openstreetmap.josm.gui.tagging.TaggingPresetSeparator; 
    23 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
     23import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    2424import org.openstreetmap.josm.tools.GBC; 
    2525 
     
    8888        else 
    8989        { 
    90             AutoCompletionCache.cachePresets(taggingPresets); 
     90            AutoCompletionManager.cachePresets(taggingPresets); 
    9191            HashMap<TaggingPresetMenu,JMenu> submenus = new HashMap<TaggingPresetMenu,JMenu>(); 
    9292            for (final TaggingPreset p : taggingPresets) 
  • trunk/src/org/openstreetmap/josm/gui/tagging/TagCellEditor.java

    r3083 r3210  
    99import javax.swing.table.TableCellEditor; 
    1010 
    11 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
     11import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 
    1212import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 
     13import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    1314 
    1415/** 
     
    2627 
    2728    /** the cache of auto completion items derived from the current JOSM data set */ 
    28     protected AutoCompletionCache acCache = null; 
     29    protected AutoCompletionManager autocomplete = null; 
    2930 
    3031    /** user input is matched against this list of auto completion items */ 
     
    3637    public TagCellEditor() { 
    3738        editor = new AutoCompletingTextField(); 
    38         acCache = new AutoCompletionCache(); 
    3939    } 
    4040 
     
    5858        // add the list of keys in the current data set 
    5959        // 
    60         acCache.populateWithKeys(autoCompletionList, true); 
     60        autocomplete.populateWithKeys(autoCompletionList); 
    6161 
    6262        // remove the keys already present in the current tag model 
     
    8383            return; 
    8484        } 
    85         acCache.populateWithTagValues(autoCompletionList, forKey, false); 
     85        autoCompletionList.clear(); 
     86        autocomplete.populateWithTagValues(autoCompletionList, forKey); 
    8687    } 
    8788 
     
    137138    } 
    138139 
    139     public void setAutoCompletionCache(AutoCompletionCache acCache) { 
    140         this.acCache = acCache; 
     140    public void setAutoCompletionManager(AutoCompletionManager autocomplete) { 
     141        this.autocomplete = autocomplete; 
    141142    } 
    142143 
  • trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java

    r3141 r3210  
    1414 
    1515import org.openstreetmap.josm.gui.layer.OsmDataLayer; 
    16 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
    1716import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 
     17import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    1818import org.openstreetmap.josm.tools.CheckParameterUtil; 
    1919 
     
    3333    private TagTable tagTable; 
    3434 
    35     private AutoCompletionCache acCache; 
     35    private AutoCompletionManager autocomplete; 
    3636    private AutoCompletionList acList; 
    3737 
     
    141141    public void initAutoCompletion(OsmDataLayer layer) throws IllegalArgumentException{ 
    142142        CheckParameterUtil.ensureParameterNotNull(layer, "layer"); 
    143         // initialize the autocompletion infrastructure 
    144         // 
    145         acCache = AutoCompletionCache.getCacheForLayer(layer); 
    146         acCache.initFromDataSet(); 
     143 
     144        autocomplete = layer.data.getAutoCompletionManager(); 
    147145        acList = new AutoCompletionList(); 
    148146 
    149147        TagCellEditor editor = ((TagCellEditor) tagTable.getColumnModel().getColumn(0).getCellEditor()); 
    150         editor.setAutoCompletionCache(acCache); 
     148        editor.setAutoCompletionManager(autocomplete); 
    151149        editor.setAutoCompletionList(acList); 
    152150        editor = ((TagCellEditor) tagTable.getColumnModel().getColumn(1).getCellEditor()); 
    153         editor.setAutoCompletionCache(acCache); 
     151        editor.setAutoCompletionManager(autocomplete); 
    154152        editor.setAutoCompletionList(acList); 
    155153    } 
  • trunk/src/org/openstreetmap/josm/gui/tagging/TagTable.java

    r3141 r3210  
    4141 
    4242import org.openstreetmap.josm.gui.dialogs.relation.RunnableAction; 
    43 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
     43import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    4444import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 
    4545import org.openstreetmap.josm.tools.ImageProvider; 
     
    406406    } 
    407407 
    408     public void setAutoCompletionCache(AutoCompletionCache acCache) { 
    409         if (acCache == null) { 
    410             logger.warning("argument acCache 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."); 
    411411            return; 
    412412        } 
    413413        if (editor != null) { 
    414             editor.setAutoCompletionCache(acCache); 
     414            editor.setAutoCompletionManager(autocomplete); 
    415415        } 
    416416    } 
  • trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java

    r3024 r3210  
    5151import org.openstreetmap.josm.gui.layer.Layer; 
    5252import org.openstreetmap.josm.gui.layer.OsmDataLayer; 
    53 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
     53import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 
    5454import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionItemPritority; 
    5555import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 
     56import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; 
    5657import org.openstreetmap.josm.io.MirroredInputStream; 
    5758import org.openstreetmap.josm.tools.GBC; 
     
    8283            if (layer == null) return; 
    8384            AutoCompletionList list  = new AutoCompletionList(); 
    84             AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithTagValues(list, key, false); 
     85            Main.main.getEditLayer().data.getAutoCompletionManager().populateWithTagValues(list, key); 
    8586            field.setAutoCompletionList(list); 
    8687        } 
     
    696697            return null; 
    697698        OsmDataLayer layer = Main.main.getEditLayer(); 
    698         if (layer != null) { 
    699             AutoCompletionCache.getCacheForLayer(layer).initFromDataSet(); 
    700         } 
    701699        PresetPanel p = new PresetPanel(); 
    702700        LinkedList<Item> l = new LinkedList<Item>(); 
  • trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java

    r3208 r3210  
    11// License: GPL. Copyright 2007 by Immanuel Scholz and others 
    2 package org.openstreetmap.josm.gui.widgets; 
     2package org.openstreetmap.josm.gui.tagging.ac; 
    33 
    44import java.awt.event.FocusEvent; 
     
    1717 * @author guilhem.bonnefille@gmail.com 
    1818 */ 
    19 public class AutoCompleteComboBox extends JComboBox { 
     19public class AutoCompletingComboBox extends JComboBox { 
    2020 
    2121    private boolean autocompleteEnabled = true; 
     
    2626     * Inspired by http://www.orbital-computer.de/JComboBox/ 
    2727     */ 
    28     class AutoCompleteComboBoxDocument extends PlainDocument { 
     28    class AutoCompletingComboBoxDocument extends PlainDocument { 
    2929        private JComboBox comboBox; 
    3030        private boolean selecting = false; 
    3131 
    32         public AutoCompleteComboBoxDocument(final JComboBox comboBox) { 
     32        public AutoCompletingComboBoxDocument(final JComboBox comboBox) { 
    3333            this.comboBox = comboBox; 
    3434        } 
     
    9898    } 
    9999 
    100     public AutoCompleteComboBox() { 
     100    public AutoCompletingComboBox() { 
    101101        final JTextComponent editor = (JTextComponent) this.getEditor().getEditorComponent(); 
    102         editor.setDocument(new AutoCompleteComboBoxDocument(this)); 
     102        editor.setDocument(new AutoCompletingComboBoxDocument(this)); 
    103103        editor.addFocusListener( 
    104104                new FocusListener() { 
  • trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingTextField.java

    r3208 r3210  
    11// License: GPL. For details, see LICENSE file. 
    2 package org.openstreetmap.josm.gui.tagging; 
     2package org.openstreetmap.josm.gui.tagging.ac; 
    33 
    44import java.awt.Component; 
  • trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionList.java

    r3083 r3210  
     1// License: GPL. For details, see LICENSE file. 
    12package org.openstreetmap.josm.gui.tagging.ac; 
    23 
     
    297298        System.out.println("---------------------------------"); 
    298299        for (AutoCompletionListItem item: list) { 
    299             System.out.println(item.getValue()); 
     300            System.out.println(item); 
    300301        } 
    301302        System.out.println("---------------------------------"); 
  • trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionListItem.java

    r3083 r3210  
    7272    @Override public String toString() { 
    7373        StringBuilder sb = new StringBuilder(); 
    74         sb.append("<AutoCompletionItemPritority: "); 
    75         sb.append("value='"); 
     74        sb.append("<val='"); 
    7675        sb.append(value); 
    7776        sb.append("',"); 
    78         sb.append("priority='"); 
    7977        sb.append(priority.toString()); 
    80         sb.append("'>"); 
     78        sb.append(">"); 
    8179        return sb.toString(); 
    8280    } 
  • trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java

    r3208 r3210  
     1// License: GPL. For details, see LICENSE file. 
    12package org.openstreetmap.josm.gui.tagging.ac; 
    23 
    34import java.util.ArrayList; 
    45import java.util.Collection; 
    5 import java.util.HashMap; 
     6import java.util.Comparator; 
     7import java.util.Collections; 
    68import java.util.HashSet; 
    79import java.util.List; 
     10import java.util.Map; 
     11import java.util.Map.Entry; 
    812import java.util.Set; 
     13import java.util.TreeSet; 
    914import java.util.logging.Logger; 
    1015 
     
    1318import org.openstreetmap.josm.data.osm.Relation; 
    1419import org.openstreetmap.josm.data.osm.RelationMember; 
     20import org.openstreetmap.josm.data.osm.DataSet; 
     21import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; 
     22import org.openstreetmap.josm.data.osm.event.DataChangedEvent; 
     23import org.openstreetmap.josm.data.osm.event.DataSetListener; 
     24import org.openstreetmap.josm.data.osm.event.NodeMovedEvent; 
     25import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent; 
     26import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent; 
     27import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent; 
     28import org.openstreetmap.josm.data.osm.event.TagsChangedEvent; 
     29import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; 
    1530import org.openstreetmap.josm.gui.MapView; 
    1631import org.openstreetmap.josm.gui.layer.Layer; 
     
    2035 
    2136/** 
    22  * AutoCompletionCache temporarily holds a cache of keys with a list of 
     37 * AutoCompletionManager holds a cache of keys with a list of 
    2338 * possible auto completion values for each key. 
    2439 * 
    25  * The cache can initialize itself from the current JOSM data set such that 
     40 * Each DataSet is assigned one AutoCompletionManager instance such that 
    2641 * <ol> 
    2742 *   <li>any key used in a tag in the data set is part of the key list in the cache</li> 
     
    3550 * field is not efficient enough, hence this cache. 
    3651 * 
     52 * TODO: respect the relation type for member role autocompletion 
    3753 */ 
    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) { 
     54public 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() { 
    86105        tagCache = new MultiMap<String, String>(); 
    87106        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        } 
    93117    } 
    94118 
     
    99123     * @param primitive an OSM primitive 
    100124     */ 
    101     protected void cachePrimitive(OsmPrimitive primitive) { 
     125    protected void cachePrimitiveTags(OsmPrimitive primitive) { 
    102126        for (String key: primitive.keySet()) { 
    103127            String value = primitive.get(key); 
     
    113137    protected void cacheRelationMemberRoles(Relation relation){ 
    114138        for (RelationMember m: relation.getMembers()) { 
    115             if (m.hasRole() && !roleCache.contains(m.getRole())) { 
     139            if (m.hasRole()) { 
    116140                roleCache.add(m.getRole()); 
    117141            } 
    118         } 
    119     } 
    120  
    121     /** 
    122      * initializes the cache from the primitives in the dataset of 
    123      * {@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); 
    139142        } 
    140143    } 
     
    187190     */ 
    188191    protected List<String> getDataKeys() { 
    189         return new ArrayList<String>(tagCache.keySet()); 
     192        return new ArrayList<String>(getTagCache().keySet()); 
    190193    } 
    191194 
     
    194197    } 
    195198 
     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 
    196206    /** 
    197207     * replies the auto completion values allowed for a specific key. Replies 
     
    202212     */ 
    203213    protected List<String> getDataValues(String key) { 
    204         return new ArrayList<String>(tagCache.getValues(key)); 
     214        return new ArrayList<String>(getTagCache().getValues(key)); 
    205215    } 
    206216 
     
    209219    } 
    210220 
     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 
    211228    /** 
    212229     * Replies the list of member roles 
     
    215232     */ 
    216233    public List<String> getMemberRoles() { 
    217         return new ArrayList<String>(roleCache); 
     234        return new ArrayList<String>(getRoleCache()); 
    218235    } 
    219236 
     
    226243    public void populateWithMemberRoles(AutoCompletionList list) { 
    227244        list.clear(); 
    228         list.add(roleCache, AutoCompletionItemPritority.IS_IN_DATASET); 
     245        list.add(getRoleCache(), AutoCompletionItemPritority.IS_IN_DATASET); 
    229246    } 
    230247 
     
    238255     * in the list by the tag values 
    239256     */ 
    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) { 
    244258        list.add(getDataValues(key), AutoCompletionItemPritority.IS_IN_DATASET); 
    245259        list.add(getPresetValues(key), AutoCompletionItemPritority.IS_IN_STANDARD); 
     
    254268     * in the list by the keys in the cache 
    255269     */ 
    256     public void populateWithKeys(AutoCompletionList list, boolean append) { 
    257         if (!append) { 
    258             list.clear(); 
    259         } 
     270    public void populateWithKeys(AutoCompletionList list) { 
    260271        list.add(getDataKeys(), AutoCompletionItemPritority.IS_IN_DATASET); 
    261272        list.add(getPresetKeys(), AutoCompletionItemPritority.IS_IN_STANDARD); 
    262273    } 
     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    } 
    263320} 
  • trunk/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java

    r3083 r3210  
    66import javax.swing.text.JTextComponent; 
    77 
    8 public class HistoryComboBox extends AutoCompleteComboBox { 
     8import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox; 
     9 
     10public class HistoryComboBox extends AutoCompletingComboBox { 
    911    private ComboBoxHistory model; 
    1012 
Note: See TracChangeset for help on using the changeset viewer.