/*
* $Id$
*
* Copyright (c) 2000-2003 by Rodney Kinney
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.command;
import java.awt.Rectangle;
import VASSAL.build.GameModule;
import VASSAL.build.module.GameState;
import VASSAL.build.module.Map;
import VASSAL.build.module.map.HighlightLastMoved;
import VASSAL.counters.GamePiece;
import VASSAL.counters.KeyBuffer;
import VASSAL.counters.Stack;
/**
* This Command removed a {@link GamePiece} from a game. Its undo
* Command is {@link AddPiece}. */
public class RemovePiece extends Command {
private Command undo = null;
private GamePiece target;
private String id;
public RemovePiece(GamePiece p) {
target = p;
}
public RemovePiece(String id) {
this.id = id;
}
/**
* Removes a piece by invoking {@link Map#removePiece} if the
* piece belongs to a {@link Map}, followed by {@link
* GameState#removePiece}.
*/
protected void executeCommand() {
if (target == null) {
target = GameModule.getGameModule().getGameState().getPieceForId(id);
if (target == null) return;
}
undo = new AddPiece(target, target.getState());
Rectangle r = null;
final Map m = target.getMap();
final Stack parent = target.getParent();
// Highlight the stack the piece was removed from - Ben
HighlightLastMoved.setLastMoved(target);
if (m != null) {
r = parent == null ? m.boundingBoxOf(target) : m.boundingBoxOf(parent);
m.removePiece(target);
target.setMap(null);
}
if (parent != null) {
final String stateWithPiece = parent.getState();
parent.remove(target);
undo = undo.append(
new ChangePiece(parent.getId(),parent.getState(), stateWithPiece));
target.setParent(null);
}
if (m != null) {
m.repaint(r);
}
GameModule.getGameModule().getGameState().removePiece(target.getId());
KeyBuffer.getBuffer().remove(target);
}
protected Command myUndoCommand() {
if (undo == null && target != null) {
undo = new AddPiece(target);
}
return undo;
}
public GamePiece getTarget() {
return target;
}
public String getId() {
return target == null ? id : target.getId();
}
}