/*
* $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.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Shape;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import VASSAL.build.module.documentation.HelpFile;
import VASSAL.command.Command;
import VASSAL.configure.StringConfigurer;
import VASSAL.tools.SequenceEncoder;
/**
* A generic Decorator that retains in its state the value of a property.
* That is, if {@link #setProperty(Object,Object)} is invoked with a key
* that is one of {@link #getKeys()}, the <code>String</code> value of that
* property will be reflected in the {@link #myGetState(String)} method.
*/
public class Marker extends Decorator implements EditablePiece {
public static final String ID = "mark;";
protected String keys[];
protected String values[];
public Marker() {
this(ID, null);
}
public Marker(String type, GamePiece p) {
mySetType(type);
setInner(p);
}
public String[] getKeys() {
return keys;
}
public void mySetType(String s) {
s = s.substring(ID.length());
SequenceEncoder.Decoder st = new SequenceEncoder.Decoder(s, ',');
ArrayList<String> l = new ArrayList<String>();
while (st.hasMoreTokens()) {
l.add(st.nextToken());
}
keys = l.toArray(new String[l.size()]);
values = new String[keys.length];
Arrays.fill(values, "");
}
public void draw(Graphics g, int x, int y, Component obs, double zoom) {
piece.draw(g, x, y, obs, zoom);
}
public String getName() {
return piece.getName();
}
public Rectangle boundingBox() {
return piece.boundingBox();
}
public Shape getShape() {
return piece.getShape();
}
public Object getProperty(Object key) {
for (int i = 0; i < keys.length; ++i) {
if (keys[i].equals(key)) {
return values[i];
}
}
return super.getProperty(key);
}
public Object getLocalizedProperty(Object key) {
for (int i = 0; i < keys.length; ++i) {
if (keys[i].equals(key)) {
return values[i];
}
}
return super.getLocalizedProperty(key);
}
public void setProperty(Object key, Object value) {
for (int i = 0; i < keys.length; ++i) {
if (keys[i].equals(key)) {
values[i] = (String) value;
return;
}
}
super.setProperty(key, value);
}
public String myGetState() {
SequenceEncoder se = new SequenceEncoder(',');
for (int i = 0; i < values.length; ++i) {
se.append(values[i]);
}
return se.getValue();
}
public void mySetState(String state) {
SequenceEncoder.Decoder st = new SequenceEncoder.Decoder(state, ',');
int i = 0;
while (st.hasMoreTokens() && i < values.length) {
values[i++] = st.nextToken();
}
}
public String myGetType() {
SequenceEncoder se = new SequenceEncoder(',');
for (int i = 0; i < keys.length; ++i) {
se.append(keys[i]);
}
return ID + se.getValue();
}
protected KeyCommand[] myGetKeyCommands() {
return new KeyCommand[0];
}
public Command myKeyEvent(KeyStroke stroke) {
return null;
}
public String getDescription() {
if (keys != null
&& keys.length > 0 && keys[0].length() > 0
&& values.length > 0 && values[0].length() > 0) {
return "Marker - " + keys[0] + " = " + values[0];
}
else
return "Marker";
}
public VASSAL.build.module.documentation.HelpFile getHelpFile() {
return HelpFile.getReferenceManualPage("PropertyMarker.htm");
}
public PieceEditor getEditor() {
return new Ed(this);
}
/**
* Return Property names exposed by this trait
*/
public List<String> getPropertyNames() {
ArrayList<String> l = new ArrayList<String>();
for (int i = 0; i < keys.length; ++i) {
l.add(keys[i]);
}
return l;
}
private static class Ed implements PieceEditor {
private StringConfigurer propName;
private StringConfigurer propValue;
private JPanel panel;
private Ed(Marker m) {
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
SequenceEncoder seKeys = new SequenceEncoder(',');
for (int i = 0; i < m.keys.length; ++i) {
seKeys.append(m.keys[i]);
}
SequenceEncoder seValues = new SequenceEncoder(',');
for (int i = 0; i < m.values.length; ++i) {
seValues.append(m.values[i]);
}
propName = new StringConfigurer(null, "Property name: ", m.keys.length == 0 ? "" : seKeys.getValue());
propValue = new StringConfigurer(null, "Property value: ", m.values.length == 0 ? "" : seValues.getValue());
panel.add(propName.getControls());
panel.add(propValue.getControls());
}
public Component getControls() {
return panel;
}
public String getState() {
return propValue.getValueString();
}
public String getType() {
return Marker.ID + propName.getValueString();
}
}
}