bjoern@3842: package de.intevation.flys.client.client.ui; bjoern@3842: bjoern@3842: import java.util.ArrayList; bjoern@3842: import java.util.List; bjoern@3842: import java.util.Iterator; bjoern@3842: bjoern@3842: import com.google.gwt.core.client.GWT; 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.ScrollPanel; 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@3842: import de.intevation.flys.client.client.FLYSConstants; bjoern@3842: 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: bjoern@3842: bjoern@3842: public class GaugeTree extends ScrollPanel { bjoern@3842: bjoern@3842: private Tree tree; bjoern@3842: private DataList[] data; bjoern@3842: bjoern@3842: /** The message class that provides i18n strings.*/ bjoern@3842: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); bjoern@3842: bjoern@3842: public GaugeTree() { 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@3842: public void setGauges(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@3842: GaugeInfoItem gaugeitem = new GaugeInfoItem(gauge); bjoern@3842: tree.addItem(gaugeitem); bjoern@3842: } bjoern@3842: bjoern@3842: public void openAll() { bjoern@3842: GWT.log("GaugeTree - openAll"); bjoern@3842: for (Iterator it = tree.treeItemIterator(); it.hasNext();) { bjoern@3842: TreeItem item = it.next(); bjoern@3842: item.setState(true); bjoern@3842: } bjoern@3842: } bjoern@3842: bjoern@3842: public void setData(DataList[] data) { bjoern@3842: this.data = data; bjoern@3842: if (tree.getItemCount() > 0) { bjoern@3842: open(); bjoern@3842: } bjoern@3842: } bjoern@3842: bjoern@3842: public void open() { bjoern@3842: ArrayList locations = new ArrayList(); bjoern@3842: bjoern@3842: if (data != null && data.length > 0) { bjoern@3842: for (int i = 0; i < data.length; i++) { bjoern@3842: DataList dl = data[i]; bjoern@3842: String state = dl.getState(); bjoern@3842: GWT.log("GaugeTree - setData " + state); bjoern@3842: if (state.equals("state.winfo.location_distance")) { bjoern@3842: Double ldfrom = null; bjoern@3842: Double ldto = null; bjoern@3842: 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: GWT.log("GaugeTree - setData - label " + label + " " + d.getStringValue()); bjoern@3842: if (label.equals("ld_from")) { bjoern@3842: ldfrom = getDoubleValue(d); bjoern@3842: } bjoern@3842: else if (label.equals("ld_to")) { bjoern@3842: ldto = getDoubleValue(d); bjoern@3842: } bjoern@3842: else if (label.equals("ld_locations")) { bjoern@3842: getLocationsFromData(locations, d); bjoern@3842: openOnLocations(locations); bjoern@3842: return; bjoern@3842: } bjoern@3842: } bjoern@3842: if (ldfrom != null) { bjoern@3842: openOnDistance(ldfrom, ldto); bjoern@3842: return; bjoern@3842: } bjoern@3842: } bjoern@3842: else if(state.equals("state.winfo.distance_only") || bjoern@3842: state.equals("state.winfo.distance")) { bjoern@3842: Double ldfrom = null; bjoern@3842: Double ldto = null; bjoern@3842: 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: GWT.log("GaugeTree - setData - label " + label + " " + d.getStringValue()); bjoern@3842: if (label.equals("ld_from")) { bjoern@3842: ldfrom = getDoubleValue(d); bjoern@3842: } bjoern@3842: else if (label.equals("ld_to")) { bjoern@3842: ldto = getDoubleValue(d); bjoern@3842: } bjoern@3842: } bjoern@3842: bjoern@3842: if (ldfrom != null) { bjoern@3842: openOnDistance(ldfrom, ldto); bjoern@3842: return; bjoern@3842: } bjoern@3842: } bjoern@3842: else if (state.equals("state.winfo.location")) { bjoern@3842: getLocations("ld_locations", locations, dl); bjoern@3842: openOnLocations(locations); bjoern@3842: return; bjoern@3842: } bjoern@3842: else if (state.equals("state.winfo.reference.curve.input.start")) { bjoern@3842: getLocations("reference_startpoint", locations, dl); bjoern@3842: } bjoern@3842: else if (state.equals("state.winfo.reference.curve.input.end")) { bjoern@3842: getLocations("reference_endpoint", locations, dl); bjoern@3842: } bjoern@3842: else if (state.equals("state.winfo.historicalq.reference_gauge")) { 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("reference_gauge")) { bjoern@3842: String tmp = d.getStringValue(); bjoern@3842: if (tmp != null) { bjoern@3844: Long gaugereference = Long.valueOf(tmp); bjoern@3842: if (gaugereference != null) { bjoern@3844: openOnReference(gaugereference); bjoern@3844: return; bjoern@3842: } bjoern@3842: } bjoern@3842: } bjoern@3842: } bjoern@3842: } bjoern@3842: } bjoern@3842: } bjoern@3842: if (!locations.isEmpty()) { bjoern@3842: openOnLocations(locations); bjoern@3842: } bjoern@3842: else { bjoern@3842: openAll(); bjoern@3842: } bjoern@3842: } bjoern@3842: bjoern@3842: private 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@3842: private 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@3842: private Double getDoubleValue(Data d) { bjoern@3842: String tmp = d.getStringValue(); bjoern@3842: if (tmp != null) { bjoern@3842: return Double.valueOf(tmp); bjoern@3842: } bjoern@3842: return null; 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@3842: if (end == null) { bjoern@3842: if (gitem.getStart() >= start) { bjoern@3842: setstate = true; bjoern@3842: } bjoern@3842: } bjoern@3842: else { bjoern@3842: GWT.log("GaugeTree - openOnDistance gitem " + gitem.getStart() + " " + gitem.getEnd()); bjoern@3842: if ((start >= gitem.getStart() && start <= gitem.getEnd()) || bjoern@3842: (end >= gitem.getStart() && end <= gitem.getEnd()) || bjoern@3842: (start <= gitem.getStart() && end >= gitem.getEnd())) { bjoern@3842: setstate = true; bjoern@3842: } bjoern@3842: } bjoern@3842: item.setState(setstate); bjoern@3842: } bjoern@3842: } bjoern@3842: } bjoern@3842: 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@3842: if (location >= gitem.getStart() && bjoern@3842: location <= gitem.getEnd()) { bjoern@3842: isset = true; bjoern@3842: break; bjoern@3842: } 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@3842: public GaugeInfoItem(GaugeInfo gauge) { bjoern@3842: GaugeInfoHead gaugeinfohead = new GaugeInfoHead(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@3842: public GaugeInfoHead(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@3842: addMember(new Anchor(MSG.gauge_info_link(), gauge.getInfoURL())); 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@3842: }