Ticket #17196: 17196.2.patch
File 17196.2.patch, 5.9 KB (added by , 5 years ago) |
---|
-
src/org/openstreetmap/josm/data/UndoRedoHandler.java
2 2 package org.openstreetmap.josm.data; 3 3 4 4 import java.util.EventObject; 5 import java.util. Iterator;5 import java.util.HashMap; 6 6 import java.util.LinkedList; 7 7 import java.util.List; 8 import java.util.Map; 8 9 import java.util.Objects; 9 10 10 11 import org.openstreetmap.josm.command.Command; … … 22 23 public final class UndoRedoHandler { 23 24 24 25 /** 25 * All commands that were made on the dataset. Don't write from outside! 26 * 27 * @see #getLastCommand() 28 * @see #getUndoCommands() 26 * All commands that were made on the dataset. 29 27 */ 30 p ublicfinal LinkedList<Command> commands = new LinkedList<>();28 private final LinkedList<Command> commands = new LinkedList<>(); 31 29 32 30 /** 33 31 * The stack for redoing commands 34 35 * @see #getRedoCommands()36 32 */ 37 p ublicfinal LinkedList<Command> redoCommands = new LinkedList<>();33 private final LinkedList<Command> redoCommands = new LinkedList<>(); 38 34 39 35 private final LinkedList<CommandQueueListener> listenerCommands = new LinkedList<>(); 40 36 private final LinkedList<CommandQueuePreciseListener> preciseListenerCommands = new LinkedList<>(); 41 37 42 38 private static class InstanceHolder { 43 static final UndoRedoHandler INSTANCE = new UndoRedoHandler(); 39 static final UndoRedoHandler NO_DATA_SET_INSTANCE = new UndoRedoHandler(); 40 static final Map<DataSet, UndoRedoHandler> map = new HashMap<>(); 44 41 } 45 42 46 43 /** … … 49 46 * @since 14134 50 47 */ 51 48 public static UndoRedoHandler getInstance() { 52 return InstanceHolder.INSTANCE; 49 DataSet ds = OsmDataManager.getInstance().getEditDataSet(); 50 if (ds == null) 51 return InstanceHolder.NO_DATA_SET_INSTANCE; 52 else 53 return InstanceHolder.map.computeIfAbsent(ds, k -> new UndoRedoHandler()); 53 54 } 54 55 55 56 /** … … 426 427 for (final CommandQueueListener l : listenerCommands) { 427 428 l.commandChanged(commands.size(), redoCommands.size()); 428 429 } 430 if (getInstance() != InstanceHolder.NO_DATA_SET_INSTANCE) { 431 for (final CommandQueueListener l : InstanceHolder.NO_DATA_SET_INSTANCE.listenerCommands) { 432 l.commandChanged(commands.size(), redoCommands.size()); 433 } 434 435 } 429 436 } 430 437 431 438 private void fireEvent(CommandQueueEvent e) { … … 450 457 public synchronized void clean(DataSet dataSet) { 451 458 if (dataSet == null) 452 459 return; 453 boolean changed = false; 454 for (Iterator<Command> it = commands.iterator(); it.hasNext();) { 455 if (it.next().getAffectedDataSet() == dataSet) { 456 it.remove(); 457 changed = true; 458 } 459 } 460 for (Iterator<Command> it = redoCommands.iterator(); it.hasNext();) { 461 if (it.next().getAffectedDataSet() == dataSet) { 462 it.remove(); 463 changed = true; 464 } 465 } 466 if (changed) { 467 fireEvent(new CommandQueueCleanedEvent(this, dataSet)); 468 fireCommandsChanged(); 469 } 460 clean(); 461 InstanceHolder.map.remove(dataSet); 470 462 } 471 463 472 464 /** -
src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
50 50 import org.openstreetmap.josm.data.osm.OsmPrimitive; 51 51 import org.openstreetmap.josm.gui.MainApplication; 52 52 import org.openstreetmap.josm.gui.SideButton; 53 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent; 54 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener; 53 55 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 54 56 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 55 57 import org.openstreetmap.josm.tools.GBC; … … 62 64 * Dialog displaying list of all executed commands (undo/redo buffer). 63 65 * @since 94 64 66 */ 65 public class CommandStackDialog extends ToggleDialog implements CommandQueuePreciseListener {67 public class CommandStackDialog extends ToggleDialog implements CommandQueuePreciseListener, ActiveLayerChangeListener { 66 68 67 69 private final DefaultTreeModel undoTreeModel = new DefaultTreeModel(new DefaultMutableTreeNode()); 68 70 private final DefaultTreeModel redoTreeModel = new DefaultTreeModel(new DefaultMutableTreeNode()); … … 144 146 145 147 InputMapUtils.addEnterAction(undoTree, selectAndZoomAction); 146 148 InputMapUtils.addEnterAction(redoTree, selectAndZoomAction); 149 MainApplication.getLayerManager().addAndFireActiveLayerChangeListener(this); 147 150 } 148 151 149 152 private static class CommandCellRenderer extends DefaultTreeCellRenderer { … … 550 553 add(selectAndZoomAction); 551 554 } 552 555 } 556 557 @Override 558 public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) { 559 hideNotify(); 560 showNotify(); 561 } 553 562 } -
test/unit/org/openstreetmap/josm/gui/dialogs/CommandStackDialogTest.java
27 27 */ 28 28 @Rule 29 29 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") 30 public JOSMTestRules test = new JOSMTestRules().main().projection() ;30 public JOSMTestRules test = new JOSMTestRules().main().projection().preferences(); 31 31 32 32 /** 33 33 * Unit test of {@link CommandStackDialog} class - empty case.