Ok here is my actual GALLERY template and code... dont get too lost... its still in-play... and messy
trust me I am a clean guy... and hopin this will be cleaned up soon <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <div xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter"> <t:block t:id="autoPagingContent" id="autoPagingContent"> <table width="100%" border="1"> <tr> <td width="25%" align="left" nowrap="NOWRAP"> <t:Label for="itemsPerPageSelect">Items Per Page</t:Label> <select t:type="Select" t:id="itemsPerPageSelect" id="itemsPerPageSelect" model="literal:5,10,15,25,50,100,250,500,1000,5000,10000" value="itemsPerPage" defaultValue="5" onchange="this.form.submit()" /> <t:Label for="tableColumnsSelect">Table Columns</t:Label> <select t:type="Select" t:id="tableColumnsSelect" id="tableColumnsSelect" model="literal:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,25,50,100" value="tableColumns" defaultValue="3" onchange="this.form.submit()" /> </td> <td colspan="0"> <div style="font-weight:bold; text-align: center;"> <t:outputRaw value="${fromValue}"/> <span class="label"> to </span> <t:outputRaw value="${toValue}"/> <span class="label"> of </span> <span class="label">${count}</span> </div> </td> </tr> <tr> <td align="left" nowrap="NOWRAP" colspan="2"> <div style="font-size:10pt; text-align: center;"> <a> <t:eventLink t:id="FirstPage"> <img src="${asset:startPage.jpg}" height="26" width="42"/> </t:eventLink> </a> <a> <t:eventLink t:id="PrevPage"> <img src="${asset:prevPage.jpg}" height="26" width="42"/> </t:eventLink> </a> <t:if test="pages"> <t:Loop id="foreachpage" source="pages" value="currentPage" index="pageIndex"> <a> <t:eventLink t:id="Page" parameters="${indexValue}"> <t:outputRaw value="${pageValue}"/> </t:eventLink> </a> </t:Loop> </t:if> <a> <t:eventLink t:id="NextPage"> <img src="${asset:nextPage.jpg}" height="26" width="42"/> </t:eventLink> </a> <a> <t:eventLink t:id="LastPage"> <img src="${asset:endPage.jpg}" height="26" width="42"/> </t:eventLink> </a> </div> </td> </tr> </table> </t:block> <t:block t:id="collectionContent" id="collectionContent"> <table width="100%"> <t:Loop id="foreachrow" source="collection" value="currentObject" index="index"> <t:If test="okToRenderItem"> <tr> <t:Loop id="foreachitem" source="currentObject"> <td> <a href="#" model="currentObject"> <t:pagelink t:page="Edit" context="editPageContext"> <t:Any id="${imageComponentId}" > <img id="transparentTextImageComponentId" model="currentObject" src="${photoLink}" image="${photoLink}" alt="${currentObject}.photo.fileName" title="${currentObject}.photo.fileName" width="200" height="160" topLeftText="${currentObject}.transparentText" topRightText="topRightText" bottomLeftText="bottomleft" bottomRightText="bottomright" centerText="center" /> </t:Any> </t:pagelink> </a> </td> <span jwcid="@Script" script="/org/trails/demo/components/TransparentTextImage.script" topLeftText = "currentObject.transparentText" index = "index"> </span> </t:Loop> <!-- for loop --> </tr> </t:If> </t:Loop> <!-- for loop --> </table> </t:block> <t:Any id="headerSelect"> <t:delegate to="autoPagingContent"/> </t:Any> <t:Any id="galleryContent"> <t:delegate to="collectionContent"/> </t:Any> </div> package org.tynamo.examples.hibernatesecurity.components; import java.util.ArrayList; import java.util.Collection; import javax.servlet.ServletContext; import org.apache.tapestry5.Asset; import org.apache.tapestry5.Block; import org.apache.tapestry5.Link; import org.apache.tapestry5.annotations.BeginRender; import org.apache.tapestry5.annotations.Component; import org.apache.tapestry5.annotations.Import; import org.apache.tapestry5.annotations.InjectPage; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.annotations.SetupRender; import org.apache.tapestry5.corelib.components.EventLink; import org.apache.tapestry5.corelib.components.Select; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.ApplicationGlobals; import org.apache.tapestry5.services.Request; import org.hibernate.criterion.DetachedCriteria; import org.slf4j.Logger; import org.tynamo.blob.BlobAsset; import org.tynamo.blob.BlobManager; import org.tynamo.blob.DefaultBlobManager; import org.tynamo.descriptor.TynamoClassDescriptor; import org.tynamo.descriptor.TynamoPropertyDescriptor; import org.tynamo.examples.hibernatesecurity.model.Coach; import org.tynamo.examples.hibernatesecurity.model.Person; import org.tynamo.examples.hibernatesecurity.model.Player; import org.tynamo.examples.hibernatesecurity.model.UploadableMedia; import org.tynamo.examples.hibernatesecurity.pages.Home; import org.tynamo.hibernate.services.HibernatePersistenceService; import org.tynamo.services.DescriptorService; import org.tynamo.services.PersistenceService; @Import(library = "classpath:org/tynamo/examples/hibernatesecurity/components/Gallery.script", stylesheet = "classpath:org/tynamo/themes/tapestryskin/theme.css") public class Gallery { @Inject private Logger logger; @Inject private Request _request; @InjectPage private Home homePage; @Property @Inject private Block autoPagingContent; @Property @Inject private Block collectionContent; @Parameter(value = "asset:startPage.jpg") @Property(write = false) private Asset startPageImage; @Parameter(value = "asset:endPage.jpg") @Property(write = false) private Asset endPageImage; @Parameter(value = "asset:prevPage.jpg") @Property(write = false) private Asset prevPageImage; @Parameter(value = "asset:nextPage.jpg") @Property(write = false) private Asset nextPageImage; // @InjectScript("Gallery.script") // private IScript script; // @Property // @Inject // @Path("context:images/iconInformation.gif") // private Asset iconInformation; @Inject private ApplicationGlobals applicationGlobals; @Inject private DescriptorService descriptorService; @Inject private PersistenceService persistenceService; @Inject private HibernatePersistenceService hibernatePersistenceService; @Inject private BlobManager blobManager; private ServletContext servletContext; /** * Property Selection Support */ @Parameter(required = true) private Class collectionType; @Property @Parameter(required = false, cache = false) private Integer itemsPerPage; @Property @Parameter(required = false, cache = false) private Integer tableColumns; @Property @Parameter(required = true, cache = true) private int cursor; /** * Collection Iterator support */ @Parameter(required = false) private int startRow; @Parameter(required = false) private Object currentObject; public Object getCurrentObject() { return currentObject; } public void setCurrentObject(Object currentObject) { this.currentObject = currentObject; } @Property @Parameter(required = false) private int index; @Property @Parameter(required = false) private int pageIndex; @Property @Parameter(required = false) private Object currentPage; @Property private Collection collection; public Collection loadCollection(Class collectionClass) { DetachedCriteria criteria = DetachedCriteria.forClass(collectionClass); // criteria.add(Restrictions.eq("id", 1)); return hibernatePersistenceService.getInstances(collectionClass, criteria); } // Render Phase annotations available at this time are: // @SetupRender // @BeginRender // @BeforeRenderTemplate // @RenderTemplate // @BeforeRenderBody // @RenderBody // @AfterRenderBody // @AfterRenderTemplate // @AfterRender // @CleanupRender @SetupRender public void setupRender() { itemsPerPage=50; try { collection = loadCollection(collectionType); } catch (Exception e) { logger.error("error loading data on collection gallery"); } } @BeginRender public void beginRender() { logger.debug("Ready to flush the cache"); } public void onActivate() { if (servletContext == null) { servletContext = applicationGlobals.getServletContext(); } } public TynamoPropertyDescriptor findPropertyDescriptor(Class clazz, String propertyName) { TynamoClassDescriptor acd = descriptorService.getClassDescriptor(clazz); for (TynamoPropertyDescriptor pd : acd.getPropertyDescriptors()) { if (pd.getName().equalsIgnoreCase(propertyName)) return pd; } return null; } @Property(write = false) private Class beanType; @Property private Object bean; public Object[] getEditPageContext() { return new Object[]{collectionType, currentObject}; } public Link getPhotoLink() { TynamoPropertyDescriptor propertyDescriptor = findPropertyDescriptor(Coach.class, "photo"); Coach currentObject = (Coach) getCurrentObject(); String contentType = currentObject.getPhoto().getContentType(); String fileName = currentObject.getPhoto().getFileName(); String filePath = currentObject.getPhoto().getFilePath(); return blobManager.createBlobLink(findPropertyDescriptor(Coach.class, "photo"), currentObject); } @Component private Select itemsPerPageSelect; public Object onValueChangedItemsPerPageSelect() { logger.info("In itemsPerPageChangeListener : "); if (itemsPerPage < tableColumns) { tableColumns = itemsPerPage; } else { /** * Use case, items is larger than columns, need to back cursor off * if in endzone */ int i = cursor + itemsPerPage; while (i > (collection.size() - Math.min(collection.size(), itemsPerPage + tableColumns))) { i--; } cursor = (i); } return homePage; } @Component private Select tableColumnsSelect; public Object onValueChangedTableColumnsSelect() { logger.info("In tableColumnsChangeListener : "); onValueChangedItemsPerPageSelect(); return homePage; } public Object galleryFormSubmit() { logger.info("In galleryFormSubmit : "); return homePage; } @Component(parameters = { "event=firstPage" }) private EventLink firstPage; public void onFirstPage() { logger.info("In onFirstPage : "); cursor = 0; } @Component(parameters = { "event=prevPage" }) private EventLink prevPage; public void onPrevPage() { logger.info("In onPrevPage : "); /** * Use Cases: * * Check for setting to - and set to 0 * * else , set back a page */ cursor = (cursor - Math.min(itemsPerPage, collection.size()) < 0 ? 0 : cursor - Math.min(itemsPerPage, collection.size())); } @Component(parameters = { "event=page" }) private EventLink page; /** <a <t:eventLink t:id="Page"/> parameters="(pageIndex + 1)"> <t:outputRaw value="(pageIndex + 2)"/> </a> */ /** * This guy is not getting called. ? * * @param number * @param cycle * @return */ public void onPage(Integer number) { logger.info("In onPage : "); cursor = (number.intValue() * itemsPerPage); } @Component(parameters = { "event=nextPage" }) private EventLink nextPage; public void onNextPage() { logger.info("In onNextPage : "); /** * If we're already in the endzone, set it to last batch, * * If our next action places us into the endzone, set it to last batch * * else just increment by a new page */ cursor = (cursor > (collection.size() - Math.min(itemsPerPage, collection.size())) ? (collection.size() - Math .min(itemsPerPage, collection.size())) : ((cursor + Math.min(itemsPerPage, collection.size())) > (collection.size() - Math.min(itemsPerPage, collection.size())) ? collection.size() - Math.min(itemsPerPage, collection.size()) : cursor + Math.min(itemsPerPage, collection.size()))); } @Component(parameters = { "event=lastPage" }) private EventLink lastPage; public void onLastPage() { logger.info("In onLastPage : "); int minimum = Math.min(itemsPerPage, collection.size()); cursor = (collection.size() - minimum); } @Parameter(value = "true") private boolean okToRenderItem; public boolean isOKToRenderItem() { boolean okToRenderItem = false; if (index >= cursor && index < (cursor + Math.min(collection.size(), itemsPerPage))) okToRenderItem = true; return okToRenderItem; } @Property @Parameter private Collection numPages; public Collection getPages() { numPages = new ArrayList(); for (int i = 1; i < (collection.size() / itemsPerPage - 1); i++) numPages.add(new Integer(i)); return numPages; } public String getImageComponentId() { return "Image_" + new Integer(index).toString(); } public String getTransparentTextImageComponentId() { return "ImageWidget_" + new Integer(index).toString(); } /** * Returns the smaller of two int values */ public int min (int tableColumns, int itemsPerPage) { return Math.min(tableColumns, itemsPerPage); } @Parameter(value = "false") private boolean atNewRow; public boolean isAtNewRow() { return ((index - cursor) % min(tableColumns, itemsPerPage) == 0); } public String getNewTableRow(){ return "</tr><tr>"; } public Class getUploadableMediaClass() { return UploadableMedia.class; } public Class getPersonClass() { return Person.class; } public Class getCoachClass() { return Coach.class; } public int getFromValue() { return cursor + 1; } public int getToValue() { return Math.min(cursor + itemsPerPage, collection.size()); } public int getCount() { return collection.size(); } public int getPageValue() { return pageIndex + 2; } public int getIndexValue() { return pageIndex + 1; } }