blob: 651fe47f810cea521717f86105f01f7e2e510e70 [file] [log] [blame]
/*
* Copyright 2008 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.user.client.DOM;
import com.google.gwt.dom.client.Element;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* Base class for panels that contain only one widget.
*/
public class SimplePanel extends Panel implements HasOneWidget {
private Widget widget;
/**
* Creates an empty panel that uses a DIV for its contents.
*/
public SimplePanel() {
this(DOM.createDiv());
}
/**
* Creates an empty panel that uses the specified browser element for its
* contents.
*
* @param elem the browser element to use
*/
protected SimplePanel(Element elem) {
setElement(elem);
}
/**
* Adds a widget to this panel.
*
* @param w the child widget to be added
*/
@Override
public void add(Widget w) {
// Can't add() more than one widget to a SimplePanel.
if (getWidget() != null) {
throw new IllegalStateException("SimplePanel can only contain one child widget");
}
setWidget(w);
}
/**
* Gets the panel's child widget.
*
* @return the child widget, or <code>null</code> if none is present
*/
public Widget getWidget() {
return widget;
}
public Iterator<Widget> iterator() {
// Return a simple iterator that enumerates the 0 or 1 elements in this
// panel.
return new Iterator<Widget>() {
boolean hasElement = widget != null;
Widget returned = null;
public boolean hasNext() {
return hasElement;
}
public Widget next() {
if (!hasElement || (widget == null)) {
throw new NoSuchElementException();
}
hasElement = false;
return (returned = widget);
}
public void remove() {
if (returned != null) {
SimplePanel.this.remove(returned);
}
}
};
}
@Override
public boolean remove(Widget w) {
// Validate.
if (widget != w) {
return false;
}
// Orphan.
try {
orphan(w);
} finally {
// Physical detach.
getContainerElement().removeChild(w.getElement());
// Logical detach.
widget = null;
}
return true;
}
public void setWidget(IsWidget w) {
setWidget(asWidgetOrNull(w));
}
/**
* Sets this panel's widget. Any existing child widget will be removed.
*
* @param w the panel's new widget, or <code>null</code> to clear the panel
*/
public void setWidget(Widget w) {
// Validate
if (w == widget) {
return;
}
// Detach new child.
if (w != null) {
w.removeFromParent();
}
// Remove old child.
if (widget != null) {
remove(widget);
}
// Logical attach.
widget = w;
if (w != null) {
// Physical attach.
DOM.appendChild(getContainerElement(), widget.getElement());
adopt(w);
}
}
/**
* Override this method to specify that an element other than the root element
* be the container for the panel's child widget. This can be useful when you
* want to create a simple panel that decorates its contents.
*
* Note that this method continues to return the
* {@link com.google.gwt.user.client.Element} class defined in the
* <code>User</code> module to maintain backwards compatibility.
*
* @return the element to be used as the panel's container
*/
protected com.google.gwt.user.client.Element getContainerElement() {
return getElement();
}
}