/*
* $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.counters;
import javax.swing.KeyStroke;
import VASSAL.build.module.documentation.HelpFile;
import VASSAL.command.Command;
import VASSAL.command.RemovePiece;
import VASSAL.configure.BooleanConfigurer;
import VASSAL.i18n.PieceI18nData;
import VASSAL.i18n.Resources;
/**
* GamePiece trait that replaces a GamePiece with another one
*/
public class Replace extends PlaceMarker {
public static final String ID = "replace;";
public Replace() {
this(ID + "Replace;R;null", null);
}
public Replace(String type, GamePiece inner) {
super(type, inner);
}
public Command myKeyEvent(KeyStroke stroke) {
Command c = null;
if (command.matches(stroke)) {
c = replacePiece();
}
return c;
}
protected Command replacePiece() {
Command c;
c = placeMarker();
if (c == null) {
reportDataError(this, Resources.getString("Error.bad_replace"));
}
else {
Command remove = new RemovePiece(Decorator.getOutermost(this));
remove.execute();
c.append(remove);
}
return c;
}
protected void selectMarker(GamePiece marker) {
KeyBuffer.getBuffer().add(marker);
}
public String getDescription() {
String d = "Replace with Other";
if (description.length() > 0) {
d += " - " + description;
}
return d;
}
public HelpFile getHelpFile() {
return HelpFile.getReferenceManualPage("Replace.htm");
}
public String myGetType() {
return ID + super.myGetType().substring(PlaceMarker.ID.length());
}
public PieceEditor getEditor() {
return new Ed(this);
}
public GamePiece createMarker() {
GamePiece marker = super.createMarker();
if (marker != null && matchRotation) {
if (above) {
matchTraits(this, marker);
}
else {
matchTraits(Decorator.getOutermost(this), marker);
}
}
return marker;
}
protected void matchTraits(GamePiece base, GamePiece marker) {
if (!(base instanceof Decorator)
|| !(marker instanceof Decorator)) {
return;
}
Decorator currentTrait = (Decorator) base;
Decorator lastMatch = (Decorator) marker;
while (currentTrait != null) {
Decorator candidate = lastMatch;
while (candidate != null) {
candidate = (Decorator) Decorator.getDecorator(candidate, currentTrait.getClass());
if (candidate != null) {
if (candidate.myGetType().equals(currentTrait.myGetType())) {
candidate.mySetState(currentTrait.myGetState());
lastMatch = candidate;
candidate = null;
}
else {
GamePiece inner = candidate.getInner();
if (inner instanceof Decorator) {
candidate = (Decorator) inner;
}
else {
candidate = null;
}
}
}
}
if (currentTrait.getInner() instanceof Decorator) {
currentTrait = (Decorator) currentTrait.getInner();
}
else {
currentTrait = null;
}
}
}
public PieceI18nData getI18nData() {
return getI18nData(command.getName(), getCommandDescription(description, "Replace command"));
}
protected static class Ed extends PlaceMarker.Ed {
public Ed(Replace piece) {
super(piece);
defineButton.setText("Define Replacement");
}
protected BooleanConfigurer createMatchRotationConfig() {
return new BooleanConfigurer(null, "Match Current State?");
}
protected BooleanConfigurer createAboveConfig() {
return new BooleanConfigurer(null, "Only match states above this trait?");
}
public String getType() {
return ID + super.getType().substring(PlaceMarker.ID.length());
}
}
}