tapestry-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bob Harner <bobhar...@gmail.com>
Subject Re: Loop and iterator
Date Wed, 29 Jan 2014 22:08:48 GMT
If you use that Columns component you'll also need some CSS:

DIV.t-column {
    float: left;
    padding: 1em;
}

Or, you can use a different CSS class name (other than t-column) by
passing the class name as a component parameter:

                <t:columns number="3" columnClass="foo">
                    <t:loop source="items" value="item">
                        <div>${item.name}</div>
                    </t:loop>
                </t:columns>

On Wed, Jan 29, 2014 at 4:57 PM, Bob Harner <bobharner@gmail.com> wrote:
> Maybe this handy little component will help:
>
> /**
>  * A Tapestry component that rearranges the HTML items in its body into multiple
>  * columns. It accomplishes this by DOM manipulation after the body is rendered
>  * to the DOM.
>  * <p>
>  * Note: For this to work properly, the items that you wrap this component
>  * around must each consist of a single HTML element (possibly with nested
>  * elements). For example, the following works, because each item is contained
>  * within a single &lt;li&gt; element:
>  *
>  * <pre>
>  * &lt;t:columns number="2"&gt;
>  *     &lt;t:loop source="myList" value="oneItem"&gt;
>  *         &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;{$oneItem.name}&lt;/li&gt;
>  *     &lt;/t:loop&gt;
>  * &lt;/t:columns&gt;
>  * </pre>
>  *
>  * But the following fails to lay out property, because there are two HTML
>  * elements -- a span and a br -- per item:
>  *
>  * <pre>
>  * &lt;t:columns number="2"&gt;
>  *     &lt;t:loop source="myList" value="oneItem"&gt;
>  *         &lt;span&gt;${oneItem.name}&lt;/span&gt;&lt;br /&gt;
>  *     &lt;/t:loop&gt;
>  * &lt;/t:columns&gt;
>  * </pre>
>  */
> @SupportsInformalParameters
> public class Columns {
>     /**
>      * The number of columns to divide the items into
>      */
>     @Property
>     @Parameter(value="5", defaultPrefix="literal")
>     private int number;
>
>     @Property
>     @Parameter(value="literal:t-column")
>     private String columnClass;
>
>     @Inject
>     private ComponentResources componentResources;
>
>     /**
>      * Manipulate the Tapestry-rendered DOM to insert as many DIV elements as
>      * needed to break up the list of items in our "body" into the requested
>      * number of columns. This method is only called after the "body" is
>      * rendered into the DOM.
>      *
>      * @param writer
>      */
>     @AfterRenderBody
>     void manipulateTheDom(MarkupWriter writer)
>     {
>         Element container = writer.getElement();
>
>         // figure out how many items should go into each column
>
>         List<Node> children = container.getChildren();
>         int numChildren = children.size();
>         int itemsPerColumn = numChildren / number;
>         int remainder = numChildren % number;
>         int itemNum = 0;
>
>         // render informal parameters into the container element
>         componentResources.renderInformalParameters(writer);
>
>         for (int columnNumber = 0; columnNumber < number; columnNumber++)
>         {
>             int extras = (remainder > 0) ? 1 : 0;
>             remainder--;
>             int numItemsthisColumn = itemsPerColumn + extras;
>
>             // Make a per-column wrapper element and move it to the bottom
>             Element columnElement = container.element("div", "class",
> columnClass);
>             columnElement.moveToBottom(container);
>
>             // move some children into the new column wrapper element
>             for (int i = 0; i < numItemsthisColumn; i++)
>             {
>                 children.get(itemNum).moveToBottom(columnElement);
>                 itemNum++;
>             }
>         }
>     }
> }
>
> On Wed, Jan 29, 2014 at 3:28 PM, Thiago H de Paula Figueiredo
> <thiagohp@gmail.com> wrote:
>> On Wed, 29 Jan 2014 17:58:08 -0200, Dimitris Zenios
>> <dimitris.zenios@gmail.com> wrote:
>>
>>> I am not sure whether i will be able to cast to collection.Maybe tapestry
>>> is doing some magic with BindParameter.
>>
>>
>> You don't need to cast it to a Collection, because Iterable is exactly the
>> Java interface implemented by any class which provides an Iterator. Just use
>> Iterable and its iterator() method directly.
>>
>>
>> --
>> Thiago H. de Paula Figueiredo
>> Tapestry, Java and Hibernate consultant and developer
>> http://machina.com.br
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: dev-help@tapestry.apache.org
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org


Mime
View raw message