bjoern@4956: package de.intevation.flys.client.client.ui.stationinfo; bjoern@4956: bjoern@4956: import java.util.ArrayList; bjoern@4956: import java.util.List; bjoern@4956: bjoern@4956: import com.google.gwt.core.client.GWT; bjoern@4956: import com.google.gwt.event.dom.client.ClickEvent; bjoern@4956: import com.google.gwt.event.dom.client.ClickHandler; bjoern@4956: import com.google.gwt.i18n.client.NumberFormat; bjoern@4956: import com.google.gwt.user.client.ui.Anchor; bjoern@4956: import com.google.gwt.user.client.ui.Grid; bjoern@4956: import com.smartgwt.client.types.ListGridFieldType; bjoern@4956: import com.smartgwt.client.widgets.Canvas; bjoern@4956: import com.smartgwt.client.widgets.Label; bjoern@4956: import com.smartgwt.client.widgets.WidgetCanvas; bjoern@4956: import com.smartgwt.client.widgets.grid.ListGridField; bjoern@4956: import com.smartgwt.client.widgets.grid.ListGridRecord; bjoern@4960: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; bjoern@4960: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; bjoern@4956: import com.smartgwt.client.widgets.layout.HLayout; bjoern@4957: import com.smartgwt.client.widgets.layout.VLayout; bjoern@4956: bjoern@4956: import de.intevation.flys.client.client.FLYS; bjoern@4956: import de.intevation.flys.client.shared.model.Data; bjoern@4956: import de.intevation.flys.client.shared.model.DataItem; bjoern@4956: import de.intevation.flys.client.shared.model.DataList; bjoern@4956: import de.intevation.flys.client.shared.model.GaugeInfo; bjoern@4956: import de.intevation.flys.client.shared.model.RiverInfo; bjoern@4956: bjoern@4956: bjoern@4956: /** bjoern@4956: * @author Björn Ricks bjoern@4956: */ bjoern@4960: public class GaugeListGrid extends InfoListGrid implements RecordClickHandler { bjoern@4956: bjoern@4956: public GaugeListGrid(FLYS flys) { bjoern@4956: super(flys); bjoern@4956: ListGridField nfield = new ListGridField("name", "Pegel"); bjoern@4956: ListGridField sfield = new ListGridField("kmstart", "Start [km]", 60); bjoern@4956: ListGridField efield = new ListGridField("kmend", "Ende [km]", 60); bjoern@4956: ListGridField stfield = new ListGridField("station", "Station [km]"); bjoern@4959: ListGridField lfield = new ListGridField("link", "Info"); bjoern@4956: lfield.setType(ListGridFieldType.LINK); bjoern@4959: ListGridField cfield = new ListGridField("curvelink", "Link"); bjoern@4959: cfield.addRecordClickHandler(this); bjoern@4956: bjoern@4959: this.setFields(nfield, sfield, efield, stfield, lfield, cfield); bjoern@4956: } bjoern@4956: bjoern@4956: public void setRiverInfo(RiverInfo riverinfo) { bjoern@4956: List gauges = riverinfo.getGauges(); bjoern@4956: bjoern@4956: if (gauges != null && !gauges.isEmpty()) { bjoern@4956: bjoern@4956: ArrayList emptygauges = new ArrayList(); bjoern@4956: bjoern@4956: if (!riverinfo.isKmUp()) { bjoern@4956: for (GaugeInfo gauge : gauges) { bjoern@4956: addGauge(gauge, emptygauges); bjoern@4956: } bjoern@4956: } bjoern@4956: else { bjoern@4956: for (int i = gauges.size()-1; i >= 0; i--) { bjoern@4956: GaugeInfo gauge = gauges.get(i); bjoern@4956: addGauge(gauge, emptygauges); bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: // put empty gauges to the end bjoern@4956: for (GaugeInfo gauge : emptygauges) { bjoern@4956: addGauge(gauge); bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: private void addGauge(GaugeInfo gauge, List empty) { bjoern@4956: if (gauge.getKmStart() != null && gauge.getKmEnd() != null) { bjoern@4956: addGauge(gauge); bjoern@4956: } bjoern@4956: else { bjoern@4956: empty.add(gauge); bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: private void addGauge(GaugeInfo gauge) { bjoern@4956: this.addData(new GaugeRecord(gauge)); bjoern@4956: } bjoern@4956: bjoern@4956: bjoern@4956: class GaugeInfoHead extends HLayout { bjoern@4956: bjoern@4956: public GaugeInfoHead(FLYS flys, GaugeInfo gauge) { bjoern@4956: setStyleName("gaugeinfohead"); bjoern@4956: setAutoHeight(); bjoern@4956: setAutoWidth(); bjoern@4956: bjoern@4956: NumberFormat nf = NumberFormat.getDecimalFormat(); bjoern@4956: bjoern@4956: Label label = new Label(gauge.getName()); bjoern@4956: addMember(label); bjoern@4956: bjoern@4956: Double start; bjoern@4956: Double end; bjoern@4956: bjoern@4956: if (!gauge.isKmUp()) { bjoern@4956: start = gauge.getKmStart(); bjoern@4956: end = gauge.getKmEnd(); bjoern@4956: } bjoern@4956: else { bjoern@4956: start = gauge.getKmEnd(); bjoern@4956: end = gauge.getKmStart(); bjoern@4956: } bjoern@4956: bjoern@4956: String kmtext = ""; bjoern@4956: if (start != null) { bjoern@4956: kmtext += nf.format(start); bjoern@4956: kmtext += " - "; bjoern@4956: } bjoern@4956: if (end != null) { bjoern@4956: kmtext += nf.format(end); bjoern@4956: } bjoern@4956: if (start != null || end != null) { bjoern@4956: kmtext += " km"; bjoern@4956: } bjoern@4956: bjoern@4956: label = new Label(kmtext); bjoern@4956: bjoern@4956: addMember(label); bjoern@4956: bjoern@4956: Double station = gauge.getStation(); bjoern@4956: if (station != null) { bjoern@4956: String stext = nf.format(station); bjoern@4956: stext += " km"; bjoern@4956: label = new Label(stext); bjoern@4956: addMember(label); bjoern@4956: } bjoern@4956: bjoern@4956: Long number = gauge.getOfficialNumber(); bjoern@4956: String url = number != null ? bjoern@4956: MSG.gauge_url() + number : bjoern@4956: MSG.gauge_url(); bjoern@4956: Anchor anchor = new Anchor(MSG.gauge_info_link(), url, "_blank"); bjoern@4956: addMember(anchor); bjoern@4956: bjoern@4956: addMember(new GaugeCurveAnchor(flys, gauge)); bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: class GaugeCurveAnchor extends Anchor implements ClickHandler { bjoern@4956: bjoern@4956: private FLYS flys; bjoern@4956: private GaugeInfo gauge; bjoern@4956: bjoern@4956: public GaugeCurveAnchor(FLYS flys, GaugeInfo gauge) { bjoern@4956: super(MSG.gauge_curve_link()); bjoern@4956: this.flys = flys; bjoern@4956: this.gauge = gauge; bjoern@4956: bjoern@4956: addClickHandler(this); bjoern@4956: } bjoern@4956: bjoern@4956: @Override bjoern@4956: public void onClick(ClickEvent ev) { bjoern@4956: GWT.log("GaugeCurveAnchor - onClick " + gauge.getRiverName() + bjoern@4956: " " + gauge.getOfficialNumber()); bjoern@4956: flys.newGaugeDischargeCurve(gauge.getRiverName(), bjoern@4956: gauge.getOfficialNumber()); bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4957: class GaugeInfoPanel extends VLayout { bjoern@4956: bjoern@4956: public GaugeInfoPanel(GaugeInfo gauge) { bjoern@4956: setStyleName("gaugeinfopanel"); bjoern@4957: setWidth100(); bjoern@4957: bjoern@4956: Grid grid = new Grid(4, 2); bjoern@4956: bjoern@4956: NumberFormat nf = NumberFormat.getDecimalFormat(); bjoern@4956: bjoern@4956: Double minw = gauge.getMinW(); bjoern@4956: Double maxw = gauge.getMaxW(); bjoern@4956: if (minw != null && maxw != null) { bjoern@4956: grid.setText(0, 0, MSG.wq_value_q()); bjoern@4956: grid.setText(0, 1, nf.format(minw) + bjoern@4956: " - " + nf.format(maxw)); bjoern@4956: } bjoern@4956: bjoern@4956: Double minq = gauge.getMinQ(); bjoern@4956: Double maxq = gauge.getMaxQ(); bjoern@4956: if (minq != null && maxq != null) { bjoern@4956: grid.setText(1, 0, MSG.wq_value_w()); bjoern@4956: grid.setText(1, 1, nf.format(minq) + bjoern@4956: " - " + nf.format(maxq)); bjoern@4956: } bjoern@4956: bjoern@4956: Double aeo = gauge.getAeo(); bjoern@4956: if (aeo != null) { bjoern@4956: grid.setText(2, 0, "AEO [km²]"); bjoern@4956: grid.setText(2, 1, nf.format(aeo)); bjoern@4956: } bjoern@4956: bjoern@4956: Double datum = gauge.getDatum(); bjoern@4956: if (datum != null) { bjoern@4956: grid.setText(3, 0, MSG.gauge_zero() + " [" + bjoern@4956: gauge.getWstUnit() + "]"); bjoern@4956: grid.setText(3, 1, nf.format(datum)); bjoern@4956: } bjoern@4956: bjoern@4957: addMember(grid); bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: public void open() { bjoern@4956: ArrayList locations = new ArrayList(); bjoern@4956: bjoern@4956: if (data != null && data.length > 0) { bjoern@4956: for (int i = 0; i < data.length; i++) { bjoern@4956: DataList dl = data[i]; bjoern@4956: String state = dl.getState(); bjoern@4956: GWT.log("GaugeListGrid - open " + state); bjoern@4956: if (state.equals("state.winfo.location_distance")) { bjoern@4956: Double ldfrom = null; bjoern@4956: Double ldto = null; bjoern@4956: bjoern@4956: for (int j = dl.size()-1; j >= 0; --j) { bjoern@4956: Data d = dl.get(j); bjoern@4956: String label = d.getLabel(); bjoern@4956: GWT.log("GaugeListGrid - setData - label " + label + " " + d.getStringValue()); bjoern@4956: if (label.equals("ld_from")) { bjoern@4956: ldfrom = getDoubleValue(d); bjoern@4956: } bjoern@4956: else if (label.equals("ld_to")) { bjoern@4956: ldto = getDoubleValue(d); bjoern@4956: } bjoern@4956: else if (label.equals("ld_locations")) { bjoern@4956: getLocationsFromData(locations, d); bjoern@4956: openOnLocations(locations); bjoern@4956: return; bjoern@4956: } bjoern@4956: } bjoern@4956: if (ldfrom != null) { bjoern@4956: openOnDistance(ldfrom, ldto); bjoern@4956: return; bjoern@4956: } bjoern@4956: } bjoern@4956: else if(state.equals("state.winfo.distance_only") || bjoern@4956: state.equals("state.winfo.distance")) { bjoern@4956: Double ldfrom = null; bjoern@4956: Double ldto = null; bjoern@4956: bjoern@4956: for (int j = dl.size()-1; j >= 0; --j) { bjoern@4956: Data d = dl.get(j); bjoern@4956: String label = d.getLabel(); bjoern@4956: GWT.log("GaugeListGrid - setData - label " + label + " " + d.getStringValue()); bjoern@4956: if (label.equals("ld_from")) { bjoern@4956: ldfrom = getDoubleValue(d); bjoern@4956: } bjoern@4956: else if (label.equals("ld_to")) { bjoern@4956: ldto = getDoubleValue(d); bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: if (ldfrom != null) { bjoern@4956: openOnDistance(ldfrom, ldto); bjoern@4956: return; bjoern@4956: } bjoern@4956: } bjoern@4956: else if (state.equals("state.winfo.location")) { bjoern@4956: getLocations("ld_locations", locations, dl); bjoern@4956: openOnLocations(locations); bjoern@4956: return; bjoern@4956: } bjoern@4956: else if (state.equals("state.winfo.reference.curve.input.start")) { bjoern@4956: getLocations("reference_startpoint", locations, dl); bjoern@4956: } bjoern@4956: else if (state.equals("state.winfo.reference.curve.input.end")) { bjoern@4956: getLocations("reference_endpoint", locations, dl); bjoern@4956: } bjoern@4956: else if (state.equals("state.winfo.historicalq.reference_gauge")) { bjoern@4956: for (int j = dl.size()-1; j >= 0; --j) { bjoern@4956: Data d = dl.get(j); bjoern@4956: String label = d.getLabel(); bjoern@4956: if (label.equals("reference_gauge")) { bjoern@4956: String tmp = d.getStringValue(); bjoern@4956: if (tmp != null) { bjoern@4956: Long gaugereference = Long.valueOf(tmp); bjoern@4956: if (gaugereference != null) { bjoern@4956: openOnReference(gaugereference); bjoern@4956: return; bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: if (!locations.isEmpty()) { bjoern@4956: openOnLocations(locations); bjoern@4956: } bjoern@4956: else { bjoern@4956: openAll(); bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: void getLocations(String labelname, List locations, DataList dl) { bjoern@4956: for (int j = dl.size()-1; j >= 0; --j) { bjoern@4956: Data d = dl.get(j); bjoern@4956: String label = d.getLabel(); bjoern@4956: if (label.equals(labelname)) { bjoern@4956: getLocationsFromData(locations, d); bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: void getLocationsFromData(List locations, Data data) { bjoern@4956: DataItem[] items = data.getItems(); bjoern@4956: for (int k = 0; k < items.length; k++) { bjoern@4956: String tmp = items[k].getStringValue(); bjoern@4956: GWT.log("GaugeListGrid - getLocationsFromData " + tmp); bjoern@4956: if (tmp != null) { bjoern@4956: if (tmp.contains(" ")) { bjoern@4956: // string contains several values ... bjoern@4956: String[] values = tmp.split(" "); bjoern@4956: for(int i=0; i < values.length; i++) { bjoern@4956: Double value = Double.valueOf(values[i]); bjoern@4956: if (value != null) { bjoern@4956: locations.add(value); bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: else { bjoern@4956: Double value = Double.valueOf(tmp); bjoern@4956: if (value != null) { bjoern@4956: locations.add(value); bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: public void openOnReference(Long number) { bjoern@4956: GWT.log("GaugeListGrid - openOnReference " + number); bjoern@4956: for (ListGridRecord record: this.getRecords()) { bjoern@4956: GaugeRecord item = (GaugeRecord)record; bjoern@4956: if (item.getOfficialNumber().equals(number)) { bjoern@4956: expandRecord(item); bjoern@4956: } bjoern@4956: else { bjoern@4956: collapseRecord(item); bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: public void openOnDistance(Double start, Double end) { bjoern@4956: GWT.log("GaugeListGrid - openOnDistance " + start + " " + end); bjoern@4956: bjoern@4956: for (ListGridRecord record: this.getRecords()) { bjoern@4956: GaugeRecord item = (GaugeRecord)record; bjoern@4956: if (end == null && item.getKmStart() != null) { bjoern@4956: if (item.getKmStart() >= start) { bjoern@4956: expandRecord(item); bjoern@4956: } bjoern@4956: else { bjoern@4956: collapseRecord(item); bjoern@4956: } bjoern@4956: } bjoern@4956: else if (item.getKmStart() != null && item.getKmEnd() != null) { bjoern@4956: // as getStart()/getEnd() return Double objects, they can be null and bjoern@4956: // can cause NPEs when comparing with double... strange... bjoern@4956: GWT.log("GaugeListGrid - openOnDistance item " + item.getKmStart() + " " + item.getKmEnd()); bjoern@4956: if ((start >= item.getKmStart() && start <= item.getKmEnd()) || bjoern@4956: (end >= item.getKmStart() && end <= item.getKmEnd()) || bjoern@4956: (start <= item.getKmStart() && end >= item.getKmEnd())) { bjoern@4956: expandRecord(item); bjoern@4956: } bjoern@4956: else { bjoern@4956: collapseRecord(item); bjoern@4956: } bjoern@4956: } bjoern@4956: else { bjoern@4956: collapseRecord(item); bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: /** bjoern@4956: * Open Gauge entry if a location fits to the gauge bjoern@4956: */ bjoern@4956: public void openOnLocations(List locations) { bjoern@4956: GWT.log("GaugeListGrid - openOnLocations " + locations); bjoern@4956: bjoern@4956: if (locations == null || locations.isEmpty()) { bjoern@4956: return; bjoern@4956: } bjoern@4956: bjoern@4956: for (ListGridRecord record: this.getRecords()) { bjoern@4956: GaugeRecord item = (GaugeRecord)record; bjoern@4956: boolean isset = false; bjoern@4956: for (Double location: locations) { bjoern@4956: if (locations == null) { bjoern@4956: continue; bjoern@4956: } bjoern@4956: bjoern@4956: Double start = item.getKmStart(); bjoern@4956: Double end = item.getKmEnd(); bjoern@4956: if (start == null || end == null) { bjoern@4956: // should not occur but avoid NullPointerException bjoern@4956: continue; bjoern@4956: } bjoern@4956: bjoern@4956: if (location >= start && location <= end) { bjoern@4956: isset = true; bjoern@4956: break; bjoern@4956: } bjoern@4956: } bjoern@4956: if (isset) { bjoern@4956: expandRecord(item); bjoern@4956: } bjoern@4956: else { bjoern@4956: collapseRecord(item); bjoern@4956: } bjoern@4956: } bjoern@4956: } bjoern@4956: bjoern@4956: @Override bjoern@4956: protected Canvas getExpandPanel(ListGridRecord record) { bjoern@4956: GaugeRecord item = (GaugeRecord)record; bjoern@4956: return new WidgetCanvas(new GaugeInfoPanel(item)); bjoern@4956: } bjoern@4960: bjoern@4960: @Override bjoern@4960: public void onRecordClick(RecordClickEvent event) { bjoern@4960: GaugeRecord gauge = (GaugeRecord)event.getRecord(); bjoern@4960: flys.newGaugeDischargeCurve(gauge.getRiverName(), bjoern@4960: gauge.getOfficialNumber()); bjoern@4960: } bjoern@4956: }