/*
* 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;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
/**
* A component that wraps another component, hiding the wrapped components
* public API.
*
* <p />
* {@link #initComponent(Component)} must be called to initialize the composite.
*
* <p />
* If the wrapped components is a <code>LayoutContainer</code> instance, it's
* layout will be executed as if the composite was a
* <code>LayoutContainer</code>.
*
* <p />
* Code snippet:
*
* <pre>
* public void onModuleLoad() {
* class TestComposite extends Composite {
* public TestComposite() {
* LayoutContainer c = new LayoutContainer();
* c.setLayout(new RowLayout(Orientation.HORIZONTAL));
*
* ContentPanel cp1 = new ContentPanel();
* cp1.setHeading("Composite Test 1");
* c.add(cp1, new RowData(.5, 1));
*
* ContentPanel cp2 = new ContentPanel();
* cp2.setHeading("Composite Test 2");
* c.add(cp2, new RowData(.5, 1));
*
* initComponent(c);
* }
* }
*
* Viewport v = new Viewport();
* v.setLayout(new FitLayout());
* v.add(new TestComposite());
* RootPanel.get().add(v);
* }
* </pre>
*
* <dl>
* <dt>Inherited Events:</dt>
* <dd>BoxComponent Move</dd>
* <dd>BoxComponent Resize</dd>
* <dd>Component Enable</dd>
* <dd>Component Disable</dd>
* <dd>Component BeforeHide</dd>
* <dd>Component Hide</dd>
* <dd>Component BeforeShow</dd>
* <dd>Component Show</dd>
* <dd>Component Attach</dd>
* <dd>Component Detach</dd>
* <dd>Component BeforeRender</dd>
* <dd>Component Render</dd>
* <dd>Component BrowserEvent</dd>
* <dd>Component BeforeStateRestore</dd>
* <dd>Component StateRestore</dd>
* <dd>Component BeforeStateSave</dd>
* <dd>Component SaveState</dd>
* </dl>
*/
public class Composite extends BoxComponent {
protected Component component;
/**
* Returns the wrapped component.
*
* @return the component
*/
public Component getComponent() {
return component;
}
@Override
public Element getElement() {
// we need this because of lazy rendering
return component.getElement();
}
@Override
public boolean isAttached() {
if (component != null) {
return component.isAttached();
}
return false;
}
@Override
public void onBrowserEvent(Event event) {
// Fire any handler added to the composite itself.
super.onBrowserEvent(event);
// Delegate events to the widget.
component.onBrowserEvent(event);
}
@Override
public void setSize(int width, int height) {
if (component instanceof BoxComponent) {
((BoxComponent) component).setSize(width, height);
}
}
@Override
public void setSize(String width, String height) {
if (component instanceof BoxComponent) {
((BoxComponent) component).setSize(width, height);
}
}
protected void initComponent(Component component) {
component.removeFromParent();
this.component = component;
component.setParent(this);
}
@Override
protected void onAttach() {
component.onAttach();
DOM.setEventListener(getElement(), this);
onLoad();
}
@Override
protected void onDetach() {
try {
onUnload();
} finally {
component.onDetach();
}
onDetachHelper();
}
@Override
protected void onDisable() {
super.onDisable();
component.disable();
}
@Override
protected void onEnable() {
super.onEnable();
component.enable();
}
@Override
protected void onRender(Element target, int index) {
component.render(target, index);
setElement(component.getElement());
}
}