Changeset 2657 in josm


Ignore:
Timestamp:
Dec 19, 2009 12:55:50 PM (3 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.