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