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: }