/*
* Ext GWT 2.2.4 - Ext for GWT
* Copyright(c) 2007-2010, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.widget.layout;
import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.core.El;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.Container;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Layout;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.menu.AdapterMenuItem;
import com.google.gwt.dom.client.Node;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Accessibility;
/**
* Custom layout for <code>Menu</code>
*/
public class MenuLayout extends Layout {
protected void cleanup(El target) {
NodeList<Node> cn = target.dom.getChildNodes();
for (int i = cn.getLength() - 1; i >= 0; i--) {
if (!cn.getItem(i).hasChildNodes()) {
target.dom.removeChild(cn.getItem(i));
}
}
}
@Override
protected void onComponentHide(Component component) {
super.onComponentHide(component);
if (component.isRendered()) {
component.el().getParent().addStyleName(component.getHideMode().value());
}
}
@Override
protected void onComponentShow(Component component) {
super.onComponentShow(component);
if (component.isRendered()) {
component.el().getParent().removeStyleName(component.getHideMode().value());
}
}
@Override
protected void onLayout(Container<?> container, El target) {
super.onLayout(container, target);
cleanup(target);
}
@Override
protected void renderComponent(Component c, int index, El target) {
if (c != null && (!c.isRendered() || !isValidParent(c.getElement(), target.dom))) {
Element div = DOM.createDiv();
div.setId("x-menu-el-" + c.getId());
div.setClassName("x-menu-list-item");
if (GXT.isAriaEnabled()) {
Accessibility.setRole(div, "presentation");
}
target.insertChild(div, index);
boolean needsIndent = (c instanceof Field<?>) || (c instanceof ContentPanel)
|| (c instanceof AdapterMenuItem && ((AdapterMenuItem) c).isNeedsIndent());
if (!c.isRendered()) {
c.render(div);
} else {
c.el().insertInto(div);
if (!c.isEnabled()) {
c.disable();
}
}
fly(div).setStyleName("x-menu-list-item-indent", needsIndent);
}
}
}