Wicket でメニューバーを部品として提供するもの
Google の オープンソースプロジェクトで見つけたもの
http://code.google.com/p/wicket-menu/
ここにあった SunriseGlossDropDownMenu を利用して、
Horizon DropDown のメニューを汎用的なコンポーネントを考えた。
(長いので分けて投稿)
HTML と Panel クラスを用意し、CSS スタイルシートとボタン画像を利用する側で用意する方法である。
HTML は、HorizonDropdownMenu.html というファイル名で以下の内容、、、
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:wicket="">http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<wicket:panel>
<div>
<ul class="menu">
<li class="top" wicket:id="menuItem">
<a href="#" class="top_link" wicket:id="menuLink"><span wicket:id="linkText">[PRIMARY MENU LINK TEXT]</span></a>
<ul class="sub" wicket:id="subMenuListContainer">
<li wicket:id="subMenuItem">
<a href="#" wicket:id="subMenuLink"><span wicket:id="subMenuLinkText">[SUBMENU LINK TEXT]</span></a>
</li>
</ul>
</li>
</ul>
</div>
</wicket:panel>
</body>
</html>
この HTML をそのまま利用してこれに合わせてCSSを書いても良いし、
http://www.cssmenumaker.com/drop_down_css_menu.php
などで、HTML CSS を作ってから、同じ wicket:id を追記してもよい。
Panel クラスとして、HorizonDropdownMenu を用意する
(Wicket 1.4 で書いてみる)
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.markup.html.IHeaderContributor;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import com.cooldatasoft.common.DestinationType;
import com.cooldatasoft.common.MenuItem;
/**
* HorizonDropdownMenu
*/
public abstract class HorizonDropdownMenu extends Panel implements IHeaderContributor{
protected abstract ResourceReference getCSSResourceReference();
public HorizonDropdownMenu(String id,List<MenuItem> menuItemList){
super(id);
ListView<MenuItem> primaryMenuListView = new ListView<MenuItem>("menuItem",menuItemList){
@Override
protected void populateItem(ListItem<MenuItem> item){
final MenuItem menuItem = item.getModelObject();
Link link = new Link("menuLink"){
@Override
public void onClick(){
if (menuItem != null){
processResponse(menuItem);
}
}
};
link.add(new Label("linkText",menuItem.getMenuText()));
item.add(link);
WebMarkupContainer subMenuListContainer = new WebMarkupContainer("subMenuListContainer");
List<MenuItem> subMenuList = new ArrayList<MenuItem>();
if (menuItem.getSubMenuItemList() != null){
subMenuList = menuItem.getSubMenuItemList();
}
ListView<MenuItem> subMenuListView = new ListView<MenuItem>("subMenuItem",subMenuList){
@Override
protected void populateItem(ListItem<MenuItem> _item){
final MenuItem subMenuItem = _item.getModelObject();
Link subMenuLink = new Link("subMenuLink"){
@Override
public void onClick(){
if (subMenuItem != null){
processResponse(subMenuItem);
}
}
};
subMenuLink.add(new Label("subMenuLinkText",subMenuItem.getMenuText()));
_item.add(subMenuLink);
}
};
subMenuListContainer.add(subMenuListView);
if (menuItem.getSubMenuItemList() != null && menuItem.getSubMenuItemList().size()==0){
subMenuListContainer.setVisible(false);
}
item.add(subMenuListContainer);
}
};
add(primaryMenuListView);
}
protected void processResponse(MenuItem menuItem){
switch(menuItem.getDestinationType()){
case DestinationType.EXTERNAL_LINK:
menuItem.getExternalLink();
break;
case DestinationType.WEB_PAGE_CLASS:
setResponsePage(menuItem.getResponsePageClass());
break;
case DestinationType.WEB_PAGE_INSTANCE:
setResponsePage(menuItem.getResponsePage());
break;
case DestinationType.NONE:
break;
default:
throw new RuntimeException("Destination type not valid!");
}
}
@Override
public void renderHead(IHeaderResponse response){
response.renderCSSReference(getCSSResourceReference());
}
}