sascha@276: package de.intevation.flys.client.client.ui; sascha@276: sascha@276: import com.google.gwt.core.client.GWT; sascha@276: sascha@276: import com.google.gwt.user.client.rpc.AsyncCallback; sascha@276: sascha@276: import com.smartgwt.client.util.SC; sascha@276: sascha@276: import com.smartgwt.client.widgets.Window; sascha@822: import com.smartgwt.client.widgets.Button; sascha@276: sascha@278: import com.smartgwt.client.widgets.tree.Tree; sascha@278: import com.smartgwt.client.widgets.tree.TreeGrid; sascha@821: import com.smartgwt.client.widgets.tree.TreeNode; sascha@821: sascha@821: import com.smartgwt.client.types.TreeModelType; sascha@278: sascha@278: import com.smartgwt.client.widgets.layout.Layout; sascha@278: import com.smartgwt.client.widgets.layout.VLayout; sascha@276: sascha@822: import com.smartgwt.client.widgets.events.ClickHandler; sascha@822: import com.smartgwt.client.widgets.events.ClickEvent; sascha@822: sascha@822: import com.smartgwt.client.widgets.grid.ListGridRecord; sascha@822: sascha@822: import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent; sascha@822: import com.smartgwt.client.widgets.grid.events.RecordDoubleClickHandler; sascha@816: sascha@276: import de.intevation.flys.client.shared.model.Artifact; sascha@276: import de.intevation.flys.client.shared.model.ArtifactDescription; sascha@276: import de.intevation.flys.client.shared.model.Data; sascha@276: import de.intevation.flys.client.shared.model.DataList; sascha@276: import de.intevation.flys.client.shared.model.DataItem; sascha@811: import de.intevation.flys.client.shared.model.User; sascha@822: import de.intevation.flys.client.shared.model.ToLoad; sascha@276: sascha@276: import de.intevation.flys.client.client.FLYSConstants; sascha@276: import de.intevation.flys.client.client.Config; sascha@276: sascha@276: import de.intevation.flys.client.client.services.MetaDataService; sascha@276: import de.intevation.flys.client.client.services.MetaDataServiceAsync; sascha@276: sascha@278: import de.intevation.flys.client.shared.model.DataCageTree; sascha@278: import de.intevation.flys.client.shared.model.DataCageNode; sascha@816: import de.intevation.flys.client.shared.model.AttrList; sascha@276: sascha@821: import java.util.ArrayList; sascha@821: import java.util.List; sascha@822: import java.util.Stack; sascha@814: sascha@276: public class DatacageWindow sascha@276: extends Window sascha@276: { sascha@276: protected MetaDataServiceAsync metaDataService = sascha@276: GWT.create(MetaDataService.class); sascha@276: sascha@276: protected FLYSConstants messages = sascha@276: GWT.create(FLYSConstants.class); sascha@276: sascha@276: sascha@276: protected Artifact artifact; sascha@811: protected User user; sascha@276: sascha@278: protected TreeGrid treeGrid; sascha@821: protected Tree tree; sascha@278: sascha@278: protected Layout layout; sascha@278: sascha@822: protected List toLoad; sascha@822: sascha@278: sascha@811: public DatacageWindow(Artifact artifact, User user) { sascha@276: this.artifact = artifact; sascha@811: this.user = user; sascha@278: sascha@822: setWidth(300); sascha@822: setHeight(500); sascha@278: sascha@278: layout = new VLayout(); sascha@278: layout.setWidth100(); sascha@278: sascha@278: addItem(layout); sascha@278: sascha@821: tree = new Tree(); sascha@821: tree.setModelType(TreeModelType.PARENT); sascha@821: tree.setNameProperty("name"); sascha@821: tree.setIdField("id"); sascha@821: tree.setParentIdField("parent-id"); sascha@821: sascha@615: treeGrid = new TreeGrid(); sascha@615: treeGrid.setLoadDataOnDemand(false); sascha@615: treeGrid.setWidth100(); sascha@278: treeGrid.setHeight100(); sascha@821: treeGrid.setShowRoot(false); sascha@821: sascha@822: treeGrid.addRecordDoubleClickHandler(new RecordDoubleClickHandler() { sascha@821: @Override sascha@822: public void onRecordDoubleClick(RecordDoubleClickEvent event) { sascha@822: doubleClickedOnTree(event); sascha@821: } sascha@821: }); sascha@278: sascha@278: layout.addMember(treeGrid); sascha@278: sascha@822: // TODO: i18n + icon sascha@822: Button plusBtn = new Button("+"); sascha@822: plusBtn.addClickHandler(new ClickHandler() { sascha@822: @Override sascha@822: public void onClick(ClickEvent event) { sascha@822: plusClicked(); sascha@822: } sascha@822: }); sascha@822: sascha@822: layout.addMember(plusBtn); sascha@822: sascha@276: String river = findRiver(); sascha@811: // TODO: i18n sascha@615: setTitle("Datenkorb: " + river); sascha@615: setShowMinimizeButton(false); sascha@615: setIsModal(true); sascha@615: setShowModalMask(true); sascha@278: setCanDragResize(true); sascha@278: sascha@276: centerInPage(); sascha@276: sascha@822: toLoad = new ArrayList(); sascha@822: sascha@811: triggerTreeBuilding(); sascha@276: } sascha@276: sascha@822: public List toLoad() { sascha@822: return toLoad; sascha@822: } sascha@822: sascha@822: public void plusClicked() { sascha@822: if (treeGrid == null) { sascha@822: return; sascha@822: } sascha@822: sascha@822: ListGridRecord [] selection = treeGrid.getSelection(); sascha@822: sascha@822: if (selection != null) { sascha@822: for (ListGridRecord record: selection) { sascha@822: if (record instanceof TreeNode) { sascha@822: collectToLoads((TreeNode)record); sascha@822: } sascha@822: } sascha@822: } sascha@822: sascha@822: GWT.log(toLoad.toString()); sascha@822: sascha@822: if (!toLoad.isEmpty()) { sascha@822: destroy(); sascha@822: } sascha@822: } sascha@822: sascha@822: protected void doubleClickedOnTree(RecordDoubleClickEvent event) { sascha@822: sascha@822: TreeNode node = (TreeNode)event.getRecord(); sascha@822: collectToLoads(node); sascha@822: GWT.log(toLoad.toString()); sascha@822: destroy(); sascha@822: } sascha@822: sascha@822: protected void collectToLoads(TreeNode node) { sascha@822: Stack stack = new Stack(); sascha@822: sascha@822: stack.push(node); sascha@822: sascha@822: while (!stack.isEmpty()) { sascha@822: node = stack.pop(); sascha@822: String factory = node.getAttribute("factory"); sascha@822: if (factory != null) { // we need at least a factory sascha@822: String ids = node.getAttribute("ids"); sascha@822: String artifactId = node.getAttribute("artifact-id"); sascha@822: String num = node.getAttribute("num"); sascha@822: sascha@822: ToLoad tl = new ToLoad(factory, artifactId, ids, num); sascha@822: if (!toLoad.contains(tl)) { sascha@822: toLoad.add(tl); sascha@822: } sascha@822: } sascha@822: TreeNode [] children = tree.getChildren(node); sascha@822: if (children != null) { sascha@822: for (TreeNode child: children) { sascha@822: stack.push(child); sascha@822: } sascha@822: } sascha@822: } sascha@822: } sascha@822: sascha@822: sascha@811: protected void triggerTreeBuilding() { sascha@276: Config config = Config.getInstance(); sascha@276: String url = config.getServerUrl(); sascha@276: String locale = config.getLocale(); sascha@276: sascha@811: String artifactId = artifact.getUuid(); sascha@811: String userId = user != null ? user.identifier() : null; sascha@811: sascha@276: metaDataService.getMetaData( sascha@811: url, locale, sascha@811: artifactId, sascha@811: userId, sascha@278: new AsyncCallback() { sascha@276: public void onFailure(Throwable caught) { sascha@276: GWT.log("Could not load meta data."); sascha@812: SC.warn(caught.getMessage()); sascha@276: } sascha@276: sascha@821: public void onSuccess(DataCageTree dcTree) { sascha@278: GWT.log("Successfully loaded meta data."); sascha@821: tree.setData(treeToData(dcTree)); sascha@821: treeGrid.setData(tree); sascha@276: } sascha@276: }); sascha@276: } sascha@276: sascha@821: private static class IdGenerator { sascha@821: protected int current; sascha@278: sascha@821: public IdGenerator() { sascha@821: } sascha@278: sascha@821: public IdGenerator(int start) { sascha@821: current = start; sascha@821: } sascha@278: sascha@821: public int next() { sascha@821: return current++; sascha@821: } sascha@821: } // class IdGenerator sascha@821: sascha@821: protected static void buildRecursive( sascha@821: DataCageNode node, sascha@821: int parentId, sascha@821: IdGenerator idGenerator, sascha@821: List nodes sascha@821: ) { sascha@821: TreeNode tn = new TreeNode(); sascha@821: int id = idGenerator.next(); sascha@821: tn.setAttribute("parent-id", parentId); sascha@821: tn.setAttribute("id", id); sascha@821: // TODO: i18n sascha@821: tn.setAttribute("name", node.getName()); sascha@821: nodes.add(tn); sascha@821: AttrList attrs = node.getAttributes(); sascha@821: if (attrs != null) { sascha@821: for (int i = 0, N = attrs.size(); i < N; ++i) { sascha@821: String key = attrs.getKey(i); sascha@821: String value = attrs.getValue(i); sascha@821: tn.setAttribute(key, value); sascha@278: } sascha@278: } sascha@821: List children = node.getChildren(); sascha@821: if (children != null) { sascha@821: for (DataCageNode child: children) { sascha@821: buildRecursive(child, id, idGenerator, nodes); sascha@821: } sascha@278: } sascha@278: } sascha@278: sascha@821: sascha@821: protected static TreeNode [] treeToData(DataCageTree tree) { sascha@821: List nodes = new ArrayList(); sascha@821: sascha@278: DataCageNode root = tree.getRoot(); sascha@278: sascha@821: IdGenerator idGenerator = new IdGenerator(); sascha@278: sascha@821: buildRecursive(root, idGenerator.next(), idGenerator, nodes); sascha@278: sascha@821: return nodes.toArray(new TreeNode[nodes.size()]); sascha@278: } sascha@278: sascha@276: protected String findRiver() { sascha@276: sascha@276: ArtifactDescription adescr = artifact.getArtifactDescription(); sascha@276: DataList [] data = adescr.getOldData(); sascha@276: sascha@276: if (data != null && data.length > 0) { sascha@276: for (int i = 0; i < data.length; i++) { sascha@276: DataList dl = data[i]; sascha@276: if (dl.getState().equals("state.winfo.river")) { sascha@276: for (int j = dl.size()-1; j >= 0; --j) { sascha@276: Data d = dl.get(j); sascha@276: DataItem [] di = d.getItems(); sascha@276: if (di != null && di.length == 1) { sascha@276: return d.getItems()[0].getStringValue(); sascha@276: } sascha@276: } sascha@276: } sascha@276: } sascha@276: } sascha@276: sascha@276: return ""; sascha@276: } sascha@276: } sascha@276: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :