bjoern@3715: package de.intevation.flys.client.client.ui; bjoern@3715: bjoern@3715: import java.util.List; bjoern@3715: bjoern@3715: import com.google.gwt.core.client.GWT; bjoern@3715: import com.google.gwt.user.client.rpc.AsyncCallback; bjoern@3715: import com.google.gwt.user.client.ui.Tree; bjoern@3715: import com.google.gwt.user.client.ui.TreeItem; bjoern@3715: import com.google.gwt.user.client.ui.Grid; bjoern@3715: import com.google.gwt.user.client.ui.DecoratorPanel; bjoern@3825: import com.google.gwt.user.client.ui.ScrollPanel; bjoern@3825: import com.google.gwt.user.client.ui.Label; bjoern@3825: import com.google.gwt.user.client.ui.HorizontalPanel; bjoern@3715: bjoern@3715: import com.smartgwt.client.types.Overflow; bjoern@3715: import com.smartgwt.client.types.Alignment; bjoern@3715: import com.smartgwt.client.widgets.layout.SectionStackSection; bjoern@3715: import com.smartgwt.client.widgets.layout.HLayout; bjoern@3715: import com.smartgwt.client.widgets.layout.VLayout; bjoern@3825: import com.smartgwt.client.widgets.events.ResizedHandler; bjoern@3825: import com.smartgwt.client.widgets.events.ResizedEvent; 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@3715: sectionStack.setItems(this); bjoern@3715: this.sectionStack = sectionStack; bjoern@3825: setStyleName("gaugepanel"); bjoern@3825: addResizedHandler(this); bjoern@3715: } bjoern@3715: bjoern@3715: public void setRiver(String river) { bjoern@3715: this.river = river; bjoern@3715: this.refresh(); 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@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@3825: gaugetree.setGauges(riverinfo.getGauges()); 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@3825: public void setGauges(List gauges) { bjoern@3825: tree.clear(); bjoern@3825: bjoern@3825: if (gauges != null && !gauges.isEmpty()) { bjoern@3825: bjoern@3825: for (GaugeInfo gauge : gauges) { bjoern@3825: TreeItem gaugeitem = new GaugeInfoItem(gauge); bjoern@3825: tree.addItem(gaugeitem); bjoern@3825: } 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@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@3715: kmtext += end.toString(); bjoern@3715: kmtext += " - "; bjoern@3715: } bjoern@3715: if (start != null) { bjoern@3715: kmtext += start.toString(); 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@3715: qtext += qmin.toString(); bjoern@3715: qtext += " qm/s"; bjoern@3715: qtext += " - "; bjoern@3715: } bjoern@3715: if (qmax != null) { bjoern@3715: qtext += qmax.toString(); bjoern@3715: qtext += " qm/s"; 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@3825: Label label = new Label(gauge.getName(), true); bjoern@3715: addMember(label); bjoern@3715: bjoern@3715: Double start = gauge.getKmStart(); bjoern@3715: Double end = gauge.getKmEnd(); bjoern@3715: String kmtext = ""; bjoern@3715: if (start != null) { bjoern@3715: kmtext += start.toString(); bjoern@3715: kmtext += " - "; bjoern@3715: } bjoern@3715: if (end != null) { bjoern@3715: kmtext += end.toString(); bjoern@3715: } bjoern@3715: kmtext +=" km"; bjoern@3715: bjoern@3715: label = new Label(kmtext); bjoern@3715: bjoern@3715: addMember(label); bjoern@3715: } bjoern@3715: } bjoern@3715: bjoern@3715: class GaugeInfoPanel extends DecoratorPanel { bjoern@3715: public GaugeInfoPanel(GaugeInfo gauge) { bjoern@3715: setStyleName("gaugeinfopanel"); bjoern@3715: Grid grid = new Grid(4, 2); bjoern@3715: bjoern@3715: grid.setText(0, 0, "W-Bereich [cm]"); bjoern@3715: grid.setText(0, 1, "" + gauge.getMinW() + " - " + gauge.getMaxW()); bjoern@3715: grid.setText(1, 0, "Q-Bereich [m²/s]"); bjoern@3715: grid.setText(1, 1, "" + gauge.getMinQ() + " - " + gauge.getMaxQ()); bjoern@3715: grid.setText(2, 0, "AEO [km²]"); bjoern@3715: grid.setText(2, 1, "" + gauge.getAeo()); bjoern@3715: grid.setText(3, 0, "Pegelnullpunk [NN+m]"); bjoern@3715: grid.setText(3, 1, "" + gauge.getDatum()); bjoern@3715: bjoern@3715: setWidget(grid); bjoern@3715: } bjoern@3715: } bjoern@3715: }