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;
    }    
}
                                          

Reply via email to