teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui.minfo; rrenkert@4223: rrenkert@4223: import java.util.ArrayList; rrenkert@4223: import java.util.List; rrenkert@4223: rrenkert@4223: import com.google.gwt.core.client.GWT; andre@8532: import com.google.gwt.i18n.client.NumberFormat; rrenkert@4299: import com.google.gwt.user.client.rpc.AsyncCallback; andre@8532: import com.smartgwt.client.data.Record; rrenkert@4299: import com.smartgwt.client.types.ListGridFieldType; rrenkert@4299: import com.smartgwt.client.util.SC; rrenkert@4223: import com.smartgwt.client.widgets.Canvas; rrenkert@4223: import com.smartgwt.client.widgets.Label; rrenkert@4223: import com.smartgwt.client.widgets.form.DynamicForm; rrenkert@4223: import com.smartgwt.client.widgets.form.fields.TextItem; rrenkert@4223: import com.smartgwt.client.widgets.form.validator.IsIntegerValidator; rrenkert@4299: import com.smartgwt.client.widgets.grid.ListGrid; rrenkert@4299: import com.smartgwt.client.widgets.grid.ListGridField; rrenkert@4223: import com.smartgwt.client.widgets.layout.HLayout; rrenkert@4223: import com.smartgwt.client.widgets.layout.VLayout; andre@8532: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; andre@8532: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; rrenkert@4223: teichmann@5835: import org.dive4elements.river.client.client.Config; andre@8532: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.services.SedimentLoadInfoService; teichmann@5835: import org.dive4elements.river.client.client.services.SedimentLoadInfoServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.ui.AbstractUIProvider; teichmann@5835: import org.dive4elements.river.client.shared.model.ArtifactDescription; teichmann@5835: import org.dive4elements.river.client.shared.model.Data; teichmann@5835: import org.dive4elements.river.client.shared.model.DataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DataList; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultData; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultDataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.SedimentLoadInfoObject; teichmann@5835: import org.dive4elements.river.client.shared.model.SedimentLoadInfoRecord; rrenkert@4223: rrenkert@4223: rrenkert@4223: public class SedLoadPeriodPanel rrenkert@4223: extends AbstractUIProvider rrenkert@4223: { rrenkert@4299: protected SedimentLoadInfoServiceAsync sedLoadInfoService = rrenkert@4299: GWT.create(SedimentLoadInfoService.class); rrenkert@4223: andre@8532: protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); andre@8532: andre@8532: private TextItem yearsItem; rrenkert@4223: rrenkert@4299: private ListGrid sedLoadTable; rrenkert@4299: andre@8532: protected List validYears; andre@8532: rrenkert@4223: public SedLoadPeriodPanel () { rrenkert@4223: } rrenkert@4223: rrenkert@4223: @Override rrenkert@4223: public Canvas createOld(DataList dataList) { rrenkert@4223: List items = dataList.getAll(); andre@8532: Data years = getData(items, "years"); andre@8532: DataItem[] yearsItems = years.getItems(); rrenkert@4223: andre@8532: String v1 = yearsItems[0].getStringValue().replace(" ", ", "); andre@8532: andre@8532: Label old = new Label(v1); rrenkert@4223: HLayout layout = new HLayout(); rrenkert@4223: layout.setWidth("400px"); rrenkert@4223: rrenkert@4223: Label label = new Label(dataList.getLabel()); rrenkert@4223: label.setWidth("200px"); rrenkert@4223: rrenkert@4223: Canvas back = getBackButton(dataList.getState()); rrenkert@4223: rrenkert@4223: layout.addMember(label); rrenkert@4223: layout.addMember(old); rrenkert@4223: layout.addMember(back); rrenkert@4223: rrenkert@4223: return layout; rrenkert@4223: } rrenkert@4223: rrenkert@4223: @Override andre@8532: public List validate() { andre@8532: return validateYears(); andre@8532: } andre@8532: andre@8532: @Override rrenkert@4223: public Canvas create(DataList data) { rrenkert@4223: VLayout layout = new VLayout(); rrenkert@4223: rrenkert@4299: Canvas helper = createHelper(); rrenkert@4299: this.helperContainer.addMember(helper); rrenkert@4223: rrenkert@4223: Canvas submit = getNextButton(); rrenkert@4223: Canvas widget = createWidget(data); rrenkert@4223: rrenkert@4223: layout.addMember(widget); rrenkert@4223: layout.addMember(submit); rrenkert@4299: rrenkert@4299: fetchSedimentLoadData(); rrenkert@4299: rrenkert@4223: return layout; rrenkert@4223: } rrenkert@4223: rrenkert@4299: private Canvas createHelper() { rrenkert@4299: sedLoadTable = new ListGrid(); rrenkert@4299: sedLoadTable.setShowHeaderContextMenu(false); rrenkert@4299: sedLoadTable.setWidth100(); rrenkert@4299: sedLoadTable.setShowRecordComponents(true); rrenkert@4299: sedLoadTable.setShowRecordComponentsByCell(true); rrenkert@4299: sedLoadTable.setHeight100(); rrenkert@4299: sedLoadTable.setEmptyMessage(MSG.empty_table()); rrenkert@4299: sedLoadTable.setCanReorderFields(false); rrenkert@4299: rrenkert@4299: ListGridField date = new ListGridField("date", MSG.year()); rrenkert@4299: date.setType(ListGridFieldType.TEXT); rrenkert@4299: date.setWidth(100); rrenkert@4299: rrenkert@4299: ListGridField descr = rrenkert@4299: new ListGridField("description", MSG.description()); rrenkert@4299: descr.setType(ListGridFieldType.TEXT); rrenkert@4299: descr.setWidth("*"); rrenkert@4299: andre@8532: String baseUrl = GWT.getHostPageBaseURL(); tom@8856: ListGridField pinFrom = new ListGridField( tom@8856: "fromIcon", MESSAGES.selection()); andre@8532: pinFrom.setWidth (60); andre@8532: pinFrom.setType (ListGridFieldType.ICON); andre@8532: pinFrom.setCellIcon(baseUrl + MESSAGES.markerGreen()); andre@8532: andre@8532: pinFrom.addRecordClickHandler (new RecordClickHandler () { andre@8532: @Override andre@8532: public void onRecordClick (RecordClickEvent e) { andre@8532: Record r = e.getRecord(); andre@8532: appendYear(r.getAttribute("date")); andre@8532: } andre@8532: }); andre@8532: andre@8532: sedLoadTable.setFields(pinFrom, date, descr); rrenkert@4299: return sedLoadTable; rrenkert@4299: } rrenkert@4299: rrenkert@4223: public Canvas createWidget(DataList data) { rrenkert@4223: VLayout layout = new VLayout(); rrenkert@4223: rrenkert@4223: Label title = new Label(data.get(0).getDescription()); rrenkert@4223: title.setHeight("25px"); rrenkert@4223: rrenkert@4223: DynamicForm form = new DynamicForm(); rrenkert@4223: form.setNumCols(4); andre@8532: yearsItem = new TextItem(MSG.years()); andre@8532: yearsItem.setValidators(new IsIntegerValidator()); andre@8532: form.setFields(yearsItem); rrenkert@4223: rrenkert@4223: layout.addMember(title); rrenkert@4223: layout.addMember(form); rrenkert@4223: rrenkert@4223: return layout; rrenkert@4223: } rrenkert@4223: rrenkert@4223: @Override rrenkert@4223: protected Data[] getData() { andre@8532: validateYears(); andre@8532: if (yearsItem != null && !yearsItem.getValueAsString().isEmpty()) { rrenkert@4223: List data = new ArrayList(); rrenkert@4223: tom@8856: DataItem yearsdata = new DefaultDataItem( tom@8856: "years", "years", yearsItem.getValueAsString().trim()); rrenkert@4223: data.add(new DefaultData( andre@8532: "years", rrenkert@4223: null, rrenkert@4223: null, andre@8532: new DataItem[] { yearsdata })); rrenkert@4223: rrenkert@4223: return data.toArray(new Data[data.size()]); rrenkert@4223: } rrenkert@4223: return new Data[0]; rrenkert@4223: } rrenkert@4223: andre@8532: protected List validateYears() { andre@8532: List errors = new ArrayList(); andre@8532: NumberFormat nf = NumberFormat.getDecimalFormat(); andre@8532: andre@8532: if (yearsItem.getValueAsString() == null || andre@8532: yearsItem.getValueAsString().trim().isEmpty()) { andre@8532: errors.add(MESSAGES.empty_filter()); andre@8532: return errors; rrenkert@4223: } andre@8532: andre@8532: String [] sValues = yearsItem.getValueAsString().trim().split(" "); andre@8532: String filtered = ""; andre@8532: int goodValues = 0; andre@8532: for (String sValue: sValues) { andre@8532: int value; andre@8532: try { andre@8532: value = Integer.parseInt(sValue); andre@8532: } catch (NumberFormatException e) { andre@8599: errors.add(MESSAGES.wrongFormat() + ": " + sValue); andre@8532: continue; andre@8532: } andre@8532: boolean isGood = false; andre@8532: for (String validYear: validYears) { andre@8532: /* No list contains for strings? */ andre@8532: if (sValue.equals(validYear)) { andre@8532: isGood = true; andre@8532: break; andre@8532: } andre@8532: } andre@8532: if (!isGood) { andre@8532: String tmp = MESSAGES.no_data_for_year(); andre@8532: tmp = tmp.replace("$1", sValue); andre@8532: errors.add(tmp); andre@8532: continue; andre@8532: } andre@8532: goodValues++; andre@8532: if (goodValues > 1) { andre@8532: filtered += " " + Integer.toString(value); andre@8532: } else { andre@8532: filtered = Integer.toString(value); andre@8532: } andre@8532: } andre@8532: andre@8532: return errors; rrenkert@4223: } rrenkert@4223: rrenkert@4299: protected void fetchSedimentLoadData() { rrenkert@4299: Config config = Config.getInstance(); rrenkert@4299: String locale = config.getLocale (); rrenkert@4299: rrenkert@4299: ArtifactDescription adescr = artifact.getArtifactDescription(); rrenkert@4299: DataList[] data = adescr.getOldData(); rrenkert@4299: rrenkert@4299: double[] km = artifact.getArtifactDescription().getKMRange(); rrenkert@4299: String river = artifact.getArtifactDescription().getRiver(); rrenkert@4299: andre@8230: String sq_ti_id = ""; andre@8532: validYears = new ArrayList(data.length); andre@8235: for (int i = 0; i < data.length; i++) { andre@8235: Data str = getData(data[i].getAll(), "sq_ti_id"); andre@8230: if (str != null) { andre@8230: DataItem[] strItems = str.getItems(); andre@8230: sq_ti_id = strItems[0].getStringValue(); andre@8235: break; andre@8230: } andre@8230: } andre@8230: andre@8235: if (sq_ti_id.isEmpty()){ andre@8235: GWT.log("Failed to find sq time interval id in data."); andre@8235: } andre@8235: tom@8856: sedLoadInfoService.getSedimentLoadInfo( tom@8856: locale, river, "single", km[0], km[1], sq_ti_id, rrenkert@4299: new AsyncCallback() { rrenkert@4299: public void onFailure(Throwable caught) { rrenkert@4299: GWT.log("Could not recieve sediment load informations."); andre@8712: SC.warn(MSG.getString(caught.getMessage())); rrenkert@4299: } rrenkert@4299: rrenkert@4299: public void onSuccess(SedimentLoadInfoObject[] sedLoad) { rrenkert@4299: int num = sedLoad != null ? sedLoad.length :0; rrenkert@4299: GWT.log("Recieved " + num + " sediment load informations."); rrenkert@4299: rrenkert@4299: if (num == 0) { rrenkert@4299: return; rrenkert@4299: } rrenkert@4299: rrenkert@4299: addSedimentLoadInfo(sedLoad); rrenkert@4299: } rrenkert@4299: } rrenkert@4299: ); rrenkert@4299: } rrenkert@4299: rrenkert@4299: rrenkert@4299: protected void addSedimentLoadInfo (SedimentLoadInfoObject[] sedLoad) { rrenkert@4299: for(SedimentLoadInfoObject sl: sedLoad) { rrenkert@4299: SedimentLoadInfoRecord rec = new SedimentLoadInfoRecord(sl); rrenkert@4299: sedLoadTable.addData(rec); andre@8532: validYears.add(rec.getDate()); rrenkert@4299: } rrenkert@4299: } rrenkert@4223: andre@8532: protected void appendYear (String year) { andre@8532: String oldYears = yearsItem.getValueAsString(); andre@8532: if (oldYears != null && !oldYears.isEmpty()) { andre@8532: yearsItem.setValue(oldYears.trim() + " " + year); andre@8532: } else { andre@8532: yearsItem.setValue(year); andre@8532: } andre@8532: } rrenkert@4223: }