package org.robobinding.viewattribute.grouped;
import org.robobinding.viewattribute.event.EventViewAttribute;
import org.robobinding.viewattribute.event.EventViewAttributeFactory;
import org.robobinding.viewattribute.property.OneWayMultiTypePropertyViewAttribute;
import org.robobinding.viewattribute.property.OneWayMultiTypePropertyViewAttributeFactory;
import org.robobinding.viewattribute.property.OneWayPropertyViewAttribute;
import org.robobinding.viewattribute.property.OneWayPropertyViewAttributeFactory;
import org.robobinding.viewattribute.property.TwoWayMultiTypePropertyViewAttribute;
import org.robobinding.viewattribute.property.TwoWayMultiTypePropertyViewAttributeFactory;
import org.robobinding.viewattribute.property.TwoWayPropertyViewAttribute;
import org.robobinding.viewattribute.property.TwoWayPropertyViewAttributeFactory;
import org.robobinding.widgetaddon.ViewAddOn;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Robert Taylor
* @author Cheng Wei
*/
public class FromClassViewAttributeFactories {
public static <ViewType> OneWayPropertyViewAttributeFactory<ViewType> oneWayPropertyViewAttributeFactoryForClass(
final Class<? extends OneWayPropertyViewAttribute<ViewType, ?>> propertyViewAttributeClass) {
return new OneWayPropertyViewAttributeFactory<ViewType>() {
@Override
public OneWayPropertyViewAttribute<ViewType, ?> create() {
return newViewAttribute(propertyViewAttributeClass);
}
};
}
public static <ViewType> TwoWayPropertyViewAttributeFactory<ViewType> twoWayPropertyViewAttributeFactoryForClass(
final Class<? extends TwoWayPropertyViewAttribute<ViewType, ?, ?>> propertyViewAttributeClass) {
return new TwoWayPropertyViewAttributeFactory<ViewType>() {
@Override
public TwoWayPropertyViewAttribute<ViewType, ?, ?> create() {
return newViewAttribute(propertyViewAttributeClass);
}
};
}
public static <ViewType> OneWayMultiTypePropertyViewAttributeFactory<ViewType> oneWayMultiTypePropertyViewAttributeFactoryForClass(
final Class<? extends OneWayMultiTypePropertyViewAttribute<ViewType>> multiTypePropertyViewAttributeClass) {
return new OneWayMultiTypePropertyViewAttributeFactory<ViewType>() {
@Override
public OneWayMultiTypePropertyViewAttribute<ViewType> create() {
return newViewAttribute(multiTypePropertyViewAttributeClass);
}
};
}
public static <ViewType> TwoWayMultiTypePropertyViewAttributeFactory<ViewType> twoWayMultiTypePropertyViewAttributeFactoryForClass(
final Class<? extends TwoWayMultiTypePropertyViewAttribute<ViewType>> multiTypePropertyViewAttributeClass) {
return new TwoWayMultiTypePropertyViewAttributeFactory<ViewType>() {
@Override
public TwoWayMultiTypePropertyViewAttribute<ViewType> create() {
return newViewAttribute(multiTypePropertyViewAttributeClass);
}
};
}
public static <ViewType> EventViewAttributeFactory<ViewType> eventViewAttributeFactoryForClass(
final Class<? extends EventViewAttribute<ViewType, ? extends ViewAddOn>> eventViewAttributeClass) {
return new EventViewAttributeFactory<ViewType>() {
@Override
public EventViewAttribute<ViewType, ? extends ViewAddOn> create() {
return newViewAttribute(eventViewAttributeClass);
}
};
}
public static <ViewType> GroupedViewAttributeFactory<ViewType> groupedViewAttributeFactoryForClass(
final Class<? extends GroupedViewAttribute<ViewType>> groupedViewAttributeClass) {
return new GroupedViewAttributeFactory<ViewType>() {
@Override
public GroupedViewAttribute<ViewType> create() {
return newViewAttribute(groupedViewAttributeClass);
}
};
}
static <T extends Object> T newViewAttribute(Class<T> viewAttributeClass) {
try {
return viewAttributeClass.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException("View Attribute class " + viewAttributeClass.getName() + " could not be instantiated: " + e);
} catch (IllegalAccessException e) {
throw new RuntimeException("View Attribute class " + viewAttributeClass.getName() + " is not public");
}
}
private FromClassViewAttributeFactories() {
}
}