Changeset 2657 in josm


Ignore:
Timestamp:
2009-12-19T12:55:50+01:00 (14 years ago)
Author:
jttt
Message:

Cache list of used tags in properties dialog (faster adding of keys in large datasets)

Location:
trunk/src/org/openstreetmap/josm
Files:
2 added
4 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r2656 r2657  
    849849    }
    850850
    851     void fireTagsChanged(OsmPrimitive prim) {
    852         fireEvent(new TagsChangedEvent(this, prim));
     851    void fireTagsChanged(OsmPrimitive prim, Map<String, String> originalKeys) {
     852        fireEvent(new TagsChangedEvent(this, prim, originalKeys));
    853853    }
    854854
  • trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    r2656 r2657  
    717717     */
    718718    public void setKeys(Map<String, String> keys) {
     719        Map<String, String> originalKeys = getKeys();
    719720        if (keys == null) {
    720721            this.keys = null;
     722            keysChangedImpl(originalKeys);
    721723            return;
    722724        }
     
    728730        }
    729731        this.keys = newKeys;
    730         keysChangedImpl();
     732        keysChangedImpl(originalKeys);
    731733    }
    732734
     
    741743     */
    742744    public final void put(String key, String value) {
     745        Map<String, String> originalKeys = getKeys();
    743746        if (key == null)
    744747            return;
     
    747750        } else if (keys == null || keys.length == 0){
    748751            keys = new String[] {key, value};
    749             keysChangedImpl();
     752            keysChangedImpl(originalKeys);
    750753        } else {
    751754            for (int i=0; i<keys.length;i+=2) {
    752755                if (keys[i].equals(key)) {
    753756                    keys[i+1] = value;
    754                     keysChangedImpl();
     757                    keysChangedImpl(originalKeys);
    755758                    return;
    756759                }
     
    764767            newKeys[keys.length + 1] = value;
    765768            keys = newKeys;
    766             keysChangedImpl();
     769            keysChangedImpl(originalKeys);
    767770        }
    768771    }
     
    776779        if (!hasKey(key))
    777780            return;
     781        Map<String, String> originalKeys = getKeys();
    778782        if (keys.length == 2) {
    779783            keys = null;
    780             keysChangedImpl();
     784            keysChangedImpl(originalKeys);
    781785            return;
    782786        }
     
    790794        }
    791795        keys = newKeys;
    792         keysChangedImpl();
     796        keysChangedImpl(originalKeys);
    793797    }
    794798
     
    799803     */
    800804    public final void removeAll() {
    801         keys = null;
    802         keysChangedImpl();
     805        if (keys != null) {
     806            Map<String, String> originalKeys = getKeys();
     807            keys = null;
     808            keysChangedImpl(originalKeys);
     809        }
    803810    }
    804811
     
    854861    }
    855862
    856     private void keysChangedImpl() {
     863    private void keysChangedImpl(Map<String, String> originalKeys) {
    857864        clearCached();
    858865        updateHasDirectionKeys();
    859866        updateTagged();
    860867        if (dataSet != null) {
    861             dataSet.fireTagsChanged(this);
     868            dataSet.fireTagsChanged(this, originalKeys);
    862869        }
    863870    }
  • trunk/src/org/openstreetmap/josm/data/osm/event/TagsChangedEvent.java

    r2645 r2657  
    44import java.util.Collections;
    55import java.util.List;
     6import java.util.Map;
    67
    78import org.openstreetmap.josm.data.osm.DataSet;
     
    1112
    1213    private final OsmPrimitive primitive;
     14    private final Map<String, String> originalKeys;
    1315
    14     public TagsChangedEvent(DataSet dataSet, OsmPrimitive primitive) {
     16    public TagsChangedEvent(DataSet dataSet, OsmPrimitive primitive, Map<String, String> originalKeys) {
    1517        super(dataSet);
    1618        this.primitive = primitive;
     19        this.originalKeys = originalKeys;
    1720    }
    1821
     
    3639    }
    3740
     41    public Map<String, String> getOriginalKeys() {
     42        return originalKeys;
     43    }
     44
    3845}
  • trunk/src/org/openstreetmap/josm/gui/MapFrame.java

    r2655 r2657  
    3737import org.openstreetmap.josm.gui.dialogs.HistoryDialog;
    3838import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
    39 import org.openstreetmap.josm.gui.dialogs.PropertiesDialog;
    4039import org.openstreetmap.josm.gui.dialogs.RelationListDialog;
    4140import org.openstreetmap.josm.gui.dialogs.SelectionListDialog;
    4241import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
    4342import org.openstreetmap.josm.gui.dialogs.UserListDialog;
     43import org.openstreetmap.josm.gui.dialogs.properties.PropertiesDialog;
    4444import org.openstreetmap.josm.tools.Destroyable;
    4545
  • trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java

    r2654 r2657  
    11
    2 package org.openstreetmap.josm.gui.dialogs;
     2package org.openstreetmap.josm.gui.dialogs.properties;
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
     
    2020import java.awt.event.MouseEvent;
    2121import java.awt.event.MouseListener;
     22import java.util.ArrayList;
    2223import java.util.Collection;
    2324import java.util.Collections;
     
    2728import java.util.Map;
    2829import java.util.TreeMap;
    29 import java.util.TreeSet;
    3030import java.util.Vector;
    3131import java.util.Map.Entry;
     
    6363import org.openstreetmap.josm.data.osm.RelationMember;
    6464import org.openstreetmap.josm.data.osm.Way;
     65import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
    6566import org.openstreetmap.josm.gui.DefaultNameFormatter;
    6667import org.openstreetmap.josm.gui.ExtendedDialog;
     
    6869import org.openstreetmap.josm.gui.MapView;
    6970import org.openstreetmap.josm.gui.SideButton;
    70 import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
     71import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
    7172import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
    7273import org.openstreetmap.josm.gui.layer.Layer;
     
    139140
    140141    private final Map<String, Map<String, Integer>> valueCount = new TreeMap<String, Map<String, Integer>>();
     142    private final ListOfUsedTags listOfUsedTags = new ListOfUsedTags();
     143
     144    @Override
     145    public void showNotify() {
     146        DatasetEventManager.getInstance().addDatasetListener(listOfUsedTags, false);
     147    }
     148
     149    @Override
     150    public void hideNotify() {
     151        DatasetEventManager.getInstance().removeDatasetListener(listOfUsedTags);
     152    }
     153
    141154    /**
    142155     * Edit the value in the properties table row
     
    158171        panel.add(new JLabel(msg), BorderLayout.NORTH);
    159172
    160         final TreeMap<String, TreeSet<String>> allData = createAutoCompletionInfo(true);
    161 
    162173        JPanel p = new JPanel(new GridBagLayout());
    163174        panel.add(p, BorderLayout.CENTER);
    164175
    165176        final AutoCompleteComboBox keys = new AutoCompleteComboBox();
    166         keys.setPossibleItems(allData.keySet());
     177        keys.setPossibleItems(listOfUsedTags.getUsedKeys());
    167178        keys.setEditable(true);
    168179        keys.setSelectedItem(key);
     
    194205        });
    195206        values.setEditable(true);
    196         updateListData(key, allData, values);
     207        values.setPossibleItems(listOfUsedTags.getUsedValues(key));
    197208        Map<String, Integer> m=(Map<String, Integer>)propertyData.getValueAt(row, 1);
    198209        final String selection= m.size()!=1?tr("<different>"):m.entrySet().iterator().next().getKey();
     
    202213        p.add(Box.createHorizontalStrut(10), GBC.std());
    203214        p.add(values, GBC.eol().fill(GBC.HORIZONTAL));
    204         addFocusAdapter(row, allData, keys, values);
     215        addFocusAdapter(row, keys, values);
    205216
    206217        final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION) {
     
    288299
    289300    /**
    290      * @param key
    291      * @param allData
    292      * @param values
    293      */
    294     private void updateListData(String key, final TreeMap<String, TreeSet<String>> allData,
    295             final AutoCompleteComboBox values) {
    296         Collection<String> newItems;
    297         if (allData.containsKey(key)) {
    298             newItems = allData.get(key);
    299         } else {
    300             newItems = Collections.emptyList();
    301         }
    302         values.setPossibleItems(newItems);
    303     }
    304 
    305     /**
    306301     * This simply fires up an relation editor for the relation shown; everything else
    307302     * is the editor's business.
     
    330325                "This will change up to {0} objects.", sel.size(),sel.size())
    331326                +"<br><br>"+tr("Please select a key")), BorderLayout.NORTH);
    332         final TreeMap<String, TreeSet<String>> allData = createAutoCompletionInfo(false);
    333327        final AutoCompleteComboBox keys = new AutoCompleteComboBox();
    334         keys.setPossibleItems(allData.keySet());
     328        List<String> usedKeys = new ArrayList<String>(listOfUsedTags.getUsedKeys());
     329        for (int i = 0; i < propertyData.getRowCount(); ++i) {
     330            usedKeys.remove(propertyData.getValueAt(i, 0));
     331        }
     332        keys.setPossibleItems(usedKeys);
    335333        keys.setEditable(true);
    336334
     
    344342        p2.add(values, BorderLayout.CENTER);
    345343
    346         addFocusAdapter(-1, allData, keys, values);
     344        addFocusAdapter(-1, keys, values);
    347345        JOptionPane pane = new JOptionPane(p, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION){
    348346            @Override public void selectInitialValue() {
     
    373371     * @param values
    374372     */
    375     private void addFocusAdapter(final int row, final TreeMap<String, TreeSet<String>> allData,
    376             final AutoCompleteComboBox keys, final AutoCompleteComboBox values) {
     373    private void addFocusAdapter(final int row, final AutoCompleteComboBox keys, final AutoCompleteComboBox values) {
    377374        // get the combo box' editor component
    378375        JTextComponent editor = (JTextComponent)values.getEditor()
     
    382379            @Override public void focusGained(FocusEvent e) {
    383380                String key = keys.getEditor().getItem().toString();
    384                 updateListData(key, allData, values);
     381                values.setPossibleItems(listOfUsedTags.getUsedValues(key));
    385382                objKey=key;
    386383            }
     
    388385    }
    389386    private String objKey;
    390 
    391     private TreeMap<String, TreeSet<String>> createAutoCompletionInfo(
    392             boolean edit) {
    393         final TreeMap<String, TreeSet<String>> allData = new TreeMap<String, TreeSet<String>>();
    394         for (OsmPrimitive osm : Main.main.getCurrentDataSet().allNonDeletedPrimitives()) {
    395             for (String key : osm.keySet()) {
    396                 TreeSet<String> values = null;
    397                 if (allData.containsKey(key)) {
    398                     values = allData.get(key);
    399                 } else {
    400                     values = new TreeSet<String>();
    401                     allData.put(key, values);
    402                 }
    403                 values.add(osm.get(key));
    404             }
    405         }
    406         if (!edit) {
    407             for (int i = 0; i < propertyData.getRowCount(); ++i) {
    408                 allData.remove(propertyData.getValueAt(i, 0));
    409             }
    410         }
    411         return allData;
    412     }
    413387
    414388    /**
Note: See TracChangeset for help on using the changeset viewer.