You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
6.9 KiB
254 lines
6.9 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2005, Andrew Hinton
|
|
//
|
|
// This file is part of PRISM.
|
|
//
|
|
// PRISM is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 2 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// PRISM 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 General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with PRISM; if not, write to the Free Software Foundation,
|
|
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
//==============================================================================
|
|
|
|
package settings;
|
|
|
|
import java.util.*;
|
|
|
|
/**
|
|
*
|
|
* @author Andrew Hinton
|
|
*/
|
|
public abstract class Setting
|
|
{
|
|
private String key;
|
|
private String name;
|
|
private String comment;
|
|
private Object value;
|
|
private boolean editableWhenMultiple;
|
|
private boolean enabled;
|
|
private ArrayList constraints;
|
|
private String version;
|
|
|
|
private SettingOwner owner;
|
|
|
|
public Setting(String name, Object value, String comment, SettingOwner owner, boolean editableWhenMultiple, SettingConstraint constraint)
|
|
{
|
|
this.name = name;
|
|
this.key = name; //you should set this to something better though.
|
|
this.value = value;
|
|
this.comment = comment;
|
|
this.owner = owner;
|
|
this.editableWhenMultiple = editableWhenMultiple;
|
|
this.enabled = true;
|
|
this.version = null;
|
|
|
|
constraints = new ArrayList();
|
|
if(constraint != null) addConstraint(constraint);
|
|
}
|
|
|
|
public Setting(String name, Object value, String comment, SettingOwner owner, SettingConstraint constraint)
|
|
{
|
|
this(name, value, comment, owner, false, constraint);
|
|
}
|
|
|
|
public Setting(String name, Object value, String comment, SettingOwner owner, boolean editableWhenMultiple)
|
|
{
|
|
this(name, value, comment, owner, editableWhenMultiple, null);
|
|
}
|
|
|
|
public Setting(String name, Object value, String comment, SettingOwner owner)
|
|
{
|
|
this(name, value, comment, owner, false, null);
|
|
}
|
|
|
|
public void addConstraint(SettingConstraint constraint)
|
|
{
|
|
if(constraint != null) constraints.add(constraint);
|
|
}
|
|
|
|
public void removeConstraint(SettingConstraint constraint)
|
|
{
|
|
constraints.remove(constraint);
|
|
}
|
|
|
|
public int getNumConstraints()
|
|
{
|
|
return constraints.size();
|
|
}
|
|
|
|
public SettingConstraint getConstraint(int i)
|
|
{
|
|
return (SettingConstraint)constraints.get(i);
|
|
}
|
|
|
|
public void setVersion(String s)
|
|
{
|
|
version = s;
|
|
}
|
|
|
|
/**
|
|
* Return the name of this setting
|
|
*/
|
|
public String getName()
|
|
{
|
|
return name;
|
|
}
|
|
|
|
/**
|
|
* Return a comment or description of this setting
|
|
*/
|
|
public String getComment()
|
|
{
|
|
return comment;
|
|
}
|
|
|
|
/**
|
|
* Returns the owner of this setting
|
|
*/
|
|
public SettingOwner getOwner()
|
|
{
|
|
return owner;
|
|
}
|
|
|
|
/**
|
|
* Should this property be editable if it has been selected along with
|
|
* others of the same name.
|
|
*/
|
|
public boolean isEditableWhenMultiple()
|
|
{
|
|
return editableWhenMultiple;
|
|
}
|
|
|
|
/**
|
|
* Returns the renderer responsible for this setting
|
|
*/
|
|
public abstract SettingRenderer getSettingRenderer();
|
|
|
|
/**
|
|
* Returns the editor for this setting
|
|
*/
|
|
public abstract SettingEditor getSettingEditor();
|
|
|
|
/**
|
|
* This method can be overridden if necessary, but do call super(obj)
|
|
*/
|
|
public void checkObjectWithConstraints(Object obj) throws SettingException
|
|
{
|
|
for(int i = 0; i < getNumConstraints(); i++)
|
|
{
|
|
getConstraint(i).checkValue(obj);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the value of this setting
|
|
*/
|
|
public Object getValue()
|
|
{
|
|
return value;
|
|
}
|
|
|
|
/**
|
|
* Returns the class type of the value being stored
|
|
*/
|
|
public abstract Class getValueClass();
|
|
|
|
/**
|
|
* Sets the value, with some type checking. A set is expected to be done
|
|
* by the SettingOwner and so the owner notifySettingChanged method is not
|
|
* called. This will cause only the renderer to display the new value.
|
|
*/
|
|
public void setValue(Object obj) throws SettingException
|
|
{
|
|
SettingEditor editor = getSettingEditor();
|
|
if(editor != null) editor.stopEditing();
|
|
|
|
if(obj.getClass().isAssignableFrom(getValueClass())) //do a check that the object is in the correct format
|
|
{
|
|
//System.out.println("checking constraints");
|
|
checkObjectWithConstraints(obj);
|
|
this.value = obj;
|
|
SettingDisplay display = getOwner().getDisplay();
|
|
if(display != null) display.redisplaySetting(this);
|
|
}
|
|
else
|
|
{
|
|
throw new SettingException("Invalid type for property: "+name);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets the value, with some type checking. The edit is expected to be
|
|
* done either by one of the editors, or by an object that is not the
|
|
* SettingOwner. Therefore, the SettingOwner will be notified and the
|
|
* renderer will display the new value.
|
|
*/
|
|
public void editValue(Object obj) throws SettingException
|
|
{
|
|
SettingEditor editor = getSettingEditor();
|
|
if(editor != null) editor.stopEditing();
|
|
|
|
if(obj.getClass().isAssignableFrom(this.getValueClass()))
|
|
{
|
|
checkObjectWithConstraints(obj);
|
|
this.value = obj;
|
|
SettingDisplay display = getOwner().getDisplay();
|
|
if(display != null) display.redisplaySetting(this);
|
|
getOwner().notifySettingChanged(this);
|
|
}
|
|
else
|
|
{
|
|
throw new SettingException("Invalid type for property: "+name);
|
|
}
|
|
}
|
|
|
|
public void setEnabled(boolean enable)
|
|
{
|
|
this.enabled = enable;
|
|
getSettingEditor().stopEditing();
|
|
|
|
}
|
|
|
|
public boolean isEnabled()
|
|
{
|
|
return enabled;
|
|
}
|
|
|
|
public void setKey(String key)
|
|
{
|
|
this.key = key;
|
|
}
|
|
|
|
public String getKey()
|
|
{
|
|
return key;
|
|
}
|
|
|
|
public String getVersion()
|
|
{
|
|
return version;
|
|
}
|
|
|
|
/**
|
|
* Must be overridden to define what this setting should be written like to
|
|
* a file, so that it can be read in again
|
|
*/
|
|
public abstract String toString();
|
|
|
|
/**
|
|
* Must be overridden to return an object of the appropriate type, which is
|
|
* a parsed version of the string.
|
|
*/
|
|
public abstract Object parseStringValue(String string) throws SettingException;
|
|
|
|
}
|