/* * Ext GWT - Ext for GWT * Copyright(c) 2007-2009, 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.Style; 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.Menu; 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 renderComponent(Component c, int index, El target) { if (c != null && !c.isRendered()) { Element li = DOM.createElement("li"); li.setId("x-menu-el-" + c.getId()); li.setClassName("x-menu-list-item"); if (GXT.isAriaEnabled()) { Accessibility.setRole(li, "presentation"); } target.insertChild(li, index); c.render(li); boolean needsIcon = (c instanceof Field) || (c instanceof ContentPanel); if (needsIcon) { c.el().getParent().addStyleName("x-menu-list-item-indent"); } } else if (c != null && !isValidParent(c.getElement(), target.dom)) { c.el().insertInto(target.dom, index); } } protected boolean isValidParent(Element elem, Element parent) { return fly(elem).findParent("li.x-menu-list-item", 5).getParent().dom == parent; } protected void onLayout(Container<?> container, El target) { renderAll(container, target); doAutoSize(); cleanup(target); } protected void cleanup(El target) { NodeList<Node> cn = target.dom.getChildNodes(); for (int i = cn.getLength() - 1; i >= 0; i--) { if (cn.getItem(i).getFirstChild() == null) { target.dom.removeChild(cn.getItem(i)); } } } protected void doAutoSize() { int w = getStaticMenuWidth((Menu) container); if (w != Style.DEFAULT) { container.setWidth(w); } else { int minWidth = ((Menu) container).getMinWidth(); int width = container.getLayoutTarget().getWidth() + container.el().getFrameWidth("lr"); container.setWidth(width < minWidth ? minWidth : width); } } private native int getStaticMenuWidth(Menu c) /*-{ return parseInt(c.@com.extjs.gxt.ui.client.widget.BoxComponent::width, 10)||@com.extjs.gxt.ui.client.Style::DEFAULT; }-*/; }