/*
* 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;
import java.util.ArrayList;
import java.util.List;
import com.extjs.gxt.ui.client.core.El;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.AbstractImagePrototype.ImagePrototypeElement;
/**
* A custom component that supports an icon, text, and tool area.
*/
public class Header extends Component implements IconSupport {
protected AbstractImagePrototype icon;
private String textStyle;
private El textEl;
private List<Component> tools = new ArrayList<Component>();
private HorizontalPanel widgetPanel;
private String text;
/**
* Adds a tool.
*
* @param tool the tool to be inserted
*/
public void addTool(Component tool) {
insertTool(tool, getToolCount());
}
public AbstractImagePrototype getIcon() {
return icon;
}
/**
* Returns the header's text.
*
* @return the text
*/
public String getText() {
return text;
}
/**
* Returns the item's text style.
*
* @return the textStyle the text style
*/
public String getTextStyle() {
return textStyle;
}
/**
* Returns the tool at the given index.
*
* @param index the index
* @return the tool
*/
public Component getTool(int index) {
return tools.get(index);
}
/**
* Returns the number of tool items.
*
* @return the count
*/
public int getToolCount() {
return tools.size();
}
/**
* Inserts a tool.
*
* @param tool the tool to insert
* @param index the insert location
*/
public void insertTool(Component tool, int index) {
tools.add(index, tool);
if (rendered) {
widgetPanel.insert((Widget) tool, index);
}
}
/**
* Removes a tool.
*
* @param tool the tool to remove
*/
public void removeTool(Component tool) {
tools.remove(tool);
if (rendered) {
widgetPanel.remove(tool);
}
}
/**
* Sets the header's icon style. The style name should match a CSS style that
* specifies a background image using the following format:
*
* <pre>
* <code>
* .my-icon {
* background: url(images/icons/my-icon.png) no-repeat center left !important;
* }
* </code>
* </pre>
*
* @param icon the icon
*/
public void setIcon(AbstractImagePrototype icon) {
if (rendered) {
if (el().selectNode("img") != null) {
el().selectNode("img").remove();
}
if (icon != null) {
ImagePrototypeElement i = icon.createElement();
El.fly(i).addStyleName("x-panel-inline-icon");
El.fly(i).setStyleAttribute("cursor", "default");
El.fly(i).setStyleAttribute("float", "left");
el().insertChild((Element) i.cast(), 0);
}
}
this.icon = icon;
}
public void setIconStyle(String icon) {
setIcon(IconHelper.create(icon));
}
/**
* Sets the header's text.
*
* @param text the new text
*/
public void setText(String text) {
this.text = text;
if (rendered) {
textEl.dom.setInnerHTML(text == null ? " " : text);
}
}
/**
* Sets the style name added to the header's text element.
*
* @param textStyle the text style
*/
public void setTextStyle(String textStyle) {
this.textStyle = textStyle;
if (rendered) {
textEl.dom.setClassName(textStyle);
}
}
@Override
protected void doAttachChildren() {
super.doAttachChildren();
ComponentHelper.doAttach(widgetPanel);
}
@Override
protected void doDetachChildren() {
super.doDetachChildren();
ComponentHelper.doDetach(widgetPanel);
}
@Override
protected void onRender(Element target, int index) {
super.onRender(target, index);
setElement(DOM.createDiv(), target, index);
addStyleName("x-small-editor");
widgetPanel = new HorizontalPanel();
widgetPanel.setStyleName("x-panel-toolbar");
widgetPanel.setLayoutOnChange(true);
widgetPanel.setStyleAttribute("float", "right");
if (tools.size() > 0) {
for (int i = 0; i < tools.size(); i++) {
widgetPanel.add(tools.get(i));
}
}
widgetPanel.render(getElement());
textEl = new El(DOM.createSpan());
textEl.setId(getId() + "-label");
getElement().appendChild(textEl.dom);
if (textStyle != null) {
setTextStyle(textStyle);
}
setText(text);
if (icon != null) {
setIcon(icon);
}
}
}