- Timestamp:
- 2017-02-25T12:52:18+01:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
r11553 r11609 10 10 import java.util.Objects; 11 11 import java.util.Optional; 12 import java.util.stream.Collectors; 12 13 13 14 import javax.swing.Icon; … … 28 29 public class AddPrimitivesCommand extends Command { 29 30 30 private List<PrimitiveData> data = new ArrayList<>(); 31 private Collection<PrimitiveData> toSelect = new ArrayList<>(); 31 private List<PrimitiveData> data; 32 private Collection<PrimitiveData> toSelect; 33 private List<PrimitiveData> preExistingData; 32 34 33 35 // only filled on undo 34 36 private List<OsmPrimitive> createdPrimitives; 35 private Collection<OsmPrimitive> createdPrimitivesToSelect;36 37 37 38 /** … … 66 67 private void init(List<PrimitiveData> data, List<PrimitiveData> toSelect) { 67 68 CheckParameterUtil.ensureParameterNotNull(data, "data"); 68 this.data.addAll(data); 69 if (toSelect != null) { 70 this.toSelect.addAll(toSelect); 69 this.data = new ArrayList<>(data); 70 if (toSelect == data) { 71 this.toSelect = this.data; 72 } else if (toSelect != null) { 73 this.toSelect = new ArrayList<>(toSelect); 71 74 } 72 75 } … … 74 77 @Override 75 78 public boolean executeCommand() { 76 Collection<OsmPrimitive> primitivesToSelect;79 DataSet ds = getAffectedDataSet(); 77 80 if (createdPrimitives == null) { // first time execution 78 81 List<OsmPrimitive> newPrimitives = new ArrayList<>(data.size()); 79 pr imitivesToSelect = new ArrayList<>(toSelect.size());82 preExistingData = new ArrayList<>(); 80 83 81 84 for (PrimitiveData pd : data) { 82 OsmPrimitive primitive = getAffectedDataSet().getPrimitiveById(pd);85 OsmPrimitive primitive = ds.getPrimitiveById(pd); 83 86 boolean created = primitive == null; 84 if ( created) {87 if (primitive == null) { 85 88 primitive = pd.getType().newInstance(pd.getUniqueId(), true); 89 } else { 90 preExistingData.add(primitive.save()); 86 91 } 87 92 if (pd instanceof NodeData) { // Load nodes immediately because they can't be added to dataset without coordinates … … 89 94 } 90 95 if (created) { 91 getAffectedDataSet().addPrimitive(primitive);96 ds.addPrimitive(primitive); 92 97 } 93 98 newPrimitives.add(primitive); 94 if (toSelect.contains(pd)) {95 primitivesToSelect.add(primitive);96 }97 99 } 98 100 … … 108 110 // a subsequent command (e.g. MoveCommand) cannot be redone. 109 111 for (OsmPrimitive osm : createdPrimitives) { 110 getAffectedDataSet().addPrimitive(osm); 112 if (preExistingData.stream().anyMatch(pd -> pd.getUniqueId() == osm.getUniqueId())) { 113 Optional<PrimitiveData> o = data.stream().filter(pd -> pd.getUniqueId() == osm.getUniqueId()).findAny(); 114 if (o.isPresent()) { 115 osm.load(o.get()); 116 } 117 } else { 118 ds.addPrimitive(osm); 119 } 111 120 } 112 primitivesToSelect = createdPrimitivesToSelect;113 121 } 114 115 getAffectedDataSet().setSelected(primitivesToSelect); 122 if (toSelect != null) { 123 ds.setSelected(toSelect.stream().map(ds::getPrimitiveById).collect(Collectors.toList())); 124 } 116 125 return true; 117 126 } … … 119 128 @Override public void undoCommand() { 120 129 DataSet ds = getAffectedDataSet(); 121 122 130 if (createdPrimitives == null) { 123 131 createdPrimitives = new ArrayList<>(data.size()); 124 createdPrimitivesToSelect = new ArrayList<>(toSelect.size());125 126 132 for (PrimitiveData pd : data) { 127 133 OsmPrimitive p = ds.getPrimitiveById(pd); 128 134 createdPrimitives.add(p); 129 if (toSelect.contains(pd)) {130 createdPrimitivesToSelect.add(p);131 }132 135 } 133 136 createdPrimitives = PurgeCommand.topoSort(createdPrimitives); 134 135 for (PrimitiveData p : data) { 136 ds.removePrimitive(p); 137 } 138 data = null; 139 toSelect = null; 140 141 } else { 142 for (OsmPrimitive osm : createdPrimitives) { 137 } 138 for (OsmPrimitive osm : createdPrimitives) { 139 Optional<PrimitiveData> previous = preExistingData.stream().filter(pd -> pd.getUniqueId() == osm.getUniqueId()).findAny(); 140 if (previous.isPresent()) { 141 osm.load(previous.get()); 142 } else { 143 143 ds.removePrimitive(osm); 144 144 } … … 178 178 @Override 179 179 public int hashCode() { 180 return Objects.hash(super.hashCode(), data, toSelect, createdPrimitives, createdPrimitivesToSelect);180 return Objects.hash(super.hashCode(), data, toSelect, preExistingData, createdPrimitives); 181 181 } 182 182 … … 189 189 return Objects.equals(data, that.data) && 190 190 Objects.equals(toSelect, that.toSelect) && 191 Objects.equals( createdPrimitives, that.createdPrimitives) &&192 Objects.equals(createdPrimitives ToSelect, that.createdPrimitivesToSelect);191 Objects.equals(preExistingData, that.preExistingData) && 192 Objects.equals(createdPrimitives, that.createdPrimitives); 193 193 } 194 194 }
Note:
See TracChangeset
for help on using the changeset viewer.