Ticket #23018: 23018.patch

File 23018.patch, 4.1 KB (added by taylor.smock, 2 years ago)
  • src/org/openstreetmap/josm/data/osm/event/DataSetListener.java

    Subject: [PATCH] Fix #23018: `RelationListDialog` should not re-init on every `DataChangedEvent`
    
    A `DataChangedEvent` can have no subevents, one subevent, or many subevents.
    
    As an example, adding the first node via the `Draw` command will fire an event
    with a single `PRIMITIVES_ADDED` subevent, adding the second node will fire an
    event with two `PRIMITIVES_ADDED` events and one `PRIMITIVE_FLAGS_CHANGED` event,
    adding the third (and further) node will fire an event with one `PRIMITIVES_ADDED`
    event, one `WAY_NODES_CHANGED` event, and one `PRIMITIVE_FLAGS_CHANGED` event.
    
    Therefore, the `RelationListDialog` ''should not'' call `initFromData` every time
    a `DataChangedEvent` is fired. We do this by adding a default method in
    `DataSetListener` which iterates through each event individually and calls the
    appropriate function. It is not and should not be called by event firers.
    ---
    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java b/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java
    a b  
    6363     * @param event data change event
    6464     */
    6565    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 xxx
     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    }
    6694}
  • src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
    a b  
    735735
    736736    @Override
    737737    public void dataChanged(DataChangedEvent event) {
    738         initFromData(MainApplication.getLayerManager().getActiveData());
     738        // I have no clue how it would be empty, but just in case use the original code.
     739        // {@code null} is used during initialization
     740        if (event == null || Utils.isEmpty(event.getEvents())) {
     741            initFromData(MainApplication.getLayerManager().getActiveData());
     742        } else {
     743            dataChangedIndividualEvents(event);
     744        }
    739745    }
    740746
    741747    @Override