Wicket Component – JQuery Accordion Menu

No Comments »

Presenting a very simple wicket component for everybody to use – a JQuery accordion menu.

You can see it live here

Full sources are available here

This is how you add it to the page:

Java

		Map<AccordionLink, List<AccordionLink>> menus = new LinkedHashMap<AccordionLink, List<AccordionLink>>();
		menus.put(new AccordionLink("Menu1", "http://www.menu1.com"),
				Arrays.asList(
						new AccordionLink("11", "http://www.menu11.com"),
						new AccordionLink("12", "http://www.menu12.com"),
						new AccordionLink("13", "http://www.menu13.com")));
		menus.put(new AccordionLink("Menu2", "http://www.menu2.com"),
				Arrays.asList(
						new AccordionLink("21", "http://www.menu21.com"),
						new AccordionLink("22", "http://www.menu22.com"),
						new AccordionLink("23", "http://www.menu23.com")));
		menus.put(new AccordionLink("Menu3", "http://www.menu3.com"),
				Arrays.asList(
						new AccordionLink("31", "http://www.menu31.com"),
						new AccordionLink("32", "http://www.menu32.com"),
						new AccordionLink("33", "http://www.menu33.com")));
		menus.put(new AccordionLink("Menu4", "http://www.menu2.com"),
				Arrays.asList(
						new AccordionLink("41", "http://www.menu41.com"),
						new AccordionLink("42", "http://www.menu42.com"),
						new AccordionLink("43", "http://www.menu43.com")));
		menus.put(new AccordionLink("Menu5", "http://www.menu2.com"),
				Arrays.asList(
						new AccordionLink("51", "http://www.menu51.com"),
						new AccordionLink("52", "http://www.menu52.com"),
						new AccordionLink("53", "http://www.menu53.com")));
		add(new AccordionMenu("menu", menus, true, this));

The important line is add(new AccordionMenu(”menu”, menus, true, this));

HTML

<html xmlns:wicket>
<body>
    <div wicket:id="menu"/>
</body>
</html>

Wicket component code:
AccordionMenu.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns:wicket>
<head>
</head>
<body>
<wicket:panel>
    <!--
    Wicket component:   JQuery Accordion Menu
    Author:             Nova Creator Software
    Website:            www.novacreator.com
    Software provided as is, without any guarantees.
    Free for any type of usage. We just kindly ask to keep this message.
     -->
    <div wicket:id="topdiv" class="menu_list">
        <p wicket:id="repeatItems" class="menu_head">
            <span wicket:id="menuItem"></span>
	        <div class="menu_body">
	             <a wicket:id="menuSubItem">
	                <span wicket:id="menuSubItemName"/>
	             </a>
	        </div>
        </p>
    </div>
</wicket:panel>
</body>
</html>

AccordionMenu.java

package com.novacreator.wicketcomponents.jquery.accordionmenu;

import java.util.List;
import java.util.Map;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.behavior.HeaderContributor;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.html.resources.CompressedResourceReference;
import org.apache.wicket.markup.html.resources.JavascriptResourceReference;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.Model;

/*
    Wicket component:   JQuery Accordion Menu
    Author:             Nova Creator Software
    Website:            www.novacreator.com
    Software provided as is, without any guarantees.
    Free for any type of usage. We just kindly ask to keep this message.
 */
@SuppressWarnings("serial")
public class AccordionMenu extends Panel {
	private static final ResourceReference JQUERYJS =
		new JavascriptResourceReference(AccordionMenu.class, "../res/jquery.js");
	private static final ResourceReference ACCORDIONJS =
		new JavascriptResourceReference(AccordionMenu.class, "../res/accordionmenu.js");
	private static final ResourceReference CSS =
		new CompressedResourceReference(AccordionMenu.class, "../res/accordionmenu.css");

	public AccordionMenu(String id, final Map<AccordionLink, List<AccordionLink>> menus, boolean autoExpand, final AccordionMenuListener listener) {
		super(id);

		add(HeaderContributor.forJavaScript(JQUERYJS));
		add(HeaderContributor.forJavaScript(ACCORDIONJS));
		add(HeaderContributor.forCss(CSS));

		WebMarkupContainer topDiv = new WebMarkupContainer("topdiv");
		add(topDiv);
		if(autoExpand) {
			topDiv.add(new AttributeModifier("id", true, new Model("autoexpand")));
		} else {
			topDiv.add(new AttributeModifier("id", true, new Model("noautoexpand")));
		}
		RepeatingView menuItems = new RepeatingView("repeatItems");
		topDiv.add(menuItems);

		for(final AccordionLink menu : menus.keySet()) {
			WebMarkupContainer wmc = new WebMarkupContainer(menuItems.newChildId());
			menuItems.add(wmc);
			wmc.add(new AjaxEventBehavior("onclick"){
				@Override
				protected void onEvent(AjaxRequestTarget target) {
					if(menu.getLink() != null &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; !menu.getLink().isEmpty()) {
						listener.onAccordionMenuClick(menu.getLink(), target);
					}
				}
			});
			wmc.add(new Label("menuItem", menu.getDisplayName()));
			RepeatingView menuSubItems = new RepeatingView("menuSubItem");
			wmc.add(menuSubItems);
			for(final AccordionLink item : menus.get(menu)) {
				AjaxFallbackLink iaf = new AjaxFallbackLink(menuSubItems.newChildId()) {
					@Override
					public void onClick(AjaxRequestTarget target) {
						if(item.getLink() != null &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; !item.getLink().isEmpty()) {
							listener.onAccordionMenuClick(item.getLink(), target);
						}
					}
				};
				iaf.add(new Label("menuSubItemName", item.getDisplayName()));
				menuSubItems.add(iaf);
			}
		}
	}
}

AccordionMenuListener.java

package com.novacreator.wicketcomponents.jquery.accordionmenu;

import org.apache.wicket.ajax.AjaxRequestTarget;

/*
Wicket component:   JQuery Accordion Menu
Author:             Nova Creator Software
Website:            www.novacreator.com
Software provided as is, without any guarantees.
Free for any type of usage. We just kindly ask to keep this message.
*/
public interface AccordionMenuListener {
	public void onAccordionMenuClick(String link, AjaxRequestTarget target);
}

AccordionLink.java

package com.novacreator.wicketcomponents.jquery.accordionmenu;

import java.io.Serializable;

/*
Wicket component:   JQuery Accordion Menu
Author:             Nova Creator Software
Website:            www.novacreator.com
Software provided as is, without any guarantees.
Free for any type of usage. We just kindly ask to keep this message.
*/
@SuppressWarnings("serial")
public class AccordionLink implements Serializable {
	private String displayName;
	private String link;

	public AccordionLink(String displayName, String link) {
		this.displayName = displayName;
		this.link = link;
	}

	public String getDisplayName() {
		return displayName;
	}
	public void setDisplayName(String displayName) {
		this.displayName = displayName;
	}
	public String getLink() {
		return link;
	}
	public void setLink(String link) {
		this.link = link;
	}
}

Post a Comment