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.smartgwt.client.types.ListGridFieldType; bjoern@4956: import com.smartgwt.client.widgets.Canvas; 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: 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@4961: private static final int ABFLUSSTAFEL_COLUMN = 6; bjoern@4961: bjoern@4956: public GaugeListGrid(FLYS flys) { bjoern@4956: super(flys); rrenkert@5816: //TODO i18n!!! 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); rrenkert@5816: ListGridField cfield = new ListGridField("curvelink", MSG.gauge_curve_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: 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: /** felix@4980: * 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; felix@4981: return new WidgetCanvas(new GaugeInfoPanel(item, flys)); 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@4961: bjoern@4961: @Override bjoern@4961: public String getCellCSSText(ListGridRecord record, int rowNum, bjoern@4961: int colNum) { bjoern@4961: if (colNum == ABFLUSSTAFEL_COLUMN) { bjoern@4961: // display the ablfusstafel cell like a link bjoern@4961: return "text-decoration: underline; color: #0000EE; cursor: pointer;"; bjoern@4961: } bjoern@4961: else { bjoern@4961: return super.getCellCSSText(record, rowNum, colNum); bjoern@4961: } bjoern@4961: } bjoern@4956: }