Wicket-menu(1)

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());
   }

}