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