Ticket #10730: 10730-alpha.patch
File 10730-alpha.patch, 9.9 KB (added by , 9 years ago) |
---|
-
src/org/openstreetmap/josm/actions/SplitWayAction.java
diff --git a/src/org/openstreetmap/josm/actions/SplitWayAction.java b/src/org/openstreetmap/josm/actions/SplitWayAction.java index 2fd7f2f..9c81a2f 100644
a b 5 5 import static org.openstreetmap.josm.tools.I18n.tr; 6 6 import static org.openstreetmap.josm.tools.I18n.trn; 7 7 8 import java.awt.Component; 9 import java.awt.GridLayout; 8 10 import java.awt.event.ActionEvent; 9 11 import java.awt.event.KeyEvent; 10 12 import java.util.ArrayList; … … 17 19 import java.util.List; 18 20 import java.util.Set; 19 21 22 import javax.swing.DefaultListCellRenderer; 23 import javax.swing.JLabel; 24 import javax.swing.JList; 20 25 import javax.swing.JOptionPane; 26 import javax.swing.JPanel; 27 import javax.swing.ListSelectionModel; 28 import javax.swing.event.ListSelectionEvent; 29 import javax.swing.event.ListSelectionListener; 21 30 22 31 import org.openstreetmap.josm.Main; 23 32 import org.openstreetmap.josm.command.AddCommand; 24 33 import org.openstreetmap.josm.command.ChangeCommand; 25 34 import org.openstreetmap.josm.command.Command; 26 35 import org.openstreetmap.josm.command.SequenceCommand; 36 import org.openstreetmap.josm.data.osm.NameFormatter; 27 37 import org.openstreetmap.josm.data.osm.Node; 28 38 import org.openstreetmap.josm.data.osm.OsmPrimitive; 29 39 import org.openstreetmap.josm.data.osm.PrimitiveId; … … 31 41 import org.openstreetmap.josm.data.osm.RelationMember; 32 42 import org.openstreetmap.josm.data.osm.Way; 33 43 import org.openstreetmap.josm.gui.DefaultNameFormatter; 44 import org.openstreetmap.josm.gui.ExtendedDialog; 34 45 import org.openstreetmap.josm.gui.Notification; 35 46 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 36 47 import org.openstreetmap.josm.tools.CheckParameterUtil; 37 48 import org.openstreetmap.josm.tools.Shortcut; 49 import org.openstreetmap.josm.tools.Utils; 38 50 39 51 /** 40 52 * Splits a way into multiple ways (all identical except for their node list). … … public void actionPerformed(ActionEvent e) { 175 187 } 176 188 177 189 // Finally, applicableWays contains only one perfect way 178 Way selectedWay = applicableWays.get(0);190 final Way selectedWay = applicableWays.get(0); 179 191 180 192 List<List<Node>> wayChunks = buildSplitChunks(selectedWay, selectedNodes); 181 193 if (wayChunks != null) { 182 List<OsmPrimitive> sel = new ArrayList<>(selectedWays.size() + selectedRelations.size());194 final List<OsmPrimitive> sel = new ArrayList<>(selectedWays.size() + selectedRelations.size()); 183 195 sel.addAll(selectedWays); 184 196 sel.addAll(selectedRelations); 185 SplitWayResult result = splitWay(getEditLayer(), selectedWay, wayChunks, sel); 186 Main.main.undoRedo.add(result.getCommand()); 187 getCurrentDataSet().setSelected(result.getNewSelection()); 197 198 final List<Way> newWays = createNewWaysFromChunks(selectedWay, wayChunks); 199 Way wayToKeep = newWays.get(0); 200 201 if (ExpertToggleAction.isExpert() && !selectedWay.isNew()) { 202 final JList<Way> list = new JList<>(newWays.toArray(new Way[newWays.size()])); 203 list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 204 list.addListSelectionListener(new ListSelectionListener() { 205 @Override 206 public void valueChanged(ListSelectionEvent e) { 207 final Way selected = list.getSelectedValue(); 208 if (Main.isDisplayingMapView() && selected != null) { 209 // todo somehow select/highlight this way although it is not yet part of the dataset 210 } 211 } 212 }); 213 list.setCellRenderer(new DefaultListCellRenderer() { 214 @Override 215 public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 216 final Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 217 ((JLabel) c).setText(tr("Segment {0}: {1}", index + 1, DefaultNameFormatter.getInstance().format((Way) value))); 218 return c; 219 } 220 }); 221 list.setSelectedValue(wayToKeep, true); 222 final String question = tr("Which way segment should reuse id {0}?", selectedWay.getId()); 223 final ExtendedDialog dialog = new ExtendedDialog(Main.parent, question, new String[]{tr("Ok"), tr("Cancel")}, true) { 224 @Override 225 protected void buttonAction(int buttonIndex, ActionEvent evt) { 226 super.buttonAction(buttonIndex, evt); 227 if (getValue() == 1) { 228 final Way wayToKeep = list.getSelectedValue(); 229 final SplitWayResult result = doSplitWay(getEditLayer(), selectedWay, wayToKeep, newWays, sel); 230 Main.main.undoRedo.add(result.getCommand()); 231 getCurrentDataSet().setSelected(result.getNewSelection()); 232 } 233 } 234 235 { 236 setButtonIcons(new String[]{"ok", "cancel"}); 237 final JPanel pane = new JPanel(new GridLayout(2, 1)); 238 pane.add(new JLabel(question)); 239 pane.add(list); 240 setContent(pane); 241 } 242 }; 243 dialog.setModal(false); 244 dialog.showDialog(); 245 } else { 246 final SplitWayResult result = doSplitWay(getEditLayer(), selectedWay, wayToKeep, newWays, sel); 247 Main.main.undoRedo.add(result.getCommand()); 248 getCurrentDataSet().setSelected(result.getNewSelection()); 249 } 188 250 } 189 251 } 190 252 … … public void actionPerformed(ActionEvent e) { 327 389 return wayChunks; 328 390 } 329 391 392 protected static List<Way> createNewWaysFromChunks(Way way, List<List<Node>> wayChunks) { 393 final List<Way> newWays = new ArrayList<>(); 394 for (List<Node> wayChunk : wayChunks) { 395 Way wayToAdd = new Way(); 396 wayToAdd.setKeys(way.getKeys()); 397 wayToAdd.setNodes(wayChunk); 398 newWays.add(wayToAdd); 399 } 400 return newWays; 401 } 402 330 403 /** 331 404 * Splits the way {@code way} into chunks of {@code wayChunks} and replies 332 405 * the result of this process in an instance of {@link SplitWayResult}. … … public void actionPerformed(ActionEvent e) { 341 414 * @param selection The list of currently selected primitives 342 415 * @return the result from the split operation 343 416 */ 344 public static SplitWayResult splitWay( OsmDataLayer layer,Way way, List<List<Node>> wayChunks,417 public static SplitWayResult splitWay(final OsmDataLayer layer, final Way way, List<List<Node>> wayChunks, 345 418 Collection<? extends OsmPrimitive> selection) { 346 419 // build a list of commands, and also a new selection list 347 Collection<Command> commandList = new ArrayList<>(wayChunks.size()); 348 List<OsmPrimitive> newSelection = new ArrayList<>(selection.size() + wayChunks.size()); 420 final List<OsmPrimitive> newSelection = new ArrayList<>(selection.size() + wayChunks.size()); 349 421 newSelection.addAll(selection); 350 422 351 Iterator<List<Node>> chunkIt = wayChunks.iterator(); 423 // Create all potential new ways 424 final List<Way> newWays = createNewWaysFromChunks(way, wayChunks); 425 426 // Determine which part reuses the existing way 427 final Way wayToKeep = newWays.get(0); 428 429 return doSplitWay(layer, way, wayToKeep, newWays, newSelection); 430 } 431 432 static SplitWayResult doSplitWay(OsmDataLayer layer, Way way, Way wayToKeep, List<Way> newWays, 433 List<OsmPrimitive> newSelection) { 434 435 Collection<Command> commandList = new ArrayList<>(newWays.size()); 352 436 Collection<String> nowarnroles = Main.pref.getCollection("way.split.roles.nowarn", 353 437 Arrays.asList("outer", "inner", "forward", "backward", "north", "south", "east", "west")); 354 438 355 // First, change the original way356 Way changedWay = new Way(way);357 changedWay.setNodes( chunkIt.next());439 // Change the original way 440 final Way changedWay = new Way(way); 441 changedWay.setNodes(wayToKeep.getNodes()); 358 442 commandList.add(new ChangeCommand(way, changedWay)); 359 443 if (!newSelection.contains(way)) { 360 444 newSelection.add(way); 361 445 } 446 newWays.remove(wayToKeep); 362 447 363 List<Way> newWays = new ArrayList<>(); 364 // Second, create new ways 365 while (chunkIt.hasNext()) { 366 Way wayToAdd = new Way(); 367 wayToAdd.setKeys(way.getKeys()); 368 newWays.add(wayToAdd); 369 wayToAdd.setNodes(chunkIt.next()); 448 for (Way wayToAdd : newWays) { 370 449 commandList.add(new AddCommand(layer, wayToAdd)); 371 450 newSelection.add(wayToAdd); 372 451 } 452 373 453 boolean warnmerole = false; 374 454 boolean warnme = false; 375 455 // now copy all relations to new way also … … public static SplitWayResult splitWay(OsmDataLayer layer, Way way, List<List<Nod 508 588 return new SplitWayResult( 509 589 new SequenceCommand( 510 590 /* for correct i18n of plural forms - see #9110 */ 511 trn("Split way {0} into {1} part", "Split way {0} into {1} parts", wayChunks.size(),512 way.getDisplayName(DefaultNameFormatter.getInstance()), wayChunks.size()),591 trn("Split way {0} into {1} part", "Split way {0} into {1} parts", newWays.size(), 592 way.getDisplayName(DefaultNameFormatter.getInstance()), newWays.size()), 513 593 commandList 514 594 ), 515 595 newSelection,