Hi,

Take a look at the Tapestry Tree component to see how recursive rendering
can be done.

-- 
Chris

On Fri, Mar 18, 2016 at 6:17 AM, Qbyte Consulting <qbyteconsult...@gmail.com
> wrote:

> I am creating a Menu component (for a ul tag) that needs to
> programmatically generate the child links.
>
> I already have a MenuItem component, but this is parameter bound to a
> template, whereas now I need to programmatically drive the parameters.
>
> I either need to be able to create the existing MenuItem objects somehow in
> the Menu component and render them, or I simply write the links out in the
> menu - however since my Menu component isn't extending AbstractLink (like
> MenuItem) I can't use writeLink().
>
> Any ideas what is the simplest approach to resolve this? Code below.
>
> John
>
>
> public class Menu {
>
>     /** The text. */
>     @Parameter(required = true, allowNull = false, defaultPrefix =
> BindingConstants.LITERAL)
>     private String name;
>
>     /** The resources. */
>     @Inject
>     private ComponentResources resources;
>
>     /** The component source. */
>     @Inject
>     private ComponentSource componentSource;
>
>     @Inject
>     private PageRenderLinkSource linkSource;
>
> /** The messages. */
> @Inject
> private Messages messages;
>
>     @Inject
>     private MenuService menuService;
>
>     /** The state bean. */
>     @SessionState(create = false)
>     private SessionStateBean stateBean;
>
>     /**
>      * If provided, this is the activation context for the target page (the
>      * information will be encoded into the URL). If not provided, then the
>      * target page will provide its own activation context.
>      */
>     @Parameter
>     private Object[] context;
>
>     /**
>      * Begin render.
>      *
>      * @param writer the writer
>      */
>     void beginRender(MarkupWriter writer) {
>     writer.element("ul");
>     for (String pageName :
> menuService.getPageNames(MenuService.Menu.valueOf(name))) {
>     renderMenuItem(pageName, writer);
>     }
>     }
>
>     private void renderMenuItem(String page, MarkupWriter writer) {
>         Link link = resources.createPageLink(page,
>        resources.isBound("context"), context);
>        writer.element("li");
> NO!!        writeLink(writer, link);
>  writer.writeRaw(messages.get(page.toLowerCase().concat(".link")));
>     writer.end();
>     writer.end();
>     }
>
>     /**
>      * After render.
>      *
>      * @param writer the writer
>      */
>     void afterRender(MarkupWriter writer) {
>    writer.end();
>     }
> }
>
>
> public class MenuItem extends AbstractLink {
>
>     /**
>      * The logical name of the page to link to.
>      */
>     @Parameter(required = true, allowNull = false, defaultPrefix =
> BindingConstants.LITERAL)
>     private String page;
>
>     /** The text. */
>     @Parameter(required = true, allowNull = false, defaultPrefix =
> BindingConstants.LITERAL)
>     private String text;
>
>     /** The resources. */
>     @Inject
>     private ComponentResources resources;
>
>     /** The component source. */
>     @Inject
>     private ComponentSource componentSource;
>
>     /** The state bean. */
>     @SessionState(create = false)
>     private SessionStateBean stateBean;
>
>     /**
>      * If provided, this is the activation context for the target page (the
>      * information will be encoded into the URL). If not provided, then the
>      * target page will provide its own activation context.
>      */
>     @Parameter
>     private Object[] context;
>
>     /**
>      * Begin render.
>      *
>      * @param writer the writer
>      */
>     void beginRender(MarkupWriter writer) {
> if (isDisabled())
>    return;
>    Link link = resources.createPageLink(page,
>    resources.isBound("context"), context);
>    writer.element("li");
>    writeLink(writer, link);
>    writer.writeRaw(text);
>     }
>
>     /**
>      * After render.
>      *
>      * @param writer the writer
>      */
>     void afterRender(MarkupWriter writer) {
> if (isDisabled())
>    return;
> writer.end();
> writer.end();
>     }
> }
>

Reply via email to