package com.robonobo.gui.preferences;
import java.beans.PropertyDescriptor;
import javax.swing.JPanel;
import com.robonobo.common.exceptions.SeekInnerCalmException;
import com.robonobo.gui.frames.RobonoboFrame;
public abstract class PrefPanel extends JPanel {
protected RobonoboFrame frame;
public PrefPanel(RobonoboFrame frame) {
this.frame = frame;
}
public abstract boolean hasChanged();
public abstract void applyChanges();
public abstract void resetValue();
protected String getProperty(String propName) {
String[] toks = propName.split("\\.");
String cfgName = toks[0];
String prop = toks[1];
Object config = frame.ctrl.getConfig(cfgName);
if(config == null)
throw new SeekInnerCalmException();
try {
PropertyDescriptor propDesc = new PropertyDescriptor(prop, config.getClass());
Object propVal = propDesc.getReadMethod().invoke(config);
return String.valueOf(propVal);
} catch (Exception e) {
throw new SeekInnerCalmException(e);
}
}
protected void setProperty(String propName, String value) {
String[] toks = propName.split("\\.");
String cfgName = toks[0];
String prop = toks[1];
Object config = frame.ctrl.getConfig(cfgName);
if(config == null)
throw new SeekInnerCalmException();
try {
PropertyDescriptor propDesc = new PropertyDescriptor(prop, config.getClass());
Class<?> propClass = propDesc.getPropertyType();
if(propClass.isAssignableFrom(String.class))
propDesc.getWriteMethod().invoke(config, value);
else if(propClass.isAssignableFrom(Integer.class) || propClass.isAssignableFrom(Integer.TYPE))
propDesc.getWriteMethod().invoke(config, Integer.valueOf(value));
else if(propClass.isAssignableFrom(Boolean.class) || propClass.isAssignableFrom(Boolean.TYPE))
propDesc.getWriteMethod().invoke(config, Boolean.valueOf(value));
else
throw new SeekInnerCalmException();
} catch (Exception e) {
throw new SeekInnerCalmException(e);
}
}
}