package org.vaadin.touchkit.gwt.client.ui;
import com.google.gwt.dom.client.Document;
import com.google.gwt.event.dom.client.ScrollEvent;
import com.google.gwt.event.dom.client.ScrollHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.ComplexPanel;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ui.TouchScrollDelegate;
import com.vaadin.client.ui.TouchScrollDelegate.TouchScrollHandler;
public class VNavigationView extends ComplexPanel {
private static final String CLASSNAME = "v-touchkit-navview";
private Element wrapper = Document.get().createDivElement().cast();
private Element toolbarDiv = Document.get().createDivElement().cast();
private VNavigationBar navbar;
private Widget content;
private Widget toolbar;
private boolean hasToolbar;
public VNavigationView() {
setElement(Document.get().createDivElement());
setStyleName(CLASSNAME);
wrapper.setClassName(CLASSNAME + "-wrapper");
getElement().appendChild(wrapper);
toolbarDiv.setClassName(CLASSNAME + "-toolbar");
getElement().appendChild(toolbarDiv);
TouchScrollHandler touchScrollHandler = TouchScrollDelegate
.enableTouchScrolling(this, wrapper);
DOM.sinkEvents(wrapper, Event.ONSCROLL);
}
@Override
public void setStyleName(String style) {
if (!hasToolbar) {
style += " " + CLASSNAME + "-notoolbar";
}
super.setStyleName(style);
}
public void setToolbar(Widget widget) {
hasToolbar = widget != null;
setStyleDependentName("notoolbar", !hasToolbar);
if (hasToolbar) {
if (toolbar != null && toolbar != widget) {
remove(toolbar);
}
toolbar = widget;
if (!toolbar.isAttached()) {
add(toolbar, toolbarDiv);
}
} else if (toolbar != null) {
remove(toolbar);
}
}
public void setContent(Widget widget) {
if (content != null && content != widget) {
remove(content);
}
content = widget;
if (content.getParent() != this) {
add(content, wrapper);
}
}
public void setNavigationBar(VNavigationBar newNavBar) {
if (navbar != newNavBar && navbar != null) {
navbar.removeFromParent();
}
navbar = newNavBar;
if (navbar.getParent() != this) {
insert(navbar, getElement(), 0, true);
}
}
@Override
public boolean remove(Widget w) {
boolean removed = super.remove(w);
if (removed) {
if (content == w) {
content = null;
} else if (toolbar == w) {
toolbar = null;
}
}
return removed;
}
public void replaceChildComponent(Widget oldComponent, Widget newComponent) {
throw new UnsupportedOperationException();
}
public boolean hasChildComponent(Widget component) {
if (component == navbar || component == content || component == toolbar) {
return true;
}
return false;
}
public int getScrollTop() {
return wrapper.getScrollTop();
}
public void setScrollTop(int scrollTop) {
wrapper.setScrollTop(scrollTop);
}
public HandlerRegistration addScrollHandler(ScrollHandler scrollHandler) {
return addHandler(scrollHandler, ScrollEvent.getType());
}
@Override
public void add(Widget child) {
add(child, getElement());
}
public Widget getContent() {
return content;
}
}