package org.iplantc.phyloviewer.viewer.client;
import java.util.HashSet;
import java.util.Set;
import org.iplantc.phyloviewer.client.events.RenderEvent;
import org.iplantc.phyloviewer.shared.layout.LayoutStorage;
import org.iplantc.phyloviewer.shared.model.Document;
import org.iplantc.phyloviewer.shared.model.INode;
import org.iplantc.phyloviewer.shared.model.Tree;
import org.iplantc.phyloviewer.viewer.client.model.RemoteNode;
import org.iplantc.phyloviewer.viewer.client.services.CombinedServiceAsync;
import org.iplantc.phyloviewer.viewer.client.services.CombinedService.CombinedResponse;
import org.iplantc.phyloviewer.viewer.client.services.CombinedService.LayoutResponse;
import org.iplantc.phyloviewer.viewer.client.services.CombinedService.NodeResponse;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class PagedDocument extends Document
{
LayoutStorage remoteLayout = new LayoutStorage();
CombinedServiceAsync combinedService;
EventBus eventBus;
Set<Integer> pendingRequests = new HashSet<Integer>();
public PagedDocument(CombinedServiceAsync combinedService, EventBus eventBus, int treeId,
NodeResponse nodeData)
{
super();
this.combinedService = combinedService;
this.eventBus = eventBus;
Tree tree = new Tree();
tree.setId(treeId);
tree.setRootNode(nodeData.node);
this.setTree(tree);
int numberOfNodes = nodeData.node.getNumberOfNodes();
remoteLayout.init(numberOfNodes);
remoteLayout.setPositionAndBounds(nodeData.layout.nodeID, nodeData.layout.position,
nodeData.layout.boundingBox);
this.setLayout(remoteLayout);
}
@Override
public boolean checkForData(final INode node)
{
// Return now if we are waiting for a response from the server.
if(pendingRequests.contains(node.getId()))
{
return false;
}
final LayoutStorage rLayout = remoteLayout;
if(node instanceof RemoteNode)
{
final RemoteNode rNode = (RemoteNode)node;
if(rNode.getChildren() == null)
{
pendingRequests.add(rNode.getId());
combinedService.getChildrenAndLayout(rNode.getId(),
new AsyncCallback<CombinedResponse>()
{
@Override
public void onFailure(Throwable arg0)
{
pendingRequests.remove(rNode.getId());
}
@Override
public void onSuccess(CombinedResponse response)
{
pendingRequests.remove(rNode.getId());
rNode.setChildren(response.nodes);
for(LayoutResponse layoutResponse : response.layouts)
{
rLayout.setPositionAndBounds(layoutResponse.nodeID,
layoutResponse.position, layoutResponse.boundingBox);
}
if(eventBus != null)
{
eventBus.fireEvent(new RenderEvent());
}
}
});
return false;
}
}
return true;
}
}