Mercurial > dive4elements > river
view flys-client/src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java @ 861:65204f30877b
Display Action Widget only for cross_section theme/facet.
flys-client/trunk@2663 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Wed, 07 Sep 2011 10:40:56 +0000 |
parents | 9ecd58f619a4 |
children | 439068365cde |
line wrap: on
line source
package de.intevation.flys.client.client.ui; import de.intevation.flys.client.client.event.DatacageHandler; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Button; import com.smartgwt.client.widgets.tree.Tree; import com.smartgwt.client.widgets.tree.TreeGrid; import com.smartgwt.client.widgets.tree.TreeNode; import com.smartgwt.client.types.TreeModelType; import com.smartgwt.client.widgets.layout.VLayout; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent; import com.smartgwt.client.widgets.grid.events.RecordDoubleClickHandler; import de.intevation.flys.client.shared.model.Artifact; import de.intevation.flys.client.shared.model.User; import de.intevation.flys.client.shared.model.ToLoad; import de.intevation.flys.client.client.FLYSConstants; import de.intevation.flys.client.client.Config; import de.intevation.flys.client.client.services.MetaDataService; import de.intevation.flys.client.client.services.MetaDataServiceAsync; import de.intevation.flys.client.shared.model.DataCageTree; import de.intevation.flys.client.shared.model.DataCageNode; import de.intevation.flys.client.shared.model.AttrList; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class DatacageWidget extends VLayout { protected MetaDataServiceAsync metaDataService = GWT.create(MetaDataService.class); protected FLYSConstants messages = GWT.create(FLYSConstants.class); protected Artifact artifact; protected User user; protected String outs; protected TreeGrid treeGrid; protected Tree tree; protected ToLoad toLoad; protected List<DatacageHandler> handlers; public DatacageWidget() { handlers = new ArrayList<DatacageHandler>(); } public DatacageWidget(Artifact artifact, User user) { this(artifact, user, null); } public DatacageWidget(Artifact artifact, User user, String outs) { this(); this.artifact = artifact; this.user = user; this.outs = outs; toLoad = new ToLoad(); setWidth100(); tree = new Tree(); tree.setModelType(TreeModelType.PARENT); tree.setNameProperty("name"); tree.setIdField("id"); tree.setParentIdField("parent-id"); treeGrid = new TreeGrid(); treeGrid.setLoadDataOnDemand(false); treeGrid.setWidth100(); treeGrid.setHeight100(); treeGrid.setShowRoot(false); treeGrid.addRecordDoubleClickHandler(new RecordDoubleClickHandler() { @Override public void onRecordDoubleClick(RecordDoubleClickEvent event) { doubleClickedOnTree(event); } }); addMember(treeGrid); // TODO: i18n + icon Button plusBtn = new Button("+"); plusBtn.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { plusClicked(); } }); addMember(plusBtn); triggerTreeBuilding(); } public void addDatacageHandler(DatacageHandler handler) { if (handlers.contains(handler)) { handlers.add(handler); } } public void removeDatacageHandler(DatacageHandler handler) { handlers.remove(handler); } public ToLoad getToLoad() { return toLoad; } public void plusClicked() { if (treeGrid == null) { return; } ListGridRecord [] selection = treeGrid.getSelection(); if (selection != null) { for (ListGridRecord record: selection) { if (record instanceof TreeNode) { collectToLoads((TreeNode)record); } } } if (!toLoad.isEmpty()) { fireToLoad(); } } protected void fireToLoad() { for (DatacageHandler handler: handlers) { handler.toLoad(toLoad); } } protected void doubleClickedOnTree(RecordDoubleClickEvent event) { TreeNode node = (TreeNode)event.getRecord(); collectToLoads(node); destroy(); } protected void collectToLoads(TreeNode node) { Stack<TreeNode> stack = new Stack<TreeNode>(); stack.push(node); while (!stack.isEmpty()) { node = stack.pop(); String factory = node.getAttribute("factory"); if (factory != null) { // we need at least a factory String artifact = node.getAttribute("artifact-id"); String out = node.getAttribute("out"); String name = node.getName(); String ids = node.getAttribute("ids"); toLoad.add(artifact, factory, out, name, ids); } TreeNode [] children = tree.getChildren(node); if (children != null) { for (TreeNode child: children) { stack.push(child); } } } } protected void triggerTreeBuilding() { Config config = Config.getInstance(); String url = config.getServerUrl(); String locale = config.getLocale(); String artifactId = artifact.getUuid(); String userId = user != null ? user.identifier() : null; metaDataService.getMetaData( url, locale, artifactId, userId, outs, new AsyncCallback<DataCageTree>() { public void onFailure(Throwable caught) { GWT.log("Could not load meta data."); SC.warn(caught.getMessage()); } public void onSuccess(DataCageTree dcTree) { GWT.log("Successfully loaded meta data."); tree.setData(treeToData(dcTree)); treeGrid.setData(tree); } }); } private static class IdGenerator { protected int current; public IdGenerator() { } public IdGenerator(int start) { current = start; } public int next() { return current++; } } // class IdGenerator protected static void buildRecursive( DataCageNode node, int parentId, IdGenerator idGenerator, List<TreeNode> nodes ) { TreeNode tn = new TreeNode(); int id = idGenerator.next(); tn.setAttribute("parent-id", parentId); tn.setAttribute("id", id); // TODO: i18n tn.setAttribute("name", node.getName()); nodes.add(tn); AttrList attrs = node.getAttributes(); if (attrs != null) { for (int i = 0, N = attrs.size(); i < N; ++i) { String key = attrs.getKey(i); String value = attrs.getValue(i); tn.setAttribute(key, value); } } List<DataCageNode> children = node.getChildren(); if (children != null) { for (DataCageNode child: children) { buildRecursive(child, id, idGenerator, nodes); } } } protected static TreeNode [] treeToData(DataCageTree tree) { List<TreeNode> nodes = new ArrayList<TreeNode>(); DataCageNode root = tree.getRoot(); IdGenerator idGenerator = new IdGenerator(); buildRecursive(root, idGenerator.next(), idGenerator, nodes); return nodes.toArray(new TreeNode[nodes.size()]); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :