/* * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.user.client.ui; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.user.client.Window; /** * A singleton implementation of {@link LayoutPanel} that always attaches itself * to the document body (i.e. {@link RootPanel#get()}). * * <p> * This panel automatically calls {@link RequiresResize#onResize()} on itself * when initially created, and whenever the window is resized. * </p> * * <p> * NOTE: This widget will <em>only</em> work in standards mode, which requires * that the HTML page in which it is run have an explicit <!DOCTYPE> * declaration. * </p> * * <p> * <h3>Example</h3> * {@example com.google.gwt.examples.LayoutPanelExample} * </p> */ public class RootLayoutPanel extends LayoutPanel { private static RootLayoutPanel singleton; /** * Gets the singleton instance of RootLayoutPanel. This instance will always * be attached to the document body via {@link RootPanel#get()}. * * <p> * Note that, unlike {@link RootPanel#get(String)}, this class provides no way * to get an instance for any element on the page other than the document * body. This is because we know of no way to get resize events for anything * but the window. * </p> */ public static RootLayoutPanel get() { if (singleton == null) { singleton = new RootLayoutPanel(); RootPanel.get().add(singleton); } return singleton; } private RootLayoutPanel() { Window.addResizeHandler(new ResizeHandler() { public void onResize(ResizeEvent event) { RootLayoutPanel.this.onResize(); } }); // TODO(jgw): We need notification of font-size changes as well. // I believe there's a hidden iframe trick that we can use to get // a font-size-change event (really an em-definition-change event). } @Override protected void onLoad() { getLayout().onAttach(); getLayout().fillParent(); } }