---
core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java | 53 ++++++-------
1 file changed, 25 insertions(+), 28 deletions(-)
diff -puN src/org/openstreetmap/josm/data/osm/DataSet.java~implement-selection-storage-in-DataSet src/org/openstreetmap/josm/data/osm/DataSet.java
|
a
|
b
|
import java.awt.geom.Area;
|
| 6 | 6 | import java.util.ArrayList; |
| 7 | 7 | import java.util.Arrays; |
| 8 | 8 | import java.util.Collection; |
| | 9 | import java.util.Collections; |
| 9 | 10 | import java.util.Comparator; |
| 10 | 11 | import java.util.HashMap; |
| | 12 | import java.util.LinkedHashSet; |
| 11 | 13 | import java.util.HashSet; |
| 12 | 14 | import java.util.Iterator; |
| 13 | 15 | import java.util.LinkedList; |
| … |
… |
import java.util.Set;
|
| 16 | 18 | |
| 17 | 19 | import org.openstreetmap.josm.data.SelectionChangedListener; |
| 18 | 20 | import org.openstreetmap.josm.data.osm.QuadBuckets; |
| | 21 | import org.openstreetmap.josm.data.osm.OsmPrimitive; |
| 19 | 22 | |
| 20 | 23 | /** |
| 21 | 24 | * DataSet is the data behind the application. It can consists of only a few points up to the whole |
| … |
… |
public class DataSet implements Cloneabl
|
| 142 | 145 | } else if (primitive instanceof Relation) { |
| 143 | 146 | relations.remove(primitive); |
| 144 | 147 | } |
| | 148 | selectedPrimitves.remove(primitive); |
| 145 | 149 | } |
| 146 | 150 | |
| 147 | 151 | public Collection<OsmPrimitive> getSelectedNodesAndWays() { |
| … |
… |
public class DataSet implements Cloneabl
|
| 156 | 160 | * @return List of all selected objects. |
| 157 | 161 | */ |
| 158 | 162 | public Collection<OsmPrimitive> getSelected() { |
| 159 | | Collection<OsmPrimitive> sel = getSelected(nodes); |
| 160 | | sel.addAll(getSelected(ways)); |
| 161 | | sel.addAll(getSelected(relations)); |
| 162 | | return sel; |
| | 163 | // It would be nice to have this be a copy-on-write list |
| | 164 | // or an Collections.unmodifiableList(). It would be |
| | 165 | // much faster for large selections. May users just |
| | 166 | // call this, and only check the .size(). |
| | 167 | return new ArrayList<OsmPrimitive>(selectedPrimitives); |
| 163 | 168 | } |
| 164 | 169 | |
| 165 | 170 | /** |
| … |
… |
public class DataSet implements Cloneabl
|
| 215 | 220 | } |
| 216 | 221 | } |
| 217 | 222 | |
| 218 | | public boolean addSelected(OsmPrimitive osm) { |
| 219 | | osm.setSelected(true); |
| 220 | | return true; |
| | 223 | LinkedHashSet<OsmPrimitive> selectedPrimitives = new LinkedHashSet<OsmPrimitive>(); |
| | 224 | public boolean addSelected(OsmPrimitive... osm) { |
| | 225 | return this.addSelected(Arrays.asList(osm)); |
| | 226 | } |
| | 227 | public boolean addSelected(Collection<? extends OsmPrimitive> list) { |
| | 228 | return selectedPrimitives.addAll(list); |
| 221 | 229 | } |
| 222 | 230 | |
| 223 | 231 | public boolean toggleSelected(OsmPrimitive osm) { |
| 224 | | osm.setSelected(!osm.isSelected()); |
| | 232 | if (!selectedPrimitives.remove(osm)) |
| | 233 | selectedPrimitives.add(osm); |
| 225 | 234 | return true; |
| 226 | 235 | } |
| 227 | 236 | public boolean isSelected(OsmPrimitive osm) { |
| 228 | | return osm.isSelected(); |
| | 237 | return selectedPrimitives.contains(osm); |
| 229 | 238 | } |
| 230 | 239 | |
| 231 | 240 | public void setDisabled(OsmPrimitive... osm) { |
| … |
… |
public class DataSet implements Cloneabl
|
| 246 | 255 | clearSelection(nodes); |
| 247 | 256 | clearSelection(ways); |
| 248 | 257 | clearSelection(relations); |
| 249 | | for (OsmPrimitive osm : selection) { |
| 250 | | osm.setSelected(true); |
| 251 | | } |
| | 258 | addSelected(selection); |
| 252 | 259 | fireSelectionChanged(selection); |
| 253 | 260 | } |
| 254 | 261 | |
| … |
… |
public class DataSet implements Cloneabl
|
| 257 | 264 | setSelected(); |
| 258 | 265 | return; |
| 259 | 266 | } |
| 260 | | clearSelection(nodes); |
| 261 | | clearSelection(ways); |
| 262 | | clearSelection(relations); |
| 263 | | for (OsmPrimitive o : osm) |
| 264 | | if (o != null) { |
| 265 | | o.setSelected(true); |
| 266 | | } |
| | 267 | List<OsmPrimitive> list = Arrays.asList(osm); |
| | 268 | setSelected(list); |
| 267 | 269 | fireSelectionChanged(Arrays.asList(osm)); |
| 268 | 270 | } |
| 269 | 271 | |
| … |
… |
public class DataSet implements Cloneabl
|
| 300 | 302 | private void clearSelection(Collection<? extends OsmPrimitive> list) { |
| 301 | 303 | if (list == null) |
| 302 | 304 | return; |
| 303 | | for (OsmPrimitive osm : list) { |
| 304 | | osm.setSelected(false); |
| 305 | | } |
| | 305 | selectedPrimitives.removeAll(list); |
| 306 | 306 | } |
| 307 | 307 | |
| 308 | 308 | /** |
| … |
… |
public class DataSet implements Cloneabl
|
| 310 | 310 | * @param list The collection from which the selected items are returned. |
| 311 | 311 | */ |
| 312 | 312 | private Collection<OsmPrimitive> getSelected(Collection<? extends OsmPrimitive> list) { |
| 313 | | Collection<OsmPrimitive> sel = new HashSet<OsmPrimitive>(); |
| 314 | 313 | if (list == null) |
| 315 | | return sel; |
| 316 | | for (OsmPrimitive osm : list) |
| 317 | | if (osm.isSelected() && !osm.isDeleted()) { |
| 318 | | sel.add(osm); |
| 319 | | } |
| | 314 | return new LinkedList<OsmPrimitive>(); |
| | 315 | Collection<OsmPrimitive> sel = new LinkedHashSet<OsmPrimitive>(selectedPrimitives); |
| | 316 | sel.retainAll(list); |
| 320 | 317 | return sel; |
| 321 | 318 | } |
| 322 | 319 | |