Use LazyPanel for deferred rendering in ShowCase git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4146 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidget.java b/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidget.java index 5861141..4f97aaf 100644 --- a/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidget.java +++ b/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidget.java
@@ -26,9 +26,9 @@ import com.google.gwt.i18n.client.HasDirection; import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DeckPanel; import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.LazyPanel; import com.google.gwt.user.client.ui.TabBar; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; @@ -43,10 +43,9 @@ * rules. * </p> * <p> - * This {@link Widget} uses a lazy initialization mechanism so that the content - * is not rendered until the onInitialize method is called, which happens the - * first time the {@link Widget} is added to the page.. The data in the source - * and css tabs are loaded using an RPC call to the server. + * This {@link Widget} extends {@link LazyPanel} so that the content is not + * rendered until the widget first becomes visible. The data in the source and + * css tabs are loaded using an RPC call to the server. * </p> * <h3>CSS Style Rules</h3> * <ul class="css"> @@ -57,7 +56,7 @@ * <li>.sc-ContentWidget-description { Applied to the description }</li> * </ul> */ -public abstract class ContentWidget extends Composite implements +public abstract class ContentWidget extends LazyPanel implements SelectionHandler<Integer> { /** * The constants used in this Content Widget. @@ -83,7 +82,7 @@ /** * An instance of the constants. */ - private CwConstants constants; + private final CwConstants constants; /** * The deck panel with the contents. @@ -91,11 +90,6 @@ private DeckPanel deckPanel = null; /** - * A boolean indicating whether or not this widget has been initialized. - */ - private boolean initialized = false; - - /** * A boolean indicating whether or not the RPC request for the source code has * been sent. */ @@ -129,13 +123,11 @@ public ContentWidget(CwConstants constants) { this.constants = constants; tabBar = new TabBar(); - deckPanel = new DeckPanel(); - initWidget(deckPanel); - setStyleName(DEFAULT_STYLE_NAME); } /** - * Add an item to this content widget. + * Add an item to this content widget. Should not be called before + * {@link #onInitializeComplete} has been called. * * @param w the widget to add * @param tabText the text to display in the tab @@ -185,57 +177,8 @@ } /** - * Initialize this widget by creating the elements that should be added to the - * page. - */ - public final void initialize() { - if (initialized == false) { - initialized = true; - - // Add a tab handler - tabBar.addSelectionHandler(this); - - // Create a container for the main example - final VerticalPanel vPanel = new VerticalPanel(); - add(vPanel, constants.contentWidgetExample()); - - // Add the name - HTML nameWidget = new HTML(getName()); - nameWidget.setStyleName(DEFAULT_STYLE_NAME + "-name"); - vPanel.add(nameWidget); - - // Add the description - HTML descWidget = new HTML(getDescription()); - descWidget.setStyleName(DEFAULT_STYLE_NAME + "-description"); - vPanel.add(descWidget); - - // Add source code tab - if (hasSource()) { - sourceWidget = new HTML(); - add(sourceWidget, constants.contentWidgetSource()); - } else { - sourceLoaded = true; - } - - // Add style tab - if (hasStyle()) { - styleDefs = new HashMap<String, String>(); - styleWidget = new HTML(); - add(styleWidget, constants.contentWidgetStyle()); - } - - // Initialize the widget and add it to the page - Widget widget = onInitialize(); - if (widget != null) { - vPanel.add(widget); - } - onInitializeComplete(); - } - } - - /** - * When the widget is first initialize, this method is called. If it returns a - * Widget, the widget will be added as the first tab. Return null to disable + * When the widget is first initialized, this method is called. If it returns + * a Widget, the widget will be added as the first tab. Return null to disable * the first tab. * * @return the widget to add to the first tab @@ -302,10 +245,60 @@ tabBar.selectTab(index); } + /** + * Initialize this widget by creating the elements that should be added to the + * page. + */ + protected final Widget createWidget() { + deckPanel = new DeckPanel(); + + setStyleName(DEFAULT_STYLE_NAME); + + // Add a tab handler + tabBar.addSelectionHandler(this); + + // Create a container for the main example + final VerticalPanel vPanel = new VerticalPanel(); + add(vPanel, constants.contentWidgetExample()); + + // Add the name + HTML nameWidget = new HTML(getName()); + nameWidget.setStyleName(DEFAULT_STYLE_NAME + "-name"); + vPanel.add(nameWidget); + + // Add the description + HTML descWidget = new HTML(getDescription()); + descWidget.setStyleName(DEFAULT_STYLE_NAME + "-description"); + vPanel.add(descWidget); + + // Add source code tab + if (hasSource()) { + sourceWidget = new HTML(); + add(sourceWidget, constants.contentWidgetSource()); + } else { + sourceLoaded = true; + } + + // Add style tab + if (hasStyle()) { + styleDefs = new HashMap<String, String>(); + styleWidget = new HTML(); + add(styleWidget, constants.contentWidgetStyle()); + } + + // Initialize the showcase widget (if any) and add it to the page + Widget widget = onInitialize(); + if (widget != null) { + vPanel.add(widget); + } + onInitializeComplete(); + + return deckPanel; + } + @Override protected void onLoad() { - // Initialize this widget if we haven't already - initialize(); + ensureWidget(); // Select the first tab if (getTabBar().getTabCount() > 0) {