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/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.