Mercurial > dive4elements > river
changeset 9063:b6919e3c2d86
work on uinfo-inundation_duration states
line wrap: on
line diff
--- a/artifacts/doc/conf/artifacts/sinfo.xml Mon May 07 17:25:53 2018 +0200 +++ b/artifacts/doc/conf/artifacts/sinfo.xml Tue May 08 15:21:23 2018 +0200 @@ -254,7 +254,7 @@ <data name="years" type="String" /> </state> - <state id="state.sinfo.load.epoch" description="state.sinfo.load.epoch" state="org.dive4elements.river.artifacts.states.minfo.SedimentLoadEpochSelect" helpText="help.state.sinfo.load.epoch"> + <state id="state.sinfo.load.epoch" description="state.sinfo.load.epoch" state="org.dive4elements.river.artifacts.sinfo.collision.LoadEpochSelect" helpText="help.state.sinfo.load.epoch"> <data name="epochs" type="String" /> </state>
--- a/artifacts/doc/conf/artifacts/uinfo.xml Mon May 07 17:25:53 2018 +0200 +++ b/artifacts/doc/conf/artifacts/uinfo.xml Tue May 08 15:21:23 2018 +0200 @@ -70,7 +70,6 @@ <data name="ld_to_part" type="Double" /> </state> - <transition transition="org.dive4elements.river.artifacts.transitions.DefaultTransition"> <from state="state.uinfo.distance_only_part" /> <to state="state.uinfo.salix_line" /> @@ -78,6 +77,9 @@ </transition> + + + <state id="state.uinfo.salix_line" description="state.uinfo.salix_line" state="org.dive4elements.river.artifacts.uinfo.salix.SalixLineState" helpText="help.state.uinfo.salix_line"> <outputmodes> @@ -97,55 +99,101 @@ </outputmode> </outputmodes> </state> - - - - + <!-- Calculation Mode: Inundation Duration --> - <!-- Calculation Mode: Vegetation Zones --> <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> <from state="state.uinfo.calculation_mode" /> - <to state="state.uinfo.vegetation_zones" /> - <condition data="calculation_mode" value="uinfo_vegetation_zones" operator="equal" /> - + <to state="state.uinfo.distance_only" /> + <condition data="calculation_mode" value="uinfo_inundation_duration" operator="equal" /> </transition> - <state id="state.uinfo.vegetation_zones" description="state.uinfo.vegetation_zones" state="org.dive4elements.river.artifacts.uinfo.vegetationzones.VegetationZonesState" helpText="help.state.uinfo.vegetation_zones"> - <outputmodes> + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.uinfo.distance_only" /> + <to state="state.uinfo.year_epoch" /> + <condition data="calculation_mode" value="uinfo_inundation_duration" operator="equal" /> + </transition> - <!-- FIXME: i01n name in FLYSConstants --> - <outputmode name="uinfo_vegetation_zones_export" description="output.uinfo_vegetation_zones_export" mime-type="text/plain" type="export"> - <facets> - <facet name="csv" description="facet.uinfo_vegetation_zones_export.csv" /> - <facet name="pdf" description="facet.uinfo_vegetation_zones_export.pdf" /> - </facets> - </outputmode> - <!-- FIXME: i01n name in FLYSConstants --> - <outputmode name="uinfo_vegetation_zones_report" description="output.uinfo_vegetation_zones_report" mime-type="text/xml" type="report"> - <facets> - <facet name="report" description="facet.uinfo_vegetation_zones_report" /> - </facets> - </outputmode> - </outputmodes> + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.uinfo.year_epoch" /> + <to state="state.uinfo.load.year" /> + <condition data="ye_select" value="state.uinfo.year" operator="equal" /> + </transition> + + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.uinfo.year_epoch" /> + <to state="state.uinfo.load.epoch" /> + <condition data="ye_select" value="state.uinfo.epoch" operator="equal" /> + </transition> + + + <state id="state.uinfo.year_epoch" description="state.uinfo.year_epoch" state="org.dive4elements.river.artifacts.uinfo.inundationduration.YearChoice" helpText="help.state.uinfo.year"> + <data name="ye_select" type="String" /> </state> + <state id="state.uinfo.load.year" description="state.uinfo.load.year" state="org.dive4elements.river.artifacts.uinfo.inundationduration.LoadYearSelect" helpText="help.state.uinfo.load.year"> + <data name="years" type="String" /> + </state> - - + <state id="state.uinfo.load.epoch" description="state.uinfo.load.epoch" state="org.dive4elements.river.artifacts.uinfo.inundationduration.LoadEpochSelect" helpText="help.state.uinfo.load.epoch"> + <data name="epochs" type="String" /> + </state> - <!-- Calculation Mode: Inundation Duration --> <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> - <from state="state.uinfo.calculation_mode" /> - <to state="state.uinfo.inundation_duration" /> + <from state="state.uinfo.load.epoch" /> + <to state="state.uinfo.inundation.use_scenario" /> <condition data="calculation_mode" value="uinfo_inundation_duration" operator="equal" /> - </transition> + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.uinfo.load.year" /> + <to state="state.uinfo.inundation.use_scenario" /> + <condition data="calculation_mode" value="uinfo_inundation_duration" operator="equal" /> + </transition> + + <!-- Doppelter State, andere ID, damit keine Mehrfach-Condition benötigt wird --> + <state id="state.uinfo.inundation.use_scenario" description="state.uinfo.inundation.use_scenario" state="org.dive4elements.river.artifacts.uinfo.salix.UseScenarioChoice" helpText="help.state.uinfo.use_scenario"> + <data name="use_scenario" type="Boolean" /> + </state> + + + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.uinfo.inundation.use_scenario" /> + <to state="state.uinfo.inundation.scenario" /> + <condition data="use_scenario" value="true" operator="equal" /> + </transition> + + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.uinfo.inundation.use_scenario" /> + <to state="state.uinfo.inundation.vegetation" /> + <condition data="use_scenario" value="false" operator="equal" /> + </transition> + + <state id="state.uinfo.inundation.scenario" description="state.uinfo.inundation.scenario" state="org.dive4elements.river.artifacts.uinfo.inundationduration.LoadScenarioSelect" helpText="help.state.uinfo.use_scenario"> + <data name="years" type="String" /> <!-- mittelwasserlage in cm! --> + </state> + + <state id="state.uinfo.inundation.vegetation" description="state.uinfo.inundation.vegetation" state="org.dive4elements.river.artifacts.uinfo.salix.UseScenarioChoice" helpText="help.state.uinfo.use_scenario"> + <data name="vegetation" type="Boolean" /> + </state> + + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.uinfo.inundation.scenario" /> + <to state="state.uinfo.inundation.vegetation" /> + <condition data="calculation_mode" value="uinfo_inundation_duration" operator="equal" /> + </transition> + + + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.uinfo.inundation.vegetation" /> + <to state="state.uinfo.inundation_duration" /> + <condition data="calculation_mode" value="uinfo_inundation_duration" operator="equal" /> + </transition> + <state id="state.uinfo.inundation_duration" description="state.uinfo.inundation_duration" state="org.dive4elements.river.artifacts.uinfo.inundationduration.InundationDurationState" helpText="help.state.uinfo.inundation_duration"> <outputmodes> @@ -167,4 +215,52 @@ </state> </states> + + + + + + + + + + + + + + + + + + + + <!-- Calculation Mode: Vegetation Zones --> + <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition"> + <from state="state.uinfo.calculation_mode" /> + <to state="state.uinfo.vegetation_zones" /> + <condition data="calculation_mode" value="uinfo_vegetation_zones" operator="equal" /> + + </transition> + + <state id="state.uinfo.vegetation_zones" description="state.uinfo.vegetation_zones" state="org.dive4elements.river.artifacts.uinfo.vegetationzones.VegetationZonesState" helpText="help.state.uinfo.vegetation_zones"> + <outputmodes> + + <!-- FIXME: i01n name in FLYSConstants --> + <outputmode name="uinfo_vegetation_zones_export" description="output.uinfo_vegetation_zones_export" mime-type="text/plain" type="export"> + <facets> + <facet name="csv" description="facet.uinfo_vegetation_zones_export.csv" /> + <facet name="pdf" description="facet.uinfo_vegetation_zones_export.pdf" /> + </facets> + </outputmode> + + <!-- FIXME: i01n name in FLYSConstants --> + <outputmode name="uinfo_vegetation_zones_report" description="output.uinfo_vegetation_zones_report" mime-type="text/xml" type="report"> + <facets> + <facet name="report" description="facet.uinfo_vegetation_zones_report" /> + </facets> + </outputmode> + </outputmodes> + </state> + + </artifact> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/LoadEpochSelect.java Tue May 08 15:21:23 2018 +0200 @@ -0,0 +1,28 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.artifacts.sinfo.collision; + +import org.apache.log4j.Logger; +import org.dive4elements.river.artifacts.states.DefaultState; + +public class LoadEpochSelect extends DefaultState { + /** The log used in this class. */ + private static Logger log = Logger.getLogger(LoadEpochSelect.class); + + /** + * The default constructor that initializes an empty State object. + */ + public LoadEpochSelect() { + } + + @Override + protected String getUIProvider() { + return "sinfo.collision.load_epoch_select"; + } +}
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/LoadYearSelect.java Mon May 07 17:25:53 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/LoadYearSelect.java Tue May 08 15:21:23 2018 +0200 @@ -28,7 +28,7 @@ /** Year Select Widget. */ @Override protected String getUIProvider() { - return "minfo.sedimentload_year_select"; + return "minfo.sedimentload_year_select"; // TODO: eigenes Panel oder allgemeineren Code } @Override
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/LoadEpochSelect.java Tue May 08 15:21:23 2018 +0200 @@ -0,0 +1,28 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.artifacts.uinfo.inundationduration; + +import org.apache.log4j.Logger; +import org.dive4elements.river.artifacts.states.DefaultState; + +public class LoadEpochSelect extends DefaultState { + /** The log used in this class. */ + private static Logger log = Logger.getLogger(LoadEpochSelect.class); + + /** + * The default constructor that initializes an empty State object. + */ + public LoadEpochSelect() { + } + + @Override + protected String getUIProvider() { + return "uinfo.inundation_duration.load_epoch_select"; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/LoadScenarioSelect.java Tue May 08 15:21:23 2018 +0200 @@ -0,0 +1,46 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.artifacts.uinfo.inundationduration; + +import org.apache.log4j.Logger; +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.river.artifacts.states.DefaultState; + +/** State in which to fetch years for sedminent load calculation. */ +public class LoadScenarioSelect extends DefaultState { + private static final long serialVersionUID = 1L; + /** The log used in this class. */ + private static Logger log = Logger.getLogger(LoadScenarioSelect.class); + + /** + * The default constructor that initializes an empty State object. + */ + public LoadScenarioSelect() { + } + + /** Year Select Widget. */ + @Override + protected String getUIProvider() { + return "minfo.sedimentload_year_select"; // TODO: eigenes Panel oder allgemeineren Code und an SCENARIO AUS DB ANPASSEN! + } + + @Override + public boolean validate(final Artifact artifact) throws IllegalArgumentException { + return true; + // final CollisionLoadYearEpochAccess access = new CollisionLoadYearEpochAccess((D4EArtifact) artifact); + // + // // Second year should be later than first. + // if (access.getYears() == null || access.getYears().length == 0) + // return true; // TODO: richtig in CollisionLoadYear... implementieren + // // throw new IllegalArgumentException("error_years_wrong"); + // + // return true; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/LoadYearSelect.java Tue May 08 15:21:23 2018 +0200 @@ -0,0 +1,46 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.artifacts.uinfo.inundationduration; + +import org.apache.log4j.Logger; +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.river.artifacts.states.DefaultState; + +/** State in which to fetch years for sedminent load calculation. */ +public class LoadYearSelect extends DefaultState { + private static final long serialVersionUID = 1L; + /** The log used in this class. */ + private static Logger log = Logger.getLogger(LoadYearSelect.class); + + /** + * The default constructor that initializes an empty State object. + */ + public LoadYearSelect() { + } + + /** Year Select Widget. */ + @Override + protected String getUIProvider() { + return "uinfo.inundationduration.load_year_select"; + } + + @Override + public boolean validate(final Artifact artifact) throws IllegalArgumentException { + return true; + // final CollisionLoadYearEpochAccess access = new CollisionLoadYearEpochAccess((D4EArtifact) artifact); + // + // // Second year should be later than first. + // if (access.getYears() == null || access.getYears().length == 0) + // return true; // TODO: richtig in CollisionLoadYear... implementieren + // // throw new IllegalArgumentException("error_years_wrong"); + // + // return true; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/YearChoice.java Tue May 08 15:21:23 2018 +0200 @@ -0,0 +1,34 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.artifacts.uinfo.inundationduration; + +import java.util.ArrayList; +import java.util.List; + +import org.dive4elements.river.artifacts.states.RadioSelect; + +/** + * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> + */ +public class YearChoice extends RadioSelect { + private static final long serialVersionUID = 1L; + + public YearChoice() { + super(); + } + + @Override + protected List<String> makeEntries() { + final List<String> entries = new ArrayList<>(); + entries.add("state.uinfo.year"); + entries.add("state.uinfo.epoch"); + return entries; + + } +} \ No newline at end of file
--- a/artifacts/src/main/resources/messages.properties Mon May 07 17:25:53 2018 +0200 +++ b/artifacts/src/main/resources/messages.properties Tue May 08 15:21:23 2018 +0200 @@ -75,11 +75,18 @@ state.minfo.t_per_a = t/a state.minfo.m3_per_a = m\u00b3/a +state.uinfo.year_epoch = Year/Epoch +state.uinfo.load.year= Year +state.uinfo.load.epoch=Epoch +state.uinfo.year=Year +state.uinfo.epoch=Epoch + state.sinfo.year_epoch = Year/Epoch state.sinfo.load.year= Year(s) state.sinfo.load.epoch=Epoch(s) state.sinfo.year=Year state.sinfo.epoch=Epoch + state.sinfo.riverside.left = Linkes Ufer state.sinfo.riverside.right = Rechtes Ufer state.sinfo.riverside.both = Beide Ufer @@ -862,7 +869,6 @@ state.sinfo.wspl.active = Ja state.sinfo.wspl.inactive = Nein help.state.sinfo.wspl= ${help.url}/OnlineHilfe/SINFO#help.state.sinfo.wspl - state.sinfo.grounding.year = Jahr/Zeitraum state.sinfo.grounding.year.option1 = Jahr state.sinfo.grounding.year.option1 = Zeitraum @@ -1000,7 +1006,7 @@ sinfo.export.csv.meta.header.sounding.current = ##METADATEN PEILUNG aktuell sinfo.export.csv.meta.header.sounding.historical = ##METADATEN PEILUNG historisch sinfo.export.csv.meta.header.waterlevel.current = ##METADATEN WASSERSPIEGELLAGE aktuell -sinfo.export.csv.meta.header.waterlevel.historical = ##METADATEN WASSERSPIEGELLAGE historisch +sinfo.export.csv.meta.header.waterlevel.historical = ##METADATEN WASSERSPIEGELLAGE historisch sinfo.export.csv.header.flowdepth.development = Flie\u00dftiefenentwicklung sinfo.export.pdf.header.flowdepth.development = Flie\u00dftiefen-entwicklung sinfo.export.csv.header.flowdepth.development.per.year = Flie\u00dftiefenent-wicklung pro Jahr @@ -1019,6 +1025,9 @@ flowdepthdevelopmentcalculation.yearDifferenceCurrent = aktuelles Differenzenpaar flowdepthdevelopmentcalculation.yearDifferenceHistorical = = historisches Differenzenpaar +state.uinfo.inundation.vegetation=Einteilung der Vegetationszonen und \u00dcberflutunsgdauern +state.uinfo.inundation.use_scenario=Szenariobetrachtung +state.uinfo.inundation.scenario = Werte f\u00fcr \u00c4nderung der Sohl- bzw. Mittelwasserlage eingeben state.uinfo.use_scenario=Szenariobetrachtung useScenario.option = Zus\u00e4tzlich Szenariobetrachtung miteinbeziehen? useScenario.active = Activ @@ -1036,7 +1045,6 @@ state.uinfo.distance_only = Range selection help.state.uinfo.distance_only = ${help.url}/OnlineHilfe/UINFO#help.state.uinfo.distance_only - uinfo_salix_line = Salix-Linie uinfo_inundation_duration = \u00dcberflutungsdauern Aue uinfo_vegetation_zones = Vegetationszonen
--- a/artifacts/src/main/resources/messages_de.properties Mon May 07 17:25:53 2018 +0200 +++ b/artifacts/src/main/resources/messages_de.properties Tue May 08 15:21:23 2018 +0200 @@ -75,11 +75,18 @@ state.minfo.t_per_a = t/a state.minfo.m3_per_a = m\u00b3/a +state.uinfo.year_epoch = Jahr/Epoche +state.uinfo.load.year= Jahr +state.uinfo.load.epoch=Epoche +state.uinfo.year=Jahr +state.uinfo.epoch=Epoche + state.sinfo.year_epoch = Jahr/Epoche state.sinfo.load.year= Jahr(e) state.sinfo.load.epoch=Epoche(n) state.sinfo.year=Jahr state.sinfo.epoch=Epoche + state.sinfo.riverside.left = Linkes Ufer state.sinfo.riverside.right = Rechtes Ufer state.sinfo.riverside.both = Beide Ufer @@ -861,8 +868,7 @@ state.sinfo.wspl.option = Wasserspiegellagen zus\u00e4tzlich darstellen? state.sinfo.wspl.active = Ja state.sinfo.wspl.inactive = Nein -help.state.sinfo.wspl= ${help.url}/OnlineHilfe/SINFO#help.state.sinfo.wspll - +help.state.sinfo.wspl= ${help.url}/OnlineHilfe/SINFO#help.state.sinfo.wspl state.sinfo.grounding.year = Jahr/Zeitraum state.sinfo.grounding.year.option1 = Jahr state.sinfo.grounding.year.option1 = Zeitraum @@ -1002,7 +1008,7 @@ sinfo.export.csv.meta.header.waterlevel.current = ##METADATEN WASSERSPIEGELLAGE aktuell sinfo.export.csv.meta.header.waterlevel.historical = ##METADATEN WASSERSPIEGELLAGE historisch sinfo.export.pdf.header.flowdepth.development = Flie\u00dftiefen-entwicklung -sinfo.export.csv.header.flowdepth.development = Flie\u00dftiefenentwicklung +sinfo.export.csv.header.flowdepth.development = Flie\u00dftiefenentwicklung sinfo.export.csv.header.flowdepth.development.per.year = Flie\u00dftiefenent-wicklung pro Jahr sinfo.export.csv.header.waterlevel.difference = \u0394WSPL sinfo.export.pdf.header.waterlevel.difference = dWSPL @@ -1019,6 +1025,9 @@ flowdepthdevelopmentcalculation.yearDifferenceCurrent = aktuelles Differenzenpaar flowdepthdevelopmentcalculation.yearDifferenceHistorical = = historisches Differenzenpaar +state.uinfo.inundation.vegetation=Einteilung der Vegetationszonen und \u00dcberflutunsgdauern +state.uinfo.inundation.use_scenario=Szenariobetrachtung +state.uinfo.inundation.scenario = Werte f\u00fcr \u00c4nderung der Sohl- bzw. Mittelwasserlage eingeben state.uinfo.use_scenario=Szenariobetrachtung useScenario.option = Zus\u00e4tzlich Szenariobetrachtung miteinbeziehen? useScenario.active = Ja @@ -1036,7 +1045,6 @@ state.uinfo.distance_only = Wahl der Berechnungsstrecke help.state.uinfo.distance_only = ${help.url}/OnlineHilfe/SINFO#help.state.sinfo.distance_only - uinfo_salix_line = Salix-Linie uinfo_inundation_duration = \u00dcberflutungsdauern Aue uinfo_vegetation_zones = Vegetationszonen @@ -1059,7 +1067,7 @@ uinfo.export.csv.meta.header.salix.historical = ##Historische Betrachtung uinfo.export.csv.meta.header.salix.historical.zeitpunkt = # Historischer Zeitpunkt uinfo.export.csv.meta.header.salix.historical.zeitart = # Art des Zeitraums - uinfo.export.csv.meta.header.veg.name = Vegetationszonen +uinfo.export.csv.meta.header.veg.name = Vegetationszonen uinfo.export.csv.meta.header.veg.dauervon = \u00dcberflutungsdauer von [d/a] uinfo.export.csv.meta.header.veg.dauerbis = \u00dcberflutungsdauer bis [d/a]
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RadioPanel.java Mon May 07 17:25:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RadioPanel.java Tue May 08 15:21:23 2018 +0200 @@ -8,14 +8,7 @@ package org.dive4elements.river.client.client.ui; -import com.google.gwt.core.client.GWT; - -import com.smartgwt.client.widgets.Canvas; -import com.smartgwt.client.widgets.Label; -import com.smartgwt.client.widgets.form.DynamicForm; -import com.smartgwt.client.widgets.form.fields.RadioGroupItem; -import com.smartgwt.client.widgets.layout.HLayout; -import com.smartgwt.client.widgets.layout.VLayout; +import java.util.LinkedHashMap; import org.dive4elements.river.client.shared.model.Data; import org.dive4elements.river.client.shared.model.DataItem; @@ -23,7 +16,13 @@ import org.dive4elements.river.client.shared.model.DefaultData; import org.dive4elements.river.client.shared.model.DefaultDataItem; -import java.util.LinkedHashMap; +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.RadioGroupItem; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; public class RadioPanel extends AbstractUIProvider { @@ -33,15 +32,15 @@ protected DynamicForm form; @Override - public Canvas createOld(DataList dataList) { - Data data = dataList.get(0); - DataItem[] items = data.getItems(); + public Canvas createOld(final DataList dataList) { + final Data data = dataList.get(0); + final DataItem[] items = data.getItems(); - HLayout layout = new HLayout(); - Label label = new Label(dataList.getLabel()); - Label value = new Label(items[0].getLabel()); + final HLayout layout = new HLayout(); + final Label label = new Label(dataList.getLabel()); + final Label value = new Label(items[0].getLabel()); - layout.setHeight(35); + layout.setHeight(35); // hat Einfluss auf Layout in der Übersicht (oben) nach Setzen des Wertes für den State layout.setWidth(400); label.setWidth(200); @@ -53,52 +52,49 @@ } @Override - public Canvas create(DataList dataList) { - Data data = dataList.get(0); - DataItem[] items = data.getItems(); + public Canvas create(final DataList dataList) { + final Data data = dataList.get(0); + final DataItem[] items = data.getItems(); this.dataName = data.getLabel(); - VLayout layout = new VLayout(); - Label label = new Label(data.getDescription()); - RadioGroupItem rgi = new RadioGroupItem("selection"); + final VLayout layout = new VLayout(); + final Label label = new Label(data.getDescription()); + final RadioGroupItem rgi = new RadioGroupItem("selection"); rgi.setShowTitle(false); GWT.log("items: " + items.length); - LinkedHashMap<String, String> elems = - new LinkedHashMap<String, String>(); - for (int i = 0; i < items.length; i++) { - GWT.log(items[i].getStringValue() + "; " + items[i].getLabel()); - elems.put(items[i].getStringValue(), items[i].getLabel()); + final LinkedHashMap<String, String> elems = new LinkedHashMap<String, String>(); + for (final DataItem item : items) { + GWT.log(item.getStringValue() + "; " + item.getLabel()); + elems.put(item.getStringValue(), item.getLabel()); } rgi.setValueMap(elems); rgi.setDefaultValue(items[0].getStringValue()); - form = new DynamicForm(); - form.setFields(rgi); + this.form = new DynamicForm(); + this.form.setFields(rgi); layout.setMembersMargin(10); layout.setHeight(35); label.setHeight(35); layout.addMember(label); - layout.addMember(form); + layout.addMember(this.form); layout.addMember(getNextButton()); layout.setMembersMargin(10); - //initDefaultValues(dataList); + // initDefaultValues(dataList); return layout; } @Override protected Data[] getData() { - String value = form.getValueAsString("selection"); - DataItem item = new DefaultDataItem( - this.dataName, this.dataName, value); - return new Data[] { new DefaultData( - this.dataName, null, null, new DataItem[]{item})}; + final String value = this.form.getValueAsString("selection"); + final DataItem item = new DefaultDataItem(this.dataName, this.dataName, value); + return new Data[] { new DefaultData(this.dataName, null, null, new DataItem[] { item }) }; } - protected String getTitle(DataItem item) { + protected String getTitle(final DataItem item) { return item.getLabel(); } }
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/UIProviderFactory.java Mon May 07 17:25:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/UIProviderFactory.java Tue May 08 15:21:23 2018 +0200 @@ -22,9 +22,13 @@ import org.dive4elements.river.client.client.ui.minfo.SedLoadEpochPanel; import org.dive4elements.river.client.client.ui.minfo.SedLoadPeriodPanel; import org.dive4elements.river.client.client.ui.minfo.SedLoadSQTiPanel; +import org.dive4elements.river.client.client.ui.sinfo.CollisionLoadEpochPanel; import org.dive4elements.river.client.client.ui.sinfo.FlowDepthMinMaxTwinPanel; import org.dive4elements.river.client.client.ui.sinfo.FlowDepthTwinPanel; import org.dive4elements.river.client.client.ui.sq.SQPeriodPanel; +import org.dive4elements.river.client.client.ui.uinfo.InundationDurLoadEpochPanel; +import org.dive4elements.river.client.client.ui.uinfo.LoadSingleEpochPanel; +import org.dive4elements.river.client.client.ui.uinfo.LoadSingleYearPanel; import org.dive4elements.river.client.shared.model.User; /** @@ -143,6 +147,14 @@ return new SedLoadPeriodPanel(); } else if (uiProvider.equals("minfo.sedimentload_epoch_select")) { return new SedLoadEpochPanel(); + } else if (uiProvider.equals("sinfo.collision.load_epoch_select")) { + return new CollisionLoadEpochPanel(); + } else if (uiProvider.equals("uinfo.inundation_duration.load_epoch_select")) { + return new InundationDurLoadEpochPanel(); + } else if (uiProvider.equals("uinfo.inundationduration.load_year_select")) { + return new LoadSingleYearPanel(); + } else if (uiProvider.equals("uinfo.inundationduration.load_epoch_select")) { + return new LoadSingleEpochPanel(); } else if (uiProvider.equals("minfo.sedimentload_sqti_select")) { return new SedLoadSQTiPanel(); } else if (uiProvider.equals("hws_datacage_panel")) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sinfo/CollisionLoadEpochPanel.java Tue May 08 15:21:23 2018 +0200 @@ -0,0 +1,383 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.client.client.ui.sinfo; + +import java.util.ArrayList; +import java.util.List; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.SedimentLoadInfoService; +import org.dive4elements.river.client.client.services.SedimentLoadInfoServiceAsync; +import org.dive4elements.river.client.client.ui.AbstractUIProvider; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoObject; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoRecord; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.validator.IsIntegerValidator; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.grid.events.RecordClickEvent; +import com.smartgwt.client.widgets.grid.events.RecordClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +public class CollisionLoadEpochPanel extends AbstractUIProvider { + protected SedimentLoadInfoServiceAsync sedLoadInfoService = GWT.create(SedimentLoadInfoService.class); + + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected ListGrid elements; + private TextItem start; + private TextItem end; + private ListGrid sedLoadTable; // TODO: Datenquelle für Collision richtig wählen! Sediment komplett eliminieren + + protected List<String> validYears; + + public Canvas createWidget(final DataList data) { + final HLayout input = new HLayout(); + final VLayout root = new VLayout(); + final VLayout grid = new VLayout(); + final VLayout intFields = new VLayout(); + final Button add = new Button(this.MSG.add_date()); + this.elements = new ListGrid(); + + final Label title = new Label(data.get(0).getDescription()); + title.setHeight("25px"); + + final DynamicForm form = new DynamicForm(); + form.setNumCols(4); + this.start = new TextItem(this.MSG.from()); + this.start.setWidth(60); + this.start.setValidators(new IsIntegerValidator()); + this.end = new TextItem(this.MSG.to()); + this.end.setWidth(60); + this.end.setValidators(new IsIntegerValidator()); + form.setFields(this.start, this.end); + add.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent ce) { + final String v1 = CollisionLoadEpochPanel.this.start.getValueAsString(); + final String v2 = CollisionLoadEpochPanel.this.end.getValueAsString(); + if (v1 == null || v2 == null) { + return; + } + if (!isValidEpoch(v1, v2)) { + return; + } + final ListGridRecord r = new ListGridRecord(); + r.setAttribute("from", v1); + r.setAttribute("to", v2); + CollisionLoadEpochPanel.this.elements.addData(r); + } + }); + + final Label sel = new Label(this.MSG.select()); + sel.setHeight(25); + this.elements.setWidth(185); + this.elements.setHeight(120); + this.elements.setShowHeaderContextMenu(false); + this.elements.setCanReorderFields(false); + this.elements.setCanSort(false); + this.elements.setCanEdit(false); + final ListGridField from = new ListGridField("from", this.MSG.from()); + final ListGridField to = new ListGridField("to", this.MSG.to()); + from.setWidth(70); + to.setWidth(70); + + final ListGridField removeField = new ListGridField("_removeRecord", "Remove Record") { + { + setType(ListGridFieldType.ICON); + setIcon(GWT.getHostPageBaseURL() + CollisionLoadEpochPanel.this.MSG.removeFeature()); + setCanEdit(false); + setCanFilter(false); + setCanSort(false); + setCanGroupBy(false); + setCanFreeze(false); + setWidth(25); + } + }; + + this.elements.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent event) { + // Just handle remove-clicks + if (!event.getField().getName().equals(removeField.getName())) { + return; + } + event.getViewer().removeData(event.getRecord()); + } + }); + + this.elements.setFields(from, to, removeField); + + intFields.addMember(form); + intFields.addMember(add); + grid.addMember(sel); + grid.addMember(this.elements); + input.addMember(intFields); + input.addMember(grid); + root.addMember(title); + root.addMember(input); + + return root; + } + + @Override + public Canvas createOld(final DataList dataList) { + final HLayout layout = new HLayout(); + layout.setWidth("400px"); + final VLayout vLayout = new VLayout(); + vLayout.setWidth(130); + final Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + label.setHeight(25); + + final List<Data> items = dataList.getAll(); + final Data str = getData(items, "epochs"); + final DataItem[] strItems = str.getItems(); + + final String[] pairs = strItems[0].getLabel().split(";"); + for (final String pair : pairs) { + final String[] vals = pair.split(","); + final Label dateLabel = new Label(vals[0] + " - " + vals[1]); + dateLabel.setHeight(20); + vLayout.addMember(dateLabel); + } + final Canvas back = getBackButton(dataList.getState()); + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + @Override + public Canvas create(final DataList data) { + final VLayout layout = new VLayout(); + final Canvas helper = createHelper(); + this.helperContainer.addMember(helper); + + final Canvas submit = getNextButton(); + final Canvas widget = createWidget(data); + + layout.addMember(widget); + layout.addMember(submit); + + fetchSedimentLoadData(); + + return layout; + } + + private Canvas createHelper() { + this.sedLoadTable = new ListGrid(); + this.sedLoadTable.setShowHeaderContextMenu(false); + this.sedLoadTable.setWidth100(); + this.sedLoadTable.setShowRecordComponents(true); + this.sedLoadTable.setShowRecordComponentsByCell(true); + this.sedLoadTable.setHeight100(); + this.sedLoadTable.setEmptyMessage(this.MSG.empty_table()); + this.sedLoadTable.setCanReorderFields(false); + + /* Input support pins */ + final String baseUrl = GWT.getHostPageBaseURL(); + final ListGridField pinFrom = new ListGridField("fromIcon", this.MESSAGES.from()); + pinFrom.setWidth(30); + pinFrom.setType(ListGridFieldType.ICON); + pinFrom.setCellIcon(baseUrl + this.MESSAGES.markerGreen()); + + final ListGridField pinTo = new ListGridField("toIcon", this.MESSAGES.to()); + pinTo.setType(ListGridFieldType.ICON); + pinTo.setWidth(30); + pinTo.setCellIcon(baseUrl + this.MESSAGES.markerRed()); + + pinFrom.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent e) { + final Record r = e.getRecord(); + CollisionLoadEpochPanel.this.start.setValue(r.getAttribute("date")); + } + }); + + pinTo.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent e) { + final Record r = e.getRecord(); + CollisionLoadEpochPanel.this.end.setValue(r.getAttribute("date")); + } + }); + + final ListGridField date = new ListGridField("date", this.MSG.year()); + date.setType(ListGridFieldType.TEXT); + date.setWidth(100); + + final ListGridField descr = new ListGridField("description", this.MSG.description()); + descr.setType(ListGridFieldType.TEXT); + descr.setWidth("*"); + + this.sedLoadTable.setFields(pinFrom, pinTo, date, descr); + return this.sedLoadTable; + } + + @Override + protected Data[] getData() { + final List<Data> data = new ArrayList<Data>(); + + final ListGridRecord[] lgr = this.elements.getRecords(); + if (lgr.length == 0) { + return new Data[0]; + } + String d = ""; + for (final ListGridRecord element : lgr) { + final Record r = element; + d += r.getAttribute("from") + "," + r.getAttribute("to"); + d += ";"; + } + + final DataItem item = new DefaultDataItem("epochs", null, d); + data.add(new DefaultData("epochs", null, null, new DataItem[] { item })); + return data.toArray(new Data[data.size()]); + } + + protected void fetchSedimentLoadData() { + final Config config = Config.getInstance(); + final String locale = config.getLocale(); + + final ArtifactDescription adescr = this.artifact.getArtifactDescription(); + final DataList[] data = adescr.getOldData(); + + final double[] km = this.artifact.getArtifactDescription().getKMRange(); + final String river = this.artifact.getArtifactDescription().getRiver(); + + String sq_ti_id = ""; + this.validYears = new ArrayList<String>(data.length); + for (final DataList element : data) { + final Data str = getData(element.getAll(), "sq_ti_id"); + if (str != null) { + final DataItem[] strItems = str.getItems(); + sq_ti_id = strItems[0].getStringValue(); + break; + } + } + + if (sq_ti_id.isEmpty()) { + GWT.log("Failed to find sq time interval id in data."); + } + + this.sedLoadInfoService.getSedimentLoadInfo(locale, river, "single", km[0], km[1], sq_ti_id, new AsyncCallback<SedimentLoadInfoObject[]>() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("Could not recieve sediment load informations."); + SC.warn(CollisionLoadEpochPanel.this.MSG.getString(caught.getMessage())); + } + + @Override + public void onSuccess(final SedimentLoadInfoObject[] sedLoad) { + final int num = sedLoad != null ? sedLoad.length : 0; + GWT.log("Recieved " + num + " sediment load informations."); + + if (num == 0) { + return; + } + + addSedimentLoadInfo(sedLoad); + } + }); + } + + protected void addSedimentLoadInfo(final SedimentLoadInfoObject[] sedLoad) { + for (final SedimentLoadInfoObject sl : sedLoad) { + final SedimentLoadInfoRecord rec = new SedimentLoadInfoRecord(sl); + this.sedLoadTable.addData(rec); + this.validYears.add(rec.getDate()); + } + } + + /* + * Validate the epoch input. We do this here and not in an overridden + * validate method as we want to validate before an epoch is added + * to the list of epochs. + */ + protected boolean isValidEpoch(final String y1, final String y2) { + // First check that both are integer + int iY1; + int iY2; + final List<String> errors = new ArrayList<String>(); + try { + iY1 = Integer.parseInt(y1); + } + catch (final NumberFormatException e) { + errors.add(this.MESSAGES.wrongFormat() + ": " + y1); + } + try { + iY2 = Integer.parseInt(y2); + } + catch (final NumberFormatException e) { + errors.add(this.MESSAGES.wrongFormat() + ": " + y2); + } + if (!errors.isEmpty()) { + showErrors(errors); + return false; + } + boolean startIsGood = false; + boolean endIsGood = false; + for (final String validYear : this.validYears) { + if (startIsGood || y1.equals(validYear)) { + startIsGood = true; + } + if (endIsGood || y2.equals(validYear)) { + endIsGood = true; + } + if (startIsGood && endIsGood) { + break; + } + /* + * alternative check if data lies in between + * int aYear = Integer.parseInt(validYear); + * if (aYear >= iY1 && aYear <= iY2) { + * isGood = true; + * break; + * } + */ + } + if (!startIsGood) { + String tmp = this.MESSAGES.no_data_for_year(); + tmp = tmp.replace("$1", y1); + errors.add(tmp); + } + if (!endIsGood) { + String tmp = this.MESSAGES.no_data_for_year(); + tmp = tmp.replace("$1", y2); + errors.add(tmp); + } + if (!errors.isEmpty()) { + showErrors(errors); + return false; + } + return true; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/InundationDurLoadEpochPanel.java Tue May 08 15:21:23 2018 +0200 @@ -0,0 +1,383 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.client.client.ui.uinfo; + +import java.util.ArrayList; +import java.util.List; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.SedimentLoadInfoService; +import org.dive4elements.river.client.client.services.SedimentLoadInfoServiceAsync; +import org.dive4elements.river.client.client.ui.AbstractUIProvider; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoObject; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoRecord; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.validator.IsIntegerValidator; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.grid.events.RecordClickEvent; +import com.smartgwt.client.widgets.grid.events.RecordClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +public class InundationDurLoadEpochPanel extends AbstractUIProvider { + protected SedimentLoadInfoServiceAsync sedLoadInfoService = GWT.create(SedimentLoadInfoService.class); + + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected ListGrid elements; + private TextItem start; + private TextItem end; + private ListGrid sedLoadTable; // TODO: Datenquelle für Collision richtig wählen! Sediment komplett eliminieren + + protected List<String> validYears; + + public Canvas createWidget(final DataList data) { + final HLayout input = new HLayout(); + final VLayout root = new VLayout(); + final VLayout grid = new VLayout(); + final VLayout intFields = new VLayout(); + final Button add = new Button(this.MSG.add_date()); + this.elements = new ListGrid(); + + final Label title = new Label(data.get(0).getDescription()); + title.setHeight("25px"); + + final DynamicForm form = new DynamicForm(); + form.setNumCols(4); + this.start = new TextItem(this.MSG.from()); + this.start.setWidth(60); + this.start.setValidators(new IsIntegerValidator()); + this.end = new TextItem(this.MSG.to()); + this.end.setWidth(60); + this.end.setValidators(new IsIntegerValidator()); + form.setFields(this.start, this.end); + add.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent ce) { + final String v1 = InundationDurLoadEpochPanel.this.start.getValueAsString(); + final String v2 = InundationDurLoadEpochPanel.this.end.getValueAsString(); + if (v1 == null || v2 == null) { + return; + } + if (!isValidEpoch(v1, v2)) { + return; + } + final ListGridRecord r = new ListGridRecord(); + r.setAttribute("from", v1); + r.setAttribute("to", v2); + InundationDurLoadEpochPanel.this.elements.addData(r); + } + }); + + final Label sel = new Label(this.MSG.select()); + sel.setHeight(25); + this.elements.setWidth(185); + this.elements.setHeight(120); + this.elements.setShowHeaderContextMenu(false); + this.elements.setCanReorderFields(false); + this.elements.setCanSort(false); + this.elements.setCanEdit(false); + final ListGridField from = new ListGridField("from", this.MSG.from()); + final ListGridField to = new ListGridField("to", this.MSG.to()); + from.setWidth(70); + to.setWidth(70); + + final ListGridField removeField = new ListGridField("_removeRecord", "Remove Record") { + { + setType(ListGridFieldType.ICON); + setIcon(GWT.getHostPageBaseURL() + InundationDurLoadEpochPanel.this.MSG.removeFeature()); + setCanEdit(false); + setCanFilter(false); + setCanSort(false); + setCanGroupBy(false); + setCanFreeze(false); + setWidth(25); + } + }; + + this.elements.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent event) { + // Just handle remove-clicks + if (!event.getField().getName().equals(removeField.getName())) { + return; + } + event.getViewer().removeData(event.getRecord()); + } + }); + + this.elements.setFields(from, to, removeField); + + intFields.addMember(form); + intFields.addMember(add); + grid.addMember(sel); + grid.addMember(this.elements); + input.addMember(intFields); + input.addMember(grid); + root.addMember(title); + root.addMember(input); + + return root; + } + + @Override + public Canvas createOld(final DataList dataList) { + final HLayout layout = new HLayout(); + layout.setWidth("400px"); + final VLayout vLayout = new VLayout(); + vLayout.setWidth(130); + final Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + label.setHeight(25); + + final List<Data> items = dataList.getAll(); + final Data str = getData(items, "epochs"); + final DataItem[] strItems = str.getItems(); + + final String[] pairs = strItems[0].getLabel().split(";"); + for (final String pair : pairs) { + final String[] vals = pair.split(","); + final Label dateLabel = new Label(vals[0] + " - " + vals[1]); + dateLabel.setHeight(20); + vLayout.addMember(dateLabel); + } + final Canvas back = getBackButton(dataList.getState()); + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + @Override + public Canvas create(final DataList data) { + final VLayout layout = new VLayout(); + final Canvas helper = createHelper(); + this.helperContainer.addMember(helper); + + final Canvas submit = getNextButton(); + final Canvas widget = createWidget(data); + + layout.addMember(widget); + layout.addMember(submit); + + fetchSedimentLoadData(); + + return layout; + } + + private Canvas createHelper() { + this.sedLoadTable = new ListGrid(); + this.sedLoadTable.setShowHeaderContextMenu(false); + this.sedLoadTable.setWidth100(); + this.sedLoadTable.setShowRecordComponents(true); + this.sedLoadTable.setShowRecordComponentsByCell(true); + this.sedLoadTable.setHeight100(); + this.sedLoadTable.setEmptyMessage(this.MSG.empty_table()); + this.sedLoadTable.setCanReorderFields(false); + + /* Input support pins */ + final String baseUrl = GWT.getHostPageBaseURL(); + final ListGridField pinFrom = new ListGridField("fromIcon", this.MESSAGES.from()); + pinFrom.setWidth(30); + pinFrom.setType(ListGridFieldType.ICON); + pinFrom.setCellIcon(baseUrl + this.MESSAGES.markerGreen()); + + final ListGridField pinTo = new ListGridField("toIcon", this.MESSAGES.to()); + pinTo.setType(ListGridFieldType.ICON); + pinTo.setWidth(30); + pinTo.setCellIcon(baseUrl + this.MESSAGES.markerRed()); + + pinFrom.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent e) { + final Record r = e.getRecord(); + InundationDurLoadEpochPanel.this.start.setValue(r.getAttribute("date")); + } + }); + + pinTo.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent e) { + final Record r = e.getRecord(); + InundationDurLoadEpochPanel.this.end.setValue(r.getAttribute("date")); + } + }); + + final ListGridField date = new ListGridField("date", this.MSG.year()); + date.setType(ListGridFieldType.TEXT); + date.setWidth(100); + + final ListGridField descr = new ListGridField("description", this.MSG.description()); + descr.setType(ListGridFieldType.TEXT); + descr.setWidth("*"); + + this.sedLoadTable.setFields(pinFrom, pinTo, date, descr); + return this.sedLoadTable; + } + + @Override + protected Data[] getData() { + final List<Data> data = new ArrayList<Data>(); + + final ListGridRecord[] lgr = this.elements.getRecords(); + if (lgr.length == 0) { + return new Data[0]; + } + String d = ""; + for (final ListGridRecord element : lgr) { + final Record r = element; + d += r.getAttribute("from") + "," + r.getAttribute("to"); + d += ";"; + } + + final DataItem item = new DefaultDataItem("epochs", null, d); + data.add(new DefaultData("epochs", null, null, new DataItem[] { item })); + return data.toArray(new Data[data.size()]); + } + + protected void fetchSedimentLoadData() { + final Config config = Config.getInstance(); + final String locale = config.getLocale(); + + final ArtifactDescription adescr = this.artifact.getArtifactDescription(); + final DataList[] data = adescr.getOldData(); + + final double[] km = this.artifact.getArtifactDescription().getKMRange(); + final String river = this.artifact.getArtifactDescription().getRiver(); + + String sq_ti_id = ""; + this.validYears = new ArrayList<String>(data.length); + for (final DataList element : data) { + final Data str = getData(element.getAll(), "sq_ti_id"); + if (str != null) { + final DataItem[] strItems = str.getItems(); + sq_ti_id = strItems[0].getStringValue(); + break; + } + } + + if (sq_ti_id.isEmpty()) { + GWT.log("Failed to find sq time interval id in data."); + } + + this.sedLoadInfoService.getSedimentLoadInfo(locale, river, "single", km[0], km[1], sq_ti_id, new AsyncCallback<SedimentLoadInfoObject[]>() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("Could not recieve sediment load informations."); + SC.warn(InundationDurLoadEpochPanel.this.MSG.getString(caught.getMessage())); + } + + @Override + public void onSuccess(final SedimentLoadInfoObject[] sedLoad) { + final int num = sedLoad != null ? sedLoad.length : 0; + GWT.log("Recieved " + num + " sediment load informations."); + + if (num == 0) { + return; + } + + addSedimentLoadInfo(sedLoad); + } + }); + } + + protected void addSedimentLoadInfo(final SedimentLoadInfoObject[] sedLoad) { + for (final SedimentLoadInfoObject sl : sedLoad) { + final SedimentLoadInfoRecord rec = new SedimentLoadInfoRecord(sl); + this.sedLoadTable.addData(rec); + this.validYears.add(rec.getDate()); + } + } + + /* + * Validate the epoch input. We do this here and not in an overridden + * validate method as we want to validate before an epoch is added + * to the list of epochs. + */ + protected boolean isValidEpoch(final String y1, final String y2) { + // First check that both are integer + int iY1; + int iY2; + final List<String> errors = new ArrayList<String>(); + try { + iY1 = Integer.parseInt(y1); + } + catch (final NumberFormatException e) { + errors.add(this.MESSAGES.wrongFormat() + ": " + y1); + } + try { + iY2 = Integer.parseInt(y2); + } + catch (final NumberFormatException e) { + errors.add(this.MESSAGES.wrongFormat() + ": " + y2); + } + if (!errors.isEmpty()) { + showErrors(errors); + return false; + } + boolean startIsGood = false; + boolean endIsGood = false; + for (final String validYear : this.validYears) { + if (startIsGood || y1.equals(validYear)) { + startIsGood = true; + } + if (endIsGood || y2.equals(validYear)) { + endIsGood = true; + } + if (startIsGood && endIsGood) { + break; + } + /* + * alternative check if data lies in between + * int aYear = Integer.parseInt(validYear); + * if (aYear >= iY1 && aYear <= iY2) { + * isGood = true; + * break; + * } + */ + } + if (!startIsGood) { + String tmp = this.MESSAGES.no_data_for_year(); + tmp = tmp.replace("$1", y1); + errors.add(tmp); + } + if (!endIsGood) { + String tmp = this.MESSAGES.no_data_for_year(); + tmp = tmp.replace("$1", y2); + errors.add(tmp); + } + if (!errors.isEmpty()) { + showErrors(errors); + return false; + } + return true; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/LoadSingleEpochPanel.java Tue May 08 15:21:23 2018 +0200 @@ -0,0 +1,383 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.client.client.ui.uinfo; + +import java.util.ArrayList; +import java.util.List; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.SedimentLoadInfoService; +import org.dive4elements.river.client.client.services.SedimentLoadInfoServiceAsync; +import org.dive4elements.river.client.client.ui.AbstractUIProvider; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoObject; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoRecord; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.validator.IsIntegerValidator; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.grid.events.RecordClickEvent; +import com.smartgwt.client.widgets.grid.events.RecordClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +public class LoadSingleEpochPanel extends AbstractUIProvider { + protected SedimentLoadInfoServiceAsync sedLoadInfoService = GWT.create(SedimentLoadInfoService.class); + + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected ListGrid elements; + private TextItem start; + private TextItem end; + private ListGrid sedLoadTable; + + protected List<String> validYears; + + public Canvas createWidget(final DataList data) { + final HLayout input = new HLayout(); + final VLayout root = new VLayout(); + final VLayout grid = new VLayout(); + final VLayout intFields = new VLayout(); + final Button add = new Button(this.MSG.add_date()); + this.elements = new ListGrid(); + + final Label title = new Label(data.get(0).getDescription()); + title.setHeight("25px"); + + final DynamicForm form = new DynamicForm(); + form.setNumCols(4); + this.start = new TextItem(this.MSG.from()); + this.start.setWidth(60); + this.start.setValidators(new IsIntegerValidator()); + this.end = new TextItem(this.MSG.to()); + this.end.setWidth(60); + this.end.setValidators(new IsIntegerValidator()); + form.setFields(this.start, this.end); + add.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent ce) { + final String v1 = LoadSingleEpochPanel.this.start.getValueAsString(); + final String v2 = LoadSingleEpochPanel.this.end.getValueAsString(); + if (v1 == null || v2 == null) { + return; + } + if (!isValidEpoch(v1, v2)) { + return; + } + final ListGridRecord r = new ListGridRecord(); + r.setAttribute("from", v1); + r.setAttribute("to", v2); + LoadSingleEpochPanel.this.elements.addData(r); + } + }); + + final Label sel = new Label(this.MSG.select()); + sel.setHeight(25); + this.elements.setWidth(185); + this.elements.setHeight(120); + this.elements.setShowHeaderContextMenu(false); + this.elements.setCanReorderFields(false); + this.elements.setCanSort(false); + this.elements.setCanEdit(false); + final ListGridField from = new ListGridField("from", this.MSG.from()); + final ListGridField to = new ListGridField("to", this.MSG.to()); + from.setWidth(70); + to.setWidth(70); + + final ListGridField removeField = new ListGridField("_removeRecord", "Remove Record") { + { + setType(ListGridFieldType.ICON); + setIcon(GWT.getHostPageBaseURL() + LoadSingleEpochPanel.this.MSG.removeFeature()); + setCanEdit(false); + setCanFilter(false); + setCanSort(false); + setCanGroupBy(false); + setCanFreeze(false); + setWidth(25); + } + }; + + this.elements.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent event) { + // Just handle remove-clicks + if (!event.getField().getName().equals(removeField.getName())) { + return; + } + event.getViewer().removeData(event.getRecord()); + } + }); + + this.elements.setFields(from, to, removeField); + + intFields.addMember(form); + intFields.addMember(add); + grid.addMember(sel); + grid.addMember(this.elements); + input.addMember(intFields); + input.addMember(grid); + root.addMember(title); + root.addMember(input); + + return root; + } + + @Override + public Canvas createOld(final DataList dataList) { + final HLayout layout = new HLayout(); + layout.setWidth("400px"); + final VLayout vLayout = new VLayout(); + vLayout.setWidth(130); + final Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + label.setHeight(25); + + final List<Data> items = dataList.getAll(); + final Data str = getData(items, "epochs"); + final DataItem[] strItems = str.getItems(); + + final String[] pairs = strItems[0].getLabel().split(";"); + for (final String pair : pairs) { + final String[] vals = pair.split(","); + final Label dateLabel = new Label(vals[0] + " - " + vals[1]); + dateLabel.setHeight(20); + vLayout.addMember(dateLabel); + } + final Canvas back = getBackButton(dataList.getState()); + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + @Override + public Canvas create(final DataList data) { + final VLayout layout = new VLayout(); + final Canvas helper = createHelper(); + this.helperContainer.addMember(helper); + + final Canvas submit = getNextButton(); + final Canvas widget = createWidget(data); + + layout.addMember(widget); + layout.addMember(submit); + + fetchSedimentLoadData(); + + return layout; + } + + private Canvas createHelper() { + this.sedLoadTable = new ListGrid(); + this.sedLoadTable.setShowHeaderContextMenu(false); + this.sedLoadTable.setWidth100(); + this.sedLoadTable.setShowRecordComponents(true); + this.sedLoadTable.setShowRecordComponentsByCell(true); + this.sedLoadTable.setHeight100(); + this.sedLoadTable.setEmptyMessage(this.MSG.empty_table()); + this.sedLoadTable.setCanReorderFields(false); + + /* Input support pins */ + final String baseUrl = GWT.getHostPageBaseURL(); + final ListGridField pinFrom = new ListGridField("fromIcon", this.MESSAGES.from()); + pinFrom.setWidth(30); + pinFrom.setType(ListGridFieldType.ICON); + pinFrom.setCellIcon(baseUrl + this.MESSAGES.markerGreen()); + + final ListGridField pinTo = new ListGridField("toIcon", this.MESSAGES.to()); + pinTo.setType(ListGridFieldType.ICON); + pinTo.setWidth(30); + pinTo.setCellIcon(baseUrl + this.MESSAGES.markerRed()); + + pinFrom.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent e) { + final Record r = e.getRecord(); + LoadSingleEpochPanel.this.start.setValue(r.getAttribute("date")); + } + }); + + pinTo.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent e) { + final Record r = e.getRecord(); + LoadSingleEpochPanel.this.end.setValue(r.getAttribute("date")); + } + }); + + final ListGridField date = new ListGridField("date", this.MSG.year()); + date.setType(ListGridFieldType.TEXT); + date.setWidth(100); + + final ListGridField descr = new ListGridField("description", this.MSG.description()); + descr.setType(ListGridFieldType.TEXT); + descr.setWidth("*"); + + this.sedLoadTable.setFields(pinFrom, pinTo, date, descr); + return this.sedLoadTable; + } + + @Override + protected Data[] getData() { + final List<Data> data = new ArrayList<Data>(); + + final ListGridRecord[] lgr = this.elements.getRecords(); + if (lgr.length == 0) { + return new Data[0]; + } + String d = ""; + for (final ListGridRecord element : lgr) { + final Record r = element; + d += r.getAttribute("from") + "," + r.getAttribute("to"); + d += ";"; + } + + final DataItem item = new DefaultDataItem("epochs", null, d); + data.add(new DefaultData("epochs", null, null, new DataItem[] { item })); + return data.toArray(new Data[data.size()]); + } + + protected void fetchSedimentLoadData() { + final Config config = Config.getInstance(); + final String locale = config.getLocale(); + + final ArtifactDescription adescr = this.artifact.getArtifactDescription(); + final DataList[] data = adescr.getOldData(); + + final double[] km = this.artifact.getArtifactDescription().getKMRange(); + final String river = this.artifact.getArtifactDescription().getRiver(); + + String sq_ti_id = ""; + this.validYears = new ArrayList<String>(data.length); + for (final DataList element : data) { + final Data str = getData(element.getAll(), "sq_ti_id"); + if (str != null) { + final DataItem[] strItems = str.getItems(); + sq_ti_id = strItems[0].getStringValue(); + break; + } + } + + if (sq_ti_id.isEmpty()) { + GWT.log("Failed to find sq time interval id in data."); + } + + this.sedLoadInfoService.getSedimentLoadInfo(locale, river, "single", km[0], km[1], sq_ti_id, new AsyncCallback<SedimentLoadInfoObject[]>() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("Could not recieve sediment load informations."); + SC.warn(LoadSingleEpochPanel.this.MSG.getString(caught.getMessage())); + } + + @Override + public void onSuccess(final SedimentLoadInfoObject[] sedLoad) { + final int num = sedLoad != null ? sedLoad.length : 0; + GWT.log("Recieved " + num + " sediment load informations."); + + if (num == 0) { + return; + } + + addSedimentLoadInfo(sedLoad); + } + }); + } + + protected void addSedimentLoadInfo(final SedimentLoadInfoObject[] sedLoad) { + for (final SedimentLoadInfoObject sl : sedLoad) { + final SedimentLoadInfoRecord rec = new SedimentLoadInfoRecord(sl); + this.sedLoadTable.addData(rec); + this.validYears.add(rec.getDate()); + } + } + + /* + * Validate the epoch input. We do this here and not in an overridden + * validate method as we want to validate before an epoch is added + * to the list of epochs. + */ + protected boolean isValidEpoch(final String y1, final String y2) { + // First check that both are integer + int iY1; + int iY2; + final List<String> errors = new ArrayList<String>(); + try { + iY1 = Integer.parseInt(y1); + } + catch (final NumberFormatException e) { + errors.add(this.MESSAGES.wrongFormat() + ": " + y1); + } + try { + iY2 = Integer.parseInt(y2); + } + catch (final NumberFormatException e) { + errors.add(this.MESSAGES.wrongFormat() + ": " + y2); + } + if (!errors.isEmpty()) { + showErrors(errors); + return false; + } + boolean startIsGood = false; + boolean endIsGood = false; + for (final String validYear : this.validYears) { + if (startIsGood || y1.equals(validYear)) { + startIsGood = true; + } + if (endIsGood || y2.equals(validYear)) { + endIsGood = true; + } + if (startIsGood && endIsGood) { + break; + } + /* + * alternative check if data lies in between + * int aYear = Integer.parseInt(validYear); + * if (aYear >= iY1 && aYear <= iY2) { + * isGood = true; + * break; + * } + */ + } + if (!startIsGood) { + String tmp = this.MESSAGES.no_data_for_year(); + tmp = tmp.replace("$1", y1); + errors.add(tmp); + } + if (!endIsGood) { + String tmp = this.MESSAGES.no_data_for_year(); + tmp = tmp.replace("$1", y2); + errors.add(tmp); + } + if (!errors.isEmpty()) { + showErrors(errors); + return false; + } + return true; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/LoadSingleYearPanel.java Tue May 08 15:21:23 2018 +0200 @@ -0,0 +1,296 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.client.client.ui.uinfo; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.validator.IsIntegerValidator; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.grid.events.RecordClickHandler; +import com.smartgwt.client.widgets.grid.events.RecordClickEvent; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.SedimentLoadInfoService; +import org.dive4elements.river.client.client.services.SedimentLoadInfoServiceAsync; +import org.dive4elements.river.client.client.ui.AbstractUIProvider; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoObject; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoRecord; + + +public class LoadSingleYearPanel +extends AbstractUIProvider +{ + protected SedimentLoadInfoServiceAsync sedLoadInfoService = + GWT.create(SedimentLoadInfoService.class); + + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + private TextItem yearsItem; + + private ListGrid sedLoadTable; + + protected List<String> validYears; + + public LoadSingleYearPanel () { + } + + @Override + public Canvas createOld(DataList dataList) { + List<Data> items = dataList.getAll(); + Data years = getData(items, "years"); + DataItem[] yearsItems = years.getItems(); + + String v1 = yearsItems[0].getStringValue().replace(" ", ", "); + + Label old = new Label(v1); + HLayout layout = new HLayout(); + layout.setWidth("400px"); + + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + + Canvas back = getBackButton(dataList.getState()); + + layout.addMember(label); + layout.addMember(old); + layout.addMember(back); + + return layout; + } + + @Override + public List<String> validate() { + return validateYears(); + } + + @Override + public Canvas create(DataList data) { + VLayout layout = new VLayout(); + + Canvas helper = createHelper(); + this.helperContainer.addMember(helper); + + Canvas submit = getNextButton(); + Canvas widget = createWidget(data); + + layout.addMember(widget); + layout.addMember(submit); + + fetchSedimentLoadData(); + + return layout; + } + + private Canvas createHelper() { + sedLoadTable = new ListGrid(); + sedLoadTable.setShowHeaderContextMenu(false); + sedLoadTable.setWidth100(); + sedLoadTable.setShowRecordComponents(true); + sedLoadTable.setShowRecordComponentsByCell(true); + sedLoadTable.setHeight100(); + sedLoadTable.setEmptyMessage(MSG.empty_table()); + sedLoadTable.setCanReorderFields(false); + + ListGridField date = new ListGridField("date", MSG.year()); + date.setType(ListGridFieldType.TEXT); + date.setWidth(100); + + ListGridField descr = + new ListGridField("description", MSG.description()); + descr.setType(ListGridFieldType.TEXT); + descr.setWidth("*"); + + String baseUrl = GWT.getHostPageBaseURL(); + ListGridField pinFrom = new ListGridField( + "fromIcon", MESSAGES.selection()); + pinFrom.setWidth (60); + pinFrom.setType (ListGridFieldType.ICON); + pinFrom.setCellIcon(baseUrl + MESSAGES.markerGreen()); + + pinFrom.addRecordClickHandler (new RecordClickHandler () { + @Override + public void onRecordClick (RecordClickEvent e) { + Record r = e.getRecord(); + appendYear(r.getAttribute("date")); + } + }); + + sedLoadTable.setFields(pinFrom, date, descr); + return sedLoadTable; + } + + public Canvas createWidget(DataList data) { + VLayout layout = new VLayout(); + + Label title = new Label(data.get(0).getDescription()); + title.setHeight("25px"); + + DynamicForm form = new DynamicForm(); + form.setNumCols(4); + yearsItem = new TextItem(MSG.years()); + yearsItem.setValidators(new IsIntegerValidator()); + form.setFields(yearsItem); + + layout.addMember(title); + layout.addMember(form); + + return layout; + } + + @Override + protected Data[] getData() { + validateYears(); + if (yearsItem != null && !yearsItem.getValueAsString().isEmpty()) { + List<Data> data = new ArrayList<Data>(); + + DataItem yearsdata = new DefaultDataItem( + "years", "years", yearsItem.getValueAsString().trim()); + data.add(new DefaultData( + "years", + null, + null, + new DataItem[] { yearsdata })); + + return data.toArray(new Data[data.size()]); + } + return new Data[0]; + } + + protected List<String> validateYears() { + List<String> errors = new ArrayList<String>(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + if (yearsItem.getValueAsString() == null || + yearsItem.getValueAsString().trim().isEmpty()) { + errors.add(MESSAGES.empty_filter()); + return errors; + } + + String [] sValues = yearsItem.getValueAsString().trim().split(" "); + String filtered = ""; + int goodValues = 0; + for (String sValue: sValues) { + int value; + try { + value = Integer.parseInt(sValue); + } catch (NumberFormatException e) { + errors.add(MESSAGES.wrongFormat() + ": " + sValue); + continue; + } + boolean isGood = false; + for (String validYear: validYears) { + /* No list contains for strings? */ + if (sValue.equals(validYear)) { + isGood = true; + break; + } + } + if (!isGood) { + String tmp = MESSAGES.no_data_for_year(); + tmp = tmp.replace("$1", sValue); + errors.add(tmp); + continue; + } + goodValues++; + if (goodValues > 1) { + filtered += " " + Integer.toString(value); + } else { + filtered = Integer.toString(value); + } + } + + return errors; + } + + protected void fetchSedimentLoadData() { + Config config = Config.getInstance(); + String locale = config.getLocale (); + + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList[] data = adescr.getOldData(); + + double[] km = artifact.getArtifactDescription().getKMRange(); + String river = artifact.getArtifactDescription().getRiver(); + + String sq_ti_id = ""; + validYears = new ArrayList<String>(data.length); + for (int i = 0; i < data.length; i++) { + Data str = getData(data[i].getAll(), "sq_ti_id"); + if (str != null) { + DataItem[] strItems = str.getItems(); + sq_ti_id = strItems[0].getStringValue(); + break; + } + } + + if (sq_ti_id.isEmpty()){ + GWT.log("Failed to find sq time interval id in data."); + } + + sedLoadInfoService.getSedimentLoadInfo( + locale, river, "single", km[0], km[1], sq_ti_id, + new AsyncCallback<SedimentLoadInfoObject[]>() { + public void onFailure(Throwable caught) { + GWT.log("Could not recieve sediment load informations."); + SC.warn(MSG.getString(caught.getMessage())); + } + + public void onSuccess(SedimentLoadInfoObject[] sedLoad) { + int num = sedLoad != null ? sedLoad.length :0; + GWT.log("Recieved " + num + " sediment load informations."); + + if (num == 0) { + return; + } + + addSedimentLoadInfo(sedLoad); + } + } + ); + } + + + protected void addSedimentLoadInfo (SedimentLoadInfoObject[] sedLoad) { + for(SedimentLoadInfoObject sl: sedLoad) { + SedimentLoadInfoRecord rec = new SedimentLoadInfoRecord(sl); + sedLoadTable.addData(rec); + validYears.add(rec.getDate()); + } + } + + protected void appendYear (String year) { + String oldYears = yearsItem.getValueAsString(); + if (oldYears != null && !oldYears.isEmpty()) { + yearsItem.setValue(oldYears.trim() + " " + year); + } else { + yearsItem.setValue(year); + } + } +}