package ilarkesto.gwt.client; import ilarkesto.core.base.Str; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; public abstract class AWidget extends Composite implements Updatable { private boolean initializing; private boolean initialized; private Wrapper wrapper; protected abstract Widget onInitialization(); public AWidget() { wrapper = new Wrapper(); if (!GWT.isScript()) wrapper.setContent(Gwt.createBugMarker(getClass().getName() + " is not initialized. -> call update()")); initWidget(wrapper); } protected boolean isResetRequired() { return false; } protected void onUpdate() { Element element = wrapper.getElement(); String newId = getId(); if (element.getId() != newId) element.setId(newId); Gwt.update(wrapper.getWidget()); } /** * Initializes the widget if not already initialized. */ public final void initialize() { // check if already initialized if (initialized) return; // check if initializing and prevent endless loop if (initializing) throw new RuntimeException("Widget already initializing: " + toString()); initializing = true; // GwtLogger.DEBUG("Initializing widget: " + toString()); Widget content = onInitialization(); wrapper.setContent(content); wrapper.getElement().setId(getId()); initialized = true; initializing = false; } public final void reset() { initialized = false; } protected void replaceContent(Widget widget) { initialize(); wrapper.setContent(widget); } public final AWidget update() { if (isResetRequired()) reset(); initialize(); // wrapper.setVisible(true); // GwtLogger.DEBUG("Updating widget: " + toString()); onUpdate(); return this; } public final boolean isInitialized() { return initialized; } protected final void setHeight100() { wrapper.setStyleName("AWidget-height100"); } public String getId() { return Str.getSimpleName(getClass()).replace('$', '_'); } @Override public String toString() { return Gwt.getSimpleName(getClass()); } private class Wrapper extends SimplePanel { // private Widget content; // // @Override // protected Widget createWidget() { // initialize(); // return content; // } // public void setContent(Widget conent) { // this.content = conent; setWidget(conent); } } }