package org.tessell.gwt.dom.client;
import static org.tessell.util.StringUtils.join;
import java.util.*;
import org.tessell.widgets.StubWidget;
import com.google.gwt.dom.client.Element;
import com.google.gwt.safehtml.shared.SafeHtml;
public class StubElement implements IsElement {
private String innerText = "";
private String innerHTML = "";
private StubWidget widget;
private int scrollTop;
private int scrollLeft;
private final ArrayList<String> styleNames = new ArrayList<String>();
private final ArrayList<StubElement> children = new ArrayList<StubElement>();
private final Map<String, String> attributes = new HashMap<String, String>();
private final StubStyle style = new StubStyle();
public StubElement parent;
public int offsetHeight;
public int offsetWidth;
public int offsetTop;
public int offsetLeft;
public int clientHeight;
public int clientWidth;
public int scrollHeight;
public int scrollWidth;
public boolean wasRemovedFromParent;
public boolean wasScrolledIntoView;
@Override
public String getInnerText() {
return innerText;
}
@Override
public void setInnerText(final String innerText) {
this.innerText = innerText == null ? "" : innerText;
innerHTML = "";
}
@Override
public void addStyleName(final String styleName) {
if (styleName == null || "".equals(styleName)) {
throw new RuntimeException("styleName must not be empty");
}
if (!styleNames.contains(styleName)) {
styleNames.add(styleName);
}
}
@Override
public void removeStyleName(final String styleName) {
styleNames.remove(styleName);
}
public List<String> getStyleNames() {
return styleNames;
}
@Override
public StubStyle getStyle() {
return style;
}
@Override
public String getInnerHTML() {
return innerHTML;
}
@Override
public void setInnerHTML(final String html) {
innerHTML = html == null ? "" : html;
innerText = "";
}
@Override
public void ensureDebugId(final String id) {
// don't bother with a gwt-debug prefix for stubs
setId(id);
}
@Override
public String toString() {
return getId();
}
@Override
public String getStyleName() {
return join(styleNames, " ");
}
@Override
public void setStyleName(String styleName) {
styleNames.clear();
styleNames.addAll(Arrays.asList(styleName.split(" ")));
}
@Override
public String getText() {
return getInnerText();
}
@Override
public void setText(final String text) {
setInnerText(text);
}
@Override
public String getAttribute(final String name) {
return attributes.get(name);
}
@Override
public void setAttribute(final String name, final String value) {
attributes.put(name, value);
}
@Override
public int getOffsetTop() {
return offsetTop;
}
@Override
public int getOffsetLeft() {
return offsetLeft;
}
@Override
public int getOffsetHeight() {
return offsetHeight;
}
@Override
public int getOffsetWidth() {
return offsetWidth;
}
@Override
public String getId() {
return getAttribute("id");
}
@Override
public void setId(final String id) {
setAttribute("id", id);
}
@Override
public Element asElement() {
throw new IllegalStateException("This is a stub");
}
@Override
public void insertFirst(IsElement element) {
children.add(0, (StubElement) element);
setParent(element, this);
}
@Override
public void appendChild(IsElement element) {
children.add((StubElement) element);
setParent(element, this);
}
public ArrayList<StubElement> getChildren() {
return children;
}
public StubWidget getWidget() {
return widget;
}
public void setWidget(StubWidget owner) {
widget = owner;
}
@Override
public int getClientHeight() {
return clientHeight;
}
@Override
public int getClientWidth() {
return clientWidth;
}
@Override
public int getScrollTop() {
return scrollTop;
}
@Override
public void setScrollTop(int scrollTop) {
this.scrollTop = scrollTop;
}
@Override
public int getScrollLeft() {
return scrollLeft;
}
@Override
public void setScrollLeft(int scrollLeft) {
this.scrollLeft = scrollLeft;
}
@Override
public int getScrollHeight() {
return scrollHeight;
}
@Override
public int getScrollWidth() {
return scrollWidth;
}
@Override
public void removeFromParent() {
if (parent != null) {
// removeChild will unset our parent
parent.removeChild(this);
}
wasRemovedFromParent = true;
}
@Override
public void setInnerSafeHtml(SafeHtml html) {
setInnerHTML(html.asString());
}
@Override
public void scrollIntoView() {
wasScrolledIntoView = true;
}
@Override
public void removeChild(IsElement element) {
children.remove(element);
setParent(element, null);
}
@Override
public void removeAllChildren() {
for (Iterator<StubElement> i = children.iterator(); i.hasNext();) {
setParent(i.next(), null);
i.remove();
}
}
@Override
public int getChildCount() {
return children.size();
}
@Override
public IsElement getParentElement() {
return parent;
}
private static void setParent(IsElement element, IsElement parent) {
((StubElement) element).parent = (StubElement) parent;
}
}