source: josm/trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java

Last change on this file was 18792, checked in by taylor.smock, 8 months ago

Fix #23018: The Name Suggestion Index preset causes dramatic slowing in line drawing and following

The root cause is that every time the dataset fires a DataChangedEvent, we
rebuild the relation list. This causes a search in the presets, which can become
very expensive with the NSI. To fix this, we instead iterate through each
individual event in the DataChangedEvent, and perform the appropriate action.

  • Property svn:eol-style set to native
File size: 3.6 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm.event;
3
4/**
5 * A listener listening for all DataSet changes.
6 *
7 * @author nenik
8 * @see DataSetListenerAdapter
9 */
10public interface DataSetListener {
11 /**
12 * A bunch of primitives were added into the DataSet, or existing
13 * deleted/invisible primitives were resurrected.
14 *
15 * @param event An event for an collection of newly-visible primitives
16 */
17 void primitivesAdded(PrimitivesAddedEvent event);
18
19 /**
20 * A bunch of primitives were removed from the DataSet, or preexisting
21 * primitives were marked as deleted.
22 *
23 * @param event An event for an collection of newly-invisible primitives
24 */
25 void primitivesRemoved(PrimitivesRemovedEvent event);
26
27 /**
28 * There was some change in the tag set of a primitive. It can have been
29 * a tag addition, tag removal or change in tag value.
30 *
31 * @param event the event for the primitive, whose tags were affected.
32 */
33 void tagsChanged(TagsChangedEvent event);
34
35 /**
36 * A node's coordinates were modified.
37 * @param event The event for the node that was moved.
38 */
39 void nodeMoved(NodeMovedEvent event);
40
41 /**
42 * A way's node list was changed.
43 * @param event The event for the way that was modified.
44 */
45 void wayNodesChanged(WayNodesChangedEvent event);
46
47 /**
48 * A relation's members have changed.
49 * @param event The event for the relation that was modified.
50 */
51 void relationMembersChanged(RelationMembersChangedEvent event);
52
53 /**
54 * Minor dataset change, currently only changeset id changed is supported, but can
55 * be extended in future.
56 * @param event the event for data modification
57 */
58 void otherDatasetChange(AbstractDatasetChangedEvent event);
59
60 /**
61 * Called after big changes in dataset. Usually other events are stopped using Dataset.beginUpdate() and
62 * after operation is completed (Dataset.endUpdate()), {@link #dataChanged(DataChangedEvent event)} is called.
63 * @param event data change event
64 */
65 void dataChanged(DataChangedEvent event);
66
67 /**
68 * Call each subevent of a {@link DataChangedEvent}. This should only ever be called from
69 * {@link #dataChanged(DataChangedEvent)}.
70 * @param event The event to call the individual elements from
71 * @implNote Implementors should decide what they want to do with {@code event == null},
72 * {@code event.getEvents() == null}, and {@code event.getEvents().isEmpty()}.
73 * @since 18792
74 */
75 default void dataChangedIndividualEvents(DataChangedEvent event) {
76 for (AbstractDatasetChangedEvent subEvent : event.getEvents()) {
77 if (subEvent instanceof PrimitivesAddedEvent) {
78 this.primitivesAdded((PrimitivesAddedEvent) subEvent);
79 } else if (subEvent instanceof PrimitivesRemovedEvent) {
80 this.primitivesRemoved((PrimitivesRemovedEvent) subEvent);
81 } else if (subEvent instanceof TagsChangedEvent) {
82 this.tagsChanged((TagsChangedEvent) subEvent);
83 } else if (subEvent instanceof NodeMovedEvent) {
84 this.nodeMoved((NodeMovedEvent) subEvent);
85 } else if (subEvent instanceof WayNodesChangedEvent) {
86 this.wayNodesChanged((WayNodesChangedEvent) subEvent);
87 } else if (subEvent instanceof RelationMembersChangedEvent) {
88 this.relationMembersChanged((RelationMembersChangedEvent) subEvent);
89 } else {
90 this.otherDatasetChange(subEvent);
91 }
92 }
93 }
94}
Note: See TracBrowser for help on using the repository browser.