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