Ignore:
Timestamp:
2010-07-09T08:24:57+02:00 (14 years ago)
Author:
jttt
Message:

Fix #5018 DataIntegrityProblemException: Primitive must be part of the dataset

File:
1 edited

Legend:

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

    r3356 r3371  
    1212import java.awt.event.KeyEvent;
    1313import java.awt.event.MouseEvent;
     14import java.util.Collection;
     15import java.util.HashSet;
     16import java.util.Set;
     17import java.util.Stack;
    1418
    1519import javax.swing.JCheckBox;
     
    2630import org.openstreetmap.josm.actions.search.SearchAction;
    2731import org.openstreetmap.josm.data.osm.Filter;
     32import org.openstreetmap.josm.data.osm.OsmPrimitive;
     33import org.openstreetmap.josm.data.osm.Relation;
     34import org.openstreetmap.josm.data.osm.RelationMember;
     35import org.openstreetmap.josm.data.osm.Way;
    2836import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
     37import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
    2938import org.openstreetmap.josm.data.osm.event.DataSetListener;
    30 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter;
    3139import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
    32 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter.Listener;
     40import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
     41import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
     42import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
     43import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
     44import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
     45import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
    3346import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
    3447import org.openstreetmap.josm.gui.SideButton;
     
    3952 * @author Petr_Dlouhý
    4053 */
    41 public class FilterDialog extends ToggleDialog implements Listener {
     54public class FilterDialog extends ToggleDialog implements DataSetListener {
    4255
    4356    private JTable userTable;
     
    4962    private SideButton downButton;
    5063
    51     private final DataSetListener listenerAdapter = new DataSetListenerAdapter(this);
    5264
    5365    public FilterDialog(){
     
    5971    @Override
    6072    public void showNotify() {
    61         DatasetEventManager.getInstance().addDatasetListener(listenerAdapter, FireMode.IN_EDT_CONSOLIDATED);
     73        DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT_CONSOLIDATED);
    6274        filterModel.executeFilters();
    6375    }
     
    6577    @Override
    6678    public void hideNotify() {
    67         DatasetEventManager.getInstance().removeDatasetListener(listenerAdapter);
     79        DatasetEventManager.getInstance().removeDatasetListener(this);
    6880        filterModel.clearFilterFlags();
    6981        Main.map.mapView.repaint();
     
    181193    }
    182194
    183     public void processDatasetEvent(AbstractDatasetChangedEvent event) {
    184         filterModel.executeFilters();
    185     }
    186 
    187195    static class StringRenderer extends DefaultTableCellRenderer {
    188196        @Override
     
    216224        filterModel.drawOSDText(g);
    217225    }
     226
     227    /**
     228     *
     229     * @param primitive
     230     * @return List of primitives whose filtering can be affected by change in primitive
     231     */
     232    private Collection<OsmPrimitive> getAffectedPrimitives(Collection<? extends OsmPrimitive> primitives) {
     233        // Filters can use nested parent/child expression so complete tree is necessary
     234        Set<OsmPrimitive> result = new HashSet<OsmPrimitive>();
     235        Stack<OsmPrimitive> stack = new Stack<OsmPrimitive>();
     236        stack.addAll(primitives);
     237
     238        while (!stack.isEmpty()) {
     239            OsmPrimitive p = stack.pop();
     240
     241            if (result.contains(p)) {
     242                continue;
     243            }
     244
     245            result.add(p);
     246
     247            if (p instanceof Way) {
     248                for (OsmPrimitive n: ((Way)p).getNodes()) {
     249                    stack.push(n);
     250                }
     251            } else if (p instanceof Relation) {
     252                for (RelationMember rm: ((Relation)p).getMembers()) {
     253                    stack.push(rm.getMember());
     254                }
     255            }
     256
     257            for (OsmPrimitive ref: p.getReferrers()) {
     258                stack.push(ref);
     259            }
     260        }
     261
     262        return result;
     263    }
     264
     265
     266    @Override
     267    public void dataChanged(DataChangedEvent event) {
     268        filterModel.executeFilters();
     269    }
     270
     271    @Override
     272    public void nodeMoved(NodeMovedEvent event) {
     273        // Do nothing
     274    }
     275
     276    @Override
     277    public void otherDatasetChange(AbstractDatasetChangedEvent event) {
     278        filterModel.executeFilters();
     279    }
     280
     281    @Override
     282    public void primtivesAdded(PrimitivesAddedEvent event) {
     283        filterModel.executeFilters(event.getPrimitives());
     284    }
     285
     286    @Override
     287    public void primtivesRemoved(PrimitivesRemovedEvent event) {
     288        filterModel.executeFilters();
     289    }
     290
     291    @Override
     292    public void relationMembersChanged(RelationMembersChangedEvent event) {
     293        filterModel.executeFilters(getAffectedPrimitives(event.getPrimitives()));
     294    }
     295
     296    @Override
     297    public void tagsChanged(TagsChangedEvent event) {
     298        filterModel.executeFilters(getAffectedPrimitives(event.getPrimitives()));
     299    }
     300
     301    @Override
     302    public void wayNodesChanged(WayNodesChangedEvent event) {
     303        filterModel.executeFilters(getAffectedPrimitives(event.getPrimitives()));
     304    }
    218305}
Note: See TracChangeset for help on using the changeset viewer.