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
Files:
8 edited

Legend:

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

    r2621 r2655  
    1414import java.util.List;
    1515import java.util.Set;
    16 import java.util.logging.Logger;
    1716
    1817import javax.swing.AbstractAction;
     
    3534import org.openstreetmap.josm.data.osm.DataSet;
    3635import org.openstreetmap.josm.data.osm.OsmPrimitive;
     36import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
    3737import org.openstreetmap.josm.gui.MapFrame;
    3838import org.openstreetmap.josm.gui.MapView;
     
    6161 */
    6262public class ChangesetDialog extends ToggleDialog{
    63     static private final Logger logger = Logger.getLogger(ChangesetDialog.class.getName());
     63    //static private final Logger logger = Logger.getLogger(ChangesetDialog.class.getName());
    6464
    6565    private ChangesetInSelectionListModel inSelectionModel;
     
    9898
    9999        ChangesetCache.getInstance().addChangesetCacheListener(inActiveDataLayerModel);
    100         MapView.addLayerChangeListener(inActiveDataLayerModel);
    101100
    102101        DblClickHandler dblClickHandler = new DblClickHandler();
     
    114113        MapView.removeLayerChangeListener(inSelectionModel);
    115114        DataSet.selListeners.remove(inSelectionModel);
    116         MapView.removeLayerChangeListener(inActiveDataLayerModel);
     115    }
     116
     117    @Override
     118    public void showNotify() {
     119        DatasetEventManager.getInstance().addDatasetListener(inActiveDataLayerModel, true);
     120    }
     121
     122    @Override
     123    public void hideNotify() {
     124        DatasetEventManager.getInstance().removeDatasetListener(inActiveDataLayerModel);
    117125    }
    118126
  • trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java

    r2621 r2655  
    4747import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
    4848import org.openstreetmap.josm.gui.SideButton;
    49 import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
    5049import org.openstreetmap.josm.gui.layer.Layer;
    5150import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     
    285284
    286285        public void addListDataListener(ListDataListener l) {
    287             if (l != null && ! listeners.contains(l)) {
    288                 listeners.add(l);
     286            if (l != null) {
     287                listeners.addIfAbsent(l);
    289288            }
    290289        }
  • trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java

    r2626 r2655  
    642642         */
    643643        public void addLayerListModelListener(LayerListModelListener listener) {
    644             synchronized(listeners) {
    645                 if (listener != null && !listeners.contains(listener)) {
    646                     listeners.add(listener);
    647                 }
     644            if (listener != null) {
     645                listeners.addIfAbsent(listener);
    648646            }
    649647        }
     
    655653         */
    656654        public void removeLayerListModelListener(LayerListModelListener listener) {
    657             synchronized(listeners) {
    658                 if (listener != null && listeners.contains(listener)) {
    659                     listeners.remove(listener);
    660                 }
    661             }
     655            listeners.remove(listener);
    662656        }
    663657
  • trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java

    r2632 r2655  
    3636import org.openstreetmap.josm.data.osm.Relation;
    3737import org.openstreetmap.josm.data.osm.RelationMember;
     38import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
    3839import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
    3940import org.openstreetmap.josm.data.osm.event.DataSetListener;
     
    738739        }
    739740    }
     741
     742    public void otherDatasetChange(AbstractDatasetChangedEvent event) {/* ignore */}
    740743}
  • 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}
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java

    r2622 r2655  
    3333import org.openstreetmap.josm.data.osm.RelationMember;
    3434import org.openstreetmap.josm.data.osm.Way;
     35import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
    3536import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
    3637import org.openstreetmap.josm.data.osm.event.DataSetListener;
     
    131132
    132133    public void wayNodesChanged(WayNodesChangedEvent event) {/* ignore */}
     134
     135    public void otherDatasetChange(AbstractDatasetChangedEvent event) {/* ignore */}
    133136    /* --------------------------------------------------------------------------- */
    134137
    135138    public void addMemberModelListener(IMemberModelListener listener) {
    136         synchronized (listeners) {
    137             if (listener != null && !listeners.contains(listener)) {
    138                 listeners.add(listener);
    139             }
     139        if (listener != null) {
     140            listeners.addIfAbsent(listener);
    140141        }
    141142    }
    142143
    143144    public void removeMemberModelListener(IMemberModelListener listener) {
    144         synchronized (listeners) {
    145             if (listener != null && listeners.contains(listener)) {
    146                 listeners.remove(listener);
    147             }
    148         }
     145        listeners.remove(listener);
    149146    }
    150147
    151148    protected void fireMakeMemberVisible(int index) {
    152         synchronized (listeners) {
    153             for (IMemberModelListener listener : listeners) {
    154                 listener.makeMemberVisible(index);
    155             }
     149        for (IMemberModelListener listener : listeners) {
     150            listener.makeMemberVisible(index);
    156151        }
    157152    }
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeModel.java

    r2578 r2655  
    44import java.util.List;
    55import java.util.concurrent.CopyOnWriteArrayList;
    6 import java.util.logging.Logger;
    76
    87import javax.swing.event.TreeModelEvent;
     
    2423 */
    2524public class RelationTreeModel implements TreeModel {
    26     private static final Logger logger = Logger.getLogger(RelationTreeModel.class.getName());
     25    //private static final Logger logger = Logger.getLogger(RelationTreeModel.class.getName());
    2726
    2827    /** the root relation */
     
    215214
    216215    public void addTreeModelListener(TreeModelListener l) {
    217         synchronized (listeners) {
    218             if (l != null && !listeners.contains(l)) {
    219                 listeners.add(l);
    220             }
     216        if (l != null) {
     217            listeners.addIfAbsent(l);
    221218        }
    222219    }
    223220
    224221    public void removeTreeModelListener(TreeModelListener l) {
    225         synchronized (listeners) {
    226             if (l != null && listeners.contains(l)) {
    227                 listeners.remove(l);
    228             }
    229         }
     222        listeners.remove(l);
    230223    }
    231224
Note: See TracChangeset for help on using the changeset viewer.