001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.command;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import org.openstreetmap.josm.Main;
007 import org.openstreetmap.josm.data.conflict.Conflict;
008 import org.openstreetmap.josm.data.conflict.ConflictCollection;
009 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
010
011 /**
012 * This is the common base class for {@link Command}s which manipulate {@link Conflict}s in
013 * addition to {@link OsmPrimitive}s.
014 *
015 * A ConflictResolverCommand can remember a collection of conflicts it resolves. Upon undoing
016 * it reconstitutes them.
017 *
018 */
019 public abstract class ConflictResolveCommand extends Command {
020 /** the list of resolved conflicts */
021 private ConflictCollection resolvedConflicts;
022
023 public ConflictResolveCommand() {
024 super();
025 resolvedConflicts = new ConflictCollection();
026 }
027
028 public ConflictResolveCommand(OsmDataLayer layer) {
029 super(layer);
030 resolvedConflicts = new ConflictCollection();
031 }
032
033 /**
034 * remembers a conflict in the internal list of remembered conflicts
035 *
036 * @param c the remembered conflict
037 */
038 protected void rememberConflict(Conflict<?> c) {
039 if (! resolvedConflicts.hasConflictForMy(c.getMy())) {
040 resolvedConflicts.add(c);
041 }
042 }
043
044 /**
045 * reconstitutes all remembered conflicts. Add the remembered conflicts to the
046 * set of conflicts of the {@link OsmDataLayer} this command was applied to.
047 *
048 */
049 protected void reconstituteConflicts() {
050 OsmDataLayer editLayer = getLayer();
051 for(Conflict<?> c : resolvedConflicts) {
052 if (!editLayer.getConflicts().hasConflictForMy(c.getMy())) {
053 editLayer.getConflicts().add(c);
054 }
055 }
056 }
057
058 @Override
059 public void undoCommand() {
060 super.undoCommand();
061
062 if (! Main.map.mapView.hasLayer(getLayer())) {
063 System.out.println(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more",
064 this.toString(),
065 getLayer().toString()
066 ));
067 return;
068 }
069
070 Main.map.mapView.setActiveLayer(getLayer());
071 reconstituteConflicts();
072 }
073 }