package automenta.vivisect.swing.property.sheet;
import java.beans.BeanInfo;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import javax.swing.UIManager;
import automenta.vivisect.swing.property.model.DefaultBeanInfoResolver;
import automenta.vivisect.swing.property.propertysheet.Property;
import automenta.vivisect.swing.property.propertysheet.PropertySheetPanel;
/**
* Binds a bean object to a PropertySheet.
*
* @author Bartosz Firyn (SarXos)
*/
public class DefaultBeanBinder implements PropertyChangeListener {
private Object object = null;
private BeanInfo info = null;
private PropertySheetPanel sheet = null;
public DefaultBeanBinder(Object object, PropertySheetPanel sheet) {
this(object, sheet, new DefaultBeanInfoResolver().getBeanInfo(object));
}
public DefaultBeanBinder(Object object, PropertySheetPanel sheet, BeanInfo info) {
if (info == null) {
throw new IllegalArgumentException(String.format("Cannot find %s for %s", BeanInfo.class.getSimpleName(), object.getClass()));
}
this.object = object;
this.sheet = sheet;
this.info = info;
bind();
}
public void bind() {
sheet.setProperties(info.getPropertyDescriptors());
sheet.readFromObject(object);
sheet.addPropertySheetChangeListener(this);
}
public void unbind() {
sheet.removePropertyChangeListener(this);
sheet.setProperties(new Property[0]);
}
@Override
public void propertyChange(PropertyChangeEvent event) {
Property prop = (Property) event.getSource();
try {
prop.writeToObject(object);
} catch (RuntimeException e) {
if (e.getCause() instanceof PropertyVetoException) {
UIManager.getLookAndFeel().provideErrorFeedback(sheet);
prop.setValue(event.getOldValue());
} else {
throw e;
}
}
}
}