package jas.util;
import java.awt.Rectangle;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
/**
* This class is used to store user prorerties. There is one instance for the application. The
* UserProperties object used is available from the Application object using a getUserProperties()
* method.
* @see Application
* @see Application#getUserProperties()
* @author Tony Johnson
* @author Jonas Gifford
*/
public class UserProperties extends Properties
{
/**
* The Application object will create an instance for the application and save it just before
* the application closes. Therefore, you should not have to use the constructor yourself. The
* UserProperties object used is available from the Application object using a getUserProperties()
* method.
* @see Application
* @see Application#getUserProperties()
*/
public UserProperties()
{
try
{
final InputStream input = new FileInputStream(custFile);
load(input);
input.close();
// Ignore personal customization files from early releases
if (getFloat("property-version",0)<0.9) clear();
}
catch (IOException x) {}
setFloat("property-version",0.91f);
theUserProperties = this;
}
// Constructor for use while migrating to freehep framework
protected UserProperties(Properties def)
{
super(def);
theUserProperties = this;
}
/**
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public Rectangle getRectangle(final String key, final Rectangle def)
{
try
{
final Rectangle result = new Rectangle();
result.x = getInteger(key.concat("-x"));
result.y = getInteger(key.concat("-y"));
result.width = getInteger(key.concat("-w"));
result.height = getInteger(key.concat("-h"));
return result;
}
catch (Exception e)
{
return def;
}
}
/**
* @param key the key used to store this property
* @param rect the value to store
*/
public void setRectangle(final String key, final Rectangle rect)
{
put(key.concat("-x"), String.valueOf(rect.x));
put(key.concat("-y"), String.valueOf(rect.y));
put(key.concat("-w"), String.valueOf(rect.width));
put(key.concat("-h"), String.valueOf(rect.height));
}
/**
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public java.awt.Color getColor(final String key, final java.awt.Color def)
{
try
{
return new java.awt.Color(getInteger(key.concat("-r")), getInteger(key.concat("-g")),
getInteger(key.concat("-b")));
}
catch (Exception e)
{
return def;
}
}
/**
* @param key the key used to store this property
* @param c the value to store
*/
public void setColor(final String key, final java.awt.Color c)
{
put(key.concat("-r"), String.valueOf(c.getRed()));
put(key.concat("-g"), String.valueOf(c.getGreen()));
put(key.concat("-b"), String.valueOf(c.getBlue()));
}
/**
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public String[] getStringArray(final String key, final String[] def)
{
try
{
final String[] result = new String[getInteger(key +"-length")];
for (int i = 0; i < result.length; i++)
result[i] = getProperty(key +"-"+ i);
return result;
}
catch (Exception e)
{
return def;
}
}
/**
* @param key the key used to store this property
* @param sa the value to store
*/
public void setStringArray(final String key, String[] sa)
{
if (sa == null)
sa = new String[0];
// just output an array of size zero
put( key +"-length", String.valueOf(sa.length) );
for (int i = 0; i < sa.length; i++)
put(key +"-"+ i, sa[i]);
}
/**
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public String getString(final String key, final String def)
{
try
{
final String s = getProperty(key);
return s == null ? def : s;
}
catch (Exception e)
{
return def;
}
}
/**
* @param key the key used to store this property
* @param s the value to store
*/
public void setString(final String key, String s)
{
if (s == null) s="";
put(key, s);
}
/**
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public boolean getBoolean(final String key, final boolean def)
{
final String value = getProperty(key);
return value==null ? def : Boolean.valueOf(value).booleanValue();
}
/**
* @param key the key used to store this property
* @param value the value to store
*/
public void setBoolean(final String key, final boolean value)
{
put(key,String.valueOf(value));
}
/**
* @exception NumberFormatException if the property retrieved cannot be converted to int
* @param key the key used to store this property
*/
public int getInteger(final String key) throws NumberFormatException
{
return Integer.valueOf(getProperty(key)).intValue();
}
/**
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public int getInteger(final String key, final int def)
{
try
{
return Integer.valueOf(getProperty(key)).intValue();
}
catch (Exception e)
{
return def;
}
}
/**
* @param key the key used to store this property
* @param f the value to store
*/
public void setFloat(final String key, final float f)
{
put(key, String.valueOf(f));
}
/**
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public float getFloat(final String key, final float def)
{
try
{
return Float.valueOf(getProperty(key)).floatValue();
}
catch (Exception e)
{
return def;
}
}
/**
* @param key the key used to store this property
* @param i the value to store
*/
public void setInteger(final String key, final int i)
{
put(key, String.valueOf(i));
}
/**
* Saves the properties. The application does this for you just before closing, so
* you don't have to call this method.
*/
public void save() throws IOException
{
final OutputStream output = new FileOutputStream(custFile);
save(output,"Java Analysis Studio Custom Properties");
output.close();
}
/**
* This is a utility method for updating a string array of recently used items.
* Supply it with an old array and a new item. If the new item was already in the
* old array, then it is simply moved to the beginning. If it was not in the old
* array then it is placed at the front and the other items are shuffled back.
* The method will return an array with a maximum size of 4.
* @param oldArray the array to update (may safely be null
)
* @param newString the new item to include
* @return the updated array
*/
public static String[] updateStringArray(final String[] oldArray, final String newString)
{
return updateStringArray(oldArray, newString, 4);
}
/**
* This is a utility method for updating a string array of recently used items.
* Supply it with an old array and a new item. If the new item was already in the
* old array, then it is simply moved to the beginning. If it was not in the old
* array then it is placed at the front and the other items are shuffled back.
* The method will return an array with a maximum size defined by the integer
* stored by the given key, or 4 if such an integer cannot be found.
* @param oldArray the array to update (may safely be null
)
* @param newString the new item to include
* @param lengthKey the key used to find the maximum length of the resulting array
* @return the updated array
*/
public String[] updateStringArray(final String[] oldArray, final String newString, final String lengthKey)
{
return updateStringArray(oldArray, newString, getInteger(lengthKey, 4));
}
/**
* This is a utility method for updating a string array of recently used items.
* Supply it with an old array and a new item. If the new item was already in the
* old array, then it is simply moved to the beginning. If it was not in the old
* array then it is placed at the front and the other items are shuffled back.
* The method will return an array of a maximum size given by the nStored
parameter.
* @param oldArray the array to update (may safely be null
)
* @param newString the new item to include
* @param nStored the maximum size of the updated array
* @return the updated array
*/
public static String[] updateStringArray(String[] oldArray, final String newString, final int nStored)
// called by either updateRecentClasses or by updateRecentServers
// (both do basically the same thing so a private method that
// contains the essential parts of both is practical)
{
if (newString == null) return oldArray;
if (oldArray != null && oldArray.length > 0)
{
if (oldArray[0].equals(newString)) return oldArray;
/*
* If the new String is already at the front, then
* there is nothing left to do.
*/
for (int i = 1; i < oldArray.length; i++)
/*
* Begin checking from the second element
* onwards: is the String already there?
*/
{
if (oldArray[i].equals(newString))
/*
* If it is already there, put
* the new one at the front and
* shuffle the others backward.
*/
{
while (i > 0)
{
oldArray[i] = oldArray[i-1];
i--;
}
oldArray[0] = newString;
return oldArray;
}
}
if (oldArray.length < nStored)
{
final String[] result = new String[oldArray.length + 1];
result[0] = newString;
for (int i = 0; i < oldArray.length; i++)
result[i + 1] = oldArray[i];
return result;
}
else
{
for (int i = nStored-1; i > 0; i--)
oldArray[i] = oldArray[i-1];
oldArray[0] = newString;
return oldArray;
}
}
else
{
oldArray = new String[1];
oldArray[0] = newString;
return oldArray;
}
}
public static UserProperties getUserProperties()
{
return theUserProperties;
}
final private String custFile = System.getProperty("user.home").concat(File.separator+"jas.properties");
private static UserProperties theUserProperties;
}