/*
* Copyright 2004-2005 Revolution Systems Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.revolsys.ui.html.view;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import com.revolsys.record.io.format.xml.XmlWriter;
import com.revolsys.ui.web.config.Menu;
import com.revolsys.ui.web.config.MenuItem;
import com.revolsys.ui.web.config.WebUiContext;
import com.revolsys.util.HtmlAttr;
import com.revolsys.util.HtmlElem;
import com.revolsys.util.Property;
public class MenuView extends ObjectView {
private static final Logger log = Logger.getLogger(MenuView.class);
private String cssClass = "menu";
private int numLevels = 1;
private boolean showRoot;
private void menu(final XmlWriter out, final Collection items, final int level) {
// Collection items = menu.getItems();
if (items.size() > 0) {
out.startTag(HtmlElem.UL);
for (final Iterator menuItemIter = items.iterator(); menuItemIter.hasNext();) {
final MenuItem menuItem = (MenuItem)menuItemIter.next();
if (menuItem.isVisible()) {
out.startTag(HtmlElem.LI);
final String cssClass = menuItem.getProperty("cssClass");
if (cssClass != null) {
out.attribute(HtmlAttr.CLASS, cssClass);
}
menuItemLink(out, menuItem);
if (level < this.numLevels && menuItem instanceof Menu) {
menu(out, ((Menu)menuItem).getItems(), level + 1);
}
out.endTag(HtmlElem.LI);
}
}
out.endTag(HtmlElem.UL);
out.startTag(HtmlElem.DIV);
out.attribute(HtmlAttr.CLASS, "end");
out.entityRef("nbsp");
out.endTag(HtmlElem.DIV);
}
}
private void menuItemLink(final XmlWriter out, final MenuItem menuItem) {
final String uri = menuItem.getUri();
if (Property.hasValue(uri)) {
if (uri.startsWith("javascript:")) {
out.startTag(HtmlElem.BUTTON);
out.attribute(HtmlAttr.ON_CLICK, uri.substring(11));
out.text(menuItem.getTitle());
out.endTag(HtmlElem.BUTTON);
} else {
out.startTag(HtmlElem.A);
out.attribute(HtmlAttr.HREF, uri);
out.attribute(HtmlAttr.TITLE, menuItem.getTitle());
out.text(menuItem.getTitle());
out.endTag(HtmlElem.A);
}
} else {
out.text(menuItem.getTitle());
}
}
@Override
public void processProperty(final String name, final Object value) {
final String stringValue = (String)value;
if (name.equals("cssClass")) {
this.cssClass = value.toString();
} else if (name.equals("numLevels")) {
this.numLevels = Integer.parseInt(stringValue);
} else if (name.equals("menuName")) {
final WebUiContext context = WebUiContext.get();
setObject(context.getMenu(stringValue));
if (getObject() == null) {
throw new IllegalArgumentException("Menu " + value + " does not exist");
}
} else if (name.equals("showRoot")) {
this.showRoot = Boolean.valueOf(stringValue).booleanValue();
}
}
@Override
public void serializeElement(final XmlWriter out) {
final Menu menu = (Menu)getObject();
if (menu != null) {
final List menuItems = new ArrayList();
for (final Object element : menu.getItems()) {
final MenuItem menuItem = (MenuItem)element;
if (menuItem.isVisible()) {
menuItems.add(menuItem);
}
}
if (this.showRoot || !menuItems.isEmpty()) {
out.startTag(HtmlElem.DIV);
out.attribute(HtmlAttr.CLASS, this.cssClass);
if (this.showRoot) {
out.startTag(HtmlElem.DIV);
out.attribute(HtmlAttr.CLASS, "title");
menuItemLink(out, menu);
out.endTag(HtmlElem.DIV);
}
menu(out, menuItems, 1);
out.endTag(HtmlElem.DIV);
}
}
}
}