/*
* $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 java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.KeyStroke;
import VASSAL.build.GameModule;
import VASSAL.command.Command;
import VASSAL.configure.NamedHotKeyConfigurer;
import VASSAL.i18n.Localization;
import VASSAL.i18n.PieceI18nData;
import VASSAL.i18n.TranslatablePiece;
import VASSAL.tools.NamedKeyStroke;
public class KeyCommand extends AbstractAction {
private static final long serialVersionUID = 1L;
private String name;
protected String untranslatedName;
protected String localizedMenuText;
private KeyStroke stroke;
private GamePiece target;
private boolean global;
private boolean enabled = true;
protected TranslatablePiece i18nPiece;
protected NamedKeyStroke namedKeyStroke;
public KeyCommand(String name, KeyStroke key, GamePiece target) {
this(name, key, target, null);
}
public KeyCommand(String name, NamedKeyStroke key, GamePiece target) {
this(name, key, target, null);
}
public KeyCommand(String name, KeyStroke key, GamePiece target, TranslatablePiece i18nPiece) {
super(key == null ? name : name + " " + NamedHotKeyConfigurer.getString(key));
this.target = target;
this.name = name;
this.stroke = key;
this.i18nPiece = i18nPiece;
}
public KeyCommand(String name, NamedKeyStroke key, GamePiece target, TranslatablePiece i18nPiece) {
this(name, key == null ? null : key.getKeyStroke(), target, i18nPiece);
namedKeyStroke = key == null ? NamedKeyStroke.NULL_KEYSTROKE : key;
}
public KeyCommand(String name, NamedKeyStroke key, GamePiece target, boolean enabled) {
this(name, key == null ? null : key.getKeyStroke(), target, enabled);
namedKeyStroke = key == null ? NamedKeyStroke.NULL_KEYSTROKE : key;
}
public KeyCommand(String name, KeyStroke key, GamePiece target, boolean enabled) {
this(name, key, target, null);
setEnabled(enabled);
}
public KeyCommand(KeyCommand command) {
this(command.name, command.stroke, command.target, command.isEnabled());
this.i18nPiece = command.i18nPiece;
}
public String getName() {
return name;
}
public boolean matches(KeyStroke key) {
return isEnabled() && key != null && key.equals(stroke);
}
public KeyStroke getKeyStroke() {
return stroke;
}
public NamedKeyStroke getNamedKeyStroke() {
return namedKeyStroke;
}
public GamePiece getTarget() {
return target;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean b) {
enabled = b;
}
/**
* If true, then this action will apply to all selected pieces
* @return
*/
public boolean isGlobal() {
return global;
}
/**
* If true, then this action will apply to all selected pieces
* @param global
*/
public void setGlobal(boolean global) {
this.global = global;
}
public void actionPerformed(ActionEvent evt) {
if (stroke != null) {
if (global) {
GameModule.getGameModule().sendAndLog(KeyBuffer.getBuffer().keyCommand(stroke));
}
else {
BoundsTracker t = new BoundsTracker();
GamePiece outer = Decorator.getOutermost(target);
t.addPiece(outer);
outer.setProperty(Properties.SNAPSHOT, PieceCloner.getInstance().clonePiece(outer)); // save state prior to command
Command c = outer.keyEvent(stroke);
if (target.getId() != null) {
GameModule.getGameModule().sendAndLog(c);
}
t.addPiece(outer);
t.repaint();
}
}
}
/**
* The human-readable text that will appear in the right-click menu, translated to the user's Locale
* @return
*/
public String getLocalizedMenuText() {
if (localizedMenuText == null && name != null) {
String localizedName = name;
if (i18nPiece != null && GameModule.getGameModule().isLocalizationEnabled()) {
String key = null;
for (PieceI18nData.Property p : i18nPiece.getI18nData().getProperties()) {
if (p.getName().equals(name)) {
key = TranslatablePiece.PREFIX + p.getName();
}
}
if (key != null) {
localizedName = Localization.getInstance().translate(key, name);
}
}
localizedMenuText = stroke == null ? localizedName : localizedName + " " + NamedHotKeyConfigurer.getString(stroke);
}
return localizedMenuText;
}
}