Tree uses BaseComponent that doesn't seem to be in tapestry5? On Fri, Mar 18, 2016 at 2:15 PM, Chris Poulsen <mailingl...@nesluop.dk> wrote:
> 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(); > > } > > } > > >