raimund@1602: package de.intevation.flys.client.client.ui; raimund@1602: raimund@1602: import com.google.gwt.core.client.GWT; raimund@2468: import com.google.gwt.i18n.client.DateTimeFormat; christian@4131: ingo@4115: import com.smartgwt.client.data.Record; raimund@1602: import com.smartgwt.client.types.ListGridFieldType; christian@4131: import com.smartgwt.client.util.SC; ingo@4115: import com.smartgwt.client.widgets.Canvas; ingo@4115: import com.smartgwt.client.widgets.Label; raimund@2468: import com.smartgwt.client.widgets.form.DynamicForm; raimund@2468: import com.smartgwt.client.widgets.form.fields.DateRangeItem; ingo@4115: import com.smartgwt.client.widgets.grid.CellFormatter; raimund@1602: import com.smartgwt.client.widgets.grid.ListGrid; raimund@1602: import com.smartgwt.client.widgets.grid.ListGridField; raimund@1602: import com.smartgwt.client.widgets.grid.ListGridRecord; ingo@4115: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; raimund@1602: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; ingo@4115: import com.smartgwt.client.widgets.layout.HLayout; ingo@4115: import com.smartgwt.client.widgets.layout.VLayout; ingo@4219: import com.smartgwt.client.widgets.tab.Tab; ingo@4219: import com.smartgwt.client.widgets.tab.TabSet; raimund@1602: raimund@1602: import de.intevation.flys.client.client.Config; ingo@4115: import de.intevation.flys.client.client.FLYSConstants; ingo@4115: import de.intevation.flys.client.client.ui.range.DischargeInfoDataSource; ingo@4219: import de.intevation.flys.client.client.widgets.DischargeTablesChart; raimund@1602: import de.intevation.flys.client.shared.model.ArtifactDescription; raimund@1602: import de.intevation.flys.client.shared.model.Data; ingo@4115: import de.intevation.flys.client.shared.model.DataItem; ingo@4115: import de.intevation.flys.client.shared.model.DataList; raimund@2468: import de.intevation.flys.client.shared.model.LongRangeData; ingo@4115: import de.intevation.flys.client.shared.model.RangeData; raimund@1602: christian@4131: import java.util.ArrayList; christian@4131: import java.util.Date; christian@4131: import java.util.List; christian@4131: raimund@1602: /** raimund@1602: * @author Raimund Renkert raimund@1602: */ raimund@2468: public class GaugeTimeRangePanel extends RangePanel { raimund@1602: christian@4131: private static final long serialVersionUID = -157571967010594739L; christian@4131: raimund@1602: /** The message class that provides i18n strings. */ raimund@1602: protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); raimund@1602: raimund@1602: protected ListGrid yearTable; raimund@1602: raimund@2468: protected DateRangeItem dateRange; raimund@2468: ingo@4132: protected Long maxUpper; ingo@4132: protected Long maxLower; ingo@4132: ingo@4132: raimund@1602: public GaugeTimeRangePanel() { raimund@1602: GWT.log("Creating YearInputPanel"); raimund@1602: yearTable = new ListGrid(); raimund@1602: yearTable.setAutoFetchData(true); raimund@1602: yearTable.setShowHeaderContextMenu(false); raimund@1602: } raimund@1602: ingo@4132: protected void setMaxUpper(DataList dataList) { ingo@4132: LongRangeData range = (LongRangeData) dataList.get(0); ingo@4132: setMaxUpper((Long) range.getUpper()); ingo@4132: } ingo@4132: ingo@4132: protected void setMaxUpper(Long maxUpper) { ingo@4132: this.maxUpper = maxUpper; ingo@4132: } ingo@4132: ingo@4132: protected void setMaxLower(DataList dataList) { ingo@4132: LongRangeData range = (LongRangeData) dataList.get(0); ingo@4132: setMaxLower((Long) range.getLower()); ingo@4132: } ingo@4132: ingo@4132: protected void setMaxLower(Long maxLower) { ingo@4132: this.maxLower = maxLower; ingo@4132: } ingo@4132: christian@4184: @Override raimund@1602: public Canvas create(DataList data) { raimund@1602: setDataName(data); raimund@1602: raimund@1602: VLayout root = new VLayout(); raimund@1602: raimund@1602: root.addMember(createLabel(data)); raimund@1602: root.addMember(createForm(data)); raimund@1602: root.addMember(getNextButton()); raimund@1602: raimund@1602: initDefaults(data); raimund@1602: raimund@1602: initYearTable(); raimund@1602: raimund@1602: long gauge = getGaugeNumber(); raimund@1602: raimund@1602: Config config = Config.getInstance(); raimund@1602: String url = config.getServerUrl(); raimund@1602: yearTable.setDataSource(new DischargeInfoDataSource(url, gauge)); raimund@1602: ingo@4219: helperContainer.addMember(createHelperPanel()); ingo@4132: ingo@4132: setMaxUpper(data); ingo@4132: setMaxLower(data); ingo@4132: raimund@1602: return root; raimund@1602: } raimund@1602: raimund@1602: ingo@4219: protected Canvas createHelperPanel() { ingo@4219: TabSet tabs = new TabSet(); ingo@4219: ingo@4219: Tab table = new Tab(MSG.discharge_timeranges()); ingo@4219: Tab chart = new Tab(MSG.discharge_chart()); ingo@4219: ingo@4219: table.setPane(yearTable); ingo@4219: chart.setPane(new DischargeTablesChart(artifact)); ingo@4219: ingo@4219: tabs.addTab(table, 0); ingo@4219: tabs.addTab(chart, 1); ingo@4219: ingo@4219: return tabs; ingo@4219: } ingo@4219: ingo@4219: felix@5390: /** Put defaults in form. */ raimund@2468: @Override raimund@2468: protected void initDefaults(DataList dataList) { raimund@2468: RangeData data = findRangeData(dataList); raimund@2468: felix@5390: if (data != null) { felix@5390: dateRange.setFromDate(new Date((Long)data.getLower())); raimund@2468: } felix@5389: felix@5389: dateRange.setToDate(new Date()); raimund@2468: } raimund@2468: raimund@2468: raimund@2468: @Override raimund@2468: public Canvas createOld(DataList dataList) { raimund@2468: GWT.log("create old date."); christian@4184: Data data = dataList.get(0); raimund@2468: HLayout layout = new HLayout(); raimund@2468: raimund@2468: Label label = new Label(dataList.getLabel()); raimund@2468: label.setWidth(200); raimund@2468: label.setHeight(20); raimund@2468: raimund@2468: Date dl = new Date((Long)((LongRangeData)data).getLower()); raimund@2468: Date du = new Date((Long)((LongRangeData)data).getUpper()); christian@4131: christian@4131: @SuppressWarnings("deprecation") raimund@2468: DateTimeFormat dtf = DateTimeFormat.getMediumDateFormat(); raimund@2468: Label value = new Label(dtf.format(dl) + " - " + dtf.format(du)); raimund@2468: value.setHeight(20); raimund@2468: raimund@2468: layout.addMember(label); raimund@2468: layout.addMember(value); raimund@2468: layout.addMember(getBackButton(dataList.getState())); raimund@2468: raimund@2468: return layout; raimund@2468: } raimund@2468: raimund@2468: raimund@2468: @Override raimund@2468: protected Data[] getData() { raimund@2468: long lo = getLowerAsLong(); raimund@2468: long up = getUpperAsLong(); raimund@2468: raimund@2468: return new Data[] { new LongRangeData(getDataName(), null, lo, up) }; raimund@2468: } raimund@2468: raimund@2468: raimund@2468: @Override raimund@2468: protected Canvas createForm(DataList dataList) { raimund@2468: HLayout layout = new HLayout(); raimund@2468: DynamicForm form = new DynamicForm(); raimund@2468: dateRange = new DateRangeItem(); raimund@2468: dateRange.setToTitle(MESSAGES.to()); raimund@2468: dateRange.setFromTitle(MESSAGES.from()); raimund@2468: dateRange.setShowTitle(false); raimund@2468: form.setFields(dateRange); raimund@2468: raimund@2468: layout.addMember(form); raimund@2468: return layout; raimund@2468: raimund@2468: } raimund@2468: raimund@2468: raimund@2468: @Override raimund@2468: public Object getMaxLower() { ingo@4132: return maxLower; raimund@2468: } raimund@2468: raimund@2468: raimund@2468: protected long getLowerAsLong() { raimund@2468: Date d = dateRange.getFromDate(); raimund@2468: return d.getTime(); raimund@2468: } raimund@2468: raimund@2468: raimund@2468: protected long getUpperAsLong() { raimund@2468: Date d = dateRange.getToDate(); raimund@2468: return d.getTime(); raimund@2468: } raimund@2468: raimund@2468: raimund@2468: @Override raimund@2468: public Object getMaxUpper() { raimund@2468: Date d = dateRange.getToDate(); raimund@2468: return new Long(d.getTime()); raimund@2468: } raimund@2468: raimund@2468: raimund@2468: @Override raimund@2468: public void setLower(String lower) { raimund@2468: try { ingo@4115: long value = Long.valueOf(lower); ingo@4115: dateRange.setFromDate(new Date(value)); raimund@2468: } ingo@4115: catch (NumberFormatException nfe) { raimund@2468: GWT.log("could not parse lower date."); christian@4131: SC.warn(MESSAGES.warning_cannot_parse_date()); raimund@2468: } raimund@2468: } raimund@2468: raimund@2468: raimund@2468: @Override raimund@2468: public void setUpper(String upper) { raimund@2468: try { ingo@4115: long value = Long.valueOf(upper); ingo@4115: dateRange.setToDate(new Date(value)); raimund@2468: } ingo@4115: catch (NumberFormatException nfe) { raimund@2468: GWT.log("could not parse upper date."); christian@4131: SC.warn(MESSAGES.warning_cannot_parse_date()); raimund@2468: } raimund@2468: } raimund@2468: raimund@2468: ingo@4115: protected String buildDateString(String raw) { ingo@4115: if (raw == null || raw.length() == 0) { ingo@4115: return ""; ingo@4115: } ingo@4115: ingo@4115: long value = Long.valueOf(raw); ingo@4115: Date date = new Date(value); christian@4131: @SuppressWarnings("deprecation") ingo@4115: DateTimeFormat dtf = DateTimeFormat.getMediumDateFormat(); ingo@4115: ingo@4115: return dtf.format(date); ingo@4115: } ingo@4115: ingo@4115: raimund@1602: protected ListGrid initYearTable() { raimund@1602: String baseUrl = GWT.getHostPageBaseURL(); raimund@1602: raimund@1602: yearTable.setWidth100(); raimund@1602: yearTable.setHeight100(); raimund@1602: yearTable.setShowRecordComponents(true); raimund@1602: yearTable.setShowRecordComponentsByCell(true); raimund@1602: yearTable.setEmptyMessage(MESSAGES.empty_filter()); raimund@1602: yearTable.setCanReorderFields(false); raimund@1602: raimund@1602: CellFormatter cf = new CellFormatter() { christian@4131: @Override raimund@1602: public String format( raimund@1602: Object value, raimund@1602: ListGridRecord record, ingo@4115: int rowNum, int colNum ingo@4115: ) { ingo@4115: if (value == null) { ingo@4115: return null; ingo@4115: } ingo@4115: else if (value.toString().equals("-1")) { raimund@1602: return ""; raimund@1602: } ingo@4115: else if (colNum == 3 || colNum == 4) { ingo@4115: return buildDateString(value.toString()); ingo@4115: } ingo@4115: else { raimund@1602: return value.toString(); ingo@4115: } ingo@4115: } raimund@1602: }; raimund@1602: raimund@1602: felix@5333: ListGridField addstart = new ListGridField ("", MESSAGES.from()); raimund@1602: addstart.setType (ListGridFieldType.ICON); raimund@1602: addstart.setWidth (20); raimund@1602: addstart.setCellIcon(baseUrl + MESSAGES.markerGreen()); raimund@1602: addstart.addRecordClickHandler(new RecordClickHandler() { christian@4131: @Override raimund@1602: public void onRecordClick(RecordClickEvent e) { raimund@1602: Record r = e.getRecord(); raimund@1602: if (r.getAttribute("start").equals("-1")) { raimund@1602: return; raimund@1602: } raimund@1602: else { raimund@1602: setLower(r.getAttribute("start")); raimund@1602: } raimund@1602: } raimund@1602: }); raimund@1602: felix@5333: ListGridField addend = new ListGridField ("", MESSAGES.to()); raimund@1602: addend.setType (ListGridFieldType.ICON); raimund@1602: addend.setWidth (20); raimund@1602: addend.setCellIcon(baseUrl + MESSAGES.markerRed()); raimund@1602: addend.addRecordClickHandler(new RecordClickHandler() { christian@4131: @Override raimund@1602: public void onRecordClick(RecordClickEvent e) { raimund@1602: Record r = e.getRecord(); raimund@1602: if (r.getAttribute("end").equals("-1")) { raimund@1602: return; raimund@1602: } raimund@1602: else { raimund@1602: setUpper(r.getAttribute("end")); raimund@1602: } raimund@1602: } raimund@1602: }); raimund@1602: raimund@1602: ListGridField desc = felix@5333: new ListGridField("description", MESSAGES.discharge_curve_gaugeless()); raimund@1602: desc.setType(ListGridFieldType.TEXT); raimund@1602: desc.setWidth("*"); raimund@1602: raimund@1602: ListGridField start = raimund@1602: new ListGridField("start", MESSAGES.start_year()); raimund@1602: start.setType(ListGridFieldType.INTEGER); ingo@4115: start.setWidth(100); raimund@1602: start.setCellFormatter(cf); raimund@1602: raimund@1602: ListGridField end = raimund@1602: new ListGridField("end", MESSAGES.end_year()); raimund@1602: end.setType(ListGridFieldType.INTEGER); ingo@4115: end.setWidth(100); raimund@1602: end.setCellFormatter(cf); raimund@1602: raimund@1602: yearTable.setFields(addstart, addend, desc, start, end); raimund@1602: raimund@1602: return yearTable; raimund@1602: } raimund@1602: raimund@1602: raimund@1602: protected long getGaugeNumber() { raimund@1602: ArtifactDescription adescr = artifact.getArtifactDescription(); raimund@1602: DataList[] data = adescr.getOldData(); raimund@1602: raimund@1602: String gauge = ""; raimund@1602: if (data != null && data.length > 0) { raimund@1602: for (int i = 0; i < data.length; i++) { raimund@1602: DataList dl = data[i]; raimund@1602: if (dl.getState().equals("state.winfo.historicalq.reference_gauge")) { raimund@1602: for (int j = 0; j < dl.size(); j++) { raimund@1602: Data d = dl.get(j); raimund@1602: DataItem[] di = d.getItems(); raimund@1602: if (di != null && di.length == 1) { raimund@1602: gauge = d.getItems()[0].getStringValue(); raimund@1602: } raimund@1602: } raimund@1602: } raimund@1602: } raimund@1602: } raimund@1602: try { raimund@1602: return Long.parseLong(gauge); raimund@1602: } raimund@1602: catch (NumberFormatException nfe) { raimund@1602: GWT.log("Error parsing gauge."); raimund@1602: return 0; raimund@1602: } raimund@1602: } raimund@2468: raimund@2468: felix@5388: /** Return List of error messages, if not validated. */ raimund@2468: @Override raimund@2468: public List validate() { raimund@2468: List errors = new ArrayList(); ingo@4132: ingo@4132: Date from = dateRange.getFromDate(); ingo@4132: Date to = dateRange.getToDate(); ingo@4132: ingo@4132: if (from == null || to == null) { raimund@2468: String msg = MSG.error_validate_date_range(); raimund@2468: errors.add(msg); raimund@2468: } ingo@4132: ingo@4132: long maxLow = (Long) getMaxLower(); ingo@4132: long maxUpper = (Long) getMaxUpper(); ingo@4132: long inLow = from.getTime(); ingo@4132: long inUpper = to.getTime(); ingo@4132: ingo@4132: if (inLow < maxLow) { ingo@4132: errors.add(MSG.error_validate_date_range_invalid()); ingo@4132: } ingo@4132: else if (inUpper > maxUpper) { ingo@4132: errors.add(MSG.error_validate_date_range_invalid()); ingo@4132: } ingo@4132: else if (inLow > inUpper) { ingo@4132: errors.add(MSG.error_validate_date_range_invalid()); ingo@4132: } ingo@4132: raimund@2468: return errors; raimund@2468: } raimund@1602: }