felix@867: package de.intevation.flys.client.client.ui; felix@867: felix@914: import java.util.ArrayList; felix@1273: import java.util.HashSet; felix@1273: import java.util.List; felix@914: import java.util.Map; felix@914: import java.util.Set; felix@914: felix@867: import com.google.gwt.core.client.GWT; felix@914: import com.google.gwt.user.client.rpc.AsyncCallback; felix@867: felix@867: import com.smartgwt.client.widgets.Canvas; felix@867: import com.smartgwt.client.widgets.Label; felix@867: import com.smartgwt.client.widgets.layout.HLayout; felix@867: import com.smartgwt.client.widgets.layout.VLayout; felix@914: import com.smartgwt.client.widgets.grid.ListGrid; felix@914: import com.smartgwt.client.widgets.grid.ListGridField; felix@914: import com.smartgwt.client.widgets.grid.ListGridRecord; felix@914: import com.smartgwt.client.widgets.events.ClickEvent; felix@867: felix@914: import de.intevation.flys.client.shared.model.Artifact; felix@867: import de.intevation.flys.client.shared.model.Data; felix@867: import de.intevation.flys.client.shared.model.DataItem; felix@867: import de.intevation.flys.client.shared.model.DefaultData; felix@867: import de.intevation.flys.client.shared.model.DefaultDataItem; felix@867: import de.intevation.flys.client.shared.model.DataList; felix@867: import de.intevation.flys.client.shared.model.User; felix@867: felix@867: import de.intevation.flys.client.client.FLYSConstants; felix@914: import de.intevation.flys.client.client.event.StepForwardEvent; felix@914: import de.intevation.flys.client.shared.model.Recommendation; felix@914: import de.intevation.flys.client.shared.model.ToLoad; felix@914: import de.intevation.flys.client.shared.model.Recommendation.Facet; felix@914: import de.intevation.flys.client.shared.model.Recommendation.Filter; felix@914: felix@914: import de.intevation.flys.client.client.services.LoadArtifactService; felix@914: import de.intevation.flys.client.client.services.LoadArtifactServiceAsync; felix@914: import de.intevation.flys.client.client.Config; felix@867: felix@867: // TODO Probably better to branch off AbstractUIProvider. felix@914: // TODO Merge with other datacage-widget impls. felix@914: /** felix@914: * Panel containing a Grid and a "next" button. The Grid is fed by a felix@914: * DatacagePairWidget which is put in the input-helper area. felix@914: */ felix@914: public class DatacageTwinPanel felix@914: extends TextProvider { felix@867: felix@867: protected static FLYSConstants MSG = GWT.create(FLYSConstants.class); felix@867: felix@867: protected String dataName; felix@867: felix@867: protected User user; felix@867: felix@914: protected ToLoad toLoad1; felix@914: felix@914: protected ToLoad toLoad2; felix@914: felix@914: protected ListGrid differencesList; felix@914: felix@914: LoadArtifactServiceAsync loadArtifactService = GWT.create( felix@914: de.intevation.flys.client.client.services.LoadArtifactService.class); felix@914: felix@867: felix@867: public DatacageTwinPanel(User user) { felix@867: super(); felix@867: this.user = user; felix@867: } felix@867: felix@867: felix@1298: /** felix@1298: * Remove first occurrence of "[" and "]" (if both do occur). felix@1298: * @param value String to be stripped of [] (might be null). felix@1298: * @return input string but with [ and ] removed, or input string if no felix@1298: * brackets were found. felix@1298: * @see StringUtil.unbracket felix@1298: */ felix@1298: public static final String unbracket(String value) { felix@1298: // null- guard. felix@1298: if (value == null) return value; felix@1298: felix@1298: int start = value.indexOf("["); felix@1298: int end = value.indexOf("]"); felix@1298: felix@1298: if (start < 0 || end < 0) { felix@1298: return value; felix@1298: } felix@1298: felix@1298: value = value.substring(start + 1, end); felix@1298: felix@1298: return value; felix@1298: } felix@1298: felix@1298: felix@1298: /** felix@1298: * Create a recommendation from a string representation of it. felix@1298: * @TODO describe format of input string felix@1298: * @param from string in format as shown above. felix@1298: * @return recommendation from input string. felix@1298: */ felix@1298: public Recommendation createRecommendationFromString(String from) { felix@1298: // TODO Construct "real" filter. felix@1298: String[] parts = unbracket(from).split(";"); felix@1298: Recommendation.Filter filter = new Recommendation.Filter(); felix@1298: Recommendation.Facet facet = new Recommendation.Facet( felix@1298: parts[1], felix@1298: parts[2]); felix@1298: felix@1298: List facets = new ArrayList felix@1298: (); felix@1298: facets.add(facet); felix@1298: filter.add("longitudinal_section", facets); felix@1298: Recommendation r = new Recommendation("waterlevel", parts[0], felix@1298: this.artifact.getUuid(), filter); felix@1298: return r; felix@1298: } felix@1298: felix@1298: felix@1298: /** felix@1298: * Add RecomendationPairRecords from input String to the ListGrid. felix@1298: */ felix@1298: public void populateGridFromString(String from){ felix@1298: // Split this string. felix@1298: // Create according recommendations and display strings. felix@1298: String[] recs = from.split("#"); felix@1298: // TODO real name felix@1298: if (recs.length % 2 != 0) return; felix@1298: for (int i = 0; i < recs.length; i+=2) { felix@1298: Recommendation minuend = createRecommendationFromString(recs[i+0]); felix@1298: Recommendation subtrahend = createRecommendationFromString(recs[i+1]); felix@1298: RecommendationPairRecord pr = new RecommendationPairRecord( felix@1298: "A", minuend, "B", subtrahend); felix@1304: // This Recommendation Pair comes from the data string and was thus felix@1304: // already cloned. felix@1304: pr.setIsAlreadyLoaded(true); felix@1298: this.differencesList.addData(pr); felix@1298: } felix@1298: } felix@1298: felix@1298: felix@867: @Override felix@867: public Canvas create(DataList dataList) { felix@867: GWT.log("createData()"); felix@867: felix@1266: // TODO use i18n of data. felix@1266: Canvas label = new Label("Subtrahend/Minuend");//data.getDescription()); felix@867: Canvas widget = createWidget(); felix@867: Canvas submit = getNextButton(); felix@867: felix@1273: VLayout layout = new VLayout(); felix@914: HLayout helperLayout = new HLayout(); felix@867: label.setHeight(50); felix@914: helperLayout.addMember(new DatacagePairWidget(this.artifact, felix@914: user, "longitudinal_section", differencesList)); felix@867: felix@867: /*layout.addMember(label);*/ felix@867: layout.addMember(widget); felix@867: layout.addMember(submit); felix@867: layout.setMembersMargin(10); felix@914: this.helperContainer.addMember(helperLayout); felix@867: felix@1298: // Find old data, if any. felix@1298: Data data = dataList.get(0); felix@1298: // "diffids" data handling. felix@1298: this.dataName = data.getLabel(); felix@1298: for (int i = 0; i < dataList.size(); i++) { felix@1298: if (dataList.get(i) != null) { felix@1298: if (dataList.get(i).getItems() != null) { felix@1298: populateGridFromString(dataList.get(i).getItems()[0].getStringValue()); felix@1298: } felix@1298: else{ felix@1298: System.out.println("DatacageTwinPanel: Datalist for item is null"); felix@1298: } felix@1298: } felix@1298: else{ felix@1298: System.out.println("DatacageTwinPanel: Data " + i + " is null (not displayable)."); felix@1298: } felix@1298: } felix@1298: felix@867: return layout; felix@867: } felix@867: felix@867: felix@867: @Override felix@914: public List validate() { felix@914: List errors = new ArrayList(); felix@914: if (differencesList.getRecords().length == 0) { felix@914: // TODO i18n of error message. (MSG.no_waterlevel_pair_selected()) felix@914: errors.add("No pair of waterlevel items selected"); felix@914: } felix@914: felix@914: return errors; felix@914: } felix@914: felix@914: felix@1274: /** felix@1274: * Creates layout with grid that displays selection inside. felix@1274: */ felix@914: public Canvas createWidget() { felix@1274: VLayout layout = new VLayout(); felix@1274: differencesList = new ListGrid(); felix@914: felix@1274: differencesList.setHeight(150); felix@1274: differencesList.setShowAllRecords(true); felix@1274: differencesList.setCanEdit(false); felix@1274: differencesList.setCanRemoveRecords(true); felix@914: felix@1274: ListGridField nameField = new ListGridField("first", "Minuend"); felix@1274: ListGridField capitalField = new ListGridField("second", "Subtrahend"); felix@1266: differencesList.setFields(new ListGridField[] {nameField, felix@1274: capitalField}); felix@914: felix@914: layout.addMember(differencesList); felix@914: felix@914: return layout; felix@914: } felix@914: felix@914: felix@914: @Override felix@914: public void onClick(ClickEvent e) { felix@914: /* felix@914: TODO: Validation/Error felix@914: List errors = validate(); felix@914: if (errors == null || errors.isEmpty()) { felix@914: ... felix@914: else {showErrors(errors);} felix@914: felix@914: * */ felix@914: GWT.log("DatacageTwinPanel.onClick"); felix@914: Config config = Config.getInstance(); felix@914: ListGridRecord[] records = differencesList.getRecords(); felix@1273: felix@1304: Set ar = new HashSet(); felix@1304: Set all = new HashSet(); felix@914: for (ListGridRecord record : records) { felix@1298: RecommendationPairRecord r = felix@1298: (RecommendationPairRecord) record; felix@1304: // Do not add "old" recommendations. felix@1304: if (!r.isAlreadyLoaded()) { felix@1304: GWT.log("One not yet loaded."); felix@1304: ar.add(r.getFirst()); felix@1304: ar.add(r.getSecond()); felix@1304: } felix@1304: else { felix@1304: GWT.log("One already loaded."); felix@1304: all.add(r.getFirst()); felix@1304: all.add(r.getSecond()); felix@1304: } felix@914: } felix@1266: felix@1304: final Recommendation[] toClone = ar.toArray(new Recommendation[ar.size()]); felix@1304: final Recommendation[] toUse = all.toArray(new Recommendation[all.size()]); felix@914: loadArtifactService.loadMany( felix@914: this.collection, felix@1304: toClone, felix@1266: "waterlevel", felix@914: config.getServerUrl(), felix@914: config.getLocale(), felix@914: new AsyncCallback() { felix@914: public void onFailure(Throwable caught) { felix@1266: GWT.log("Failure of cloning with waterlevelfactory!"); felix@914: } felix@914: public void onSuccess(Artifact[] artifacts) { felix@1304: GWT.log("Success in cloning ("+toClone.length+") with watelevelfactory!"); felix@1266: felix@1266: fireStepForwardEvent(new StepForwardEvent( felix@1304: getData(toClone, artifacts, toUse))); felix@1273: } felix@1273: } ); felix@914: } felix@914: felix@914: felix@1304: protected Data[] getData( felix@1304: Recommendation[] newRecommendations, felix@1304: Artifact[] newArtifacts, felix@1304: Recommendation[] oldRecommendations) felix@1304: { felix@914: // Construct string with info about selections. felix@914: String dataItemString = ""; felix@1304: for (int i = 0; i < newRecommendations.length; i++) { felix@1304: Recommendation r = newRecommendations[i]; felix@914: Artifact newArtifact = newArtifacts[i]; felix@914: String uuid = newArtifact.getUuid(); felix@914: r.setMasterArtifact(uuid); felix@914: if (i>0) dataItemString += "#"; felix@914: felix@914: dataItemString += createDataString(uuid, r.getFilter()); felix@914: } felix@1304: felix@1304: for (int i = 0; i < oldRecommendations.length; i++) { felix@1304: Recommendation r = oldRecommendations[i]; felix@1304: String uuid = r.getIDs(); felix@1304: if (dataItemString.length() > 0) dataItemString += "#"; felix@1304: felix@1304: dataItemString += createDataString(uuid, r.getFilter()); felix@1304: } felix@1304: felix@914: DataItem item = new DefaultDataItem(dataName, dataName, dataItemString); felix@914: return new Data[] { new DefaultData( felix@914: dataName, null, null, new DataItem[] {item}) }; felix@914: } felix@914: felix@914: felix@914: protected String createDataString(String artifact, Filter filter) { felix@914: Facet f = null; felix@914: felix@914: Map> outs = filter.getOuts(); felix@914: Set>> entries = outs.entrySet(); felix@914: felix@914: for (Map.Entry> entry: entries) { felix@914: List fs = entry.getValue(); felix@914: felix@914: f = fs.get(0); felix@914: if (f != null) { felix@914: break; felix@914: } felix@914: } felix@914: felix@914: return "[" + artifact + ";" + f.getName() + ";" + f.getIndex() + "]"; felix@914: } felix@914: felix@914: /*@Override felix@867: protected Data[] getData() { felix@914: // TODO ToLoadRecord ! felix@914: String value = "TODO:FIND VALUE"; felix@914: if (toLoad1 != null) { felix@914: List recommendations = toLoad1.toRecommendations(); felix@914: value = recommendations.get(0).getIDs(); felix@914: } felix@914: DataItem item1 = new DefaultDataItem(dataName, dataName, value); felix@914: DataItem item2 = new DefaultDataItem(dataName, dataName, value); felix@867: return new Data[] { new DefaultData( felix@914: dataName, null, null, new DataItem[] { item1, item2}) }; felix@914: }*/ felix@867: } felix@867: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :