Ignore:
Timestamp:
2009-11-22T12:06:30+01:00 (14 years ago)
Author:
jttt
Message:

Added Dataset.beginUpdate and Dataset.endUpdate that can be used to temporarily stop dataset events in case of big changes

File:
1 edited

Legend:

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

    r2472 r2497  
    4747    private Map<PrimitiveId, OsmPrimitive> primitivesMap = allPrimitives.foreignKey(new IdHash());
    4848    private List<DataSetListener> listeners = new ArrayList<DataSetListener>();
     49    // Number of open calls to beginUpdate
     50    private int updateCount;
    4951
    5052    /**
     
    796798    }
    797799
     800    /**
     801     * Can be called before bigger changes on dataset. Events are disabled until {@link #endUpdate()}.
     802     * {@link DataSetListener#dataChanged()} event is triggered after end of changes
     803     * <br>
     804     * Typical usecase should look like this:
     805     * <pre>
     806     * ds.beginUpdate();
     807     * try {
     808     *   ...
     809     * } finally {
     810     *   ds.endUpdate();
     811     * }
     812     * </pre>
     813     */
     814    public void beginUpdate() {
     815        updateCount++;
     816    }
     817
     818    /**
     819     * @see DataSet#beginUpdate()
     820     */
     821    public void endUpdate() {
     822        if (updateCount > 0) {
     823            updateCount--;
     824            if (updateCount == 0) {
     825                fireDataChanged();
     826            }
     827        } else
     828            throw new AssertionError("endUpdate called without beginUpdate");
     829    }
     830
     831    private void fireDataChanged() {
     832        if (updateCount == 0) {
     833            for (DataSetListener dsl : listeners) {
     834                dsl.dataChanged();
     835            }
     836        }
     837    }
     838
    798839    void firePrimitivesAdded(Collection<? extends OsmPrimitive> added) {
    799         for (DataSetListener dsl : listeners) {
    800             dsl.primtivesAdded(added);
     840        if (updateCount == 0) {
     841            for (DataSetListener dsl : listeners) {
     842                dsl.primtivesAdded(added);
     843            }
    801844        }
    802845    }
    803846
    804847    void firePrimitivesRemoved(Collection<? extends OsmPrimitive> removed) {
    805         for (DataSetListener dsl : listeners) {
    806             dsl.primtivesRemoved(removed);
     848        if (updateCount == 0) {
     849            for (DataSetListener dsl : listeners) {
     850                dsl.primtivesRemoved(removed);
     851            }
    807852        }
    808853    }
    809854
    810855    void fireTagsChanged(OsmPrimitive prim) {
    811         for (DataSetListener dsl : listeners) {
    812             dsl.tagsChanged(prim);
     856        if (updateCount == 0) {
     857            for (DataSetListener dsl : listeners) {
     858                dsl.tagsChanged(prim);
     859            }
    813860        }
    814861    }
    815862
    816863    void fireRelationMembersChanged(Relation r) {
    817         for (DataSetListener dsl : listeners) {
    818             dsl.relationMembersChanged(r);
    819         }
    820     }
    821 
    822     public void fireNodeMoved(Node node) {
     864        if (updateCount == 0) {
     865            for (DataSetListener dsl : listeners) {
     866                dsl.relationMembersChanged(r);
     867            }
     868        }
     869    }
     870
     871    void fireNodeMoved(Node node) {
    823872        reindexNode(node);
    824         for (DataSetListener dsl : listeners) {
    825             dsl.nodeMoved(node);
    826         }
    827     }
    828 
    829     public void fireWayNodesChanged(Way way) {
     873        if (updateCount == 0) {
     874            for (DataSetListener dsl : listeners) {
     875                dsl.nodeMoved(node);
     876            }
     877        }
     878    }
     879
     880    void fireWayNodesChanged(Way way) {
    830881        reindexWay(way);
    831         for (DataSetListener dsl : listeners) {
    832             dsl.wayNodesChanged(way);
     882        if (updateCount == 0) {
     883            for (DataSetListener dsl : listeners) {
     884                dsl.wayNodesChanged(way);
     885            }
    833886        }
    834887    }
Note: See TracChangeset for help on using the changeset viewer.