/*
* @(#)FigureAttributes.java
*
* Project: JHotdraw - a GUI framework for technical drawings
* http://www.jhotdraw.org
* http://jhotdraw.sourceforge.net
* Copyright: (c) by the original author(s) and all contributors
* License: Lesser GNU Public License (LGPL)
* http://www.opensource.org/licenses/lgpl-license.html
*/
package org.jhotdraw.figures;
import org.jhotdraw.util.*;
import org.jhotdraw.framework.*;
import java.awt.Color;
import java.io.IOException;
import java.io.Serializable;
import java.util.Map;
import java.util.Iterator;
/**
* A container for a figure's attributes. The attributes are stored
* as key/value pairs.
*
* @see Figure
*
* @version <$CURRENT_VERSION$>
*/
public class FigureAttributes
extends Object
implements Cloneable, Serializable {
private Map fMap;
/*
* Serialization support.
*/
private static final long serialVersionUID = -6886355144423666716L;
private int figureAttributesSerializedDataVersion = 1;
/**
* Constructs the FigureAttributes.
*/
public FigureAttributes() {
fMap = CollectionsFactory.current().createMap();
}
/**
* Gets the attribute with the given name.
* @return attribute or null if the key is not defined
*/
public Object get(FigureAttributeConstant attributeConstant) {
return fMap.get(attributeConstant);
}
/**
* Sets the attribute with the given name and
* overwrites its previous value.
*/
public void set(FigureAttributeConstant attributeConstant, Object value) {
if (value != null) {
fMap.put(attributeConstant, value);
}
else {
fMap.remove(attributeConstant);
}
}
/**
* Tests if an attribute is defined.
*/
public boolean hasDefined(FigureAttributeConstant attributeConstant) {
return fMap.containsKey(attributeConstant);
}
/**
* Clones the attributes.
*/
public Object clone() {
try {
FigureAttributes a = (FigureAttributes) super.clone();
a.fMap = CollectionsFactory.current().createMap(fMap);
return a;
}
catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
/**
* Reads the attributes from a StorableInput.
* FigureAttributes store the following types directly:
* Color, Boolean, String, Int. Other attribute types
* have to implement the Storable interface or they
* have to be wrapped by an object that implements Storable.
* @see Storable
* @see #write
*/
public void read(StorableInput dr) throws IOException {
String s = dr.readString();
if (!s.toLowerCase().equals("attributes")) {
throw new IOException("Attributes expected");
}
fMap = CollectionsFactory.current().createMap();
int size = dr.readInt();
for (int i=0; i<size; i++) {
String key = dr.readString();
String valtype = dr.readString();
Object val = null;
if (valtype.equals("Color")) {
val = new Color(dr.readInt(), dr.readInt(), dr.readInt());
}
else if (valtype.equals("Boolean")) {
val = new Boolean(dr.readString());
}
else if (valtype.equals("String")) {
val = dr.readString();
}
else if (valtype.equals("Int")) {
val = new Integer(dr.readInt());
}
else if (valtype.equals("Storable")) {
val = dr.readStorable();
}
else if (valtype.equals(FigureAttributeConstant.POPUP_MENU_STR)) {
// read String but don't store it
continue;
}
else if (valtype.equals("UNKNOWN")) {
continue;
}
// try to get defined constant
FigureAttributeConstant attributeConstant = FigureAttributeConstant.getConstant(key);
set(attributeConstant, val);
}
}
/**
* Writes the attributes to a StorableInput.
* FigureAttributes store the following types directly:
* Color, Boolean, String, Int. Other attribute types
* have to implement the Storable interface or they
* have to be wrapped by an object that implements Storable.
* @see Storable
* @see #write
*/
public void write(StorableOutput dw) {
dw.writeString("attributes");
dw.writeInt(fMap.size()); // number of attributes
Iterator iter = fMap.keySet().iterator();
while (iter.hasNext()) {
FigureAttributeConstant fac = (FigureAttributeConstant)iter.next();
String attributeName = fac.getName();
Object attributeValue = fMap.get(fac);
dw.writeString(attributeName);
if (attributeValue instanceof String) {
dw.writeString("String");
dw.writeString((String)attributeValue);
}
else if (attributeValue instanceof Color) {
writeColor(dw, "Color", (Color)attributeValue);
}
else if (attributeValue instanceof Boolean) {
dw.writeString("Boolean");
if (((Boolean)attributeValue).booleanValue()) {
dw.writeString("TRUE");
}
else {
dw.writeString("FALSE");
}
}
else if (attributeValue instanceof Integer) {
dw.writeString("Int");
dw.writeInt(((Integer)attributeValue).intValue());
}
else if (attributeValue instanceof Storable) {
dw.writeString("Storable");
dw.writeStorable((Storable)attributeValue);
}
else if (attributeValue instanceof javax.swing.JPopupMenu) {
dw.writeString(FigureAttributeConstant.POPUP_MENU_STR);
}
else {
System.err.println("Unknown attribute: " + attributeValue);
dw.writeString("UNKNOWN");
}
}
}
public static void writeColor(StorableOutput dw, String colorName, Color color) {
if (color != null) {
dw.writeString(colorName);
dw.writeInt(color.getRed());
dw.writeInt(color.getGreen());
dw.writeInt(color.getBlue());
}
}
public static Color readColor(StorableInput dr) throws IOException {
return new Color(dr.readInt(), dr.readInt(), dr.readInt());
}
}