Changeset 2497 in josm for trunk/src


Ignore:
Timestamp:
2009-11-22T12:06:30+01:00 (12 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

Location:
trunk/src/org/openstreetmap/josm
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java

    r2412 r2497  
    9090                int count = 0;
    9191                for (Way w : OsmPrimitive.getFilteredList(n.getReferrers(), Way.class)) {
    92                     if (w.isDeleted() || w.incomplete || w.getNodesCount() < 1) {
     92                    if (w.isDeleted() || w.incomplete) {
    9393                        continue;
    9494                    }
     
    353353            // modify all ways containing the nodes
    354354            for (Way w : OsmPrimitive.getFilteredList(selectedNode.getReferrers(), Way.class)) {
    355                 if (w.isDeleted() || w.incomplete || w.getNodesCount() < 1) {
     355                if (w.isDeleted() || w.incomplete) {
    356356                    continue;
    357357                }
  • 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    }
  • trunk/src/org/openstreetmap/josm/data/osm/DataSetListener.java

    r2439 r2497  
    3737     * @param added A collection of newly-visible primitives
    3838     */
    39     public void primtivesAdded(Collection<? extends OsmPrimitive> added);
     39    void primtivesAdded(Collection<? extends OsmPrimitive> added);
    4040
    4141    /**
     
    4545     * @param removed A collection of newly-invisible primitives
    4646     */
    47     public void primtivesRemoved(Collection<? extends OsmPrimitive> removed);
     47    void primtivesRemoved(Collection<? extends OsmPrimitive> removed);
    4848
    4949    /**
     
    5353     * @param prim the primitive, whose tags were affected.
    5454     */
    55     public void tagsChanged(OsmPrimitive prim);
     55    void tagsChanged(OsmPrimitive prim);
    5656
    5757    /**
     
    5959     * @param node The node that was moved.
    6060     */
    61     public void nodeMoved(Node node);
     61    void nodeMoved(Node node);
    6262
    6363    /**
     
    6565     * @param way The way that was modified.
    6666     */
    67     public void wayNodesChanged(Way way);
     67    void wayNodesChanged(Way way);
    6868
    6969    /**
     
    7171     * @param relation The relation that was modified.
    7272     */
    73     public void relationMembersChanged(Relation r);
     73    void relationMembersChanged(Relation r);
    7474
     75    /**
     76     * Called after big changes in dataset. Usually other events are stopped using Dataset.beginUpdate() and
     77     * after operation is completed (Dataset.endUpdate()), {@link #dataChanged()} is called.
     78     */
     79    void dataChanged();
    7580
    7681}
  • trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java

    r2484 r2497  
    333333        if (sourceDataSet == null)
    334334            return;
    335         for (Node node: sourceDataSet.getNodes()) {
    336             mergePrimitive(node);
    337         }
    338         for (Way way: sourceDataSet.getWays()) {
    339             mergePrimitive(way);
    340         }
    341         for (Relation relation: sourceDataSet.getRelations()) {
    342             mergePrimitive(relation);
    343         }
    344         fixReferences();
     335        targetDataSet.beginUpdate();
     336        try {
     337            for (Node node: sourceDataSet.getNodes()) {
     338                mergePrimitive(node);
     339            }
     340            for (Way way: sourceDataSet.getWays()) {
     341                mergePrimitive(way);
     342            }
     343            for (Relation relation: sourceDataSet.getRelations()) {
     344                mergePrimitive(relation);
     345            }
     346            fixReferences();
     347        } finally {
     348            targetDataSet.endUpdate();
     349        }
    345350    }
    346351
  • trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java

    r2492 r2497  
    788788    }
    789789
     790    public void dataChanged() {
     791        Layer l = Main.main.getEditLayer();
     792        if (l != null) {
     793            initFromLayer(l);
     794        }
     795    }
     796
    790797    /* ---------------------------------------------------------------------------------- */
    791798    /* DataSetListener                                                                    */
  • trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java

    r2448 r2497  
    822822    }
    823823
     824    public void dataChanged() {
     825        dataChanged(getEditLayer());
     826    }
     827
    824828    /* ---------------------------------------------------------------------- */
    825829    /* DataChangeListener                                                    */
  • trunk/src/org/openstreetmap/josm/io/OsmReader.java

    r2470 r2497  
    563563
    564564            progressMonitor.subTask(tr("Preparing data set..."));
    565             reader.processNodesAfterParsing();
    566             reader.processWaysAfterParsing();
    567             reader.processRelationsAfterParsing();
     565            reader.ds.beginUpdate();
     566            try {
     567                reader.processNodesAfterParsing();
     568                reader.processWaysAfterParsing();
     569                reader.processRelationsAfterParsing();
     570            } finally {
     571                reader.ds.endUpdate();
     572            }
    568573            progressMonitor.worked(1);
    569574            return reader.getDataSet();
Note: See TracChangeset for help on using the changeset viewer.