Ticket #20935: 20935-v2.patch
| File 20935-v2.patch, 14.2 KB (added by , 5 years ago) |
|---|
-
src/org/openstreetmap/josm/actions/SplitWayAction.java
35 35 import org.openstreetmap.josm.data.osm.PrimitiveId; 36 36 import org.openstreetmap.josm.data.osm.Way; 37 37 import org.openstreetmap.josm.data.osm.WaySegment; 38 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; 39 import org.openstreetmap.josm.data.osm.event.DataChangedEvent; 40 import org.openstreetmap.josm.data.osm.event.DataSetListener; 41 import org.openstreetmap.josm.data.osm.event.NodeMovedEvent; 42 import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent; 43 import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent; 44 import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent; 45 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent; 46 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; 38 47 import org.openstreetmap.josm.gui.ExtendedDialog; 39 48 import org.openstreetmap.josm.gui.MainApplication; 40 49 import org.openstreetmap.josm.gui.MapFrame; … … 145 154 final Way wayToKeep = SplitWayCommand.Strategy.keepLongestChunk().determineWayToKeep(newWays); 146 155 147 156 if (ExpertToggleAction.isExpert() && !selectedWay.isNew()) { 148 final ExtendedDialog dialog = new SegmentToKeepSelectionDialog(selectedWay, newWays, wayToKeep, sel );157 final ExtendedDialog dialog = new SegmentToKeepSelectionDialog(selectedWay, newWays, wayToKeep, selectedNodes, sel); 149 158 dialog.toggleEnable("way.split.segment-selection-dialog"); 150 159 if (!dialog.toggleCheckState()) { 151 160 dialog.setModal(false); … … 164 173 */ 165 174 static class SegmentToKeepSelectionDialog extends ExtendedDialog { 166 175 static final AtomicInteger DISPLAY_COUNT = new AtomicInteger(); 167 final transient Way selectedWay;168 final transient List<Way> newWays;169 176 final JList<Way> list; 177 transient Way selectedWay; 178 transient List<Way> newWays; 179 transient Way wayToKeep; 170 180 final transient List<OsmPrimitive> selection; 171 final transient Way wayToKeep; 181 final transient List<Node> selectedNodes; 182 private final SplitWayDataSetListener dataSetListener; 172 183 173 SegmentToKeepSelectionDialog(Way selectedWay, List<Way> newWays, Way wayToKeep, List< OsmPrimitive> selection) {184 SegmentToKeepSelectionDialog(Way selectedWay, List<Way> newWays, Way wayToKeep, List<Node> selectedNodes, List<OsmPrimitive> selection) { 174 185 super(MainApplication.getMainFrame(), tr("Which way segment should reuse the history of {0}?", selectedWay.getId()), 175 186 new String[]{tr("Ok"), tr("Cancel")}, true); 176 187 177 188 this.selectedWay = selectedWay; 178 189 this.newWays = newWays; 190 this.selectedNodes = selectedNodes; 179 191 this.selection = selection; 180 192 this.wayToKeep = wayToKeep; 181 193 this.list = new JList<>(newWays.toArray(new Way[0])); 194 this.dataSetListener = new SplitWayDataSetListener(); 195 182 196 configureList(); 183 197 184 198 setButtonIcons("ok", "cancel"); … … 209 223 } 210 224 211 225 protected void setHighlightedWaySegments(Collection<WaySegment> segments) { 212 selectedWay.getDataSet().setHighlightedWaySegments(segments); 213 MainApplication.getMap().mapView.repaint(); 226 DataSet ds = selectedWay.getDataSet(); 227 if (ds != null) { 228 ds.setHighlightedWaySegments(segments); 229 MainApplication.getMap().mapView.repaint(); 230 } 214 231 } 215 232 216 233 @Override 217 234 public void setVisible(boolean visible) { 218 235 super.setVisible(visible); 236 DataSet ds = selectedWay.getDataSet(); 219 237 if (visible) { 220 238 DISPLAY_COUNT.incrementAndGet(); 221 239 list.setSelectedValue(wayToKeep, true); 240 if (ds != null) { 241 ds.addDataSetListener(dataSetListener); 242 } 222 243 } else { 244 if (ds != null) { 245 ds.removeDataSetListener(dataSetListener); 246 } 223 247 setHighlightedWaySegments(Collections.emptyList()); 224 248 DISPLAY_COUNT.decrementAndGet(); 225 249 if (getValue() != 1) { … … 232 256 protected void buttonAction(int buttonIndex, ActionEvent evt) { 233 257 super.buttonAction(buttonIndex, evt); 234 258 toggleSaveState(); // necessary since #showDialog() does not handle it due to the non-modal dialog 235 if (getValue() == 1 ) {259 if (getValue() == 1 && selectedWay.getDataSet() != null) { 236 260 doSplitWay(selectedWay, list.getSelectedValue(), newWays, selection); 237 261 } 238 262 } 263 264 private class SplitWayDataSetListener implements DataSetListener { 265 266 @Override 267 public void primitivesAdded(PrimitivesAddedEvent event) { 268 } 269 270 @Override 271 public void primitivesRemoved(PrimitivesRemovedEvent event) { 272 if (event.getPrimitives().stream().anyMatch(p -> p instanceof Way)) { 273 updateWaySegments(); 274 } 275 } 276 277 @Override 278 public void tagsChanged(TagsChangedEvent event) {} 279 280 @Override 281 public void nodeMoved(NodeMovedEvent event) {} 282 283 @Override 284 public void wayNodesChanged(WayNodesChangedEvent event) { 285 updateWaySegments(); 286 } 287 288 @Override 289 public void relationMembersChanged(RelationMembersChangedEvent event) {} 290 291 @Override 292 public void otherDatasetChange(AbstractDatasetChangedEvent event) {} 293 294 @Override 295 public void dataChanged(DataChangedEvent event) {} 296 297 private void updateWaySegments() { 298 if (!selectedWay.isUsable()) { 299 setVisible(false); 300 return; 301 } 302 303 List<List<Node>> chunks = SplitWayCommand.buildSplitChunks(selectedWay, selectedNodes); 304 if (chunks == null) { 305 setVisible(false); 306 return; 307 } 308 309 newWays = SplitWayCommand.createNewWaysFromChunks(selectedWay, chunks); 310 if (list.getSelectedIndex() < newWays.size()) { 311 wayToKeep = newWays.get(list.getSelectedIndex()); 312 } else { 313 wayToKeep = SplitWayCommand.Strategy.keepLongestChunk().determineWayToKeep(newWays); 314 } 315 list.setListData(newWays.toArray(new Way[0])); 316 list.setSelectedValue(wayToKeep, true); 317 } 318 319 } 239 320 } 240 321 241 322 static class SegmentListCellRenderer extends DefaultListCellRenderer {
