/*
* $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.build;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import VASSAL.configure.AutoConfigurer;
import VASSAL.configure.VisibilityCondition;
import VASSAL.i18n.Localization;
/**
* A class that implements AutoConfigurable can use the {@link AutoConfigurer}
* class to automatically build a property editor.
*/
public interface AutoConfigurable extends Configurable {
/**
* @return an array of Strings giving all attributes of this Buildable
* component that will be written to/read from an XML element
*/
public String[] getAttributeNames();
/**
* Called by the {@link #build} method, where <code>value</code> is the
* String value read by the XML attribute.
* Can also be called with Object value to set the attribute.
*/
public void setAttribute(String key, Object value);
/**
* Called by the {@link #getBuildElement} method to write the
* attributes into an XML element
*/
public String getAttributeValueString(String key);
/**
* Return an array of Strings describing the attributes
* of this object. These strings are used as prompts in
* the Properties window for this object.
*/
public String[] getAttributeDescriptions();
/**
* Return the Class for the attributes of this object.
* Valid classes are: String, Integer, Double, Boolean, Image,
* File, Color, and KeyStroke
*/
public Class<?>[] getAttributeTypes();
/**
* Because attributes are not always applicable in all cases, this method returns an interface
* to determine when the controls for specifying the named attribute should be visible.
* @param name
* @return null if the attribute controls should always be visible;
*/
public VisibilityCondition getAttributeVisibility(String name);
public static class Util {
public static void buildAttributes(Element e, AutoConfigurable parent) {
if (e != null) {
NamedNodeMap n = e.getAttributes();
for (int i = 0; i < n.getLength(); ++i) {
Attr att = (Attr) n.item(i);
parent.setAttribute(att.getName(), att.getValue());
Localization.getInstance().saveTranslatableAttribute(parent, att.getName(), att.getValue());
}
}
}
public static org.w3c.dom.Element getBuildElement(org.w3c.dom.Document doc,
AutoConfigurable parent) {
Element el = doc.createElement(parent.getClass().getName());
String[] names = parent.getAttributeNames();
for (int i = 0; i < names.length; ++i) {
String val = parent.getAttributeValueString(names[i]);
if (val != null) {
el.setAttribute(names[i], val);
}
}
return el;
}
}
}