package org.vaadin.touchkit.gwt.client.vcom.navigation;
import org.vaadin.touchkit.gwt.client.ui.VNavigationManager;
import org.vaadin.touchkit.gwt.client.ui.VNavigationManager.AnimationListener;
import org.vaadin.touchkit.ui.NavigationManager;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ConnectorHierarchyChangeEvent;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractComponentContainerConnector;
import com.vaadin.client.ui.layout.ElementResizeEvent;
import com.vaadin.client.ui.layout.ElementResizeListener;
import com.vaadin.shared.ui.Connect;
@Connect(NavigationManager.class)
public class NavigationManagerConnector extends
AbstractComponentContainerConnector implements AnimationListener {
@Override
protected Widget createWidget() {
VNavigationManager widget = GWT.create(VNavigationManager.class);
widget.addAnimationListener(this);
return widget;
}
@Override
public void onStateChanged(StateChangeEvent stateChangeEvent) {
super.onStateChanged(stateChangeEvent);
updateWidgets();
}
@Override
public void onConnectorHierarchyChange(ConnectorHierarchyChangeEvent event) {
// No need to do anything here as all hierarchy changes are already
// handled by #onStateChanged
}
private void updateWidgets() {
if (getParent() == null) {
// Component is removed, skip stuff to save user from JS exceptions
// and some milliseconds of lost life
return;
}
Widget current = ((ComponentConnector) getState().getCurrentComponent())
.getWidget();
getWidget().setCurrentWidget(current);
Widget previous = null;
if (getState().getPreviousComponent() != null) {
previous = ((ComponentConnector) getState().getPreviousComponent())
.getWidget();
}
Widget next = null;
if (getState().getNextComponent() != null) {
next = ((ComponentConnector) getState().getNextComponent())
.getWidget();
}
getWidget().setPreviousWidget(previous);
getWidget().setNextWidget(next);
}
@Override
public NavigationManagerSharedState getState() {
return (NavigationManagerSharedState) super.getState();
}
@Override
public VNavigationManager getWidget() {
return (VNavigationManager) super.getWidget();
}
@Override
public void updateCaption(ComponentConnector connector) {
// TODO Auto-generated method stub
}
private final ElementResizeListener listener = new ElementResizeListener() {
@Override
public void onElementResize(ElementResizeEvent e) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
getWidget().resetPositionsAndChildSizes();
}
});
}
};
@Override
protected void init() {
super.init();
getLayoutManager().addElementResizeListener(getWidget().getElement(),
listener);
}
@Override
public void onUnregister() {
super.onUnregister();
getLayoutManager().removeElementResizeListener(
getWidget().getElement(), listener);
}
@Override
public void animationWillStart() {
getConnection().getMessageHandler().suspendReponseHandling(this);
}
@Override
public void animationDidEnd() {
getConnection().getMessageHandler().resumeResponseHandling(this);
}
}