bjoern@3715: package de.intevation.flys.client.client.ui; bjoern@3715: bjoern@3828: import java.util.ArrayList; bjoern@3828: import java.util.Iterator; bjoern@3715: import java.util.List; bjoern@3715: bjoern@3715: import com.google.gwt.core.client.GWT; bjoern@3828: import com.google.gwt.i18n.client.NumberFormat; bjoern@3715: import com.google.gwt.user.client.rpc.AsyncCallback; bjoern@3828: import com.google.gwt.user.client.ui.DecoratorPanel; bjoern@3828: import com.google.gwt.user.client.ui.Grid; bjoern@3828: import com.google.gwt.user.client.ui.HorizontalPanel; bjoern@3828: import com.google.gwt.user.client.ui.Label; bjoern@3828: import com.google.gwt.user.client.ui.ScrollPanel; bjoern@3715: import com.google.gwt.user.client.ui.Tree; bjoern@3715: import com.google.gwt.user.client.ui.TreeItem; bjoern@3715: bjoern@3715: import com.smartgwt.client.types.Overflow; bjoern@3828: import com.smartgwt.client.widgets.events.ResizedEvent; bjoern@3828: import com.smartgwt.client.widgets.events.ResizedHandler; bjoern@3828: import com.smartgwt.client.widgets.layout.HLayout; bjoern@3715: import com.smartgwt.client.widgets.layout.SectionStackSection; bjoern@3715: import com.smartgwt.client.widgets.layout.VLayout; bjoern@3715: bjoern@3715: import de.intevation.flys.client.client.FLYSConstants; bjoern@3715: import de.intevation.flys.client.client.services.GaugeOverviewInfoService; bjoern@3715: import de.intevation.flys.client.client.services.GaugeOverviewInfoServiceAsync; bjoern@3715: import de.intevation.flys.client.shared.model.GaugeInfo; bjoern@3715: import de.intevation.flys.client.shared.model.RiverInfo; bjoern@3715: bjoern@3715: /** bjoern@3715: * The GaugePanel is intendet to be used within a SectionStackSection bjoern@3715: * It extends the VLayout by two methods to show and hide the bjoern@3715: * section stack section. bjoern@3715: */ bjoern@3825: public class GaugePanel extends VLayout implements ResizedHandler { bjoern@3715: bjoern@3715: /** SectionStackSection where this GaugePanel belongs in*/ bjoern@3715: private SectionStackSection sectionStack; bjoern@3715: bjoern@3715: /** Name of the river */ bjoern@3715: private String river; bjoern@3715: bjoern@3715: /** The message class that provides i18n strings.*/ bjoern@3715: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); bjoern@3715: bjoern@3715: protected GaugeOverviewInfoServiceAsync gaugeOverviewInfoService = bjoern@3715: GWT.create(GaugeOverviewInfoService.class); bjoern@3715: bjoern@3825: protected GaugeTree gaugetree = new GaugeTree(); bjoern@3825: bjoern@3825: protected RiverInfoPanel riverinfopanel; bjoern@3825: bjoern@3715: /** bjoern@3715: * Creates a new VLayout with a SectionStackSection bjoern@3715: * The GaugePanel's SectionStackSection is hidden by default. bjoern@3715: * @param sectionStack The section stack section to place the VLayout in. bjoern@3715: */ bjoern@3715: public GaugePanel(SectionStackSection sectionStack) { bjoern@3825: setOverflow(Overflow.HIDDEN); bjoern@3828: sectionStack.setHidden(true); bjoern@3715: sectionStack.setItems(this); bjoern@3715: this.sectionStack = sectionStack; bjoern@3825: setStyleName("gaugepanel"); bjoern@3825: addResizedHandler(this); bjoern@3715: } bjoern@3715: bjoern@3828: /** bjoern@3828: * Sets and loads the river data if river is not the current set river bjoern@3828: */ bjoern@3715: public void setRiver(String river) { bjoern@3828: if (!river.equals(this.river)) { bjoern@3828: this.river = river; bjoern@3828: this.refresh(); bjoern@3828: } bjoern@3715: } bjoern@3715: bjoern@3715: /** bjoern@3715: * Loads the river info and renders it afterwards bjoern@3715: */ bjoern@3715: public void refresh() { bjoern@3715: gaugeOverviewInfoService.getRiverInfo(this.river, new AsyncCallback() { bjoern@3715: public void onFailure(Throwable e) { bjoern@3715: GWT.log("Could not load the river info." + e); bjoern@3715: } bjoern@3715: bjoern@3715: public void onSuccess(RiverInfo riverinfo) { bjoern@3715: GWT.log("Loaded river info"); bjoern@3715: renderGaugeOverviewInfo(riverinfo); bjoern@3828: gaugetree.openAll(); bjoern@3715: } bjoern@3715: }); bjoern@3715: } bjoern@3715: bjoern@3715: public void renderGaugeOverviewInfo(RiverInfo riverinfo) { bjoern@3825: removeMembers(getMembers()); bjoern@3715: bjoern@3825: riverinfopanel = new RiverInfoPanel(riverinfo); bjoern@3825: addMember(riverinfopanel); bjoern@3825: addMember(gaugetree); bjoern@3715: bjoern@3828: gaugetree.setGauges(riverinfo); bjoern@3825: } bjoern@3715: bjoern@3825: @Override bjoern@3825: public void onResized(ResizedEvent event) { bjoern@3825: /* this height calculation is only an approximation and doesn't reflect bjoern@3825: * the real height of the the gaugetree. */ bjoern@3825: int height = getInnerContentHeight() - bjoern@3825: (RiverInfoPanel.HEIGHT + bjoern@3825: (2 * RiverInfoPanel.BORDER_WIDTH) + bjoern@3825: (2 * RiverInfoPanel.PADDING) + bjoern@3825: (2 * RiverInfoPanel.MARGIN)); bjoern@3825: bjoern@3825: if (height < 0) { bjoern@3825: height = 0; bjoern@3715: } bjoern@3825: bjoern@3825: gaugetree.setHeight("" + height + "px"); bjoern@3715: } bjoern@3715: bjoern@3825: bjoern@3715: /** bjoern@3715: * Hide the section stack section. bjoern@3715: */ bjoern@3715: public void hide() { bjoern@3715: GWT.log("GaugePanel - hide"); bjoern@3715: this.sectionStack.setHidden(true); bjoern@3715: } bjoern@3715: bjoern@3715: /** bjoern@3715: * Show the section stack section. bjoern@3715: */ bjoern@3715: public void show() { bjoern@3715: GWT.log("GaugePanel - show"); bjoern@3715: this.sectionStack.setHidden(false); bjoern@3715: } bjoern@3715: bjoern@3825: class GaugeTree extends ScrollPanel { bjoern@3825: bjoern@3825: private Tree tree; bjoern@3825: bjoern@3825: public GaugeTree() { bjoern@3825: tree = new Tree(); bjoern@3825: setWidget(tree); bjoern@3825: } bjoern@3825: bjoern@3825: /** bjoern@3825: * Resets the items of the tree. bjoern@3825: * If the list of gauges is empty or null the tree will be empty. bjoern@3825: */ bjoern@3828: public void setGauges(RiverInfo riverinfo) { bjoern@3825: tree.clear(); bjoern@3825: bjoern@3828: List gauges = riverinfo.getGauges(); bjoern@3828: bjoern@3825: if (gauges != null && !gauges.isEmpty()) { bjoern@3825: bjoern@3828: ArrayList emptygauges = new ArrayList(); bjoern@3828: bjoern@3828: if (!riverinfo.isKmUp()) { bjoern@3828: for (GaugeInfo gauge : gauges) { bjoern@3828: addGauge(gauge, emptygauges); bjoern@3828: } bjoern@3825: } bjoern@3828: else { bjoern@3828: for (int i = gauges.size(); i >= 0; i--) { bjoern@3828: GaugeInfo gauge = gauges.get(i); bjoern@3828: addGauge(gauge, emptygauges); bjoern@3828: } bjoern@3828: } bjoern@3828: bjoern@3828: // put empty gauges to the end bjoern@3828: for (GaugeInfo gauge : emptygauges) { bjoern@3828: addGauge(gauge); bjoern@3828: } bjoern@3828: } bjoern@3828: } bjoern@3828: bjoern@3828: private void addGauge(GaugeInfo gauge, List empty) { bjoern@3828: if (gauge.getKmStart() != null && gauge.getKmEnd() != null) { bjoern@3828: addGauge(gauge); bjoern@3828: } bjoern@3828: else { bjoern@3828: empty.add(gauge); bjoern@3828: } bjoern@3828: } bjoern@3828: bjoern@3828: private void addGauge(GaugeInfo gauge) { bjoern@3828: TreeItem gaugeitem = new GaugeInfoItem(gauge); bjoern@3828: tree.addItem(gaugeitem); bjoern@3828: } bjoern@3828: bjoern@3828: public void openAll() { bjoern@3828: for (Iterator it = tree.treeItemIterator(); it.hasNext();) { bjoern@3828: TreeItem item = it.next(); bjoern@3828: item.setState(true); bjoern@3825: } bjoern@3825: } bjoern@3825: } bjoern@3825: bjoern@3825: class RiverInfoPanel extends HorizontalPanel { bjoern@3825: bjoern@3825: public final static int HEIGHT = 30; bjoern@3825: public final static int BORDER_WIDTH = 3; bjoern@3825: public final static int PADDING = 8; bjoern@3825: public final static int MARGIN = 10; bjoern@3715: bjoern@3715: public RiverInfoPanel(RiverInfo riverinfo) { bjoern@3825: setStyleName("riverinfopanel"); bjoern@3825: setHeight("" + HEIGHT + "px"); bjoern@3825: setVerticalAlignment(ALIGN_MIDDLE); bjoern@3715: bjoern@3828: NumberFormat nf = NumberFormat.getDecimalFormat(); bjoern@3828: bjoern@3825: addLabel(riverinfo.getName(), false); bjoern@3715: bjoern@3715: String kmtext = ""; bjoern@3715: Double start = riverinfo.getKmStart(); bjoern@3715: Double end = riverinfo.getKmEnd(); bjoern@3715: bjoern@3715: if (!riverinfo.isKmUp()) { bjoern@3715: Double tmp = end; bjoern@3715: end = start; bjoern@3715: start = tmp; bjoern@3715: } bjoern@3715: if (end != null) { bjoern@3828: kmtext += nf.format(end); bjoern@3715: kmtext += " - "; bjoern@3715: } bjoern@3715: if (start != null) { bjoern@3828: kmtext += nf.format(start); bjoern@3715: } bjoern@3715: kmtext += " km"; bjoern@3715: bjoern@3825: addLabel(kmtext, false); bjoern@3715: bjoern@3715: String qtext = ""; bjoern@3715: Double qmin = riverinfo.getMinQ(); bjoern@3715: Double qmax = riverinfo.getMaxQ(); bjoern@3715: if (qmin != null) { bjoern@3828: qtext += nf.format(qmin); bjoern@3828: qtext += " " + MSG.gauge_q_unit(); bjoern@3715: qtext += " - "; bjoern@3715: } bjoern@3715: if (qmax != null) { bjoern@3828: qtext += nf.format(qmax); bjoern@3828: qtext += " " + MSG.gauge_q_unit(); bjoern@3715: } bjoern@3715: bjoern@3825: addLabel(qtext, false); bjoern@3825: } bjoern@3825: bjoern@3825: private void addLabel(String text, boolean wordwrap) { bjoern@3825: Label label = new Label(text, wordwrap); bjoern@3825: add(label); bjoern@3825: setCellHeight(label, "" + HEIGHT + "px"); bjoern@3715: } bjoern@3715: } bjoern@3715: bjoern@3715: class GaugeInfoItem extends TreeItem { bjoern@3715: public GaugeInfoItem(GaugeInfo gauge) { bjoern@3715: GaugeInfoHead gaugeinfohead = new GaugeInfoHead(gauge); bjoern@3715: GaugeInfoPanel gaugeinfopanel = new GaugeInfoPanel(gauge); bjoern@3715: setWidget(gaugeinfohead); bjoern@3715: addItem(gaugeinfopanel); bjoern@3715: } bjoern@3715: } bjoern@3715: bjoern@3715: class GaugeInfoHead extends HLayout { bjoern@3715: bjoern@3715: public GaugeInfoHead(GaugeInfo gauge) { bjoern@3715: setStyleName("gaugeinfohead"); bjoern@3715: setAutoHeight(); bjoern@3715: setAutoWidth(); bjoern@3715: bjoern@3828: NumberFormat nf = NumberFormat.getDecimalFormat(); bjoern@3828: bjoern@3825: Label label = new Label(gauge.getName(), true); bjoern@3715: addMember(label); bjoern@3715: bjoern@3828: Double start; bjoern@3828: Double end; bjoern@3828: bjoern@3828: if (!gauge.isKmUp()) { bjoern@3828: start = gauge.getKmStart(); bjoern@3828: end = gauge.getKmEnd(); bjoern@3828: } bjoern@3828: else { bjoern@3828: start = gauge.getKmEnd(); bjoern@3828: end = gauge.getKmStart(); bjoern@3828: } bjoern@3828: bjoern@3715: String kmtext = ""; bjoern@3715: if (start != null) { bjoern@3828: kmtext += nf.format(start); bjoern@3715: kmtext += " - "; bjoern@3715: } bjoern@3715: if (end != null) { bjoern@3828: kmtext += nf.format(end); bjoern@3715: } bjoern@3828: if (start != null || end != null) { bjoern@3828: kmtext += " km"; bjoern@3828: } bjoern@3715: bjoern@3715: label = new Label(kmtext); bjoern@3715: bjoern@3715: addMember(label); bjoern@3828: bjoern@3828: Double station = gauge.getStation(); bjoern@3828: if (station != null) { bjoern@3828: String stext = nf.format(station); bjoern@3828: stext += " km"; bjoern@3828: label = new Label(stext); bjoern@3828: addMember(label); bjoern@3828: } bjoern@3715: } bjoern@3715: } bjoern@3715: bjoern@3715: class GaugeInfoPanel extends DecoratorPanel { bjoern@3828: bjoern@3715: public GaugeInfoPanel(GaugeInfo gauge) { bjoern@3715: setStyleName("gaugeinfopanel"); bjoern@3715: Grid grid = new Grid(4, 2); bjoern@3715: bjoern@3828: NumberFormat nf = NumberFormat.getDecimalFormat(); bjoern@3828: bjoern@3828: Double minw = gauge.getMinW(); bjoern@3828: Double maxw = gauge.getMaxW(); bjoern@3828: if (minw != null && maxw != null) { bjoern@3828: grid.setText(0, 0, MSG.wq_value_q()); bjoern@3828: grid.setText(0, 1, "" + nf.format(minw) + bjoern@3828: " - " + nf.format(maxw)); bjoern@3828: } bjoern@3828: bjoern@3828: Double minq = gauge.getMinQ(); bjoern@3828: Double maxq = gauge.getMaxQ(); bjoern@3828: if (minq != null && maxq != null) { bjoern@3828: grid.setText(1, 0, MSG.wq_value_w()); bjoern@3828: grid.setText(1, 1, "" + nf.format(minq) + bjoern@3828: " - " + nf.format(maxq)); bjoern@3828: } bjoern@3828: bjoern@3828: Double aeo = gauge.getAeo(); bjoern@3828: if (aeo != null) { bjoern@3828: grid.setText(2, 0, "AEO [kmĀ²]"); bjoern@3828: grid.setText(2, 1, "" + nf.format(aeo)); bjoern@3828: } bjoern@3828: bjoern@3828: Double datum = gauge.getDatum(); bjoern@3828: if (datum != null) { bjoern@3831: grid.setText(3, 0, MSG.gauge_zero() + " [" + bjoern@3831: gauge.getWstUnit() + "]"); bjoern@3828: grid.setText(3, 1, "" + nf.format(datum)); bjoern@3828: } bjoern@3715: bjoern@3715: setWidget(grid); bjoern@3715: } bjoern@3715: } bjoern@3715: }