Ticket #17196: 17196.2.patch

File 17196.2.patch, 5.9 KB (added by GerdP, 5 years ago)

POC: One instance per DataSet

  • src/org/openstreetmap/josm/data/UndoRedoHandler.java

     
    22package org.openstreetmap.josm.data;
    33
    44import java.util.EventObject;
    5 import java.util.Iterator;
     5import java.util.HashMap;
    66import java.util.LinkedList;
    77import java.util.List;
     8import java.util.Map;
    89import java.util.Objects;
    910
    1011import org.openstreetmap.josm.command.Command;
     
    2223public final class UndoRedoHandler {
    2324
    2425    /**
    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.
    2927     */
    30     public final LinkedList<Command> commands = new LinkedList<>();
     28    private final LinkedList<Command> commands = new LinkedList<>();
    3129
    3230    /**
    3331     * The stack for redoing commands
    34 
    35      * @see #getRedoCommands()
    3632     */
    37     public final LinkedList<Command> redoCommands = new LinkedList<>();
     33    private final LinkedList<Command> redoCommands = new LinkedList<>();
    3834
    3935    private final LinkedList<CommandQueueListener> listenerCommands = new LinkedList<>();
    4036    private final LinkedList<CommandQueuePreciseListener> preciseListenerCommands = new LinkedList<>();
    4137
    4238    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<>();
    4441    }
    4542
    4643    /**
     
    4946     * @since 14134
    5047     */
    5148    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());
    5354    }
    5455
    5556    /**
     
    426427        for (final CommandQueueListener l : listenerCommands) {
    427428            l.commandChanged(commands.size(), redoCommands.size());
    428429        }
     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        }
    429436    }
    430437
    431438    private void fireEvent(CommandQueueEvent e) {
     
    450457    public synchronized void clean(DataSet dataSet) {
    451458        if (dataSet == null)
    452459            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);
    470462    }
    471463
    472464    /**
  • src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java

     
    5050import org.openstreetmap.josm.data.osm.OsmPrimitive;
    5151import org.openstreetmap.josm.gui.MainApplication;
    5252import org.openstreetmap.josm.gui.SideButton;
     53import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
     54import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
    5355import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    5456import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
    5557import org.openstreetmap.josm.tools.GBC;
     
    6264 * Dialog displaying list of all executed commands (undo/redo buffer).
    6365 * @since 94
    6466 */
    65 public class CommandStackDialog extends ToggleDialog implements CommandQueuePreciseListener {
     67public class CommandStackDialog extends ToggleDialog implements CommandQueuePreciseListener, ActiveLayerChangeListener {
    6668
    6769    private final DefaultTreeModel undoTreeModel = new DefaultTreeModel(new DefaultMutableTreeNode());
    6870    private final DefaultTreeModel redoTreeModel = new DefaultTreeModel(new DefaultMutableTreeNode());
     
    144146
    145147        InputMapUtils.addEnterAction(undoTree, selectAndZoomAction);
    146148        InputMapUtils.addEnterAction(redoTree, selectAndZoomAction);
     149        MainApplication.getLayerManager().addAndFireActiveLayerChangeListener(this);
    147150    }
    148151
    149152    private static class CommandCellRenderer extends DefaultTreeCellRenderer {
     
    550553            add(selectAndZoomAction);
    551554        }
    552555    }
     556
     557    @Override
     558    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
     559        hideNotify();
     560        showNotify();
     561    }
    553562}
  • test/unit/org/openstreetmap/josm/gui/dialogs/CommandStackDialogTest.java

     
    2727     */
    2828    @Rule
    2929    @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();
    3131
    3232    /**
    3333     * Unit test of {@link CommandStackDialog} class - empty case.