package org.robobinding.presentationmodel;
import java.util.Map;
import java.util.Set;
import org.robobinding.function.FunctionSupply;
import org.robobinding.function.MethodDescriptor;
import org.robobinding.property.ObservableBean;
import org.robobinding.property.PropertyChangeListener;
import org.robobinding.property.PropertyDescriptor;
import org.robobinding.property.PropertySupply;
import org.robobinding.property.PropertyUtils;
/**
* @since 1.0
* @author Cheng Wei
*
*/
public abstract class AbstractPresentationModelObject implements PropertySupply, FunctionSupply, ObservableBean {
private final Class<?> presentationModelClass;
protected final PresentationModelChangeSupport changeSupport;
protected AbstractPresentationModelObject(Object presentationModel) {
this.presentationModelClass = presentationModel.getClass();
if(presentationModel instanceof HasPresentationModelChangeSupport) {
this.changeSupport = ((HasPresentationModelChangeSupport)presentationModel).getPresentationModelChangeSupport();
} else {
this.changeSupport = new PresentationModelChangeSupport(presentationModelClass,
PropertyUtils.getPropertyNames(presentationModelClass));
}
}
/*
private Set<String> allPropertyNames() {
Set<String> all = Sets.newHashSet();
all.addAll(propertyNames());
all.addAll(dataSetPropertyNames());
return all;
}*/
public abstract Set<String> propertyNames();
public abstract Set<String> dataSetPropertyNames();
/*
protected Set<String> allPropertyNames() {
Set<String> allPropertyNames = Sets.newHashSet(propertyNames());
allPropertyNames.addAll(dataSetPropertyNames());
return allPropertyNames;
}*/
public abstract Map<String, Set<String>> propertyDependencies();
public abstract Set<MethodDescriptor> eventMethods();
protected MethodDescriptor createMethodDescriptor(String name) {
return new MethodDescriptor(name, new Class[0]);
}
protected MethodDescriptor createMethodDescriptor(String name, Class<?>... parameterTypes) {
return new MethodDescriptor(name, parameterTypes);
}
protected PropertyDescriptor createPropertyDescriptor(Class<?> propertyType, String propertyName, boolean readable, boolean writable) {
return new PropertyDescriptor(presentationModelClass, propertyType, propertyName, readable, writable);
}
protected PropertyDescriptor createDataSetPropertyDescriptor(Class<?> propertyType, String propertyName) {
return new PropertyDescriptor(presentationModelClass, propertyType, propertyName, true, false);
}
@Override
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
changeSupport.addPropertyChangeListener(propertyName, listener);
}
@Override
public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
changeSupport.removePropertyChangeListener(propertyName, listener);
}
public Class<?> getPresentationModelClass() {
return presentationModelClass;
}
}