bjoern@3842: package de.intevation.flys.client.client.ui;
bjoern@3842:
bjoern@3842: import com.google.gwt.core.client.GWT;
bjoern@3865: import com.google.gwt.event.dom.client.ClickEvent;
bjoern@3865: import com.google.gwt.event.dom.client.ClickHandler;
bjoern@3842: import com.google.gwt.i18n.client.NumberFormat;
bjoern@3842: import com.google.gwt.user.client.ui.Anchor;
bjoern@3842: import com.google.gwt.user.client.ui.DecoratorPanel;
bjoern@3842: import com.google.gwt.user.client.ui.Grid;
bjoern@3842: import com.google.gwt.user.client.ui.Label;
bjoern@3842: import com.google.gwt.user.client.ui.Tree;
bjoern@3842: import com.google.gwt.user.client.ui.TreeItem;
bjoern@3842:
bjoern@3842: import com.smartgwt.client.widgets.layout.HLayout;
bjoern@3842:
bjoern@3865: import de.intevation.flys.client.client.FLYS;
bjoern@3842: import de.intevation.flys.client.shared.model.Data;
bjoern@3842: import de.intevation.flys.client.shared.model.DataItem;
bjoern@3842: import de.intevation.flys.client.shared.model.DataList;
bjoern@3842: import de.intevation.flys.client.shared.model.GaugeInfo;
bjoern@3842: import de.intevation.flys.client.shared.model.RiverInfo;
bjoern@3842:
christian@4129: import java.util.ArrayList;
christian@4129: import java.util.Iterator;
christian@4129: import java.util.List;
christian@4129:
bjoern@4268: /**
bjoern@4268: * @author Björn Ricks
bjoern@4268: */
bjoern@4268: public class GaugeTree extends InfoTree {
bjoern@3842:
bjoern@3865: public GaugeTree(FLYS flys) {
bjoern@3865: this.flys = flys;
bjoern@3842: tree = new Tree();
bjoern@3842: setWidget(tree);
bjoern@3842: }
bjoern@3842:
bjoern@3842: /**
bjoern@3842: * Resets the items of the tree.
bjoern@3842: * If the list of gauges is empty or null the tree will be empty.
bjoern@3842: */
bjoern@4268: @Override
bjoern@4268: public void setRiverInfo(RiverInfo riverinfo) {
bjoern@3842: tree.clear();
bjoern@3842:
bjoern@3842: List gauges = riverinfo.getGauges();
bjoern@3842:
bjoern@3842: if (gauges != null && !gauges.isEmpty()) {
bjoern@3842:
bjoern@3842: ArrayList emptygauges = new ArrayList();
bjoern@3842:
bjoern@3842: if (!riverinfo.isKmUp()) {
bjoern@3842: for (GaugeInfo gauge : gauges) {
bjoern@3842: addGauge(gauge, emptygauges);
bjoern@3842: }
bjoern@3842: }
bjoern@3842: else {
bjoern@3842: for (int i = gauges.size()-1; i >= 0; i--) {
bjoern@3842: GaugeInfo gauge = gauges.get(i);
bjoern@3842: addGauge(gauge, emptygauges);
bjoern@3842: }
bjoern@3842: }
bjoern@3842:
bjoern@3842: // put empty gauges to the end
bjoern@3842: for (GaugeInfo gauge : emptygauges) {
bjoern@3842: addGauge(gauge);
bjoern@3842: }
bjoern@3842:
bjoern@3842: open();
bjoern@3842: }
bjoern@3842: }
bjoern@3842:
bjoern@3842: private void addGauge(GaugeInfo gauge, List empty) {
bjoern@3842: if (gauge.getKmStart() != null && gauge.getKmEnd() != null) {
bjoern@3842: addGauge(gauge);
bjoern@3842: }
bjoern@3842: else {
bjoern@3842: empty.add(gauge);
bjoern@3842: }
bjoern@3842: }
bjoern@3842:
bjoern@3842: private void addGauge(GaugeInfo gauge) {
bjoern@3865: GaugeInfoItem gaugeitem = new GaugeInfoItem(flys, gauge);
bjoern@3842: tree.addItem(gaugeitem);
bjoern@3842: }
bjoern@3842:
bjoern@4268: void getLocations(String labelname, List locations, DataList dl) {
bjoern@3842: for (int j = dl.size()-1; j >= 0; --j) {
bjoern@3842: Data d = dl.get(j);
bjoern@3842: String label = d.getLabel();
bjoern@3842: if (label.equals(labelname)) {
bjoern@3842: getLocationsFromData(locations, d);
bjoern@3842: }
bjoern@3842: }
bjoern@3842: }
bjoern@3842:
bjoern@4268: void getLocationsFromData(List locations, Data data) {
bjoern@3842: DataItem[] items = data.getItems();
bjoern@3842: for (int k = 0; k < items.length; k++) {
bjoern@3842: String tmp = items[k].getStringValue();
bjoern@3842: GWT.log("GaugeTree - getLocationsFromData " + tmp);
bjoern@3842: if (tmp != null) {
bjoern@3842: if (tmp.contains(" ")) {
bjoern@3842: // string contains several values ...
bjoern@3842: String[] values = tmp.split(" ");
bjoern@3842: for(int i=0; i < values.length; i++) {
bjoern@3842: Double value = Double.valueOf(values[i]);
bjoern@3842: if (value != null) {
bjoern@3842: locations.add(value);
bjoern@3842: }
bjoern@3842: }
bjoern@3842: }
bjoern@3842: else {
bjoern@3842: Double value = Double.valueOf(tmp);
bjoern@3842: if (value != null) {
bjoern@3842: locations.add(value);
bjoern@3842: }
bjoern@3842: }
bjoern@3842: }
bjoern@3842: }
bjoern@3842: }
bjoern@3842:
bjoern@3844: public void openOnReference(Long number) {
bjoern@3844: GWT.log("GaugeTree - openOnReference " + number);
bjoern@3844: for (Iterator it = tree.treeItemIterator(); it.hasNext();) {
bjoern@3844: TreeItem item = it.next();
bjoern@3844: if (item instanceof GaugeInfoItem) {
bjoern@3844: GaugeInfoItem gitem = (GaugeInfoItem)item;
bjoern@3844: if (gitem.getReference().equals(number)) {
bjoern@3844: item.setState(true);
bjoern@3844: }
bjoern@3844: else {
bjoern@3844: item.setState(false);
bjoern@3844: }
bjoern@3844: }
bjoern@3844: }
bjoern@3844: }
bjoern@3844:
bjoern@3842: public void openOnDistance(Double start, Double end) {
bjoern@3842: GWT.log("GaugeTree - openOnDistance " + start + " " + end + " " +
bjoern@3842: tree.getItemCount());
bjoern@3842:
bjoern@3842: for (Iterator it = tree.treeItemIterator(); it.hasNext();) {
bjoern@3842: TreeItem item = it.next();
bjoern@3842: /* Strange stuff is happening here:
bjoern@3842: * GWT Tree.treeItemIterator returns another TreeItem for each
bjoern@3842: * GaugeInfoItem */
bjoern@3842: if (item instanceof GaugeInfoItem) {
bjoern@3842: boolean setstate = false;
bjoern@3842: GaugeInfoItem gitem = (GaugeInfoItem)item;
bjoern@4154: if (end == null && gitem.getStart() != null) {
bjoern@3842: if (gitem.getStart() >= start) {
bjoern@3842: setstate = true;
bjoern@3842: }
bjoern@3842: }
bjoern@3842: else {
christian@4129: // as getStart()/getEnd() return Double objects, they can be null and
christian@4129: // can cause NPEs when comparing with double... strange...
christian@4129: if (gitem.getStart() != null && gitem.getEnd() != null) {
christian@4129: GWT.log("GaugeTree - openOnDistance gitem " + gitem.getStart() + " " + gitem.getEnd());
christian@4129: if ((start >= gitem.getStart() && start <= gitem.getEnd()) ||
christian@4129: (end >= gitem.getStart() && end <= gitem.getEnd()) ||
christian@4129: (start <= gitem.getStart() && end >= gitem.getEnd())) {
christian@4129: setstate = true;
christian@4129: }
christian@4129: }
bjoern@3842: }
bjoern@3842: item.setState(setstate);
bjoern@3842: }
bjoern@3842: }
bjoern@3842: }
bjoern@3842:
bjoern@4153: /**
bjoern@4153: * Open Gauge entry if a location fits to the gauge
bjoern@4153: */
bjoern@3842: public void openOnLocations(List locations) {
bjoern@3842: GWT.log("GaugeTree - openOnLocations " + locations + " " +
bjoern@3842: tree.getItemCount());
bjoern@3842:
bjoern@3842: if (locations == null || locations.isEmpty()) {
bjoern@3842: return;
bjoern@3842: }
bjoern@3842:
bjoern@3842: for (Iterator it = tree.treeItemIterator(); it.hasNext();) {
bjoern@3842: TreeItem item = it.next();
bjoern@3842: if (item instanceof GaugeInfoItem) {
bjoern@3842: GaugeInfoItem gitem = (GaugeInfoItem)item;
bjoern@3842: boolean isset = false;
bjoern@3842: for (Double location: locations) {
bjoern@3842: if (locations == null) {
bjoern@3842: continue;
bjoern@3842: }
bjoern@4153:
bjoern@4153: Double start = gitem.getStart();
bjoern@4153: Double end = gitem.getEnd();
bjoern@4153: if (start == null || end == null) {
bjoern@4153: // should not occur but avoid NullPointerException
bjoern@4153: continue;
bjoern@4153: }
bjoern@4153:
bjoern@4153: if (location >= start && location <= end) {
bjoern@3842: isset = true;
bjoern@3842: break;
bjoern@4153: }
bjoern@3842: }
bjoern@3842: item.setState(isset);
bjoern@3842: }
bjoern@3842: }
bjoern@3842: }
bjoern@3842:
bjoern@3842: class GaugeInfoItem extends TreeItem {
bjoern@3842:
bjoern@3842: private GaugeInfo gauge;
bjoern@3842:
bjoern@3865: public GaugeInfoItem(FLYS flys, GaugeInfo gauge) {
bjoern@3865: GaugeInfoHead gaugeinfohead = new GaugeInfoHead(flys, gauge);
bjoern@3842: GaugeInfoPanel gaugeinfopanel = new GaugeInfoPanel(gauge);
bjoern@3842: setWidget(gaugeinfohead);
bjoern@3842: addItem(gaugeinfopanel);
bjoern@3842: this.gauge = gauge;
bjoern@3842: }
bjoern@3842:
bjoern@3842: public Double getStart() {
bjoern@3842: return gauge.getKmStart();
bjoern@3842: }
bjoern@3842:
bjoern@3842: public Double getEnd() {
bjoern@3842: return gauge.getKmEnd();
bjoern@3842: }
bjoern@3844:
bjoern@3844: public Long getReference() {
bjoern@3844: return gauge.getOfficialNumber();
bjoern@3844: }
bjoern@3842: }
bjoern@3842:
bjoern@3842: class GaugeInfoHead extends HLayout {
bjoern@3842:
bjoern@3865: public GaugeInfoHead(FLYS flys, GaugeInfo gauge) {
bjoern@3842: setStyleName("gaugeinfohead");
bjoern@3842: setAutoHeight();
bjoern@3842: setAutoWidth();
bjoern@3842:
bjoern@3842: NumberFormat nf = NumberFormat.getDecimalFormat();
bjoern@3842:
bjoern@3842: Label label = new Label(gauge.getName(), true);
bjoern@3842: addMember(label);
bjoern@3842:
bjoern@3842: Double start;
bjoern@3842: Double end;
bjoern@3842:
bjoern@3842: if (!gauge.isKmUp()) {
bjoern@3842: start = gauge.getKmStart();
bjoern@3842: end = gauge.getKmEnd();
bjoern@3842: }
bjoern@3842: else {
bjoern@3842: start = gauge.getKmEnd();
bjoern@3842: end = gauge.getKmStart();
bjoern@3842: }
bjoern@3842:
bjoern@3842: String kmtext = "";
bjoern@3842: if (start != null) {
bjoern@3842: kmtext += nf.format(start);
bjoern@3842: kmtext += " - ";
bjoern@3842: }
bjoern@3842: if (end != null) {
bjoern@3842: kmtext += nf.format(end);
bjoern@3842: }
bjoern@3842: if (start != null || end != null) {
bjoern@3842: kmtext += " km";
bjoern@3842: }
bjoern@3842:
bjoern@3842: label = new Label(kmtext);
bjoern@3842:
bjoern@3842: addMember(label);
bjoern@3842:
bjoern@3842: Double station = gauge.getStation();
bjoern@3842: if (station != null) {
bjoern@3842: String stext = nf.format(station);
bjoern@3842: stext += " km";
bjoern@3842: label = new Label(stext);
bjoern@3842: addMember(label);
bjoern@3842: }
bjoern@3842:
bjoern@3847: Long number = gauge.getOfficialNumber();
bjoern@3847: String url = number != null ?
bjoern@3847: MSG.gauge_url() + number :
bjoern@3847: MSG.gauge_url();
bjoern@4137: Anchor anchor = new Anchor(MSG.gauge_info_link(), url, "_blank");
bjoern@3847: addMember(anchor);
bjoern@3865:
bjoern@3865: addMember(new GaugeCurveAnchor(flys, gauge));
bjoern@3865: }
bjoern@3865: }
bjoern@3865:
bjoern@3865: class GaugeCurveAnchor extends Anchor implements ClickHandler {
bjoern@3865:
bjoern@3865: private FLYS flys;
bjoern@3865: private GaugeInfo gauge;
bjoern@3865:
bjoern@3865: public GaugeCurveAnchor(FLYS flys, GaugeInfo gauge) {
bjoern@3865: super(MSG.gauge_curve_link());
bjoern@3865: this.flys = flys;
bjoern@3865: this.gauge = gauge;
bjoern@3865:
bjoern@3865: addClickHandler(this);
bjoern@3865: }
bjoern@3865:
christian@4129: @Override
bjoern@3865: public void onClick(ClickEvent ev) {
bjoern@3865: GWT.log("GaugeCurveAnchor - onClick " + gauge.getRiverName() +
bjoern@3865: " " + gauge.getOfficialNumber());
bjoern@3865: flys.newGaugeDischargeCurve(gauge.getRiverName(),
bjoern@3865: gauge.getOfficialNumber());
bjoern@3842: }
bjoern@3842: }
bjoern@3842:
bjoern@3842: class GaugeInfoPanel extends DecoratorPanel {
bjoern@3842:
bjoern@3842: public GaugeInfoPanel(GaugeInfo gauge) {
bjoern@3842: setStyleName("gaugeinfopanel");
bjoern@3842: Grid grid = new Grid(4, 2);
bjoern@3842:
bjoern@3842: NumberFormat nf = NumberFormat.getDecimalFormat();
bjoern@3842:
bjoern@3842: Double minw = gauge.getMinW();
bjoern@3842: Double maxw = gauge.getMaxW();
bjoern@3842: if (minw != null && maxw != null) {
bjoern@3842: grid.setText(0, 0, MSG.wq_value_q());
bjoern@3842: grid.setText(0, 1, "" + nf.format(minw) +
bjoern@3842: " - " + nf.format(maxw));
bjoern@3842: }
bjoern@3842:
bjoern@3842: Double minq = gauge.getMinQ();
bjoern@3842: Double maxq = gauge.getMaxQ();
bjoern@3842: if (minq != null && maxq != null) {
bjoern@3842: grid.setText(1, 0, MSG.wq_value_w());
bjoern@3842: grid.setText(1, 1, "" + nf.format(minq) +
bjoern@3842: " - " + nf.format(maxq));
bjoern@3842: }
bjoern@3842:
bjoern@3842: Double aeo = gauge.getAeo();
bjoern@3842: if (aeo != null) {
bjoern@3842: grid.setText(2, 0, "AEO [km²]");
bjoern@3842: grid.setText(2, 1, "" + nf.format(aeo));
bjoern@3842: }
bjoern@3842:
bjoern@3842: Double datum = gauge.getDatum();
bjoern@3842: if (datum != null) {
bjoern@3842: grid.setText(3, 0, MSG.gauge_zero() + " [" +
bjoern@3842: gauge.getWstUnit() + "]");
bjoern@3842: grid.setText(3, 1, "" + nf.format(datum));
bjoern@3842: }
bjoern@3842:
bjoern@3842: setWidget(grid);
bjoern@3842: }
bjoern@3842: }
bjoern@3842:
bjoern@4268: public void open() {
bjoern@4268: ArrayList locations = new ArrayList();
bjoern@4268:
bjoern@4268: if (data != null && data.length > 0) {
bjoern@4268: for (int i = 0; i < data.length; i++) {
bjoern@4268: DataList dl = data[i];
bjoern@4268: String state = dl.getState();
bjoern@4268: GWT.log("GaugeTree - open " + state);
bjoern@4268: if (state.equals("state.winfo.location_distance")) {
bjoern@4268: Double ldfrom = null;
bjoern@4268: Double ldto = null;
bjoern@4268:
bjoern@4268: for (int j = dl.size()-1; j >= 0; --j) {
bjoern@4268: Data d = dl.get(j);
bjoern@4268: String label = d.getLabel();
bjoern@4268: GWT.log("GaugeTree - setData - label " + label + " " + d.getStringValue());
bjoern@4268: if (label.equals("ld_from")) {
bjoern@4268: ldfrom = getDoubleValue(d);
bjoern@4268: }
bjoern@4268: else if (label.equals("ld_to")) {
bjoern@4268: ldto = getDoubleValue(d);
bjoern@4268: }
bjoern@4268: else if (label.equals("ld_locations")) {
bjoern@4268: getLocationsFromData(locations, d);
bjoern@4268: openOnLocations(locations);
bjoern@4268: return;
bjoern@4268: }
bjoern@4268: }
bjoern@4268: if (ldfrom != null) {
bjoern@4268: openOnDistance(ldfrom, ldto);
bjoern@4268: return;
bjoern@4268: }
bjoern@4268: }
bjoern@4268: else if(state.equals("state.winfo.distance_only") ||
bjoern@4268: state.equals("state.winfo.distance")) {
bjoern@4268: Double ldfrom = null;
bjoern@4268: Double ldto = null;
bjoern@4268:
bjoern@4268: for (int j = dl.size()-1; j >= 0; --j) {
bjoern@4268: Data d = dl.get(j);
bjoern@4268: String label = d.getLabel();
bjoern@4268: GWT.log("GaugeTree - setData - label " + label + " " + d.getStringValue());
bjoern@4268: if (label.equals("ld_from")) {
bjoern@4268: ldfrom = getDoubleValue(d);
bjoern@4268: }
bjoern@4268: else if (label.equals("ld_to")) {
bjoern@4268: ldto = getDoubleValue(d);
bjoern@4268: }
bjoern@4268: }
bjoern@4268:
bjoern@4268: if (ldfrom != null) {
bjoern@4268: openOnDistance(ldfrom, ldto);
bjoern@4268: return;
bjoern@4268: }
bjoern@4268: }
bjoern@4268: else if (state.equals("state.winfo.location")) {
bjoern@4268: getLocations("ld_locations", locations, dl);
bjoern@4268: openOnLocations(locations);
bjoern@4268: return;
bjoern@4268: }
bjoern@4268: else if (state.equals("state.winfo.reference.curve.input.start")) {
bjoern@4268: getLocations("reference_startpoint", locations, dl);
bjoern@4268: }
bjoern@4268: else if (state.equals("state.winfo.reference.curve.input.end")) {
bjoern@4268: getLocations("reference_endpoint", locations, dl);
bjoern@4268: }
bjoern@4268: else if (state.equals("state.winfo.historicalq.reference_gauge")) {
bjoern@4268: for (int j = dl.size()-1; j >= 0; --j) {
bjoern@4268: Data d = dl.get(j);
bjoern@4268: String label = d.getLabel();
bjoern@4268: if (label.equals("reference_gauge")) {
bjoern@4268: String tmp = d.getStringValue();
bjoern@4268: if (tmp != null) {
bjoern@4268: Long gaugereference = Long.valueOf(tmp);
bjoern@4268: if (gaugereference != null) {
bjoern@4268: openOnReference(gaugereference);
bjoern@4268: return;
bjoern@4268: }
bjoern@4268: }
bjoern@4268: }
bjoern@4268: }
bjoern@4268: }
bjoern@4268: }
bjoern@4268: }
bjoern@4268: if (!locations.isEmpty()) {
bjoern@4268: openOnLocations(locations);
bjoern@4268: }
bjoern@4268: else {
bjoern@4268: openAll();
bjoern@4268: }
bjoern@4268: }
bjoern@3842: }