Ignore:
Timestamp:
2009-12-19T10:47:49+01:00 (14 years ago)
Author:
jttt
Message:

Fixed #4161 Major slowdown in recent versions, used correct pattern for listeners realized using CopyOnWriteArrayList

Location:
trunk/src/org/openstreetmap/josm/gui/dialogs/changeset
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetListModel.java

    r2616 r2655  
    99import java.util.List;
    1010import java.util.Set;
    11 import java.util.logging.Logger;
    1211
    1312import javax.swing.DefaultListModel;
     
    2019import org.openstreetmap.josm.data.osm.DataSet;
    2120import org.openstreetmap.josm.data.osm.OsmPrimitive;
     21import org.openstreetmap.josm.data.osm.Storage;
    2222
    2323public class ChangesetListModel extends DefaultListModel  implements ChangesetCacheListener{
    24     static private final Logger logger = Logger.getLogger(ChangesetListModel.class.getName());
     24    //static private final Logger logger = Logger.getLogger(ChangesetListModel.class.getName());
    2525
    2626    private final List<Changeset> data = new ArrayList<Changeset>();
     27    private final Storage<Changeset> shownChangesets = new Storage<Changeset>();
    2728    private DefaultListSelectionModel selectionModel;
    2829
     
    6364    }
    6465
     66    protected void addChangeset(Changeset changeset) {
     67        if (shownChangesets.add(changeset)) {
     68            setChangesets(shownChangesets);
     69            updateModel();
     70        }
     71    }
     72
     73    protected void removeChangeset(Changeset changeset) {
     74        if (shownChangesets.remove(changeset)) {
     75            setChangesets(shownChangesets);
     76            updateModel();
     77        }
     78    }
     79
    6580    protected void setChangesets(Collection<Changeset> changesets) {
     81        shownChangesets.clear();
     82        if (changesets != null) {
     83            shownChangesets.addAll(changesets);
     84        }
     85        updateModel();
     86    }
     87
     88    private void updateModel() {
    6689        Set<Changeset> sel = getSelectedChangesets();
    6790        data.clear();
    68         if (changesets == null) {
    69             fireContentsChanged(this, 0, getSize());
    70             return;
    71         }
    72         data.addAll(changesets);
     91        data.addAll(shownChangesets);
    7392        ChangesetCache cache = ChangesetCache.getInstance();
    7493        for (Changeset cs: data) {
  • trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java

    r2652 r2655  
    44import javax.swing.DefaultListSelectionModel;
    55
    6 import org.openstreetmap.josm.Main;
    7 import org.openstreetmap.josm.gui.MapView;
    8 import org.openstreetmap.josm.gui.layer.DataChangeListener;
    9 import org.openstreetmap.josm.gui.layer.Layer;
    10 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     6import org.openstreetmap.josm.data.osm.Changeset;
     7import org.openstreetmap.josm.data.osm.OsmPrimitive;
     8import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
     9import org.openstreetmap.josm.data.osm.event.ChangesetIdChangedEvent;
     10import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
     11import org.openstreetmap.josm.data.osm.event.DataSetListener;
     12import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
     13import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
     14import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
     15import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
     16import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
     17import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
    1118
    12 public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements MapView.LayerChangeListener, DataChangeListener{
     19public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements DataSetListener  {
    1320
    1421    public ChangesetsInActiveDataLayerListModel(DefaultListSelectionModel selectionModel) {
     
    1623    }
    1724
    18     /* ---------------------------------------------------------------------------- */
    19     /* Interface LayerChangeListener                                                */
    20     /* ---------------------------------------------------------------------------- */
    21     public void activeLayerChange(Layer oldLayer, Layer newLayer) {
    22         if (oldLayer != null && oldLayer instanceof OsmDataLayer) {
    23             OsmDataLayer l = (OsmDataLayer)oldLayer;
    24             l.listenerDataChanged.remove(this);
    25         }
    26         if (newLayer == null) {
    27             setChangesets(null);
    28         } else if (newLayer instanceof OsmDataLayer){
    29             OsmDataLayer l = (OsmDataLayer)newLayer;
    30             l.listenerDataChanged.add(this);
    31             initFromDataSet(l.data);
    32         } else {
    33             setChangesets(null);
     25    public void dataChanged(DataChangedEvent event) {
     26        initFromPrimitives(event.getPrimitives());
     27    }
     28
     29    public void nodeMoved(NodeMovedEvent event) {/* ignored */}
     30
     31    public void primtivesAdded(PrimitivesAddedEvent event) {
     32        for (OsmPrimitive primitive:event.getPrimitives()) {
     33            addChangeset(new Changeset(primitive.getChangesetId()));
    3434        }
    3535    }
    36     public void layerAdded(Layer newLayer) {}
    37     public void layerRemoved(Layer oldLayer) {}
    3836
    39     /* ---------------------------------------------------------------------------- */
    40     /* Interface DataChangeListener                                                 */
    41     /* ---------------------------------------------------------------------------- */
    42     public void dataChanged(OsmDataLayer l) {
    43         if (l == null) return;
    44         if (l != Main.main.getEditLayer()) return;
    45         initFromDataSet(l.data);
     37    public void primtivesRemoved(PrimitivesRemovedEvent event) {
     38        for (OsmPrimitive primitive:event.getPrimitives()) {
     39            removeChangeset(new Changeset(primitive.getChangesetId()));
     40        }
    4641    }
     42
     43    public void relationMembersChanged(RelationMembersChangedEvent event) {/* ignored */}
     44
     45    public void tagsChanged(TagsChangedEvent event) {/* ignored */}
     46
     47    public void otherDatasetChange(AbstractDatasetChangedEvent event) {
     48        if (event instanceof ChangesetIdChangedEvent) {
     49            ChangesetIdChangedEvent e = (ChangesetIdChangedEvent) event;
     50            removeChangeset(new Changeset(e.getOldChangesetId()));
     51            addChangeset(new Changeset(e.getNewChangesetId()));
     52        }
     53    }
     54
     55    public void wayNodesChanged(WayNodesChangedEvent event) {/* ignored */}
     56
    4757}
Note: See TracChangeset for help on using the changeset viewer.