Changeset 3371 in josm


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

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

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

Legend:

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

    r3367 r3371  
    6161    }
    6262
     63    public static boolean executeFilters(OsmPrimitive primitive, FilterMatcher filterMatcher) {
     64        boolean hidden = primitive.isDisabledAndHidden();
     65        boolean disabled = primitive.isDisabled();
     66        if (filterMatcher.isHidden(primitive)) {
     67            primitive.setDisabledState(true);
     68        } else if (filterMatcher.isDisabled(primitive)) {
     69            primitive.setDisabledState(false);
     70        } else {
     71            primitive.unsetDisabledState();
     72        }
     73        return hidden != primitive.isDisabledAndHidden() || disabled != primitive.isDisabled();
     74    }
     75
    6376    public static void clearFilterFlags(Collection<OsmPrimitive> prims) {
    6477        for (OsmPrimitive osm : prims) {
  • 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}
  • trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java

    r3356 r3371  
    88import java.awt.Graphics;
    99import java.awt.Graphics2D;
     10import java.util.ArrayList;
    1011import java.util.Collection;
    1112import java.util.HashSet;
     
    2526import org.openstreetmap.josm.data.osm.FilterMatcher;
    2627import org.openstreetmap.josm.data.osm.FilterWorker;
     28import org.openstreetmap.josm.data.osm.Node;
    2729import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2830
     
    5961
    6062
    61    
     63
    6264    public void executeFilters() {
    6365        DataSet ds = Main.main.getCurrentDataSet();
     
    6567            return;
    6668
    67         final Collection<OsmPrimitive> all = ds.allNonDeletedCompletePrimitives();
    68 
    69         FilterWorker.executeFilters(all, filterMatcher);
    70 
    71         disabledCount = 0;
    72         disabledAndHiddenCount = 0;
    73         // collect disabled and selected the primitives
    7469        final Collection<OsmPrimitive> deselect = new HashSet<OsmPrimitive>();
    75         for (OsmPrimitive osm : all) {
    76             if (osm.isDisabled()) {
    77                 disabledCount++;
    78                 if (osm.isSelected()) {
    79                     deselect.add(osm);
    80                 }
    81                 if (osm.isDisabledAndHidden()) {
    82                     disabledAndHiddenCount++;
     70
     71        ds.beginUpdate();
     72        try {
     73
     74            final Collection<OsmPrimitive> all = ds.allNonDeletedCompletePrimitives();
     75
     76            FilterWorker.executeFilters(all, filterMatcher);
     77
     78            disabledCount = 0;
     79            disabledAndHiddenCount = 0;
     80            // collect disabled and selected the primitives
     81            for (OsmPrimitive osm : all) {
     82                if (osm.isDisabled()) {
     83                    disabledCount++;
     84                    if (osm.isSelected()) {
     85                        deselect.add(osm);
     86                    }
     87                    if (osm.isDisabledAndHidden()) {
     88                        disabledAndHiddenCount++;
     89                    }
    8390                }
    8491            }
    85         }
    86         disabledCount -= disabledAndHiddenCount;
     92            disabledCount -= disabledAndHiddenCount;
     93        } finally {
     94            ds.endUpdate();
     95        }
     96
    8797        if (!deselect.isEmpty()) {
    8898            ds.clearSelection(deselect);
     
    91101        Main.map.mapView.repaint();
    92102        Main.map.filterDialog.updateDialogHeader();
     103    }
     104
     105
     106    public void executeFilters(Collection<? extends OsmPrimitive> primitives) {
     107        DataSet ds = Main.main.getCurrentDataSet();
     108        if (ds == null)
     109            return;
     110
     111        boolean changed = false;
     112        List<OsmPrimitive> deselect = new ArrayList<OsmPrimitive>();
     113
     114        ds.beginUpdate();
     115        try {
     116            for (int i=0; i<2; i++) {
     117                for (OsmPrimitive primitive: primitives) {
     118
     119                    if (i == 0 && primitive instanceof Node) {
     120                        continue;
     121                    }
     122
     123                    if (i == 1 && !(primitive instanceof Node)) {
     124                        continue;
     125                    }
     126
     127                    if (primitive.isDisabled()) {
     128                        disabledCount--;
     129                    }
     130                    if (primitive.isDisabledAndHidden()) {
     131                        disabledAndHiddenCount--;
     132                    }
     133                    changed = changed | FilterWorker.executeFilters(primitive, filterMatcher);
     134                    if (primitive.isDisabled()) {
     135                        disabledCount++;
     136                    }
     137                    if (primitive.isDisabledAndHidden()) {
     138                        disabledAndHiddenCount++;
     139                    }
     140
     141                    if (primitive.isSelected() && primitive.isDisabled()) {
     142                        deselect.add(primitive);
     143                    }
     144
     145                }
     146            }
     147        } finally {
     148            ds.endUpdate();
     149        }
     150
     151        if (changed) {
     152            Main.map.mapView.repaint();
     153            Main.map.filterDialog.updateDialogHeader();
     154            ds.clearSelection(deselect);
     155        }
     156
    93157    }
    94158
Note: See TracChangeset for help on using the changeset viewer.