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:
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:
raimund@2468: @Override
raimund@2468: protected void initDefaults(DataList dataList) {
raimund@2468: RangeData data = findRangeData(dataList);
raimund@2468:
raimund@2468: if(data != null) {
raimund@2468: GWT.log("data: " + data);
raimund@2468: }
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:
raimund@1602: ListGridField addstart = new ListGridField ("", "");
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:
raimund@1602: ListGridField addend = new ListGridField ("", "");
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 =
raimund@1602: new ListGridField("description", MESSAGES.description());
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:
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: }