package org.tynamo.examples.simple.pages.collections;
import org.apache.tapestry5.EventConstants;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SetupRender;
import org.apache.tapestry5.corelib.components.Grid;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.ContextValueEncoder;
import org.tynamo.descriptor.CollectionDescriptor;
import org.tynamo.descriptor.TynamoPropertyDescriptor;
import org.tynamo.routing.annotations.At;
import org.tynamo.services.DescriptorService;
import org.tynamo.util.TynamoMessages;
import org.tynamo.util.Utils;
@At(value = "/{0}/{1}/{2}", order = "after:Edit")
public class ListC
{
@Inject
private Messages messages;
@Inject
private DescriptorService descriptorService;
@Inject
private ContextValueEncoder contextValueEncoder;
@Inject
private PropertyAccess adapter;
@Property(write = false)
private Class beanType;
@Property
private Object bean;
@Property(write = false)
private Object parentBean;
@Property
private String propertyName;
@Component
private Grid grid;
@OnEvent(EventConstants.ACTIVATE)
Object activate(Class clazz, String parentId, String property)
{
if (clazz != null)
{
TynamoPropertyDescriptor propertyDescriptor = descriptorService.getClassDescriptor(clazz).getPropertyDescriptor(property);
if (propertyDescriptor != null)
{
CollectionDescriptor collectionDescriptor = ((CollectionDescriptor) propertyDescriptor);
this.beanType = collectionDescriptor.getElementType();
this.parentBean = contextValueEncoder.toValue(clazz, parentId);
this.propertyName = property;
if (parentBean != null) return null; // I know this is counterintuitive
}
}
return Utils.new404(messages);
}
@OnEvent(EventConstants.PASSIVATE)
Object[] passivate()
{
return new Object[]{parentBean.getClass(), parentBean, propertyName};
}
/**
* This is where you can perform any one-time per-render setup for your component. This is a good place to read
* component parameters and use them to set temporary instance variables.
* More info: http://tapestry.apache.org/tapestry5.1/guide/rendering.html
* {@see org.apache.tapestry5.annotations.SetupRender}
*/
@SetupRender
void setupRender()
{
grid.reset();
}
/**
* The source of data for the Grid to display.
* This will usually be a List or array but can also be an explicit GridDataSource
*/
public Object getSource()
{
return adapter.get(parentBean, propertyName);
}
public Object[] getShowPageContext()
{
return new Object[]{beanType, bean};
}
public Object[] getParentShowPageContext()
{
return new Object[]{parentBean.getClass(), parentBean};
}
public Object[] getAddElementPageContext()
{
return new Object[]{parentBean.getClass(), parentBean, propertyName};
}
public String getTitle()
{
return TynamoMessages.list(messages, beanType);
}
public String getNewLinkMessage()
{
return TynamoMessages.add(messages, beanType);
}
}