/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.filters.spi;
import java.beans.PropertyEditor;
import org.gephi.filters.api.PropertyExecutor;
import org.openide.nodes.PropertySupport;
import org.openide.util.Lookup;
/**
* Properties for filters. All editable properties of a filter must be used
* through this class, especially setting value should be done by using
* {@link #setValue(java.lang.Object) }.
* <p>
* The role of this class is to define filter's properties in order value changes
* can be tracked by the system, UI can be generated and values correctly saved
* in projects file.
*
* @author Mathieu Bastian
*/
public final class FilterProperty {
protected PropertySupport.Reflection property;
protected Filter filter;
protected PropertyExecutor propertyExecutor;
FilterProperty(Filter filter) {
this.filter = filter;
propertyExecutor = Lookup.getDefault().lookup(PropertyExecutor.class);
}
/**
* Returns property's name
* @return property's name
*/
public String getName() {
return property.getDisplayName();
}
/**
* Returns property's value, can be <code>null</code>
* @return property's value
*/
public Object getValue() {
try {
return property.getValue();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* Set property's value. The type of <code>value</code> must match with this
* property value type.
* @param value the value that is to be set
*/
public void setValue(Object value) {
if (propertyExecutor != null) {
propertyExecutor.setValue(this, value, new PropertyExecutor.Callback() {
public void setValue(Object value) {
try {
property.setValue(value);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} else {
try {
property.setValue(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* Returns the <code>PropertyEditor</code> associated to the property value.
* @return the property editor
*/
public PropertyEditor getPropertyEditor() {
return property.getPropertyEditor();
}
/**
* Sets the property editor class. The class must implement
* {@link PropertyEditor}.
* @param clazz the property editor class
*/
public void setPropertyEditorClass(Class<? extends PropertyEditor> clazz) {
property.setPropertyEditorClass(clazz);
}
/**
* Returns the property's value type.
* @return the value type
*/
public Class getValueType() {
return property.getValueType();
}
/**
* Returns the filter instance this property is associated to.
* @return the filter this property belongs to
*/
public Filter getFilter() {
return filter;
}
/**
* Create a property.
* @param filter The filter instance
* @param valueType The type of the property value, ex: <code>Double.class</code>
* @param propertyName The display name of the property
* @param getMethod The name of the get method for this property, must exist
* to make Java reflexion working.
* @param setMethod The name of the set method for this property, must exist
* to make Java reflexion working.
* @return the created property
* @throws NoSuchMethodException if the getter or setter methods cannot be found
*/
public static FilterProperty createProperty(Filter filter, Class valueType, String propertyName, String getMethod, String setMethod) throws NoSuchMethodException {
final FilterProperty filterProperty = new FilterProperty(filter);
PropertySupport.Reflection property = new PropertySupport.Reflection(filter, valueType, getMethod, setMethod);
property.setName(propertyName);
filterProperty.property = property;
return filterProperty;
}
/**
* Create a property.
* @param filter The filter instance
* @param valueType The type of the property value, ex: <code>Double.class</code>
* @param fieldName The Java field name of the property
* @throws NoSuchMethodException if the getter or setter methods cannot be found
*/
public static FilterProperty createProperty(Filter filter, Class valueType, String fieldName) throws NoSuchMethodException {
if (valueType == Boolean.class) {
valueType = boolean.class;
}
final FilterProperty filterProperty = new FilterProperty(filter);
PropertySupport.Reflection property = new PropertySupport.Reflection(filter, valueType, fieldName);
property.setName(fieldName);
filterProperty.property = property;
return filterProperty;
}
}