# HG changeset patch # User Sascha L. Teichmann # Date 1366896217 -7200 # Node ID 5aa05a7a34b7dabc857689439fade0ed17548638 # Parent d9901a08d0a6e12914ed2a4757fab407b14f2aa8 Rename modules to more fitting names. diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/CHANGES --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/CHANGES Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,310 @@ +2011-09-19 RELEASE 2.5 + + NEW: + + * Introduced the concept of a "datacage": the datacage is a service that + provides a list of chart themes that fit to a given chart type. The + service accepts a user uuid, the uuid of a master Artifact, the name + of the output type and a set of further string parameters. In general, + we distinguish between user-specific datacage and system-specific + datacage: + The user-specific datacage returns themes provided by old + calculations computed by the user. + The system-specific datacage returns themes that might be generated + using the data stored in the flys-backend. + + * Introduced a database used by the datacage that stores information + about Artifacts, their outputs and their facets. This database + requires synchronization with the Artifact database. The intent of + this database is to have a fast access to data stored in Artifacts. + + * Introduced a mechanism to clone existing Artifacts (with or without + restrictions). For cloning an Artifact, it is necessary to specify the + UUID of a "model Artifact". The clone will be based on that model by + extracting all required data from it. + + * Introduced "recommendations": recommendations are themes in charts or + maps (Artifacts/Facets) that should be added automatically to an + existing chart/map. They are provided by the datacage. + + * Introduced new Artifact types to provide further chart themes: + - Annotations + - Mainvalues + + * Introduced new Facet type WMSLayerFacet. This type stores all required + information (server url, layer names, layer extent, layer srid) to + display a WMS layer in a WMS client. + + * Introduced a new chart output "Querprofildiagramm". This output + calculates a waterlevel and displays it as single line together with + one or more cross section lines ("Querprofilspuren"). + + * Introduced a new chart output "W-Differenzen". This output calculates + waterlevel differences based on at least two waterlevels (a + "W-Differenzen" output can consist of more than a single waterlevel + difference calculation). Each waterlevel difference calculation + results in three chart themes: two W curves and a W-Differences curve. + + * Introduced a new output "Ãœberschwemmungskarte". The visualization of + this output is a map. One of the map's layers is a WMS layer that + displays the calculation result of WSPLGEN (external C++ tool). + + * Improved the rendering process of chart themes: the styles configured + for themes are now used. + + * Improved the DistanceInfoService: it supports filters to filter the + type of items returned by this service (reduces the number of returned + items of course). + + * Introduced a CSV export for "W-Differenzen". + + * Downgraded GNU Trove to 1.1-beta-5 (later versions have been removed + from maven repositories). + + + FIXES: + + * flys/issue135 (Diagramm: Trotz abgeschalteter Themen bleiben Beschriftungen bestehen) + + * flys/issue159 (WINFO: Radiobutton - Ortsauswahl bei "W für ungleichwertigen Abflusslängsschnitt" entfernen) + + * flys/issue160 (WINFO: Auswahltabelle Orte bei Modus Strecke nach Step-Back) + + * flys/issue176 (Diagramm: Benennung eines Abflusses bei gewählter Höhe am Pegel) + + * flys/issue180 (WINFO: Zeilen der Tabelle können nach der Markierung in die Zwischenablage kopiert werden.) + + * flys/issue181 (Erstes Thema in der Themenliste wählt sich automatisch wieder an) + + * flys/issue191 (AT-Export: Längsten monoton steigenden Bereich exportieren.) + + * flys/issue219 (W-INFO: Abflusskurvenberechnung / keine Themen im Diagramm) + + * flys/issue254 (Datenkorb: Klonen von Artefakten in anderen Collections + Facettenfilter zum Ausblenden) + + * flys/issue256 (Datenkorb: XXX Issue festhalten) + + * flys/issue258 (Datenkorb: Outs statt States führen) + + * flys/issue259 (Daten aus Datenkorb in Diagramm einladen) + + * flys/issue260 (Datenkorb: Masterartefakt in View aufführen) + + * flys/issue262 (Datenkorb: Vereinigung der beiden Konfigurations-Templates) + + * flys/issue279 (WINFO: Elbe Wasserspiegellage - Index Out of Bounds) + + * flys/issue280 (BoundingBoxen von Streckenfavoriten und Haupt- und Extremwerten unsichtbar machen) + + * flys/issue281 (Karte: Auswahl der berechnten Wasserspiegellage über Inline-Datenkorb) + + * flys/issue282 (Karte: Abstand interpolierte Profile - Default wert) + + * flys/issue290 (Karte: Eingabe von Differenzen zw. WSP und Gelände findet keine Ausprägung in der Karte) + + * flys/issue303 (Keine Streckenfavoriten, wenn nur Q im Längsschnittdiagram ausgewählt) + + * flys/issue309 (Querprofil: Manuelle Eingabe funktioniert nicht nach Return (nur nach Tab)) + + * flys/issue310 (Querprofil: Farben der Themen) + + * flys/issue311 (Querprofil: i18n) + + + +2011-06-27 RELEASE 2.4 + + NEW: + + * Finalized the Facet concept: output modes and the output generation + are now based on facets. Facets are created dynamically by an Artifact + based on the results of a calculation. + + * Introduced a report mechanism that gives feedback of calculation + problems. + + * Introduced output modes that generate XML document with calculation + report information. + + * Introduced deactivated themes in charts: such themes are not rendered. + + * Introduced a cache to store distance info per river. + + * Introduced output modes that generate XML documents which contain meta + information of charts as axes ranges, data ranges and a transformation + matrix that allows to transform image coordinates into chart + coordinates. + + * Added support for zoom values in Chart output modes. + + * Added support for min/max values in DESCRIBE documents. + + * Added "Oberkante" and "Unterkante" columns to distance info service. + + * Added a new export mode to save data in AT format. + + * Improved performance while storing/loading Q values of WST columns. + + * Improved the WQ values validation for calculation 1 & 4. + + * Improved calculations to work independent of "from"/"to" order of + kilometer ranges. + + * Improved the input of WQ values for calculation 1. We distinguish + between a selected Q at a given gauge or a selected Q that doesn't + base on a given gauge. + + * Allow "from" to be greater than "to" in kilometer ranges. + + * Write default values of the user into the Artifact's DESCRIBE + document (flys/issue40). + + + FIXES: + + * flys/issue62 Artifacts no longer share their data with each other. + + * flys/issue77 Added titles for themes in duration curve charts. + + * flys/issue81 + + * flys/issue82 Fixed NPE after a calculation has taken place. + + * flys/issue84 + + * flys/issue85 Fixed location input for calculation 1 & 4. + + * flys/issue86 Fixed Q determination based on a given W. + + * flys/issue90 Removed space between chart axes and chart area. + + * flys/issue93 Renamed calculation 4. + + * flys/issue103 Append values selected by the user in the correct format + to the DESCRIBE document of Artifacts (uses i18n). + + * flys/issue147 + + * flys/issue150 Invert the X axis correctly for charts of type + calculation 1 & 4. + + * flys/issue154 Repaired computed discharge curve that broke after the + facets had been finalized. + + * flys/issue157 Discharge curve charts (computed an static) will now + have a lower x value set to "1". + + * flys/issue161 Longitudinal section chart's second Y axis will + initially start at Q=0. + + * flys/issue164 Improved input validation for WQ input of calculation 4. + + * flys/issue172 Duration curve charts will now have a lower x value set + to "0". + + * flys/issue173 Fixed broken gauge determination in calculation 4. + + * flys/issue174 Repaired broken upper margin between chart data and + chart border in longitudinal section charts. + + * Added missing "Corrected W" facet for results of calculation 4. + + * Map datasets in duration curve charts to the correct axes. + + * Fixed broken XPath to detect output modes in an attribute document of + a Collection. + + * Feed operation will no longer save data if the validation of the given + values failed. + + + +2011-05-19 RELEASE 2.3.1 + + NEW: + + * New export format for waterlevels: WST. + + * Added descriptions for the curves of the following charts: + - discharge curves (dt. 'Abflusskurven am Pegel') + - computed discharge curves (dt. 'berechnete Abflusskurven') + - longitudinal section curves (dt. 'Längsschnitt') + - discharge longitudinal section curves (dt. 'Abflusslängsschnitt') + + * Number formatting is done in a central place/class. + + FIXES: + + * flys/issue47 (Diagramm: Farbliche Unterscheidung von Abfluß und Wasserstand) + + * flys/issue52 (WINFO: W-Längsschnitt - Wasser jeweils von links nach rechts laufen lassen) + + * flys/issue53 (WINFO/Berechnungsausgabe: Kilometerierung und Wasserstände werden zum Teil mit vielen Nachkommastellen angezeigt) + + * flys/issue66: (i18n: Untertitel bei Längsschnitten - Bereich der Strecke enthält "double") + + * flys/issue67 (WINFO: Längsschnitt - Wasser fließt bergauf) + + * flys/issue72: (WINFO: Q/W/D-Info liefert selten eine Antwort) + + + +2011-05-13 RELEASE 2.3 + + NEW: + + * Initial release of the artifacts for FLYS. Currently there is a single + WINFO artifact for the following computations: + - waterlevels + - discharge curves + - duration curves + - discharge longitudinal section curves + + * Configuration is placed in doc/conf/conf.xml + + * WINFO Artifact specific configuration is placed in + doc/conf/artifacts/winfo.xml + + * So called 'OutGenerators' produce different types of output. + Currently, the flys-artifacts are able to produce charts and exports. + Each output type has to be configured in conf.xml. + + * New chart types: + - discharge curves (dt. 'Abflusskurven am Pegel') + - computed discharge curves (dt. 'Abflusskurve') + - longitudinal section curves (dt. 'Längsschnitte') + - duration curves (dt. 'Dauerlinie') + - discharge longitudinal section curve (dt. 'W bei + ungleichmäßigem Abflusslängsschnitt') + + * New exports: + - csv of waterlevels + - csv of duration curves + - csv of computed discharge curves + - csv of discharge longitudinal section + + * New services that provides: + - supported rivers + - main values of a gauge + - range information of a river + - meta information of a river + + * Caching of computation relevant values + + * Initial model to support chart specific themes (theme.xml) + + + LIMITATIONS: + + * Charts are not rendered using the themes in theme.xml + + + !!! + + The version number of this release depends on an existing desktop variant of + this software that is in version 2.1. + + !!! + + +2011-03-30 RELEASE 0.1 diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/ChangeLog-before-20121017 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/ChangeLog-before-20121017 Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,22056 @@ +2012-10-17 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java: + Let FIX_SECTOR_AVERAGE_DWT*-Facets enter inactively. + +2012-10-17 Felix Wolfsteller + + Fix loading former derivative curves in fixation analysis artifacts + DC. + + * flys-artifacts/doc/conf/meta-data.xml: Fix typo. + +2012-10-17 Björn Ricks + + * doc/conf/artifacts/gaugedischargecurve.xml, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java, + src/main/resources/messages.properties, + src/main/resources/messages_de.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties: + Add data for the gauge name to the GaugeDischargeCurveArtifact. + +2012-10-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/DoubleUtil.java(explode): + Return empty double array if we are up to create a negative + result array. This should fix some problems in + "Fixierungsanalyse/Auslagerung von Wasserspiegellagen". + +2012-10-16 Björn Ricks + + * doc/conf/default-themes.xml, + doc/conf/themes.xml: + Add theme for gauge discharge curve artifact. + +2012-10-16 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java: + Set uiprovider on the state. + +2012-10-16 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/AbstractStaticStateArtifact.java: + Use StaticState class instead of State in member staticstate. + Override describe method to return also a uiprovider. + +2012-10-16 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java: + Change visibility of createOutputModes to protected. + +2012-10-16 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Avoid NullPointerException if help text is null. + +2012-10-16 Ingo Weinzierl + + flys/issue930 + + * src/main/java/de/intevation/flys/artifacts/access/Access.java: Added new + method to retrieve long[] values separated with a ';'. + + * src/main/java/de/intevation/flys/artifacts/access/HistoricalDischargeAccess.java: + New. Access class to retrieve information for historical discharge + curves. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Add the evaluation timerange provided by HistoricalDischargeAccess to + the subtitle of those charts. + + * src/main/resources/messages.properties, + src/main/resources/messages_de.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties: Added start and end date to + subtitle of historical discharge curve charts. + +2012-10-16 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/access/BedHeightAccess.java, + src/main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java: + Workaround for double facets in "Mittlere SohlhÃhe" (#961). + +2012-10-16 Felix Wolfsteller + + Fix issue946. + + * flys-artifacts/doc/conf/meta-data.xml: Load wkms with different + parameter for fix wq curves. + + * flys-artifacts/doc/conf/artifacts/fixanalysis.xml: + Add new facet to compat list. + + * flys-artifacts/doc/conf/default-themes.xml, + flys-artifacts/doc/conf/second-themes.xml, + flys-artifacts/doc/conf/themes.xml: + Added new theme/mapping. + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Register new facet type. + + * flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Handle "new" Facet. + +2012-10-16 Christian Lins + + * src/main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java, + src/main/resources/messages_de.properties, + src/main/resources/messages_de_DE.properties: + Fix typo + +2012-10-16 Ingo Weinzierl + + flys/issue930 + + * src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java: + Add unit [cm] to the facet description if calculation mode is W. + +2012-10-15 Ingo Weinzierl + + flys/issue904 + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Defined two constants for converting discharge table values into [cm]. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: + Use the new constants for value conversion for master discharge table + and historical discharge tables. + +2012-10-15 Ingo Weinzierl + + flys/issue548 + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: + Use SCALE=1 for fetching values of a discharge table. In future, all + discharge tables should be stored in [cm] in database. Currently, + historical discharge tables are in [cm], so no transformation is + necessary. + +2012-10-13 Felix Wolfsteller + + Improve on issue945/6 + + * flys-artifacts/doc/conf/meta-data.xml: Add nodes for W/Q-only + mainvalues. + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Create only W/Q values if corresponding data given. + +2012-10-13 Felix Wolfsteller + + Improve on issue945/1 + + * flys-artifacts/doc/conf/meta-data.xml: Recommend main values + in computed discharge curves. + +2012-10-12 Felix Wolfsteller + + Improve on issue943/4 + + * flys-artifacts/doc/conf/meta-data.xml: Do not show double + annotation entry in LS DC. + +2012-10-12 Felix Wolfsteller + + Improve on issue943/4 + + * flys-artifacts/doc/conf/meta-data.xml: Show an "all" node in DC + for annotations per type. + +2012-10-12 Felix Wolfsteller + + Fix issue943/3 + + * flys-artifacts/doc/conf/meta-data.xml: Add Floodprotections to + LS non-recommendations. + +2012-10-12 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Help future developers. + +2012-10-12 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/access/RiverAccess.java: + Improve code drastically. + +2012-10-12 Felix Wolfsteller + + * flys-artifacts/doc/conf/artifacts/winfo.xml: Include new state and + transition for extreme value q input per segment. + +2012-10-12 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/extreme/ExtremeQInput.java: + New, initial Input state for Q input per segment in extreme analysis + path. + +2012-10-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/DischargeInfoService.java: + Insert the date as time millis for each discharge curve. + +2012-10-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurements.java: + Added debug output to detect where data got lost. + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Fixed problem with losing meassurement points. There are still bugs left. + +2012-10-08 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeCalculation.java, + flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/OutliersInput.java: + Documentation. + +2012-10-08 Felix Wolfsteller + + * flys-artifacts/doc/conf/artifacts/winfo.xm: Introduce another + dummyish state for extreme value analysis. + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/extreme/PercentInput.java: + New State to get percentage as input. + +2012-10-08 Felix Wolfsteller + + * flys-artifacts/doc/conf/artifacts/winfo.xm: Introduce dummyish states for + extreme value analysis. + + * flys-artifacts/src/main/resources/messages.properties, + flys-artifacts/src/main/resources/messages_de.properties, + flys-artifacts/src/main/resources/messages_de_DE.properties, + flys-artifacts/src/main/resources/messages_en.properties: + i18n. + +2012-10-08 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java, + flys-artifacts/src/main/java/de/intevation/flys/utils/FLYSUtils.java: + Validate partial strings. + +2012-10-08 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/access/ExtremeAccess.java, + flys-artifacts/src/main/java/de/intevation/flys/artifacts/charts/TimeseriesStepChart.java, + flys-artifacts/src/main/java/de/intevation/flys/utils/DoubleUtil.java: + Doc. + +2012-10-05 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java, + flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/extreme/ExtremeCompute.java, + flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/fixation/FunctionSelect.java, + flys-artifacts/src/main/java/de/intevation/flys/artifacts/transitions/ValueCompareTransition.java: + Cosmetics, docs. + +2012-10-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java, + src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java, + src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java, + src/main/java/de/intevation/flys/artifacts/model/ManagedDomFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java, + src/main/java/de/intevation/flys/artifacts/model/WQKmsFactory.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightFactory.java, + src/main/java/de/intevation/flys/artifacts/services/BedKMChartService.java, + src/main/java/de/intevation/flys/artifacts/services/BedloadKMChartService.java, + src/main/java/de/intevation/flys/artifacts/states/OutputState.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/EventSelect.java, + src/main/java/de/intevation/flys/exports/BooleanAttribute.java, + src/main/java/de/intevation/flys/exports/ChoiceStringAttribute.java, + src/main/java/de/intevation/flys/exports/DoubleAttribute.java, + src/main/java/de/intevation/flys/exports/IntegerAttribute.java, + src/main/java/de/intevation/flys/exports/StringAttribute.java, + src/main/java/de/intevation/flys/exports/VisibleAttribute.java: + More dead code removal. Minor code clean ups. + +2012-10-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java, + src/main/java/de/intevation/flys/artifacts/model/map/WSPLGENCalculation.java, + src/main/java/de/intevation/flys/collections/CollectionAttribute.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Cleaned up iterating over maps. Removed some dead code. + +2012-10-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/artifacts/ChartArtifact.java, + src/main/java/de/intevation/flys/artifacts/MapArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java, + src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java, + src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java, + src/main/java/de/intevation/flys/artifacts/states/EnterMultipleLocationsState.java, + src/main/java/de/intevation/flys/artifacts/states/ReferenceGaugeState.java, + src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java, + src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FunctionSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/PreprocessingSelect.java, + src/main/java/de/intevation/flys/artifacts/states/minfo/DifferenceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/minfo/YearEpochSelect.java, + src/main/java/de/intevation/flys/exports/OutputHelper.java, + src/main/java/de/intevation/flys/themes/DefaultTheme.java: + Removed dead code. + +2012-10-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java, + src/main/java/de/intevation/flys/jfree/CollisionFreeXYTextAnnotation.java, + src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Removed dead code. + +2012-10-06 Sascha L. Teichmann + + * main/java/de/intevation/flys/exports/LegendProcessor.java: + Removed superfluous import. + + * main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + main/java/de/intevation/flys/exports/FlowVelocityGenerator.java, + main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java, + main/java/de/intevation/flys/exports/NormalizedReferenceCurveGenerator.java, + main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java, + main/java/de/intevation/flys/utils/MapfileGenerator.java: + Removed dead code. + +2012-10-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/LegendProcessor.java: + Avoid redundant hashing. Removed dead code. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: + Fix for ArrayIndexOutOfBoundsException (#818). + +2012-10-05 Christian Lins + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Add chart legend entries for interpolated series (#838). + +2012-10-05 Felix Wolfsteller + + * doc/conf/meta-data.xml: Fix typo. + +2012-10-05 Felix Wolfsteller + + Register new calculation mode "extreme". + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + + * src/main/resources/messages.properties, + src/main/resources/messages_de.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties: + i18n. + +2012-10-05 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/access/ExtremeAccess.java, + flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeCalculation.java: + Documentation. + +2012-10-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Removed dead code. + +2012-10-04 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Prefer to use static method on Class (vs. on object). + +2012-10-04 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/states/StaticState.java: + Allow to set an uiprovider for a static state. + +2012-10-04 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java: + Set translated data descriptions. + +2012-10-04 Björn Ricks + + * src/main/resources/messages.properties, + src/main/resources/messages_de.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties: + Add messages for displaying the river name and gauge reference. + +2012-10-04 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeCurveFacet.java: + Add description from message template for facet and set correct facet + name. + +2012-10-04 Felix Wolfsteller + + Fix issue889/2 . + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Do not AIOOB on wsts with one (or zero) value only. + +2012-10-04 Björn Ricks + + * src/main/resources/messages.properties, + src/main/resources/messages_de.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties: + Add template for the gauge discharge curver description + +2012-10-04 Björn Ricks + + * doc/conf/artifacts/gaugedischargecurve.xml: + Fix typo and change type to chart. + +2012-10-04 Björn Ricks + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + Add warning if no compatible facet is found. + +2012-10-04 Björn Ricks + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Avoid NullPointerException if not attribute outs are present. + +2012-10-04 Felix Wolfsteller + + Fix issue417. + + * flys-artifacts/doc/conf/default-themes, + flys-artifacts/doc/conf/second-themes, + flys-artifacts/doc/conf/virtual-themes: + Remove not needed theme props from main-value-annotations. + +2012-10-04 Christian Lins + + * flys-artifacts/src/main/java/de/intevation/flys/exports/LegendProcessor.java, + flys-artifacts/src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Cosmetics, comments. + + * flys-artifacts/src/main/resources/messages.properties, + flys-artifacts/src/main/resources/messages_de.properties, + flys-artifacts/src/main/resources/messages_de_DE.properties, + flys-artifacts/src/main/resources/messages_en.properties: + Add message for 'state.chart.km' (#899). + Add message for 'state.chart.km' (#899). +2012-10-02 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/AnnotationRiverState.java: + If type of annotation was chosen, give facet name of type. + +2012-10-02 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java + (setup): Deal with ids from datacage-doc, expose a data-item with the + annotationtypename. + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java + (getData): filter annotations given by typename, if available. + +2012-10-02 Felix Wolfsteller + + * doc/conf/meta-data.xml: Show "per-type" annotations in + longitudinal-sections DC. + +2012-10-01 Felix Wolfsteller + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java, + flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/LocationProvider.java: + Added TODOs for issue880. + +2012-10-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Totals are now fetched with separate SQL statement. Fixed join to + GEWAESSER table. + +2012-10-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Wrote fractions SQL more compact. Fixed AIOOBE. + +2012-10-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Fixed typo. + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Removed unused field from SQL query. + +2012-10-01 Sascha L. Teichmann + + Finally calculate the S(Q) fractions. TODO: Split SQL into two queries. + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Make the fractions accessible. + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Calculate the fraction. + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Measurements.java: + Store new measurements for fractions in separate list. + +2012-10-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Make it compilable again. + +2012-10-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java, + src/main/java/de/intevation/flys/artifacts/model/sq/Measurements.java: + Generate a second list of accumulated meassurements, + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Do not calculate the adjusted and sieve array for all measurements. + + * src/main/java/de/intevation/flys/artifacts/model/sq/Sieve.java: + Added diameter comparator. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SieveArray.java: + Copy the data if total load is zero. + + +2012-10-01 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/states/StaticState.java: + Add simple default constuctor. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Add a facet type for GaugeDischargeCurveArtifact + + * doc/conf/artifacts/gaugedischargecurve.xml, + flys-artifacts/doc/conf/conf.xml: + Add a config for GaugeDischargeCurveArtifact + +2012-09-30 Sascha L. Teichmann + + * flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Sieve.java: + Model a sieve with diameter and load which simplifies the logic a lot. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SieveArray.java: + New. A standard sieve array with 12 sieves. + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Removed the string lookup crap and move the code to classes. + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Directy generate sieves now not the symbolic string lookup stuff. + +2012-09-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java: + Removed dead code. + +2012-09-30 Christian Lins + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Fixing Delta W/t chart: reference period area can now switched to invisible (#877). + +2012-09-30 Christian Lins + + * src/main/resources/messages.properties, + src/main/resources/messages_de.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties: + Correct i18n for fixation outlier widget (state.fixation.preprocess) (#873). + +2012-09-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeCurveFacet.java: + Removed heavy weight backend data (gauge) from facet. + The relevant data is already available in the artifact. + + !!! Facets should be only used to retrieve data with the help of + !!! the artifact. If the artifact already stores the data or + !!! is able to fetch it for the facet don't replicated it in + !!! the members of the facet. + +2012-09-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/FlowVelocityCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Removed superfluous imports. + +2012-09-29 Christian Lins + + * doc/conf/themes.xml, + src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Manual Points working in Fixing Delta W/t chart (#462). + +2012-09-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + More code for calculating S fractions. Totally broken and incomplete! + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Fetch more data from data base (sieve diameters). + +2012-09-29 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java: + Also add the artifact name to the artifact description. + +2012-09-29 Björn Ricks + + * doc/conf/conf.xml, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeCurveArtifact.java, + src/main/java/de/intevation/flys/artifacts/AbstractStaticStateArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeCurveFacet.java: + Implement new Artifacts and State for displaying discharge curves at a + gauge. + +2012-09-29 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/states/StaticState.java: + Make addOuput public. Allow StaticArtifacts to add static outputs to the + state. + +2012-09-29 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Add protected method addFacets to allow child classes to add facets + without accessing the member variable. + +2012-09-28 Ingo Weinzierl + + * doc/conf/meta-data.xml: Added 'info' column to the dem section of the + datacage. + +2012-09-28 Felix Wolfsteller + + Work on issue724 (i18n in minfo). + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + i18n strings. + +2012-09-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightCalculation.java, + src/main/java/de/intevation/flys/artifacts/states/SoundingsSelect.java: + Whitespace-cosmetics. + + * src/main/java/de/intevation/flys/artifacts/access/FlowVelocityAccess.java: + Doc. + +2012-09-27 Felix Wolfsteller + + Work on issue724 (i18n in minfo). + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + i18n strings. + + * src/main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java: + Fix typo. + +2012-09-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Removed invalid entries of the SQL projection. + +2012-09-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java, + Added more data fields from SedDB to calculate the fraction parts. + + src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Have now previous and next Measurement attached. + +2012-09-27 Felix Wolfsteller + + Fix part of issue871 (selected flow-veloc- parameter shown wrong). + + * src/main/java/de/intevation/flys/artifacts/states/DischargeState.java: + Fix conditional. + +2012-09-27 Felix Wolfsteller + + Fix issue863 (gaps in middle height bed data). + + * src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightCalculation.java: + Handle missing data. + +2012-09-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java: Set + missing 'originalExtent' attribute of the WSPLGEN layer. + +2012-09-27 Felix Wolfsteller + + Towards fix issue863 (gaps in middle height bed data). + + * src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightData.java + (addAll): Do not expose single add*-Methods, instead always add a full + set of data. + Added new isEmpty-data and query it before exporting data as + double[][] to e.g. ChartGenerator. + + * src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightCalculation.java: + Do not use single add()*-Methods, instead call new addAll method. + Find out whether a gap-value is present. + + * src/main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java: + Prevent skipping of NaNs (gaps). + +2012-09-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/map/WMSLayerFacet.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java: + Removed trailing whitespace. + +2012-09-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurements.java + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Add more symbols. + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Adjust symbols. + +2012-09-26 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Change createOutputModes method to be private. It is not used in a child + class. + +2012-09-26 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java: + Mark FLYSArtifact data member as private and add setter method. + +2012-09-26 Christian Lins + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml: + Enable line labels for Delta W/t sector average lines (#896). + +2012-09-26 Ingo Weinzierl + + * doc/conf/mapserver/db_layer.vm: Set initial projection of the database + to "epsg:31467". + + * doc/conf/mapserver/mapfile.vm: Set initial projection of the database to + "epsg:31467". Set the max extent to the extent of the river Saar. + + TODO: Set the max extent to the extent of germany! + + * src/main/java/de/intevation/flys/artifacts/WMSQPSArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHydrBoundaryArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFixpointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodmapsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHwsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSCatchmentArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHydrBoundaryPolyArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSBuildingsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSGaugeLocationArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java, + src/main/java/de/intevation/flys/artifacts/MapArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSLineArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java: + Added a parameter "reproject" to the getExtent() method. If reproject is + set, the method should return the extent of the layer in the projection + that is specified for the relevant river in the configuration. + Otherwise, this method should return the extent in the projection that + is used by the database. + + * src/main/java/de/intevation/flys/artifacts/model/map/WMSLayerFacet.java: + Added new attributes and methods for the original extent of a layer. The + original extent is used in the XML document that is generated by + toXML(). + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: Use the + getOriginalExtent() method of WMSLayerFacet to determine the max extent + for the map (maps should be in the river projection specified in the + configuration). + +2012-09-26 Christian Lins + + * doc/conf/artifacts/fixanalysis.xml, + doc/conf/artifacts/manualpoints.xml, + doc/conf/themes.xml, + src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java, + src/main/java/de/intevation/flys/artifacts/FixationArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java, + src/main/java/de/intevation/flys/artifacts/states/ManualPointsSingleState.java: + Rename fix_derivate facet to enable manual points in the derived curve chart. + +2012-09-25 Felix Wolfsteller + + * doc/conf/artifacts/manualpoints.xml: Re-enable manualpoints + compatibility. + +2012-09-24 Christian Lins + + * src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java: + Fix for #825 ? + +2012-09-24 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadOverview.java: + Fixed SQL statement. Exclude data where km is null. + +2012-09-24 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java: + Fixing analysis longitudinal section chart has now initially + deactivated A1/B facets. W/Q and W(t) has activated facets. (#874) + +2012-09-24 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java: + Remove info-url from gauge and river in the response and add official + number to the river. + +2012-09-23 Christian Lins + + * doc/conf/default-themes.xml, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + W(Q) chart: q sectors are now black and labeled by default (#875). + +2012-09-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/GaugeInfoService.java: + Cosmetics. + +2012-09-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Removed trailing whitespace. + +2012-09-23 Christian Lins + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Themes and i18n of Delta W/t's A1/B facets (#876). + +2012-09-23 Christian Lins + + * doc/conf/artifacts/fixanalysis.xml, + doc/conf/themes.xml, + doc/conf/second-themes.xml, + doc/conf/default-themes.xml, + src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Add reference period facet to delta W/t chart (#877). + +2012-09-22 Christian Lins + + * src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Longitudinal section chart does now respect the bounds of the drawn + areas, so that no clipping occurs (#878). + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + i18n corrections. + +2012-09-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixATWriter.java: + Cosmetics, doc. + +2012-09-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Prevent ArrayIndexOutOfBounds. + +2012-09-22 Felix Wolfsteller + + Document issue880 (extrapolation of wkms). + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Do not extrapolate, mention further issues with the code. + +2012-09-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiffYearResult.java, + src/main/java/de/intevation/flys/artifacts/states/minfo/DifferencesState.java, + src/main/java/de/intevation/flys/exports/minfo/BedDifferenceEpochGenerator.java, + src/main/java/de/intevation/flys/exports/minfo/BedDifferenceYearGenerator.java: + Removed trailing whitespace. + +2012-09-21 Raimund Renkert + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for bedheight difference charts. + +2012-09-21 Raimund Renkert + + * doc/conf/themes.xml, + doc/conf/second-themes.xml, + doc/conf/default-themes.xml: + Added themes for bedheight difference charts. + +2012-09-21 Raimund Renkert + + * doc/conf/meta-data.xml: + Add river annotations to bedheight difference charts. + +2012-09-21 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/minfo/BedDiffHeightYearInfoGenerator.java, + src/main/java/de/intevation/flys/exports/minfo/BedDiffHeightYearGenerator.java, + src/main/java/de/intevation/flys/exports/minfo/BedDiffEpochInfoGenerator.java, + src/main/java/de/intevation/flys/exports/minfo/BedDiffYearInfoGenerator.java, + src/main/java/de/intevation/flys/exports/minfo/BedDifferenceEpochGenerator.java, + src/main/java/de/intevation/flys/exports/minfo/BedDifferenceYearGenerator.java: + New. Chart generators for bedheight diff calculation charts. + + * src/main/java/de/intevation/flys/artifacts/states/minfo/DifferencesState.java: + Add facets to generate outputs. + + * src/main/java/de/intevation/flys/artifacts/access/BedDifferencesAccess.java: + Extract calculation relevant data. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedDifferencesResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiffYearResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiffEpochResult.java: + Updated result set data fields. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiffCalculation.java: + Updated the bedheight difference calculation. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new facet types. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiffEpochFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiffYearFacet.java: + New facets for bedheight differences. + + * doc/conf/conf.xml: + Added ouput generators. + + * doc/conf/artifacts/minfo.xml: + Added facets to outputmodes. + +2012-09-21 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeight.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightSingle.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightEpoch.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightFactory.java: + Updated data fields to fit the needs of bedheight difference calculation. + +2012-09-21 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java: + Return also the gauge official number in a service response. + +2012-09-21 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java: + Use Gauge and River fetchInfoURL instead of getInfoURL until the URLs are + fetched from the db. + +2012-09-21 Felix Wolfsteller + + Fix issue887 (HYKs in New Chart). + + * src/main/java/de/intevation/flys/artifacts/HYKArtifact.java: + Lower the Casting requirement to FLYSArtifact instead of + WINFOArtifact. + +2012-09-21 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java: + Return also the gauge and river info-url in a service response. + +2012-09-20 Felix Wolfsteller + + Fix issue886 (do not show waterline if out of range). + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Do not extrapolate waterlines. + +2012-09-21 Felix Wolfsteller + + Better Partial issue880 (diverse DC). + + * doc/conf/meta-data.xml: Remove double entry for annotations in + longitudinal section case but keep recommending it. + +2012-09-20 Felix Wolfsteller + + Partial issue880 (diverse DC). + + * doc/conf/meta-data.xml: Remove double entry for annotations in + longitudinal section case. + +2012-09-20 Christian Lins + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml, + src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/jfree/StyledAreaSeriesCollection.java, + src/main/java/de/intevation/flys/jfree/StyledDomainMarker.java: + Theme area transparency fixed for longitudinal section chart (#879). + +2012-09-20 Felix Wolfsteller + + Improvements for manual points in fixation diags. + + * doc/conf/artifacts/fixanalysis.xml: Add LS-manual points. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Add missing ChartTypes. + +2012-09-20 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiffCalculation.java: + New. Calcuation for bed height differences. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedDifferencesResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiffEpochResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiffYearResult.java: + New. Bed height calculation results. + + * src/main/java/de/intevation/flys/artifacts/access/BedDifferencesAccess.java: + New. Access object to get bed height difference parameters from artifact. + +2012-09-20 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightFactory.java: + Create separate objects for bed height epochs and single bed heights. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeight.java: + Added morph. width. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightEpoch.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightSingle.java: + New. Separate classes for bed height epochs and single bed heights. + +2012-09-20 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/minfo/BedQualityExporter.java: + Add dates to csv header. + +2012-09-20 Raimund Renkert + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n string for bed quality CSV export. + +2012-09-20 Christian Lins + + * doc/conf/artifacts/fixanalysis.xml, + doc/conf/artifacts/manualpoints.xml, + src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java, + src/main/java/de/intevation/flys/artifacts/states/ManualPointsSingleState.java: + Work on manual points in fix analysis charts (not yet working). + +2012-09-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/minfo/BedQualityExporter.java: + Removed superfluous imports. + +2012-09-19 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/minfo/BedQualityExporter.java: + New. CSV exporter for bed quality calculation result. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadDiameterResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiameterResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedParametersResult.java: + Added getter with km as parameter. + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java: + Added facet for csv export. + + * doc/conf/artifacts/minfo.xml: + Added output mode. + + * doc/conf/conf.xml: + Added export generator. + +2012-09-19 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java: + Return also the station in a service response. + +2012-09-18 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FunctionSelect.java: + Cosmetics. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java: + A and B facets of fix analysis are now deactivated by default (#717). + +2012-09-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeCalculation.java: + Extract parameters needed for calculation from access. + + * src/main/java/de/intevation/flys/utils/DoubleUtil.java(isValid): + Added method to check if 2d double array is valid. + +2012-09-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java, + src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Use generics aware Collections.emptyList(). + +2012-09-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityCalculation.java, + src/main/java/de/intevation/flys/artifacts/states/SoundingsSelect.java, + src/main/java/de/intevation/flys/exports/minfo/BedQualityGenerator.java, + src/main/java/de/intevation/flys/exports/OutputHelper.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/themes/ThemeFactory.java, + src/main/java/de/intevation/flys/themes/ThemeMapping.java, + src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + The usual whitespace and import cleanups. + +2012-09-18 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurementFactory.java: + Avoid loading empty data sets. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityCalculation.java: + Load bedload data sets... + +2012-09-18 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/minfo/CharDiameter.java: + Removed incorrect characteristic diameter. + +2012-09-18 Christian Lins + + * doc/conf/default-themes.xml: + Update point themes of fixing W/Q chart to show point descriptions + per default (#685). + +2012-09-18 Felix Wolfsteller + + i18n for area label (fix issue487). + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Get internationalized label and numberformat, pass it to renderer, + where its used. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Area label translations. + +2012-09-18 Christian Lins + + * src/main/java/de/intevation/flys/collections/CollectionDescriptionHelper.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Add robustness checks to prevent NPEs (#859). + +2012-09-18 Felix Wolfsteller + + Brought showarea-theme setting back (fix issue865). + + * doc/conf/default-themes.xml, doc/conf/second-themes.xml: + Define showarea theme prop where its needed. + +2012-09-17 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityResult.java: + Added setter for date range. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityCalculation.java + Set correct date range for result. + +2012-09-17 Raimund Renkert + + Refactor MINFO bed quality resultsets and facets. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedLoadBedQualityResult.java, + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedBedQualityResult.java: + Removed. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityResult.java: + Container wrapping the single calculation results. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiameterResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadDiameterResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityDiameterResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedParametersResult.java: + New. Results containing calculated average diameter, porosity and density. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedPorosityFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadDiameterFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiameterFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDensityFacet.java: + Facets now return the concrete datatype using the facet index. + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java: + Create a facet for each resultset. + + * src/main/java/de/intevation/flys/exports/minfo/BedQualityGenerator.java: + Use the classes containing the results. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityCalculation.java: + Use new classes for results and calculate porosity and density once + each period. + +2012-09-17 Ingo Weinzierl + + Tagged RELEASE 2.9.1 + +2012-09-17 Ingo Weinzierl + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added still missing + translations for state. + +2012-09-17 Ingo Weinzierl + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added missing translations + for state to select soundings. + + * src/main/java/de/intevation/flys/artifacts/states/SoundingsSelect.java: + Added more debug output to find out how many single and epochs where + found. + +2012-09-17 Ingo Weinzierl + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml: Defined initial colors. + + * src/main/java/de/intevation/flys/exports/OutputHelper.java, + src/main/java/de/intevation/flys/themes/ThemeFactory.java, + src/main/java/de/intevation/flys/themes/ThemeMapping.java: Added more + debug output to understand why theme mappings don't match to facets. + +2012-09-17 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/access/BedQualityAccess.java: + Extract characteristic diameter only if the user selected a diameter. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityCalculation.java: + Calculate for selected diameter only. + +2012-09-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadOverview.java, + src/main/java/de/intevation/flys/artifacts/model/SQOverview.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java, + src/main/java/de/intevation/flys/exports/fixings/ParametersExporter.java: + Fixed wrong assigned loggers. + +2012-09-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FlowVelocityCalculation.java: + Please _DO NOT_ use FLYSUtils in new code based on Access*! + Now the river name is fetch via access.getRiver(). + + * src/main/java/de/intevation/flys/artifacts/access/RiverAccess.java: + New. Almost all calculations need accessing the river name. + + * src/main/java/de/intevation/flys/artifacts/access/SQRelationAccess.java, + src/main/java/de/intevation/flys/artifacts/access/BedQualityAccess.java, + src/main/java/de/intevation/flys/artifacts/access/FixAccess.java, + src/main/java/de/intevation/flys/artifacts/access/FlowVelocityAccess.java, + src/main/java/de/intevation/flys/artifacts/access/ExtremeAccess.java: + Now extend RiverAccess. + +2012-09-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/access/ExtremeAccess.java: + Implemented the access methods needed for + "Auslagerung extremer Wasserspiegellagen". + + * src/main/java/de/intevation/flys/artifacts/model/Segment.java: + Move segment parsing to DoubleUtil to be usable with more data types. + The wire protocol should be the same for: + - "WINFO: W fuer ungleichwertige Abfluesse", + - "WINFO: Auslagerung extremer Wasserspiegellagen" + - "Fixierungsanalyse: Auslagerung von Wasserspiegellagen" + + * src/main/java/de/intevation/flys/utils/DoubleUtil.java: + Now contains the the code to parse segments. Found segments + are propagated back with a callback. + + * src/main/java/de/intevation/flys/artifacts/model/RangeWithValues.java: + Added toString() method. + +2012-09-16 Sascha L. Teichmann + + More infrastructure stuff for the "Auslagerung extremer Wasserspiegellagen". + + * src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeCalculation.java: + New. Stub for "Auslagerung extremer Wasserspiegellagen" calculation. + + * src/main/java/de/intevation/flys/artifacts/model/extreme/ExtremeResult.java: + New. Stub for the cacheable results of the calculation. + + * src/main/java/de/intevation/flys/artifacts/states/extreme/ExtremeCompute.java: + New. Stub compute state for the calculation. + + * src/main/java/de/intevation/flys/artifacts/access/ExtremeAccess.java: + New. Sub access to the artifact to extract the relevant data. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java: + A little code reordering to keep related stuff together more closely. + +2012-09-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/BedHeightsArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/AreaFacet.java, + src/main/java/de/intevation/flys/artifacts/MINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/QSectorArtifact.java, + src/main/java/de/intevation/flys/artifacts/FixationArtifact.java: + Removed some superfluous implementations of FacetTypes. + TODO: FacetTypes should be broken into smaller pieces. + ATM a lof of class implement it and share a lot of unnecessary + stuff. + +2012-09-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java, + src/main/java/de/intevation/flys/artifacts/geom/VectorUtils.java: + Deleted. Some nice code from the early days of the cross sections + but its unused nowadays. + +2012-09-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedBedQualityResult.java: + Removed superfluous imports. + + * src/main/java/de/intevation/flys/jfree/JFreeUtil.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiameterFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadDiameterFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedLoadBedQualityResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDensityFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedPorosityFacet.java, + src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java, + src/main/java/de/intevation/flys/exports/minfo/BedQualityInfoGenerator.java, + src/main/java/de/intevation/flys/exports/minfo/BedQualityGenerator.java: + Removed trailing whitespace. + +2012-09-15 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/resources/Resources.java, + src/main/java/de/intevation/flys/utils/Formatter.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + i18n messages are now formatted with correct (client) locale, not + server VM locale (#852).. + +2012-09-15 Christian Lins + + * doc/conf/artifacts/fixanalysis.xml, + doc/conf/artifacts/manualpoints.xml, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java: + Try to add support for ManualPoints in fixing charts (not working yet). + +2012-09-14 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurementFactory.java: + Fixed SQL-statement. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurements.java: + Added getter for all kms. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityCalculation.java: + Implemented the bed quality calculation. There are still some fixes to do, + e.g. extract a single result object for porosity and density. + +2012-09-14 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/access/BedQualityAccess.java: + Getter for characteristic diameter. + +2012-09-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java: + Create i18n facet descriptions. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: New i18n strings for facets + in bed quality calculation. + +2012-09-14 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: Splitted facets for diameter of bed into + two facets: diameter for sublayer and toplayer. + + * doc/conf/themes.xml, + doc/conf/second-themes.xml, + doc/conf/default-themes.xml: Splitted themes for diameter of bed into + two themes. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Splitted facets for diameter of bed into two facets. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityResult.java: + New method to retrieve the diameter data. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedBedQualityResult.java: + New methods to retrieve the porosity, density and diameter data. + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java: + Create two facets for bed diameter instead of a single one. + + * src/main/java/de/intevation/flys/exports/minfo/BedQualityGenerator.java: + Insert data supported by facets into chart. + +2012-09-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/JFreeUtil.java: Added function to + generate a randomized line. + +2012-09-14 Ingo Weinzierl + + * doc/conf/themes.xml: Defined new mappings for the six bed quality + facets. + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml: Added themes for new mappings in + themes.xml. The themes in second-themes are the same as in + default-themss. + +2012-09-14 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedBedQualityResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedLoadBedQualityResult.java: + Updated bed quality result objects. + +2012-09-14 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: Splitted porosity and density facets into + two facets: a toplayer and a sublayer facet for each. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + the new facets for toplayer and sublayer for porosity and density. + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java: + Create Facets based on the calculation results. + + * src/main/java/de/intevation/flys/exports/minfo/BedQualityGenerator.java: + Use concrete result types in doXXXOut(). + +2012-09-13 Christian Lins + + * doc/conf/artifacts/fixanalysis.xml, + doc/conf/themes.xml, + src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java, + src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java: + Work on ManualPoints integration in fix analysis charts (wip). + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java: + Fix missing import. + +2012-09-13 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/access/BedQualityAccess.java: + Added getter for calculation parameters. + + * src/main/java/de/intevation/flys/artifacts/model/BedQualityCalculation.java: + Removed. Moved to package de.intevation.flys.artifacts.model.minfo. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedLoadBedQualityResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedBedQualityResult.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedQualityCalculation.java: + New. Calculation results and some more calculation stub. + +2012-09-13 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml, + src/main/java/de/intevation/flys/artifacts/access/FlowVelocityAccess.java, + src/main/java/de/intevation/flys/artifacts/states/DischargeState.java, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Renamed MINFO parameter + 'main.channel' -> 'main_channel' and 'total.channel' -> 'total_channel'. + +2012-09-13 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurementFactory.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurement.java: + Added depth parameter to bed quality data. + +2012-09-13 Ingo Weinzierl + + * doc/conf/conf.xml: Registered new OutGenerators BedQualityGenerator and + BedQualityInfoGenerator. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedPorosityFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDiameterFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadDiameterFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedDensityFacet.java: + New Facets for serving data for bed quality exports/charts. + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java: + Add some dummy Facets to force chart creation. + + * src/main/java/de/intevation/flys/exports/minfo/BedQualityInfoGenerator.java, + src/main/java/de/intevation/flys/exports/minfo/BedQualityGenerator.java: + New OutGenerators for bed quality charts. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: New I18N strings for bed + quality charts. + +2012-09-13 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurementFactory.java: + The factory can load bedload and bed data from seddb now. + +2012-09-13 Raimund Renkert + + Objects and factory for minfo bedquality calculation data. + + * src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurementFactory.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurements.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/QualityMeasurement.java: + New. Data objects and factory for minfo bed quality calculation. + +2012-09-13 Felix Wolfsteller + + Added missing images for datacage config manual doc. + + * doc/datacage-config-manual/figures/bsh_logo.png, + doc/datacage-config-manual/figures/intevation-logo.eps, + doc/datacage-config-manual/figures/intevation-logo.pdf: + Logos for DC conf doc. + +2012-09-13 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java: + Add also min and max q values to the river info. + +2012-09-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/BedloadKMChartService.java, + src/main/java/de/intevation/flys/artifacts/services/BedKMChartService.java: + Removed trailing whitespace. + +2012-09-12 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/services/BedloadKMChartService.java, + src/main/java/de/intevation/flys/artifacts/services/BedKMChartService.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedOverview.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadOverview.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedOverviewFactory.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadOverviewFactory.java: + New. Services, data structures and factories for overview charts in minfo + bed quality calculation. + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityPeriodsSelect.java: + New. State for period input in minfo bed quality that displays the overview + charts. + + * doc/conf/artifacts/minfo.xml: + Added states and transitions for minfo bed quality calculation. + + * doc/conf/conf.xml: + Added services. + +2012-09-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/BedQualityCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java, + src/main/java/de/intevation/flys/artifacts/access/BedQualityAccess.java, + src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java: + Removed trailing whitespace. + +2012-09-12 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: Defined facets for bed quality chart. + + * src/main/java/de/intevation/flys/artifacts/model/BedQualityCalculation.java: + Calculation stub for bed quality. + + * src/main/java/de/intevation/flys/artifacts/access/BedQualityAccess.java: + Access stub for bed quality data. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + facets defined in minfo.xml. + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java: + Override computeAdvance; no calculation and facet creation takes place + yet. + +2012-09-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java: + Made AEo and datum attributes NPE proof. + +2012-09-11 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java: + Use getGaugeValue method also for aeo and datum. Also add some javadoc for + the getGaugeValue method. + +2012-09-11 Christian Lins + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Fix for line text annotations in Delta W(t) charts (#837). + +2012-09-10 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/states/GaugeTimerangeState.java: + Add additional check to prevent NPE (fix for #844) + +2012-09-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/RangeWithValues.java: + Extends Range now. + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Adjusted to use slightly different method names of Range. + +2012-09-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Range.java: + Added disjoint method. + + * src/main/java/de/intevation/flys/artifacts/model/QRangeTree.java: + Find a list of segments intersecting a given range. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Generate a list of ranges needed for the input of Qs + in the "Auslagerung extremer Wasserspiegellagen.". + +2012-09-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/extreme/Curve.java: + Added type safety. + +2012-09-10 Sascha L. Teichmann + + * pom.xml: Java 1.5 -> 1.6 + +2012-09-10 Christian Lins + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml: + Remove unnecessary attributes for fixation derived curve (#836). + +2012-09-10 Björn Ricks + + * doc/conf/conf.xml, + src/main/java/de/intevation/flys/artifacts/services/GaugeOverviewInfoService.java: + Add new artifact service for the gauge overview + +2012-09-09 Christian Lins + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml, + doc/conf/virtual-themes.xml, + src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/jfree/StyledDomainMarker.java: + Theme transparency attribute support (part of #840). + +2012-09-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/extreme/Curve.java: + Store Ws and Qs in double arrays instead of WQ objects (as + they are return from WstValueTable.interpolateTabular()). + This simplifies the code and should be more memory effective. + +2012-09-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/Linear.java: + Added a vectorwise weighting. + + src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Added methods to interpolate tabulated values only. + Need in "Auslagerung extremer Wasserspiegellagen". + +2012-09-09 Christian Lins + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml, + doc/conf/virtual-themes.xml: + Updating themes for issue #840 (wip). + +2012-09-09 Christian Lins + + * doc/conf/second-themes.xml: + Modify every theme to differ from default theme (#835). + + * src/main/java/de/intevation/flys/artifacts/services/MainValuesService.java: + Use gauge.getMainValues() instead of gauge.fetchMainValues() which fixes + a compiling issue on my setup. + +2012-09-08 Sascha L. Teichmann + + Some models for representing results for the upcoming + "Auslagerung extremer Wasserspiegellagen". Work im progress. + + * src/main/java/de/intevation/flys/artifacts/math/NaNFunction.java: + New. Function always return NaNs. + + * src/main/java/de/intevation/flys/artifacts/math/UnivariateRealFunctionFunction.java: + New. Adapter to bridge between our Functions and UnivariateRealFunctions + of Apache Common Math. + + * src/main/java/de/intevation/flys/artifacts/model/extreme/Curve.java: + New. Part of the result model of "Auslagerung extremer Wasserspiegellagen". + Its a function for a given km that uses a spline interpolation + for the tabulated Q range (which is effectively the same as the + calculated discharge curve for this km) and an extrapolated + function beyond the tabulated values. + +2012-09-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java, + src/main/java/de/intevation/flys/themes/DefaultTheme.java: + More iterator code simplification. + +2012-09-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/themes/DefaultThemeField.java: + Simplified code. + +2012-09-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java: + Simplified code. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisResult.java: + Improved robustness and performance. + Only expose date events as Collections not TreeSets. + +2012-09-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/QW.java: + New. a pure model for discharge and waterlevel. No extras. + + Makes reuse in upcoming "Auslagerung extremer Wasserspiegellagen" + a lot easier. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QW.java: + Removed. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QWI.java: + Re-inserted here. Extends the new QW and adds all the extra bells + and whistles needed in the fixings analysis. + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java, + src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisResult.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingResult.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/QWD.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Adjusted QW to QWI. + +2012-09-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesFactory.java; + Removed because code is found in backend already. + + * src/main/java/de/intevation/flys/artifacts/services/MainValuesService.java: + Simplified. Please _DO_NOT_ use NullPointerExceptions for regular flow control! + This hides unintended errors. + +2012-09-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixChartGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Removed code duplication. + +2012-09-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Removed trailing whitespace. + +2012-09-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/minfo/CharDiameter.java: + Removed superfluous imports. + +2012-09-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/datacage/DatacageBackendListener.java, + src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/java/de/intevation/flys/artifacts/ChartArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java, + src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixChartGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixATExport.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/TypeSection.java, + src/main/java/de/intevation/flys/jfree/DoubleBounds.java, + src/main/java/de/intevation/flys/jfree/Bounds.java: + Cosmetics, docs. + +2012-09-07 Raimund Renkert + + * doc/conf/artifacts/minfo.xml: + Add data fields for characteristic bed and bedload diameter. + + * src/main/java/de/intevation/flys/artifacts/states/minfo/CharDiameter.java: + Use parametermatrix as UI provider and set the correct data. + + * src/main/java/de/intevation/flys/artifacts/states/SoundingsSelect.java, + src/main/java/de/intevation/flys/artifacts/states/MultiStringArrayState.java: + Updated method parameter. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings. + +2012-09-07 Raimund Renkert + + Issue 791. + + * src/main/java/de/intevation/flys/artifacts/states/EnterMultipleLocationsState.java: + Add start km to data to compare reference and target km in next state. + +2012-09-07 Ingo Weinzierl + + Tagged RELEASE 2.9 + +2012-09-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesFactory.java: + Removed superfluous imports. + +2012-09-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesFactory.java: + Removed the deprecated method. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Call the new Gauge model method fetchDurationCurveData(). + +2012-09-06 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesFactory.java: + Mark getDurationCurveData as deprecated. The instance method of Gauge with + the same name should be used instead. + +2012-09-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java: + Revert accidentally committed experiment. + +2012-09-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java: + Comments, changed order of columns as requested in issue825. + +2012-09-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixATWriter.java: + Only goto down to Q = 0.0001 to circumvent some numerial issues + with steep functions around zero. + +2012-09-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixATWriter.java: + Increase Q max about 5% (as it should be). + +2012-09-04 Sascha L. Teichmann + + Fix for issue687 + + * src/main/java/de/intevation/flys/exports/fixings/FixATWriter.java: + Rewrote AT export to fix it. + +2012-09-03 Felix Wolfsteller + + Fix for issue820. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Changed label for middle height/depth. + +2012-09-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Default horizontal and vertical placement of logo to "center" and + "top" instead of "none." + +2012-09-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Improved comment regarding image placement. + +2012-09-03 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Fixed URLs for logos. + +2012-09-02 Felix Wolfsteller + + Fix issue744 (wrong ranges for w/q input). + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Do not add items for gauges that do not intersect with given range. + +2012-09-01 Felix Wolfsteller + + Fix issue829 (wrong fixation names). + + * src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java: + Fix check, column indices start with 0. + +2012-09-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeight.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightFacet.java, + src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java, + src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChoiceStringAttribute.java: + Removed trailing whitespace. + +2012-08-31 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Fix cast. + +2012-08-31 Raimund Renkert + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for minfo bed quality parameters. + +2012-08-31 Björn Ricks + + * src/main/java/de/intevation/flys/artifacts/services/ModuleService.java, + src/main/java/de/intevation/flys/artifacts/model/Module.java, + src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java, + src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties, + doc/conf/conf.xml: + Add a module service. It's now possible to configure the modules which are + available for a client. With the selected attribute it is possible to give + a hint for the client which module should be pre selected by default. + +2012-08-31 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/minfo/BedQualityState.java, + src/main/java/de/intevation/flys/artifacts/states/minfo/CharDiameter.java: + New. States for minfo bed quality calculation. + + * doc/conf/artifacts/minfo.xml: + Added states and transitions for minfo bed quality calculation. + +2012-08-31 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + Refactored state to use FLYSArtifact instead of WINFOArtifact. + +2012-08-31 Felix Wolfsteller + + Fix issue817 (double datacage entries). + + * doc/conf/meta-data.xml: removed double entries. + +2012-08-30 Felix Wolfsteller + + issue729, default line labels for waterlines in cross sections. + + * doc/conf/default-themes.xml: Default line label and level label + to true for lines in crossections.. + +2012-08-30 Felix Wolfsteller + + issue814, line labels do not follow zoom. + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Move line label into visible area if otherwise outside. + +2012-08-30 Felix Wolfsteller + + issue695, show waterlevel as line label. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + Fix path to showlevel style property. + +2012-08-30 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Mention how/where to change predefined logos in comment. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Mention how/where to change predefined logos in comment, + Use resource for images. + + * src/main/resources/images/bfg_logo.gif, + src/main/resources/images/intevation.png: + Added sample logos of intevation and bfg. + +2012-08-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Copy and slightly modified XYChartGenerators logo mechanism. + +2012-08-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (getLeftX, getRightX): New and overridden to deal with inverted axis + for logo placement in longitudinalsection charts. + +2012-08-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Use RectangleAnchor to set anchor of logo. + +2012-08-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Add Logo settings to CrossSection ChartSettings. + +2012-08-29 Felix Wolfsteller + + Split logo-placement property in two, one for horizontal, one for + vertical placement. + + * src/main/java/de/intevation/flys/exports/ChartSettings.java, + src/main/java/de/intevation/flys/exports/ChartSection.java: + Accessors for split property. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java + (logoHPlace,logoVPlace,logoPlace): Use split properties for vertical + and horizontal placement of logo. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Use split properties, respect in placement. + +2012-08-28 Felix Wolfsteller + + Sloppy logo placement property implementation. + + * src/main/java/de/intevation/flys/exports/ChartSettings.java: + Parse and set logo placement property value. + + * src/main/java/de/intevation/flys/exports/ChartSection.java: + Accessors for Logo placement property. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java + (logoPlace): New, get logo placement property value. + (showLogo): Default to "none". + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Sloppy interpretation of the logo placement property. + +2012-08-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (addLogo): New, add an image annotation to plot, very stubby, + use hard-coded paths for now. + +2012-08-28 Felix Wolfsteller + + Preparations for logo-inclusion in charts. + + * src/main/java/de/intevation/flys/exports/ChoiceStringAttribute.java: + New string attribute type to trigger different UI (selectboxes) + in client. + + * src/main/java/de/intevation/flys/exports/TypeSection.java + (setChoiceStringValue): Create new ChoiceStringAttribute. + + + * src/main/java/de/intevation/flys/exports/ChartSection.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartSettings.java: + Accessors to show logo-property. + +2012-08-28 Raimund Renkert + + MINFO: Implemented UI and facet/artifact stack for bed height differences. + + * src/main/java/de/intevation/flys/artifacts/model/minfo, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeight.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightFacet.java, + src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightFactory.java, + src/main/java/de/intevation/flys/artifacts/model/StaticBedHeightCacheKey.java: + New. Facet and data object incl. factory for bed heights. + + * src/main/java/de/intevation/flys/artifacts/states/minfo, + src/main/java/de/intevation/flys/artifacts/states/minfo/YearEpochSelect.java, + src/main/java/de/intevation/flys/artifacts/states/minfo/DifferenceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/minfo/DifferencesState.java, + src/main/java/de/intevation/flys/artifacts/BedHeightsArtifact.java: + New. States for difference calculation mode and new artifact for difference + selection. + + * src/main/java/de/intevation/flys/artifacts/access/BedHeightAccess.java: + Added getter for time (year or epoch). + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new facet type. + + * doc/conf/meta-data.xml: + Datacage config for minfo bed heights. + + * doc/conf/artifacts/minfo.xml: + Added transitions and states for minfo difference calculation. + + * doc/conf/conf.xml: + Added artifact factory. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings. + +2012-08-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartSettings.java: + (setDisplayGird, setDisplayGrid): Fixed typos. + +2012-08-23 Raimund Renkert + + FixA: Changed sector average form point to line in delta W(t) chart. + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Add data points for sector average and changed time unit for analysis period + from month to day. + + * doc/conf/default-themes.xml: + Changed theme for sector average to color line. + +2012-08-23 Raimund Renkert + + Issue 716. FixA: Spilt reference and analysis period themes into one theme for each event. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java: + Create a facet for each event and use new facet for sector average in + longitudinal section chart. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalAnalysisFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalReferenceFacet.java: + The facets now return data for a single event. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalAvSectorFacet.java: + New. This facet returns an analysis period containing the calculated + average. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisResult.java: + Added methods to get the dates for all reference and analysis period events. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Fixed range combining. + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java: + Adjusted generators to use the data returned by the facets. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings. + +2012-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java: + Using trove to map int->int instead of bloated generics. + +2012-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Prevent another NPE. Removed dead code. + +2012-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java: + Each analysis period has its own index scheme now. + +2012-08-22 Christian Lins + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Fix for NullPointerException. + +2012-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java: + Made indices of analysis periods QWs zero based. + +2012-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QW.java: + Store index, too. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QWD.java: + Adjusted to keep constructors in sync. + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java: + Set QD index to the values of the column cache columns. + +2012-08-22 Sascha L. Teichmann + + Use the column cache to establish a consistent index scheme. + TODO: Store the index values in the created QWDs. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + doFitting() fetches the columns from column cache, too. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java: + Reuse same column cache from fitting to have the same index scheme. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java: + Adjusted to use the column cache. + +2012-08-22 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/model/HYKFacet.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Fix NullPointerExceptions in cross section diagrams that occurred when + no HYKs are available for the selected kms. + + * src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties: + Typo, see issue #806 + +2012-08-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixATExport.java: + Removed superfluous import. s/Double.valueOf/Double.parseDouble/. + +2012-08-17 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/fixings/FixATExport.java: + Removed debug outputs. + +2012-08-17 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/fixings/FixATExport.java: + New. Exporter for FixAnaylsis AT files. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java: + Add facet for AT export. + + * doc/conf/conf.xml: + Added out generator for fix AT export. + + * doc/conf/artifacts/fixanalysis.xml: + Added outputmode for AT export. + +2012-08-16 Felix Wolfsteller + + * doc/conf/artifacts/fixanalysis.xml: Add more facets to + compat list, removed doubled wq output. + +2012-08-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: + Shorten overlong lines. Simplified code. + +2012-08-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: + Interpolate and reduce WQKms if currentKm found in context. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Handle WQKms in WQOuts. + +2012-08-16 Felix Wolfsteller + + * doc/conf/artifacts/fixanalysis.xml: Add longitudinal section + facet type to compatibility list of W/Q diags. + +2012-08-16 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FunctionSelect.java: + Added getter for ui provider. + +2012-08-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + BasicStroke constructor takes an float as first argument + so there is no need to blow up an 'int' to an Integer + which is auto-unboxed to int which is implicitly cast to float. + +2012-08-15 Felix Wolfsteller + + * doc/conf/meta-data.xml: Do not hard-recommend gauge-dis. for fixwq. + +2012-08-15 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java: + Fail more gracefully. + +2012-08-14 Felix Wolfsteller + + * doc/conf/meta-data.xml: More former calculations in fixA (dwt) DC. + +2012-08-14 Felix Wolfsteller + + * doc/conf/meta-data.xml: More former calculations in fixA DC. + +2012-08-13 Felix Wolfsteller + + * doc/conf/artifacts/fixanalysis.xml: Add discharge curve facet to + compat. list. + + * doc/conf/meta-data.xml: Show discharge curves for FixA WQ DC. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Handle discharge curve data. + +2012-08-13 Felix Wolfsteller + + * doc/conf/artifacts/fixanalysis.xml: Add more facets to compat. list. + + * doc/conf/meta-data.xml: Show more additional data in FixA w/q-diag. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Handle new, annotation-type facets. + +2012-08-13 Felix Wolfsteller + + * doc/conf/artifacts/fixanalysis.xml: Added wqkms facets to comp. list. + + * doc/conf/meta-data.xml: Add wq-basedata and other stubs to fixA dc. + + * src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java + (getWQAtKm): Adjusted behaviour such that passed km can be + respected. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Handle WQFacets. + + * src/main/java/de/intevation/flys/artifacts/model/WQFacet.java: + Pass contexts current_km if available. + +2012-08-13 Felix Wolfsteller + + * doc/conf/artifacts/fixanalysis.xml: Added deltawt-out. + +2012-08-13 Felix Wolfsteller + + * doc/conf/meta-data.xml: Show former calculations in FixA WQ-DC. + +2012-08-13 Felix Wolfsteller + + * doc/conf/meta-data.xml: Show more former calculations in DeltaWTs + and fix query (and/or/() precedences). + +2012-08-13 Felix Wolfsteller + + * doc/conf/meta-data.xml: Show more former calculations in fixA LS. + +2012-08-13 Felix Wolfsteller + + * doc/conf/conf.xml: Renamed qsector(s) factory. + +2012-08-13 Felix Wolfsteller + + * doc/conf/meta-data.xml: Load annotations for fixA long.sections. + Add stubs for "old calculations"-dc-conf for various FixA outs. + + * src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java: + Handle annotation outs. + +2012-08-13 Felix Wolfsteller + + * doc/conf/themes.xml, doc/conf/default-themes.xml: + Added theme fields for qsectors label. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Add markers for the qsectors. + +2012-08-10 Felix Wolfsteller + + * doc/conf/themes.xml, doc/conf/default-themes.xml: + Fix some typos, correct defaults and add mapping for qsector-theme. + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Cosmetics. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Add accidentally omitted change, stub for style-handling. + +2012-08-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/QSectorFacet.java, + src/main/java/de/intevation/flys/artifacts/states/QSectorSingleState.java, + src/main/java/de/intevation/flys/artifacts/QSectorArtifact.java: + Wording and i18n of qsectors. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Add Markers to plot for qsectors. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + i18n for qsectors. + +2012-08-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/QSectorSingleState.java: + New, accidentally omitted single state of a qsector-artifact. + +2012-08-10 Felix Wolfsteller + + * doc/conf/artifacts/fixanalysis.xml: Add qsectors-facet to + compatibility list. + + * doc/conf/conf.xml: Register qsector artifact and its factory. + + * doc/conf/meta-data.xml: Recommend qsectors in fix w/q settings. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Add qsector facet type. + +2012-08-10 Felix Wolfsteller + + * doc/conf/artifacts/qsector.xml: + Trivial state model for qsector artifact. + + * src/main/java/de/intevation/flys/artifacts/model/QSectorFacet.java: + Rather trivial facet to get QSectors from QSectorArtifact. + + * src/main/java/de/intevation/flys/artifacts/QSectorArtifact.java: + New QSectorArtifact. + +2012-08-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java, + src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java: + Cosmetics. + +2012-08-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Fitting.java, + src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java: + Removed superfluous imports. + +2012-08-08 Felix Wolfsteller + + * doc/conf/meta-data.xml: Set info attribute (will evaluate as tooltip + in GUI. + +2012-08-07 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Reflect fact that there can be only one reference station. + +2012-08-07 Felix Wolfsteller + + Fix issue798. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Set Tick Units dependant on cm/m scale on X axis. + +2012-08-01 Sascha L. Teichmann + + Fix for flys/issue748 + + * src/main/java/de/intevation/flys/artifacts/model/sq/Fitting.java, + src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java: + Only remove one data point per outlier removal iteration. + +2012-07-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/Outlier.java: + Only evict only one(!) data point as outlier. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + Recalculate the function when one point is removed. + +2012-07-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/Outlier.java: + Corrected the formulas of Grubbs' test for outliers. + TODO: Remove only one(!) data point. Currently it removes + more than on point without recalculating the fitting curve. + This leads to too much removed points. + +2012-07-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + Setup better initial activity for the facets of the S/Q results. + +2012-07-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Use getCurrentKmFromRequest().doubleValue() in i18n formatting. + +2012-07-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + getCurrentKmFromRequest returns Double(!) not double. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + Use Double.parseDouble() instead od Double.valueOf(). + +2012-07-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + Initially activate/deactivate facets. + +2012-07-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java, + src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Refactored to use the new Chain-of-responsibility pattern in facet + activation. + +2012-07-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/GaugeInfoService.java: + Made expensive XMLUtils.toString() debug output conditional. + +2012-07-29 Sascha L. Teichmann + + Use the new infrastructure to figure out if a facet should + be initially active or not. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + Uses the FacetActivity.Registry to look up the initial acitiviy. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Do not use sub classing any more. + + * src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java, + src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java, + src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/HYKArtifact.java: + Register to FacetActivity.Registry now. TODO: Make it configurable. + +2012-07-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/themes/ThemeFactory.java, + src/main/java/de/intevation/flys/collections/CollectionAttribute.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java, + src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/artifacts/ChartArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/MapArtifact.java: + s/container.size() == 0/container.isEmpty()/ + +2012-07-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Lowered logging output level from info to debug. + Made some more debug outputs conditional. + +2012-07-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Some code simplifications. + +2012-07-27 Sascha L. Teichmann + + Extented the result data model of the S/Q calculation to + store the curve coefficients for each iteration step + of the outlier elimination. The starting data set of S/Qs + is stored as well. + + TODOs: + - Create the new facets as inactive. + - Repair the facet to style mapping. + + * doc/conf/themes.xml: Added mappings for new facets. + + * doc/conf/artifacts/minfo.xml: Configured the new facets. + + * src/main/java/de/intevation/flys/exports/sq/SQRelationExporter.java: + Adjusted to new data model. + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + Generate facets for outlier curves and measurements. Simplified code. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + New facet types for outlier curves and meassurements. + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + New set() method to set an array of values by their names. + + * src/main/java/de/intevation/flys/artifacts/model/Segment.java: + Removed trailing whitespace. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQMeasurementFacet.java: + Adjusted to new data model. Curves are drawn over the whole length of the + starting S/Q dataset. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOutlierCurveFacet.java: + New. Facet for the curves of the outlier test iterations. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOutlierMeasurementFacet.java + New. Facet for the meassurement data remainind after outlier test iteration. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Now creates the new data model. + + * src/main/java/de/intevation/flys/artifacts/model/sq/Fitting.java, + src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java: + Refactorted to have more control over the data structures to be generated. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQFractionResult.java: + The new data model to represnt a fraction result. Each outlier test iteration + results in a different iteration object. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for new facets. + +2012-07-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/QWDDateRange.java: + Added method getQWD() to retrieve the QWD property. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Avoid class cast exceptions; a QWDDateRange object is returned by WQ + sector average Facet - not a QWD object. Use new getter method to + retrieve the required data object. + +2012-07-27 Ingo Weinzierl + + Tagged module as '2.8.1'. + +2012-07-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/QWDDateRange.java: + New class. QWD and a DateRange. + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java: + Produce QWDDateRanges in state, consume in generator. + +2012-07-26 Ingo Weinzierl + + * doc/conf/artifacts/fixanalysis.xml: Registered new Output + 'fix_vollmer_wq_curve'. + + * doc/conf/conf.xml: Registered new FixWQCurveGenerator for + 'fix_vollmer_wq_curve'. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added new names for Facets + used in 'fix_vollmer_wq_curve' Output. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java: + Make use of FitResult (parent of FixAnalysisResult) which is enough for + these Facets instead of casting the calculation result to + FixAnalysisResult. + + * src/main/java/de/intevation/flys/artifacts/access/FixAnalysisAccess.java: + Fixed potential NullpointerException. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java: + Create new Facets for WQ curve, fix events and outliers. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Add subtitles only if the required data (date period and referenence + period) are existing. Otherwise do not add a subtitle. + +2012-07-26 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Adjusted i18n strings (vollmer). + +2012-07-26 Christian Lins + + * doc/conf/virtual-themes.xml, + src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/themes/ThemeAccess.java, + src/main/java/de/intevation/flys/themes/TextStyle.java, + src/main/java/de/intevation/flys/themes/LineStyle.java, + src/main/java/de/intevation/flys/themes/ThemeFactory.java, + src/main/java/de/intevation/flys/themes/PointStyle.java, + src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java, + src/main/java/de/intevation/flys/jfree/XYStyle.java, + src/main/java/de/intevation/flys/jfree/StyledDomainMarker.java: + Line labels and point labels share same styles and code. + Point labels can have a background color. + +2012-07-26 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Adjusted i18n strings (vollmer). + +2012-07-26 Ingo Weinzierl + + * doc/conf/artifacts/fixanalysis.xml: Registered new Output + 'fix_waterlevel_export' for FixRealizingCompute State. + + * doc/conf/conf.xml: Registered new WaterlevelExport Generator for + 'fix_waterlevel_export'. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java: + Create proper CSV, WST and PDF Facets with hash and State id. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Made + WaterlevelExporter support FixRealizingResult objects. + +2012-07-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWaterlevelFacet.java: + Removed instanceof hack to fetch the WQKms of the fix realizations. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWaterlevelFacet.java: + New. Subclass of WaterlevelFacet. Used to fetch the WQKms the fix realization way. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java: + Create the subclassed waterlevel facets. + +2012-07-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java: + Create proper facets for Ws and Qs. + +2012-07-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java: + Also add Q-Facet. + +2012-07-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java: + Add WaterlevelFacet. + + * doc/conf/artifacts/fixanalysis.xml: + Add output and facet compability. + +2012-07-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/access/FixRealizingAccess.java: + Fix data names in FixRealizingAccess. + +2012-07-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: + Handle slightly different access to Fixation-WQKms. + +2012-07-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: + Handle slightly different access to Fixation-WQKms. + +2012-07-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationSelect.java: + Fix (last?) vol(l)mer naming issue. + +2012-07-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/StateFactory.java, + src/main/java/de/intevation/flys/artifacts/states/ManualPointsSingleState.java + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java + src/main/java/de/intevation/flys/themes/ThemeMapping.java: + s/.equals("")/.length() == 0/ + +2012-07-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java, + src/main/java/de/intevation/flys/artifacts/model/WQTimerange.java, + src/main/java/de/intevation/flys/artifacts/states/SoundingsSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Removed some superfluous casts. + +2012-07-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Removed some inner whitespace. + +2012-07-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java: + New base class for fixing analysis results. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisResult.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingResult.java: + Inherits from FixResult. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java: + Calculation returns FixRealizingResult. + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Remove superfluous import. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Cosmetics. + +2012-07-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Broke over long line. + + * src/main/java/de/intevation/flys/artifacts/model/Segment.java: + Added some getters. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java: + Calculated the Q -> Ws. TODO: Produce result. + +2012-07-23 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Adjusted i18n strings (vollmer). + +2012-07-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/fixation/LocationSelect.java: + Set ld_mode so that FLYSUtils can use it. + +2012-07-23 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Adjusted i18n strings (vollmer). + +2012-07-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Handle FixationArtifacts with as much care as WINFOArtifacts, + by using refactore FLYSUtils. + +2012-07-23 Felix Wolfsteller + + Towards per-Gauge-input of W/Q values for FixationArtifact. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/utils/FLYSUtils.java: + (getGauges): Refactored, moved from WINFOArtifact to FLYSUtils. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: + Handle unlucky differences in names of data for + WINFOArtifact/FixationArtifact. + + * doc/conf/artifacts/fixanalysis.xml: + (Re-)use WQAdapted State for fix.analysis. + +2012-07-23 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml, + src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java, + src/main/java/de/intevation/flys/artifacts/model/HYKFacet.java, + src/main/java/de/intevation/flys/artifacts/model/RelativePointFacet.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/QSelect.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/jfree/StyledAreaSeriesCollection.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Cosmetics, docs. + +2012-07-23 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/model/Segment.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Moved code to convert W to Q at gauge to segments to be reusable. + +2012-07-23 Christian Lins + + * doc/conf/themes.xml, + doc/conf/second-themes.xml, + doc/conf/default-themes.xml: + Remove line style attributes from FixingReferenceEvents theme. + +2012-07-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation4.java + src/main/java/de/intevation/flys/artifacts/model/Segment.java: + Moved reference point comparator to segment class be be reusable + in FixA 'ausgelagerte Wasserspiegellagen'. + +2012-07-23 Christian Lins + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Simplify annotation code. + +2012-07-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Made abstract. Sub classes have to overwrite innerCalculate() + calculate() now figures out the fixings overview and the function + to fit and passes it to innerCalculate() + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java: + Overrides innerCalculate() now. + +2012-07-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Prevent NPE in getOutputForState(). Why does this happen? + +2012-07-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Made curve fitting over the given calculation range reusable. Removed dead code. + +2012-07-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java: + Moved more common code into base class. + +2012-07-21 Sascha L. Teichmann + + * contrib/fixoverview2html.xsl: Clip the displayed from/to ranges + of the gauges to the max extent of the events. + +2012-07-21 Sascha L. Teichmann + + * contrib/fixoverview2html.xsl: Embed german and english translations + into the stylesheet. This should be better done by importing + an external resource depending on the choosen locale! + +2012-07-21 Sascha L. Teichmann + + * contrib/fixoverview2html.xsl: Introduced i18n to transformation. + +2012-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Wrong epsilon was taken so sector aggregation was not working + leading to too large result documents and wrong range display + on client side. + +2012-07-20 Sascha L. Teichmann + + * contrib/fixoverview2html.xsl: Render the names of the gauges into + the header line. Full name and spread is displayed as a tooltip. + +2012-07-20 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: Use SQPeriodSelect state for the input of + a time range. The difference to PeriodSelect is the UI provider desired + by this state. + + * src/main/java/de/intevation/flys/artifacts/states/sq/SQPeriodSelect.java: + New subclass of PeriodSelect; this state wants to be rendered in a + 'sq.period.select' UI provider. + +2012-07-20 Sascha L. Teichmann + + * contrib/fixoverview2html.xsl: To help developing the + HTML overview stylsheet more quickly bring back in sync with + version of the flys-client. + +2012-07-20 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: Changed the parameters for SQ relation + period selection; only a single period is allowed now. + + * src/main/java/de/intevation/flys/artifacts/states/PeriodSelect.java: New + class that allows the selection of a time period. + + * src/main/java/de/intevation/flys/artifacts/access/SQRelationAccess.java: + Reduced support of time periods to a single period. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Adapted the usage of SQRelationAccess which method signature has + changed; it returns a single DateRange instance only. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Modified the keys of the + state for SQ relation time period input. + +2012-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/sq/SQOverviewGenerator.java: + Disabled legends in this overview. + +2012-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/sq/SQOverviewGenerator.java: + Removed superfluous imports. + +2012-07-20 Sascha L. Teichmann + + * src/main/resources/messages_de.properties, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties: + Fixed anomalies. + +2012-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ReportGenerator.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java, + src/main/java/de/intevation/flys/exports/ATExporter.java, + src/main/java/de/intevation/flys/exports/sq/SQOverviewGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/MapGenerator.java, + src/main/java/de/intevation/flys/exports/OutGenerator.java, + src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: + Added a setCollection() method that allows the caller of OutGenerators + to set a reference to a FLYSArtifactCollection. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Use setCollection() to set the reference to the current + FLYSArtifactCollection before using OutGenerators. + + * doc/conf/conf.xml: Registered the SQOverviewGenerator. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Add a list of gauges which intersect the range of the selected columns: + + + + ... + + + + * src/main/java/de/intevation/flys/artifacts/model/GaugeRange.java: + Store the name of the gauge, too. + + * src/main/java/de/intevation/flys/artifacts/model/GaugeFinderFactory.java: + Load the names of the gauges from database, too. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java: + Some minor refactoring. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java: + Call super constructor to retrieve the common data from the artifact. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + New. Common base class for Fix*Calculations. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java: + Moved common stuff to base class FixCalculation. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java: + Inherit from FixCalculation. + + * src/main/java/de/intevation/flys/artifacts/access/FixRealizingAccess.java: + Extract parameters that are only relevant for the + 'Ausgelagerte Wasserspiegellagen' calculation. + + isQ(): Must we convert the given values from W to Q first? + Used data field: 'fix_isq' + getSegments(): Segments same semantics as WINFO's + 'W fuer ungleichwertige Abfluesse.' + Used data field: 'fix_segments' + + * src/main/java/de/intevation/flys/artifacts/model/Segment.java, + src/main/java/de/intevation/flys/artifacts/access/FixAccess.java: + Cosmetics. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/access/FixAccess.java: + New. Common base class for the Fix*Access. + + * src/main/java/de/intevation/flys/artifacts/access/FixAnalysisAccess.java, + src/main/java/de/intevation/flys/artifacts/access/FixRealizingAccess.java: + Now inherit from FixAccess. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/ParametersExporter.java: + Prevent NPE. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixFacetUtils.java: + Use constant to lookup column instead of dynamically allocated array. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java: + Removed. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisResult.java: + Re-added here. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalDeviationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalAnalysisFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalReferenceFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisPeriodsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDeviationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java, + src/main/java/de/intevation/flys/exports/fixings/ParametersExporter.java, + src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java: + Adjusted. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java: + New. Stub for 'Ausgelagerte Wasserspiegellagen' calculation. + + * src/main/java/de/intevation/flys/artifacts/access/FixRealizingAccess.java: + New. Stub for accessing the artifact to extract the relevant parameters + for the 'ausgelagerte Wasserspiegellagen' calculation. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java: + Call the calculation if the state is reached. + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Removed trailing whitespace. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationVolmerCompute.java: + Deleted. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java: + Re-added here. + + * doc/conf/artifacts/fixanalysis.xml: Adjusted. BTW: Vollmer is spelled with two 'l's. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Removed. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixAnalysisCompute.java: + Re-added. + + * doc/conf/artifacts/fixanalysis.xml: Adjusted. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Deleted + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisCalculation.java: + Re-added. + + * src/main/java/de/intevation/flys/artifacts/access/FixAnalysisAccess.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Adjusted class name usage. + +2012-07-19 Christian Lins + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + native2ascii with properties files. + Show analysis periods as subtitle in W/Q chart. + +2012-07-19 Christian Lins + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Add subtitle to Fix W/Q chart. + Move addSubtitle() code from generators up to ChartGenerate which saves + a lot of duplicate code. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java: + Deleted. + + * src/main/java/de/intevation/flys/artifacts/access/FixAnalysisAccess.java: + Re-added. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalDeviationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalAnalysisFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalReferenceFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisPeriodsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDeviationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Adjusted class name usage. + +2012-07-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Sourced code to set default values of a parameter to an own method. + Subclasses should override this method. + + * src/main/java/de/intevation/flys/artifacts/states/OutliersInput.java: + Set default value for outliers to "3". + +2012-07-19 Christian Lins + + * src/main/java/de/intevation/flys/exports/fixings/FixChartGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Add kilometer info to chart titles. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSQPSArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java, + src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java, + src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHwsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSCatchmentArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSLineArtifact.java, + src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/utils/FLYSUtils.java, + src/main/java/de/intevation/flys/exports/ChartSettings.java, + src/main/java/de/intevation/flys/jfree/XYStyle.java: + Use Integer.parseInt() instead of Integer.valueOf() + Autounboxing. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Replaced "string -> object -> native -> object" by simple "string -> object". + Removed stupid duplicate XPathing. + +2012-07-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java: + Use only blue as point color. + +2012-07-18 Sascha L. Teichmann + + Adjusted Delta W(t) CSV exporter to customers wishes. + + * src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java: + Reordered columns, removed description, added W and formatted date + via i18n. + + * src/main/java/de/intevation/flys/utils/Formatter.java: + Added method to get a formatter based on pattern and locale. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Adjusted i18n strings. + +2012-07-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Classify each discharge range by the gauges which intersect it. + + * src/main/java/de/intevation/flys/artifacts/model/Range.java: + Added convinience constructor. + + * src/main/java/de/intevation/flys/artifacts/model/GaugeFinder.java: + Added method to return all gauges. + +2012-07-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Use bandwidth parameter for width of band, adjusted name to be + displayed in legend. + +2012-07-18 Felix Wolfsteller + + * doc/conf/default-themes.xml, + src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Change bandwidth type to double (still bugged, round integers still + work, though). + +2012-07-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java: + Added column for time range. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties + src/main/resources/messages_en.properties + src/main/resources/messages_de.properties: + Added i18n strings. + + * src/main/java/de/intevation/flys/artifacts/resources/Resources.java: + Fixed stupid formatting bug. + +2012-07-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java: + Added discharge column. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added missing strings. + +2012-07-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Removed trailing whitespace. + +2012-07-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java, + src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java, + src/main/java/de/intevation/flys/jfree/StyledAreaSeriesCollection.java, + src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java, + src/main/java/de/intevation/flys/collections/CollectionAttribute.java: + Cosmetics, doc. + +2012-07-17 Felix Wolfsteller + + Partial implementation of issue720 (bandwith for curves), in + longitudinal section ws only, no styling, integer-based. + + * doc/conf/default-themes.xml: Add bandwidth to fields of longitudinal + section facets. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Add bandwidth + theme parsing. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + If bandwidth is set, add an area data series with datapoints + above/under the actual data points. + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java: + Helper for adding points with offset. + +2012-07-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Use Q_BPEGEL as symbolic name for Q + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Out commented the LEFT JOINs which produce a lot of empty and + redundant data. Bring them back in when we treat subsamples right. + +2012-07-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Added getValue() method. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Store location of calculation in result, too. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQFractionResult.java: + Added method getTotalCount() to return the number of used S/Q pairs. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQResult.java: + Store location of result, too. + + * src/main/java/de/intevation/flys/exports/sq/SQRelationExporter.java: + Write parameters as export result. + +2012-07-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java: + Bit of doc. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: + TODO for automatic official lines added. + +2012-07-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Out commented debug output which caused OOM errors. + +2012-07-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/SQOverview.java, + src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Q is not taken from MESSUNG.Q but from MESSUNG.Q_BPEGEL + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Fixed indentation. More macros. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Removed trailing whitespace. + +2012-07-16 Ingo Weinzierl + + * Tagged module as '2.8'. + +2012-07-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/StyledXYSeries.java, + src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java, + src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java, + src/main/java/de/intevation/flys/jfree/CollisionFreeXYTextAnnotation.java, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/SQRelation.java, + src/main/java/de/intevation/flys/artifacts/states/OutliersInput.java, + src/main/java/de/intevation/flys/artifacts/states/PeriodsSelect.java, + src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java, + src/main/java/de/intevation/flys/artifacts/model/FlowVelocityCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/WQKmsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/FixingsFilterBuilder.java, + src/main/java/de/intevation/flys/artifacts/model/RelativePointFacet.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WQKmsFactory.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java, + src/main/java/de/intevation/flys/artifacts/model/LocationProvider.java, + src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java, + src/main/java/de/intevation/flys/artifacts/model/WKmsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WQFacet.java: + Removed same package imports. + +2012-07-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Lowered log level. + +2012-07-13 Felix Wolfsteller + + * doc/conf/meta-data.xml: Allow manual loading of official lines in + longitudinal_discharge diagrams. + +2012-07-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Prevent nasty NPE (hidden by autobox). + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java: + Suppress data points with values <= 0 because they kill JFreeChart's + log/log diagrams. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Fixed more SQL syntax errors. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Generate more than one SQResult (To my big suprise it's possible). + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQFractionResult.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQCurveFacet.java. + src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java: + Made more NPE bullet proof. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Fixed problem with string operation precedence. + +2012-07-13 Felix Wolfsteller + + * doc/conf/meta-data.xml: very basic official lines matching the current + artifact (for this it is wrongly placed in previous calc.-part, for + now. + +2012-07-13 Christian Lins + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: + Create shapefile directory instead of shapefile 'file'. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQFractionResult.java, + src/main/java/de/intevation/flys/artifacts/WMSFixpointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSCatchmentArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSBuildingsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java: + Removed translation whitespace. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQFractionResult.java: + Finally! SQResult is build and should be ready for display. :-) + +2012-07-13 Christian Lins + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java, + src/main/java/de/intevation/flys/utils/GeometryUtils.java: + Fix and workaround NullPointerExceptions. + +2012-07-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/wsplgen/WSPLGENCallable.java, + src/main/java/de/intevation/flys/wsplgen/FacetCreator.java, + src/main/java/de/intevation/flys/wsplgen/JobObserver.java, + src/main/java/de/intevation/flys/wsplgen/ProblemObserver.java, + src/main/java/de/intevation/flys/wsplgen/Scheduler.java, + src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java, + src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java, + src/main/java/de/intevation/flys/artifacts/MapArtifact.java, + src/main/java/de/intevation/flys/utils/MapfileGenerator.java, + src/main/java/de/intevation/flys/exports/MapGenerator.java: + Organized and added missing imports. + +2012-07-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: Added new + functions to reproject an Envelope from one CoordinateReferenceSystem to + antoher. + + * src/main/java/de/intevation/flys/artifacts/WMSQPSArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHydrBoundaryArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFixpointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodmapsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHwsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSCatchmentArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java, + src/main/java/de/intevation/flys/artifacts/WMSHydrBoundaryPolyArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSBuildingsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSGaugeLocationArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSLineArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java: + The getExtent() method will now return the extent of the layer in the + coordinate reference system that is configured for the specific river. + +2012-07-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WSPLGENJob.java, + src/main/java/de/intevation/flys/artifacts/model/WMSDBLayerFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WSPLGENLayerFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WSPLGENCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/WSPLGENReportFacet.java: + Moved to subpackage map. + + * src/main/java/de/intevation/flys/artifacts/model/map/WSPLGENLayerFacet.java, + src/main/java/de/intevation/flys/artifacts/model/map/WMSLayerFacet.java, + src/main/java/de/intevation/flys/artifacts/model/map/WSPLGENJob.java, + src/main/java/de/intevation/flys/artifacts/model/map/WMSDBLayerFacet.java, + src/main/java/de/intevation/flys/artifacts/model/map/WSPLGENCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/map/WSPLGENReportFacet.java: + Moved from upper package. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOverviewFacet.java, + src/main/java/de/intevation/flys/exports/OutputHelper.java, + src/main/java/de/intevation/flys/exports/sq/SQOverviewGenerator.java: + Added missing vim lines. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOverviewFacet.java, + src/main/java/de/intevation/flys/exports/OutputHelper.java: + Removed trailing whitespace. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOverviewFacet.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Removed superfluous imports. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Only use first period of the time periods given by the UI. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQResult.java: + Added some more index checking. + +2012-07-13 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOverviewFacet.java: + New. Facet for chart overview in sq relation. + + * src/main/java/de/intevation/flys/exports/sq/SQOverviewGenerator.java: + New. Generator for chart overview. This generator is not used jet. + Currently we generate the overview on client side by putting all charts in a + simple grid, cause the charts rendered by this generator are empty. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new Facet type. + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + Add facets for overview. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Avoid a NPE in legend entry aggregation. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Moved log output to avoid NPE. + + * doc/conf/artifacts/minfo.xml: + Added new output for chart overview. + +2012-07-13 Raimund Renkert + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Refactored. Moved some functionality to FLYSContext and OutputHelper. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java: + Added 'getOutGenerator' to get a concrete generator. Moved from + FLYSArtifactCollection. + + * src/main/java/de/intevation/flys/exports/OutputHelper.java: + New. Provides the 'doOut' functionality for FYLSArtifactCollection. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurements.java: + Handle the error case of accessing wrong indexed SQ relation + more smoothly. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Added access to the data of GSIEBSATZ and SSIEBUNG. + +2012-07-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Added the left joins to the GSIEBSATZ and SSIEBUNG tables. + +2012-07-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Do not store null values from database. + +2012-07-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurements.java: + New. Container for measurements. Helps to extract the S/Q fractions. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Now uses the measurements container. + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + Added convenience methods to extract the different fractions. + DONE: Q, S_SS, S_SF + TODO: S_BL_S, S_BL_FG, S_BL_CG, S_BL + + * src/main/java/de/intevation/flys/artifacts/model/SQOverview.java, + src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Relax existence of SIEBSATZID. + We have to use a left join during data extraction anyway. + We force the existence of Q because we cannot do the fitting if + we don't have them. + +2012-07-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java: + New. Access to the data from the SedDB. + + * src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java: + Load measurements from SedDB. + + * src/main/java/de/intevation/flys/artifacts/model/SQOverview.java: + Force NOT NULL for discharge values, too. + + * src/main/java/de/intevation/flys/artifacts/model/SQOverviewFactory.java: + Indentation fix. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Iterate over all given periods. + +2012-07-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/SQKMChartService.java: + Fixed wrong logger class. + +2012-07-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/SQOverview.java: + Filter out the meassures which don't have a related 'Siebsatz'. + + * doc/conf/cache.xml: Added forgotten cache for sq-overview. + + * src/main/java/de/intevation/flys/artifacts/model/SQOverviewFactory.java: + Added vim line. + +2012-07-12 Christian Lins + + * doc/conf/default-themes.xml, + doc/conf/virtual-themes.xml, + src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/themes/ThemeAccess.java: + Add showpointlabel style attribute. Refactor some styles to make use of + general attributes in the virtual themes. + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java, + src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java: + Suppress or fix some warnings. + +2012-07-12 Felix Wolfsteller + + * doc/conf/conf.xml: Fix class name. + +2012-07-11 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/DefaultState.java, + src/main/java/de/intevation/flys/utils/FLYSUtils.java, + src/main/java/de/intevation/flys/exports/ChartExportHelper.java, + src/main/java/de/intevation/flys/exports/WstWriter.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java, + src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Various cosmetic doc fixes. + +2012-07-11 Felix Wolfsteller + + * doc/conf/meta-data.xml: Make official lines available in dc for + manual loading in longitudinal sections. + +2012-07-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Sieve.java: + Simulates a sieve to separate the differen fractions from each other. + +2012-07-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DateRange.java, + src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Removed trailing whitespace. + +2012-07-11 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/model/DateRange.java, + src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Delta W(t) chart subtitle now with real values and correct i18n. + + +2012-07-11 Christian Lins + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Re-add HYK rendering code again to CrossSectionGenerator (fix for #712). + +2012-07-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/SQKMChartService.java, + src/main/java/de/intevation/flys/artifacts/model/SQOverview.java: + Removed superfluous imports. + +2012-07-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/SQOverview.java: + Made km separating of dates epsilon tolerant and avoid empty date lists. + +2012-07-10 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/services/SQKMChartService.java: + New. Service that generates an overview chart for measuring points. + + * src/main/java/de/intevation/flys/artifacts/model/SQOverview.java: + New. Instance of measuring points overview data. + + * src/main/java/de/intevation/flys/artifacts/model/SQOverviewFactory.java: + New. Foctory for overview data objects. + + * doc/conf/conf.xml: + Added new service to config. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings. + +2012-07-10 Felix Wolfsteller + + Fix for issue694. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Also resolve edge cases (last/first cross section km). + +2012-07-10 Felix Wolfsteller + + Partial fix for issue694 (Heightmarks snap to nearest cross section + line). + + * src/main/java/de/intevation/flys/artifacts/WaterLineArtifact.java: + Extended signature of getWaterLines to allow behaviour of only + delivering data if it snaps to the km (is closest). + + * src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Documentation, updated signature of getWaterLines(). + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Remember if Heightmarks are displayed, if so deliver data + only if cross-section is closest (snap). + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + Make next and previous km of cross-sections available as data. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Provide next and previous cross-section km via blackboard, adjusted + call to getWaterLines. + +2012-07-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Removed trailing whitespace. + +2012-07-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java, + src/main/java/de/intevation/flys/exports/ChartExportHelper.java, + src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/OutGenerator.java, + src/main/java/de/intevation/flys/exports/FlowVelocityGenerator.java: + Fix various documentation issues. + +2012-07-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionFactory.java, + src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java, + src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/transitions/DefaultTransition.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesExporter.java, + src/main/java/de/intevation/flys/exports/ChartHelper.java, + src/main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java, + src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java, + src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Fix various issues in the hard-to-find documentation. + +2012-07-09 Felix Wolfsteller + + * pom.xml: Configure javadoc mojo to include doc for protected/private. + +2012-07-09 Sascha L. Teichmann + + * contrib/themes2html.xsl: Create a list of direct sub themes + of a theme. + +2012-07-08 Felix Wolfsteller + + * doc/datacage-config-manual/Makefile: New, added Makefile. + +2012-07-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/Calculation2.java, + src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java, + src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/jfree/HasLabel.java: + Cosmetics, docs. + +2012-07-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java: + Fixed XPath typo. + +2012-07-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Removed dynamic XPaths to pervent potential XPath injections. + +2012-07-08 Sascha L. Teichmann + + * contrib/themes2html.xsl: New. Transformation to get a better + overview of themes.xml. Usage: + + $ xsltproc --path doc/conf \ + contrib/themes2html.xsl \ + doc/conf/themes.xml \ + > themes.xhtml + + Use browser to view the resulting file. + +2012-07-08 Sascha L. Teichmann + + * doc/conf/second-themes.xml: Name the second themegroup 'second' + instead of 'default' to avoid clashes with the real 'default' + themegroup. + +2012-07-08 Sascha L. Teichmann + + * doc/conf/default-themes.xml, + doc/conf/virtual-themes.xml, + doc/conf/themes.xml, + doc/conf/second-themes.xml: + Added xml processing instruction. + +2012-07-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/fitting/InvLog.java, + src/main/java/de/intevation/flys/artifacts/access/Access.java, + src/main/java/de/intevation/flys/artifacts/access/BedHeightAccess.java, + src/main/java/de/intevation/flys/artifacts/access/FlowVelocityAccess.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorA.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorB.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorC.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorD.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorE.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorF.java, + src/main/java/de/intevation/flys/exports/ChartArea.java, + src/main/java/de/intevation/flys/jfree/StyledValueMarker.java, + src/main/java/de/intevation/flys/jfree/StyledDomainMarker.java: + Added vim lines. + +2012-07-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java, + src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java, + src/main/java/de/intevation/flys/artifacts/model/FlowVelocityCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightCalculation.java, + src/main/java/de/intevation/flys/artifacts/access/BedHeightAccess.java, + src/main/java/de/intevation/flys/artifacts/access/FlowVelocityAccess.java: + Replaced tabs with four spaces each. + +2012-07-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartArea.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Removed superfluous imports. + +2012-07-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/StyledDomainMarker.java, + src/main/java/de/intevation/flys/jfree/StyledValueMarker.java, + src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java, + src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Removed trailing whitespace. + +2012-07-06 Christian Lins + + * doc/conf/*-themes.xml, + src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/jfree/StyledValueMarker.java, + src/main/java/de/intevation/flys/jfree/StyledDomainMarker.java, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Add styles for W(t) domain markers. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java: + Remove false @override. + +2012-07-06 Christian Lins + + * doc/conf/themes.xml, + doc/conf/second-themes.xml, + doc/conf/default-themes.xml: + Add missing themes for fixation charts. + +2012-07-06 Felix Wolfsteller + + Fix issue705 (names for mainvalues in export). + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Documentation and use NamedMainValues irrespective of WQ-type ( + single vs range). + +2012-07-06 Christian Lins + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + W(t) chart label rotation now working (see #684) + +2012-07-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Removed solved TODO. + +2012-07-06 Felix Wolfsteller + + Fix issue710 (crashing diagrams with only one point). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Expand the range/bounds where its added. + +2012-07-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java + (expandPointRange): Fix weird code with help of new ChartHelper + method. + +2012-07-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ChartHelper.java + (expandBounds): New, expand bounds by given percentage. + +2012-07-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/math/Distance.java: + New distance helper module. + +2012-07-06 Christian Lins + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Remove debugging code. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Remove HYK references and code. + +2012-07-05 Felix Wolfsteller + + * doc/datacage-config-manual/datacage-config-manual.tex: + Changed inclusions to include new content file. + + * doc/datacage-config-manual/content.tex: Content from doc/datacage.txt, + xml formatted. + +2012-07-05 Felix Wolfsteller + + * doc/datacage-config-manual/datacage-config-manual.tex, + doc/datacage-config-manual/README, + doc/datacage-config-manual/title.tex: + Added stub of tex-version of datacage config documentation. + +2012-07-05 Christian Lins + + * doc/*-themes.xml: + Add textorientation field. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartArea.java: + Move annotation related code to base class ChartGenerator. + +2012-07-04 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Prevent casting exception. + +2012-07-04 Felix Wolfsteller + + issue487 (wrong area calculation). + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + Fix area calculation. + +2012-07-04 Ingo Weinzierl + + * doc/conf/themes.xml: Moved theme groups to own XML files to improve the + structure. + + * doc/conf/second-themes.xml, + doc/conf/default-themes.xml, + doc/conf/virtual-themes.xml: New XML files for themes / theme groups; each + theme group in one single file. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Improved logging; print number of theme groups and themes in it as INFO. + +2012-07-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Only show labels if enabled in theme. Commented (failed) trials to get the + text rotation right. + +2012-07-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Fix certain AIOOBs that were caused by the fact that QWDs can end up in two + different series. + +2012-07-03 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Implemented mergeRanges to combine y bounds in timeseries charts. + +2012-07-03 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveInfoGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtInfoGenerator.java: + New. Added chart info generator for WQ and delta W(t) chart. + + * doc/conf/conf.xml: + Added info generators to config. + +2012-07-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Very basic, unstyled, always-on labels of points in DeltaWt-Diagrams. + +2012-07-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Replaced Arrays.asList(new String[] { "a", "b" }).contains("a") code. + +2012-07-03 Sascha L. Teichmann + + * doc/conf/themes.xml, + src/main/java/de/intevation/flys/artifacts/model/FlowVelocityCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightCalculation.java, + src/main/java/de/intevation/flys/artifacts/access/BedHeightAccess.java, + src/main/java/de/intevation/flys/artifacts/access/FlowVelocityAccess.java, + src/main/java/de/intevation/flys/artifacts/states/FlowVelocityState.java, + src/main/java/de/intevation/flys/artifacts/states/MiddleBedHeight.java: + Removed trailing whitespace. + +2012-07-03 Ingo Weinzierl + + * doc/conf/themes.xml: Added missing themes for middle bed height curves. + +2012-07-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/access/BedHeightAccess.java, + src/main/java/de/intevation/flys/artifacts/access/FlowVelocityAccess.java: + New Access objects to access relevant information of Artifacts specific + to bed heights and flow velocity calculations. + + * src/main/java/de/intevation/flys/artifacts/model/FlowVelocityCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightCalculation.java, + src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java, + src/main/java/de/intevation/flys/artifacts/states/FlowVelocityState.java, + src/main/java/de/intevation/flys/artifacts/states/MiddleBedHeight.java: + Use *Access objects to get required information from Artifact. + + * src/main/java/de/intevation/flys/artifacts/MINFOArtifact.java: Moved + methods to access specific information for calculations to *Access + objects. + +2012-07-03 Felix Wolfsteller + + Fix issue695 (labeling of waterlines). + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java + (doCrossSectionWaterLineOut): Handle labels more individually. + + * src/main/java/de/intevation/flys/jfree/XYStyle.java + (applyShowLineLabel): Tell renderer that there is something to do in case + any label is switched on. + +2012-07-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java, + src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/math/DifferenceCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/DifferenceCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java, + src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/geom/VectorUtils.java, + src/main/java/de/intevation/flys/artifacts/geom/Lines.java, + src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java, + src/main/java/de/intevation/flys/artifacts/WaterLineArtifact.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationExporter.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/themes/ThemeAccess.java, + src/main/java/de/intevation/flys/jfree/StyledAreaSeriesCollection.java: + Fixed various bugs (package declarations, moved classes to correct + places). + +2012-07-03 Ingo Weinzierl + + * doc/conf/themes.xml: Removed line properties from fixation point themes + and added missing point properties. + +2012-07-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/ManualPointsFacet.java, + src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Cosmetics. + +2012-07-02 Felix Wolfsteller + + issue654. + + * src/main/java/de/intevation/flys/exports/LegendProcessor.java: + Do not include type in hash for legend item. + +2012-07-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/ParametersExporter.java: + Generate CSV for facet 'fix_parameters'. + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: + Be more eloquent on which kind of facet the exporter does not + like. + +2012-07-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + Made it more symmetrical to FixationCompute. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Removed fake result stuff. Fetch parameters from SQRelationAccess. + +2012-07-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixChartGenerator.java: + Remove some evidence that the authors of this software + do not know Java at all. + +2012-07-01 Sascha L. Teichmann + + Part of flys/issue687 + + * src/main/java/de/intevation/flys/exports/ATWriter.java: + New. Samples fitting function to AT files. + + !!! Untested and expected to be slightly broken. !!! + + * src/main/java/de/intevation/flys/exports/fixings/FixATWriter.java: + Made some formatting things public to be reusable. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for AT headers. + +2012-07-01 Sascha L. Teichmann + + * doc/conf/artifact-db.xml, + doc/conf/cache.xml, + doc/conf/meta-data.xml: Removed trailing whitespace. + +2012-07-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Removed embedded class IdGenerator. + + * src/main/java/de/intevation/flys/utils/IdGenerator.java: + New. Re-added the id generator as top level class. + +2012-06-30 Sascha L. Teichmann + + Added parameter exporter for fixings analysis. + Part of flys/issue689 + + * src/main/java/de/intevation/flys/exports/fixings/ParametersExporter.java: + New. Exports the contents of the parameters of the fix analysis. + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Added visitor interface to visit all rows of the parameters. + + * doc/conf/artifacts/fixanalysis.xml: Added new facet for + parameter export. + + * doc/conf/conf.xml: Register the new parameter exporter. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added facet type. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Fixed indentation. + Removed some programming oddities. + Create facet for parameter export. + + * src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java: + Removed code which is already contained in the base class. + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: + Cleaned up code. + +2012-06-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/DeltaWtExporter.java: + Deleted + + * src/main/java/de/intevation/flys/exports/fixings/DeltaWtExporter.java: + Re-added here + + * doc/conf/conf.xml: Adjusted package name of DeltaWtExporter. + +2012-06-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveInfoGenerator.java: + New. Added chart info companion for FixDerivedCurveGenerator. + + * doc/conf/conf.xml: Added to configuration. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java: + Code clean up. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixFunction.java: + Simplified. Not Serializable any more because its only a transient object. + + * src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java: + Clean up. Simplified. Removed dependency from Function2DAdapter because + we are doing our own sampling. + + * src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionInfoGenerator.java: + Removed empty last line. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Small cosmetics. + + * src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java: + Do not notify listeners when add data series. + + * src/main/java/de/intevation/flys/jfree/Function2DAdapter.java: + Removed. Obsolete. + +2012-06-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Removed superfluous import. + +2012-06-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionInfoGenerator.java: + New. Added chart info companion for FixLongitudinalSectionGenerator. + + * doc/conf/conf.xml: Added to configuration. + +2012-06-29 Christian Lins + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Unfinished work on generalizing annotations in ChartGenerators. + +2012-06-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java: + Fixed parameter name. + + * src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties: + Fixed typo. + +2012-06-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/access/SQRelationAccess.java: + Finished the access to the S/Q relation stuff. + + * doc/conf/artifacts/minfo.xml: + State "state.minfo.sq.periods" returns the value as string + symmetrical to state "state.fix.analysisperiods". + + * src/main/java/de/intevation/flys/artifacts/model/fixings/DateRange.java: + Deleted. + + * src/main/java/de/intevation/flys/artifacts/model/DateRange.java: + Re-added here because its of use not only in the fix analysis + but also in the S/Q relation. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisPeriodsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/AnalysisPeriod.java, + src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java, + src/main/java/de/intevation/flys/artifacts/access/Access.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Adjusted the imports for the moved DateRange. + +2012-06-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/access/SQRelationAccess.java: + New. Artifact access for the S/Q relation. TODO: Add more parameters. + + * src/main/java/de/intevation/flys/artifacts/access/Access.java: + Remove trailing whitespace. + + * src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java: + Added more debug output. + +2012-06-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/access/Access.java: New. + Base class for *Access of FLYSArtifacts. + + * src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java: + Extends Access now. + +2012-06-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java: + Removed dead code. + +2012-06-28 Christian Lins + + * doc/conf/themes.xml, + src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/themes/ThemeAccess.java: + Set text orientation to horizontal for points in Fixation W/Q curve. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Fix overlapping indices of facets. + +2012-06-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java: + Added method to figure out which discharge sectors of the + the analysis periods really contains data. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Only emit analysis period / discharge sectors which really contain data. + +2012-06-28 Sascha L. Teichmann + + Moved FixationArtifactAccess into own package access because there are + more *Access to come e.g. SQRelationAccess. + + TODO: Refactor the code for WINFO to use this *Access pattern. This + results in much cleaner, better scaling and better understandable code. + + * src/main/java/de/intevation/flys/artifacts/FixationArtifactAccess.java: Deleted. + * src/main/java/de/intevation/flys/artifacts/access/FixationArtifactAccess.java: New. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalDeviationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalAnalysisFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalReferenceFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisPeriodsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDeviationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/access, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Adjusted imports. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + Removed superfluous imports. + +2012-06-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + If fitting fails for tolerance of 1e-10 increase it incremental + by factor of 10 to 1e-3 and only bail out if it fails on this level. + +2012-06-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Exp.java: + Fixed da/dQ but the fitting still does not work for the function. :-/ + +2012-06-27 Christian Lins + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Show only dates as point labels. + +2012-06-27 Christian Lins + + * doc/conf/conf.xml: + Fix typo in generator class for fix_longitudinal_section_curve + +2012-06-27 Felix Wolfsteller + + Create and handle new manual line facets. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Added new constructor to play nice with upcoming facet-type. + + * src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java: + Added functionality to serve as WaterLineFacet (calculate water + line against cross section profile). + + * src/main/java/de/intevation/flys/artifacts/states/ManualPointsSingleState.java: + Extended to generate cross section water line facets, too. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Handle new Facet Type. + +2012-06-27 Felix Wolfsteller + + FacetType for upcoming cross_section.manualline facet. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added Facet Type and IS-helper dor upcoming facet. + +2012-06-27 Felix Wolfsteller + + Configure Themes and compatibility of upcoming + cross_section.manualline facet. + + * doc/conf/artifacts/winfo.xml, + doc/conf/artifacts/manualpoint.xml: + Add upcoming facet to compatibility lists. + + * doc/conf/themes.xml: Register theme for upcoming facet. + +2012-06-27 Christian Lins + + * doc/conf/conf.xml: + Add output generator for 'fix_derived_curve' + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Add some ugly formatted point labels. + +2012-06-27 Sascha L. Teichmann + + Moved describe() and the generating of output into FLYSArtifact. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + This the base class so it should contain common code! + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/FixationArtifact.java, + src/main/java/de/intevation/flys/artifacts/ChartArtifact.java, + src/main/java/de/intevation/flys/artifacts/MINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/MapArtifact.java: + Moved common code into base class. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Removed superfluous imports. + +2012-06-27 Christian Lins + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Use JFreeUtil.sampleFunction2D() to sample a StyledXYSeries. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDeviationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java: + Add ctor with addtional custom facet index parameter. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Introduce IdGenerator to generate unique facets IDs within an output, + so themes can now be applied properly to points and lines. + +2012-06-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/AttributeParser.java: + Removed some expensive XPath usage. Some quick profiling + showed that up to 7% of our code (excluding Hibernate, H2, Restlet, etc.) + were spend in these XPaths. A lot of time + + !!! Please, please, dear fellow programmers do not use XPath for fetching + !!! trivial things that are easily accessible via DOM, too! + +2012-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java, + src/main/java/de/intevation/flys/artifacts/model/sq/Fitting.java: + Refactored to better fit the data types of SQResult. + +2012-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/LegendProcessor.java: + Removed trailing whitespace. + +2012-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQ.java: + Added method to validate point. + + * src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java: + Added method to callback to re-initialize the function to fit. + + * src/main/java/de/intevation/flys/artifacts/model/sq/Fitting.java: + New. Shell for fitting of one SQ fraction. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Removed superfluous import. + +2012-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java: + New. Specialized outlier test for the S/Q relation. + Outliers are accepted in multiples of the standard deviation. + +2012-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Only generate outlier facet when we done the prepocessing. + +2012-06-26 Felix Wolfsteller + + Enable legend aggregation in time series charts. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Call super.aggregateLegendEntries. + +2012-06-26 Felix Wolfsteller + + Legend Item Aggregation refactoring. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java + (aggregateLegendEntries): Moved up from XYChartGenerator to ChartGenerator. + +2012-06-26 Felix Wolfsteller + + Legend Item Aggregation refactoring. + + * src/main/java/de/intevation/flys/exports/LegendProcessor.java: + New (extracted from XYChartGenerator). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Extracted legend item aggregation to LegendProcessor. + +2012-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Removed trailing whitespace. + +2012-06-26 Felix Wolfsteller + + Minor polish for LegendItem-Aggregation. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: +  Define and use static SPACE Shape. + +2012-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/fitting/InvLogLinear.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvQuad.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvPow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvSQPow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvLogLinear.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Quad.java: + Completed inverse stubs. + +2012-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/fitting/FunctionFactory.java: + Register the singletons instead of new objects. + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Pow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvQuad.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/SQPow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/LogLinear.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvPow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvSQPow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvLogLinear.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Quad.java: + Link the functions to there inverses via getInverse(). + +2012-06-26 Sascha L. Teichmann + + Implemenation of the inverses of the fitting functions. Needed + for the AT export of the calculated curves. + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Function.java: + Added abstract method getInverse() to get the inverse of the + function. + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Pow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/SQPow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Linear.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/LogLinear.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Log.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Quad.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Exp.java: + Implements the getInverse() method. + + * src/main/java/de/intevation/flys/artifacts/math/fitting/InvLog.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvLogLinear.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvQuad.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvPow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvExp.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvSQPow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/InvLinear.java: + Implements the inverses of the function above. Some are still + stubs. + +2012-06-25 Felix Wolfsteller + + Fix issue663 ("step" curves for Q). + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java + (addStepPointsKmQ): New, add "step" points for series. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Use new StyledSeriesBuilder function. + +2012-06-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Fix LegendAggregation; prevent single aggregated legend item to + overflow by splitting it into many, but iconless legenditems. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Fixed typo in I18N key. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Finished I18N. + + * src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java: + Accept callback to label legend items. + + * src/main/java/de/intevation/flys/jfree/ShapeRenderer.java: Added interface + LabelGenerator to create labels for entries. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added strings. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalReferenceFacet.java: + Removed trailing whitespace. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalDeviationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalAnalysisFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalReferenceFacet.java, + src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java: + Removed superfluous imports. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Uses I18N now. + + * src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java: + Added convenience constructor for creating date formatters with strings. + + * src/main/java/de/intevation/flys/artifacts/resources/Resources.java: + Added variadic method format(). + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added strings. + +2012-06-25 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java: + New. Generator for longitudinal sections in fix analysis. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalDeviationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalAnalysisFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixLongitudinalReferenceFacet.java: + New. Facets for longitudinal sections chart in fix analysis. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new facet types. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Add facets for new chart. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Fixed NPE. + + * doc/conf/artifacts/fixanalysis.xml: + Added facets to config. + + * doc/conf/themes.xml: + Added new themes. + + * doc/conf/conf.xml: + Added new chart generator. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings. + +2012-06-25 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Look for the attribut "outline" to render shape outlines in charts. + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Add the "outline" attribute. + +2012-06-25 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Do not add entries ending with " " to legend. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Prevent that the plot becomes to small if only one point is drawn. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Added debug output about the concrete coeffs found by the fitting. + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Log.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/LogLinear.java: + Re-checked the partial deviations to the coeffs. Write the formulas + more human readable. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/ShapeRenderer.java: If a label collides + with a other labels try to draw it on the other side of the point. + This results in more labeled points which is useful because you cannot zoom + in for details in the fixings km chart. + + * src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java: + Paint measured points blue and interpolated green. + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Set background color to white. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Interpolated and measured values where switched. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Label the points in diagram and show if they are interpolated or not. + + * src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java: + New. Extended XYSeriesCollection to cope with QWs + + * src/main/java/de/intevation/flys/utils/Formatter.java: Added formatters + to be fetched only over CallMeta. CallContext are not present in services. + + * src/main/java/de/intevation/flys/java2d/ShapeUtils.java: New. Some code + to handle Shapes. + + * src/main/java/de/intevation/flys/jfree/ShapeRenderer.java: New. Shape + renderer. This is a simplified version of the shape renderer + from fixings analysis in desktop FLYS. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Re-added accidentially removed code. + +2012-06-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/jfree/StyledXYSeries.java: + Removed trailing whitespace. + +2012-06-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Removed TODOs about I18N + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added strings for fixing analysis. + +2012-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/KMIndex.java: + OpenJDK javac 1.6.0_24 seems to be more picky about + correct usage of generics. + +2012-06-23 Sascha L. Teichmann + + * contrib/add-i18n-numbers.py: New. Script to prefix + the values of property files with a small number to + make the keys identifiable even through the UI. + + Apply in the same manner as contrib/check-i18n-properties.py + +2012-06-23 Sascha L. Teichmann + + * src/main/resources/messages_de.properties, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties: + Repaired inconsistencies. + +2012-06-24 Christian Lins + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/themes/ThemeFactory.java, + src/main/java/de/intevation/flys/jfree/XYStyle.java: + Add debug logs. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/jfree/StyledXYSeries.java: + Draw the W/Q function as StyledXYSeries. + +2012-06-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Re-enable legend entry aggregation, take the threshold from + settings. + +2012-06-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ChartSettings.java: + Parse and set legend aggregation value. + +2012-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java, + src/main/java/de/intevation/flys/artifacts/model/GaugeFinderFactory.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java: + Removed trailing whitespace. + +2012-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Added bug output when creating Q sector markers. + + * src/main/java/de/intevation/flys/artifacts/model/GaugeRange.java: + Added toString() method. + +2012-06-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Set the aggregation threshold value. + +2012-06-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java, + src/main/java/de/intevation/flys/collections/OutputParser.java: + Cosmetics, doc. + +2012-06-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/WstWriter.java: + Cosmetics. + +2012-06-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Draw domain markers for borders of Q sectors. There is some kind of glitch + in in the Q sector classifaction code or the db data is strange. + + Because of the common code basis this affects the fixings calculations, too. :-( + +2012-06-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Calculate the standard deviation of the Q sector delta Ws, too. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/AnalysisPeriod.java: + Store the standard deviation of the Q sector delta Ws, too. + Indexed 0..3; NaN means the std dev for this sector is not existing. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/GaugeRange.java: + added method getSectorBorder(int). With this method you can figure + the three discharge sector borders. Returns NaN if border is + not there. Usage: + + GaugeFinderFactory ggf = GaugeFinderFactory.getInstance(); + GaugeFinder gf = ggf.getGaugeFinder("Elbe"); + if (gf == null) { /* FAIL */ } + GaugeRange gr = gf.find(km); // km is the km where you are. + if (gr == null) { /* FAIL */ } + + double m0 = gr.getSectorBorder(0); // Draw as marker if not NaN + double m1 = gr.getSectorBorder(1); // Draw as marker if not NaN + double m2 = gr.getSectorBorder(2); // Draw as marker if not NaN + + Labels should be: + '(MNQ+MQ)/2' for m0 + '(MQ+MHQ)/2' for m1 + 'HQ5' for m2 + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/GaugeFinderFactory.java: + New. Cache access to per river gauge finders. This very useful + if you want to draw the discharge sectors of river at a given + km into a diagram. + + * doc/conf/cache.xml: Added cache 'gauge-finders'. + + * src/main/java/de/intevation/flys/artifacts/model/GaugeFinder.java: + Added find(double km) method to find GaugeRange by km. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Uses the instance of the GaugeFinderFactory to access the + gauge ranges. + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java: + Simplified code. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/GaugeFinder.java: + New. Moved out of FixingsOverview. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Moved GaugeFinder into top level class. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/GaugeRange.java: + New. Moved out of FixingsOverview. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Moved GaugeRange into top level class. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Prevent some NPEs. + !!! This is not a fix for the real problem !!! + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixDeviationFacet.java, + src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Removed superfluous imports. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Range.java: + New. Moved out of FixingsOverview. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Moved Range into top level class. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/FixingsFilterBuilder.java, + src/main/java/de/intevation/flys/artifacts/services/FixingsOverviewService.java: + Adjusted imports. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Fixed problem with select the wrong meta data (date, descriptions, etc.) + for a data column. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsFilterBuilder.java: + Fixed stupid i/j switch bug. + +2012-06-21 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Updated i18n. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n string for delta W(t) chart. + +2012-06-21 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Added attribution for single series styling. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Skip legend items for interpolated point series. + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + Split analysis and reference points into two chart series. Added attribute + for interpolated points for different styling. + + * src/main/java/de/intevation/flys/jfree/Style.java: + Added getter for renderer. + + * src/main/java/de/intevation/flys/jfree/XYStyle.java: + Implemented getter for renderer. + +2012-06-21 Christian Lins + + * doc/conf/artifacts/fixanalysis.xml, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Split fix_sector_average_wq in four facet types, one for each class (_0, _1, ..) + + * doc/conf/themes.xml: + Update themes for WQ curve + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Fix for small issue with sector average points + +2012-06-21 Christian Lins + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Adapt doAverageSectorOut() to reflect changes in Facet. + +2012-06-20 Raimund Renkert + + Added delta W(t) chart in fix analysis. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added facet types for deta W(t) chart. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java: + Changed facet index to determine the sector index and the analysis period + index. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Calculate a facet index including the sector index and the analysis period + index. + Added new facet for delta W(t) chart. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixDeviationFacet.java: + New. Facet to display the standard deviation in delta W(t) chart. + + * src/main/java/de/intevation/flys/exports/fixings/FixDeltaWtGenerator.java: + New. Generator for the delta W(t) chart. + + * doc/conf/artifacts/fixanalysis.xml: + Updated facets in outputmodes. + + * doc/conf/conf.xml: + Added output generator to config. + +2012-06-20 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + New methods to add domain and value axis markers to the plot. + +2012-06-20 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/DeltaWtExporter.java: + Added reference events to CSV export. + +2012-06-20 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java: + Changed data type from QW[] to QWD[] to have delta Ws in reference events. + +2012-06-20 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + Moved function instantiation to alway have a valid function instance. + +2012-06-20 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Fixed binary search. + +2012-06-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Bring binarySearch with epsilon more to source of binarySearch of Collections. + Still not working properly. Why? + +2012-06-20 Felix Wolfsteller + + Avoid problems with corrected Ws in cross-sections; hacky solution, + issue680. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java + (waterLineC): New, get corrected W. + + * src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java: + Create C-facet with other index. + +2012-06-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Cosmetics, doc. + +2012-06-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Cosmetics, doc. + +2012-06-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Now respects the selected events and reference period correctly. + + * src/main/java/de/intevation/flys/artifacts/FixationArtifactAccess.java: + referenceStart and referenceEnd are now melted into referencePeriod. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Add a new filter IdsFilter which is more efficent to check than a + OrFilter with a list of IdFilters inside. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsFilterBuilder.java: + Expose the new IdsFilter to the XML representation in form of + + +2012-06-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java: + Fixed broken naming of chart curves. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Renamed facets for SQ + relation chart curves. + +2012-06-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + Create a compound index value for SQOutlierFacets. This index is based + on the index of the result object (to get the correct data) and the + iteration of the outliers. This compound index is used to make + SQOutlierFacets unique to FLYSCollection's DESCRIBE document. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOutlierFacet.java: + Parse the index of the result object and the iteration number from index + property. + + * src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java: + Added some more debug output. + +2012-06-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Create only SQ objects with values > 0. Otherwise JFreeChart will break + during chart creation (values for logarithmic axes have to be > 0). + +2012-06-20 Ingo Weinzierl + + * doc/conf/themes.xml: Adjusted the color of SQ Facets (lines and points) + as shown in examples. + +2012-06-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + Create new Facets with proper i18n label. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for facet + names. + +2012-06-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorA.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorB.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorC.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorD.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorE.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGeneratorF.java: + New concrete chart generators. Each fraction of the SQ relation + calculation has its own generator now. This is because they all have + different chart titles and labels. + + * doc/conf/conf.xml: Let SQ relation charts use more concrete generators. + + * src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java: + Implemented getDefaultXAxisLabel() getDefaultYAxisLabel(). + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for chart + titles and axes labels. + +2012-06-19 Felix Wolfsteller + + Fix issue681 (wrong vertical lines in duration curve q-mainvalues on + second y-axis). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Fix vertical line if on second y-axis. + +2012-06-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java: + Restrict q-filter facet to the differences case. + +2012-06-19 Felix Wolfsteller + + * doc/conf/artifacts/waterlevel.xml: Add Q-facets to compatibility list. + + * src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java: + Add Q-facets to filter facet list. + +2012-06-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QW.java, + src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Removed trailing whitespace. + +2012-06-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/JFreeUtil.java: Directly + sample "our" Function objects instead of JFreeChart Function2Ds. + + * src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java: + Removed JFreeChart Function2D wrapper and directly use our Function + objects. + +2012-06-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Removed superfluous imports. + +2012-06-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + Calculate the standard deviation of the delta Ws of the referencen points, too. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Store the standard deviation of delta Ws of reference points into + a parameters column "std-dev". + +2012-06-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/JFreeUtil.java: New function to + sample a Function2D. This method is used, because JFreeChart's + DataUtilities.sampleFunction2D() returns an instance of XYSeries but we + need StyledXYSeries. + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: Added a + method to retrieve parameter values for a list of parameter names. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Create a fake Parameters object for the SQ curve. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQFractionResult.java: + Added getMinQ() and getMaxQ() to determine the Q range. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQFunction.java: New + model class that stores a Function and a min and max Q value. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQCurveFacet.java: + Return a SQFunction instance based on the parameters and Q range of the + SQFractionResult. + + * src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java: Use + JFreeUtil's new function sampleFunction2D to create a StyledXYSeries for + the SQ curve. + +2012-06-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Store into QWs if they are interpolated. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QW.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/QWD.java: + Stores boolean if the values are interpolated. + +2012-06-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/fitting/SQPow.java: + Name derivative S'(Q). + +2012-06-19 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Add Q-Facets to compatibility list of dis-c. + +2012-06-19 Ingo Weinzierl + + * doc/conf/themes.xml: Added theme mappings for sq relation fractions b - f. + +2012-06-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQResult.java: Renamed + the former SQResult to SQFractionResult. This class is now used to store a + set of SQFractionResults for each SQ calculation. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQFractionResult.java: + Former SQResult. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Create new fake SQFractionResults for fraction A, B and C (used for + testing). + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQMeasurementFacet.java: + Added the 'fractionIdx' property to get to know which fraction should be + represented. + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: Create + Facets for each SQResult and SQFractionResult. + +2012-06-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/fitting/SQPow.java: + New. S(Q) = a*Q^b + + * src/main/java/de/intevation/flys/artifacts/math/fitting/FunctionFactory.java: + Registered new function. + +2012-06-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQMeasurementFacet.java: + Implemented getData(). It returns the SQ[] of + SQResult.getMeasurements(). + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: Create + proper facet for sq measurements and corrected constructor call of + SQOutlierFacet. + + * src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java: + Generalized doSQMeasurementsOut() and doSQOutliersOut() to one single + method doSQOut() which is able to handle SQ[] data. + +2012-06-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Changed the + default behavior: line labels are not visible if no config option is set! + +2012-06-19 Sascha L. Teichmann + + * doc/conf/conf.xml: Load config of rest server and floodmap over + external entities, too. + + * doc/conf/floodmap.xml, doc/conf/rest-server.xml: New. + External config. + +2012-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + The reference points are now wrapped in QWDs. This enables the + plotting of Delta W(t) data for the reference points. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QWD.java: + Added convenience constructor. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Adjusted. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixFacetUtils.java: + Cosmetics. + +2012-06-18 Christian Lins + + * doc/conf/artifacts/fixanalysis.xml: + Remove fix_analysis_periods_wq from fix_wq_curve facet. + + * doc/conf/themes.xml: + Add fixing themes for other theme groups. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java: + Debug output added. + +2012-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixFacetUtils.java: + Added vim line, made class public. + +2012-06-18 Sascha L. Teichmann + + * doc/conf/conf.xml: Using external system entities to configure databases. + !!! + !!! FROM NOW ON YOU CAN YOUR conf.xml FROM TRUNK. + !!! Adjust the database credentials via the *-db.xml files + !!! which are included. + !!! + + * doc/conf/artifact-db.xml: New. Configuration for the artifact database. + * doc/conf/seddb-db.xml: New. Configuration for the SedDB + * doc/conf/backend-db.xml: New. Configuration for the FLYS3 database. + * doc/conf/datacage-db.xml: Configuration for the datacage datacage. + +2012-06-18 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/fixings/AnalysisPeriod.java: + Fixed constructor. + +2012-06-18 Christian Lins + + * doc/conf/themes.xml: + Add themes for fixing facets. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java: + Use FixFacetUtils.getMaxQ() to retrieve max Q. + Interpolate km values instead of strict binary search. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixFacetUtils.java: + Added, contains static getMaxQ() method. + + * src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Some issues fixed. + +2012-06-18 Ingo Weinzierl + + * doc/conf/themes.xml: Fixed broken color strings. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Added new functions + that return colors for points. + + * src/main/java/de/intevation/flys/themes/ThemeAccess.java: Added new + function that returns the color for points. + + * src/main/java/de/intevation/flys/jfree/XYStyle.java: Added new method to + apply the color of points (independent of the specified line color). + +2012-06-18 Ingo Weinzierl + + * doc/conf/themes.xml: Added themes for SQ relation charts + ('sq_a_measurement', sq_a_outlier' and 'sq_a_curve'). + +2012-06-18 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/fixings/FixChartGenerator.java: + New. Abstract chart generator for fix analysis. This generator adds the + current km to the context. + + * src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Generators now extend the FixCahrtGenerator. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisPeriodsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java: + Get the current km from context. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Removed getter for current km. + +2012-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/map/PrintMap.java, + src/main/java/de/intevation/flys/artifacts/states/SoundingsSelect.java, + src/main/java/de/intevation/flys/artifacts/states/SQRelation.java, + src/main/java/de/intevation/flys/artifacts/states/DischargeState.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java, + src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/collections/CollectionDescriptionHelper.java: + Removed repeated x.size() calls from for loops. + +2012-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Removed superfluous imports. + +2012-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WKmsJRDataSource.java, + src/main/java/de/intevation/flys/artifacts/model/WWQQJRDataSource.java, + src/main/java/de/intevation/flys/artifacts/model/WQTJRDataSource.java: + Added missing 'else's in if/else ladders. + +2012-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FileUploadService.java: + Fixed string comparision for identity. + +2012-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/**/*.java: Added missing vim lines. + +2012-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Removed tabs. Set log level from INFO to DEBUG because this case + is much too common. + +2012-06-17 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Comments added. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java: + Logging output added. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java: + Max Q is now determined by parameter.interpolate(). + + * src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java, + src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Use getCurrentKmFromRequest() in output generation. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Typo in method description. + +2012-06-15 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisPeriodsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java: + The getData() method now takes a km parameter to get the data at a specific + km. + +2012-06-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQ.java: New model to + store values for S/Q. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQResult.java: New + model class that should be used to store calculation results of SQ + relation. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java: + Create a fake SQResult. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQOutlierFacet.java: + Set missing required properties, so that this facet will be able to + re-calculate results again if the results are not in cache. + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + Create correct number of facets for parameter A for outliers Facet. + + * src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java: + Create a JFreeChart XYSeries from SQResult's outliers Facet. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Added a + method to create X axes. The SQRelationGenerator overrides this method, + because it requires a logarithmic axis. + +2012-06-15 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Added getter for current km. + +2012-06-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + new functions to determine if a Facet is a SQ curve, measurement or + outlier independend of their parameter. + + * src/main/java/de/intevation/flys/exports/sq/SQRelationInfoGenerator.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationGenerator.java, + src/main/java/de/intevation/flys/exports/sq/SQRelationExporter.java: + Stubs for chart and export generators. + + * doc/conf/conf.xml: Registered new output-generators for SQ relation + charts and exports. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for CSV + export of SQ relations. + +2012-06-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/**/*.java: Removed trailing whitespace. + +2012-06-14 Sascha L. Teichmann + + * doc/conf/conf.xml: Added out commented block for SedDB configuration. + +2012-06-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java: + Some code cleanup. + +2012-06-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + Added more debug output. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java: + Interpolate the coeffs for the function to be drawn. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Made code more robust for none existing data. + +2012-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + new Facets for MINFO SQ relation calculation. + + * doc/conf/artifacts/minfo.xml: Added output for chart and data export for + sq relation calculation. Registered new facets. + + * src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/sq/SQMeasurementFacet.java: + Stubs for calculation and Facets used for SQ relation calculation. + + * src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + Override computeAdvance() and implemented a stub for calculation and + Facet creation. + +2012-06-11 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java: + Changed filter string to 'Messstelle'. + +2012-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Fetch only cross section tracks that have a name 'qps' set for WSPLGEN + calculation. + +2012-06-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java: + Use binary search again. + +2012-06-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java: + Removed superfluous import. + +2012-06-13 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java: + Workaround for IndexOutOfBoundsException. + + * src/main/java/de/intevation/flys/exports/fixings/FixDerivedCurveGenerator.java: + Output generator for fixing derived curve. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java: + Use binary search with epsilon again. + +2012-06-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java: + Added more debug/warn log statements. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: Do + not add empty objects into the calculation result. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Take care on empty QWD objects. + +2012-06-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/AnalysisPeriod.java: + Max Q is store in column "max_q" in Parameters now. So function can be plotted + bewtween calculated kms, too. + For function sampling use something like this.: + + double [] maxQ = parameters.interpolate("km", 42.3", new String [] { "max_q" }); + double maxSampleQ = 10000d; + + if (maxQ != null) { + maxSampleQ = Math.min(2000d, Math.abs(maxQ[0])); + maxSampleQ += 0.05*maxSampleQ; + } + +2012-06-13 Christian Lins + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Add missing imports and correct coding issues. + +2012-06-12 Christian Lins + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java: + Use KMIndex.search() (with epsilon) instead of KMIndex.binarySearch(). + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Move marker generation to XYChartGenerator. + +2012-06-12 Christian Lins + + * doc/conf/conf.xml: + Add fix_wq_curve output generator. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisPeriodsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java: + Add additional null-checks to prevent NullPointerExceptions when accessing empty + facets. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java: + getMaxQ() now returns constant '1000' until it is properly fixed. + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Code for generating charts more or less complete but untested due to bugs in facets. + +2012-06-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Added method double [] interpolate(keyName, key, columnNames). + This construct is better suited for the extraction of + coefficients for building functions. In pseudo code: + + fitting.Function function = + FunctionFactory.getInstance().getFunction("log"); + + double km = 42.35; + + double [] coeffs = parameters.interpolate( + "km", km, function.getParamterNames()); + + math.Function f = function.instantiate(coeffs); + +2012-06-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java, + src/main/java/de/intevation/flys/artifacts/states/GaugeDischargeState.java: + Removed superfluous imports. + +2012-06-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Added interpolate methods that return an array of linear interpolated + values for a given key. Say you have a column named "km" you can call + 'values = parameters.interpolate("km", 12)' to fetch a set + of proportional interpolated parameters even if there are only + "km": 10 and "km": 15 in the data structure. Returns null if out of bounds. + +2012-06-11 Raimund Renkert + + * doc/conf/artifacts/minfo.xml: + Added states and transitions for S-Q-relation. + + * src/main/java/de/intevation/flys/artifacts/states/PeriodsSelect.java, + src/main/java/de/intevation/flys/artifacts/states/OutliersInput.java, + src/main/java/de/intevation/flys/artifacts/states/SQRelation.java: + New. States for multiple periods input, outliers input and final + S-Q-relation. + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java: + Added name filter for locations. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for states. + +2012-06-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java: + Fixed broken logger class. + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Re-establish old indentation. + +2012-06-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + (doWOut): Interpolate values from WKms. + +2012-06-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/GaugeDischargeState.java: + Enable caching. + +2012-06-07 Felix Wolfsteller + + * doc/conf/meta-data.xml: Simplified choice of gauges for discharge c. + + * src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/GaugeDischargeState.java: + Create better name for facets, minor refactoring, polishing. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings. + +2012-06-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java, + src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java: + Cosmetics, docs + +2012-06-07 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/fixation/PreprocessingSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Use i18n strings. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings. + +2012-06-07 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Changed facet description. + +2012-06-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeFacet.java, + src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java, + src/main/java/de/intevation/flys/utils/FLYSUtils.java: + Cosmetics, doc. + +2012-06-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java: + Fix issues, import river, documentation, more debug. + +2012-06-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeFacet.java: + Hard-code state id, instruct computation to result in facets. + +2012-06-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Doc. + +2012-06-06 Raimund Renkert + + Added facet for derivate curve and fixed facet names. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixDerivateFacet.java: + New. Facet for derivate curve. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisPeriodsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java: + Added name for facet to constructor. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Add one facet for each output using a different name. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added facet names. + + * doc/conf/artifacts/fixanalysis.xml: + Changed facet names. + +2012-06-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/MiddleBedHeightExporter.java: + Trivial doc. + +2012-06-06 Felix Wolfsteller + + * doc/datacage.txt: More documentation of datacage conf. + +2012-06-06 Raimund Renkert + + Added new facet for analysis periods and updated facet names. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisPeriodsFacet.java: + New. Facet for analysis periods. Returns the date ranges for the analysis + periods. + + * doc/conf/artifacts/fixanalysis.xml, + src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new facet and updated facet names. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java: + Updated facet names. + +2012-06-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/CollisionFreeXYTextAnnotation.java: + Minor doc. + +2012-06-06 Felix Wolfsteller + + * doc/datacage.txt: More documentation of datacage conf. + +2012-06-06 Raimund Renkert + + Implemented facets and splitted up the event facet. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixEventsFacet.java: + Removed. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAnalysisEventsFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixReferenceEventsFacet.java: + New. Facets for events. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java: + Implemented getData(). + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Add new event facets. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java: + Fixed return value. + +2012-06-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/Function2DAdapter.java: + New. Adapter class to brigde de.intevation.flys.artifacts.math.Function + to org.jfree.data.function.Function2D. + + Function2D objects can be used by org.jfree.data.general.DatasetUtilities + to sample functions into XYDatasets. + See DatasetUtilities.sampleFunction2D() + +2012-06-06 Felix Wolfsteller + + * doc/datacage.txt: New file that will contain datacage configuration + documentation. + +2012-06-06 Raimund Renkert + + * doc/conf/artifacts/fixanalysis.xml: + Fixed outputmodes. + +2012-06-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + Local variable shadowed instance variable. + +2012-06-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Fixed index problem with name of chi^2. + +2012-06-06 Raimund Renkert + + Added facets for fix analysis. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixAvSectorFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixOutlierFacet.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixEventsFacet.java: + New. Facets for W/Q-Chart in fix analysis. FixAvSectorFacet is implemented, + the others are just stubs. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Add facets to artifact after calculation. + + * src/main/java/de/intevation/flys/artifacts/FixationArtifactAccess.java: + Added method to get the current km for charts. The km is used for + synchronous navigation in fix analysis charts. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new facet types. + + * doc/conf/artifacts/fixanalysis.xml: + Added facets to config. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Added some binary search methods. TODO: Sort by column. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/DeltaWtExporter.java: + Use new data structures for export. + + * src/main/java/de/intevation/flys/utils/KMIndex.java: + Implements java.lang.Iterable now. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/DeltaWT.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/DeltaWTsKM.java: + Removed. Obsolete. + + * src/main/java/de/intevation/flys/jfree/CollisionFreeXYTextAnnotation.java: + Removed superfluous import. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FixationArtifactAccess.java: + Prevent duplicates in analysis periods. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/DateRange.java: + Added equals. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/EpsilonComparator.java: + Removed. Obsolete now. + +2012-06-05 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/JFreeUtil.java: + Improved collision detection. + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Avoid collisions of line labels, documentation. + + * src/main/java/de/intevation/flys/jfree/CollisionFreeXYTextAnnotation.java: + Use JFreeUtil. + + * src/main/java/de/intevation/flys/jfree/CollisionFreeLineLabelEntity.java: + New, ChartEntity class for Line labels. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + Store the QWs that are actually used in the fitting as referenced. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Store the referenced QWs for each km. TODO: Use same index structure. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java: + Store the referenced QWs, too. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixResults.java: + Removed. Obsolete. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/AnalysisPeriodsKM.java: + Removed. Not needed any longer. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Store the AnalysisPeriod per km into FixResult. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java: + Uses KMIndex instead of DeltaWTsKM now. + + * src/main/java/de/intevation/flys/exports/DeltaWtExporter.java: + Commented out old code. + TODO: Rewrite exporter to use AnalysisPeriods. + +2012-06-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: Override + endOfLife() to remove files and directories produced for WMS output. + +2012-06-05 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/JFreeUtil.java: + New jfreechart-related utility class. + +2012-06-05 Felix Wolfsteller + + * src/main/java/de/intevation/flys/utils/Formatter.java: + (getMeterFormat): New. + Doc. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + i18n and formatting for line labels. + +2012-06-05 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Added better doc and TODO. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java: + Now uses the KMIndex for outliers. + TODO: Use KMIndex for DeltaWTs, too. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/KMIndex.java: New. + Serializable index structure to find objects by there km. + TODO: Use in fixings analysis. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/EpsilonComparator.java: + Fixed sign problem in comparison. + +2012-06-04 Sascha L. Teichmann + + Implemented outlier checks in fixings analysis. Expected to be + still broken, but the code is in the right place now and has the + right structure. + + * src/main/java/de/intevation/flys/artifacts/math/Outlier.java: + Fixed endless loop. + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Added further set methods for indexed access. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/Fitting.java: + New. Out factored fitting code from FixCalculation. Checks for outliers, too. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Moved fitting code out to separate class. Streamlined code a bit. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java: + Store the outliers from fitting in separate data structure, too. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QW.java: New. + Base class for delta W/t data. Used as storage for outliers. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QWD.java: + Is a sub class of QW now. + +2012-06-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Store Chi^2 of fitting into result, too. + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Added indexed set method. + +2012-05-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Function.java: + Added inner class Derivative representing the first derivative of the + function. Can be instantiated with a given set of parameters. + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Log.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Pow.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Linear.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Quad.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/Exp.java, + src/main/java/de/intevation/flys/artifacts/math/fitting/LogLinear.java: + Added the derivatives of all fitting functions. + +2012-05-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Calculate the Delta W/ts + + the average Delta W/ts per Q sector per analysis period. + !!! Very complicated stuff !!! + TODO: + - Store results into the new data structures AnalysisPeriod and + AnalysisPeriods. + - Remove the old DeltaWTsKM and DeltaWT. + - Adjust the facets and the export. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QWD.java: + Added convinience constructor. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Added sector filter. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsFilterBuilder.java: + Expose the new sector filter to the fixing overview service. Syntax: + + +2012-05-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/DateAverager.java: + New. Averages a list of dates preventing overflows. + +2012-05-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Added a km filter to find columns which touches a given km. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsFilterBuilder.java: + Expose the new km filter to the fixing overview service. Syntax: + + +2012-05-30 Sascha L. Teichmann + + Better persistence model for delta w/t calculations. Supports + storage of Q sector averages, too. TODO: Use the new model. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/QWD.java: + New. Will be used as a replacement for DeltaWT. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/AnalysisPeriod.java: + New. Will be used as a replacement for DeltaWTsKM.KM. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/AnalysisPeriodsKM.java: + New. List Will be used as a replacement for DeltaWTsKM. + +2012-05-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/FixationArtifactAccess.java: + Use DateRange objects now. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/DateRange.java: New. + Model for date ranges. To be used in re-factored persistance model. + +2012-05-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Added method to find the Q sector of fixing column for a given km. + Useful to classify fixing events at certain kms. + +2012-05-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FixationArtifactAccess.java: + Fixed access to analysis periods. + +2012-05-30 Raimund Renkert + + * doc/conf/artifacts/fixanalysis.xml: + Changed data fields to a single string data field. The data contains a + string of semi-colon separated 'long' value pairs. + + * src/main/java/de/intevation/flys/artifacts/FixationArtifactAccess.java: + Process the new data. + +2012-05-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/RelativePointFacet.java: + trivial doc. + + * src/main/java/de/intevation/flys/themes/ThemeAccess.java: + Removed disturbing comment. + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java + (SimpleAxis): Add ommitted Y_AXIS2 to enum. + +2012-05-29 Felix Wolfsteller + + solve issue417: duration curve annotations as line to curve. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java + (createStickyLineAnnotation): New. + Resolved todos, use the line style. + +2012-05-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Doc, TODOs added. + +2012-05-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Consider theme setting before drawing line to curve. + +2012-05-29 Felix Wolfsteller + + * doc/conf/themes.xml: Donate own theme for mainvalues. + +2012-05-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Fit from Q to W not from W to Q! + Delta w/t's are now in cm. + Slimmed down fitting error report. + + * src/main/java/de/intevation/flys/exports/DeltaWtExporter.java: + Changed default column header of delta W to cm. + +2012-05-28 Sascha L. Teichmann + + Made Delta W/t calculation work. + + * src/main/java/de/intevation/flys/artifacts/model/QRangeTree.java: + Added toString() method. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsColumn.java: + Fixed problem accessing Ws. + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Fixed silly 'name.equals(name)' bug. This mainly prevented delta W/t + computation from working. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/DeltaWTsKM.java: + More deug code. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + More debug code. Simplified access to data a bit. + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: + Allow CSV exporter to throw IOExceptions. + + * src/main/java/de/intevation/flys/exports/DeltaWtExporter.java: + More debug output. Flush CSV after writing. + +2012-05-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Units of step is in meter and not km. Added more debug output. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Stupidly forgot to add facet to return the delta w/t as CSV. + +2012-05-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/ReportFacet.java: + There was a cast to WINFOArtifact where a cast to FLYSArtifact + is sufficient. This prevented generating error reports that + does not inherit from WINFOArtifact like FixationArtifact. + +2012-05-27 Sascha L. Teichmann + + * doc/conf/artifacts/fixanalysis.xml, + doc/conf/conf.xml: Added CSV and error report generator/facets. + +2012-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFactory.java: + CrossSectionFactory.isNewest() will return true if the CrossSection is + the only CrossSection found in the database. No IndexOutOfBounds is + thrown. + +2012-05-27 Ingo Weinzierl + + * Tagged module as '2.7'. + +2012-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Don't break chart creation if no hyks are existing. + +2012-05-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/DeltaWTsKM.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java, + src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java, + src/main/java/de/intevation/flys/artifacts/ExternalWMSArtifact.java: + Removed superfluous imports. + +2012-05-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/DeltaWTsKM.java: + Added getters to access the inner data structures. + + * src/main/java/de/intevation/flys/utils/Formatter.java: Added formatting + support for delta w/t exports of fix analysis. + + * src/main/java/de/intevation/flys/exports/DeltaWtExporter.java: + New. CSV exporter for delta w/ts of fix analysis. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Reordered imports. + +2012-05-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FitResult.java: + Removed. Obsolete. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixResult.java: + New. Stores the result of the fixing analysis. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Return the right structure (FixResult) from the calculation. + +2012-05-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Fixed stupid index bug. + +2012-05-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + Call the computing. + +2012-05-25 Ingo Weinzierl + + * doc/conf/conf.xml: Use the correct Artifacts for wms fixpoints and + floodmaps (they were interchanged). + +2012-05-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixResults.java: + New. Stores all results of a fixing analysis. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/DeltaWTsKM.java: + New. Km indexed container for Delta W/t diagrams. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Create FixResults and DeltaWTsKM now to store the results. + +2012-05-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/AttributeParser.java: + Replaced another silly "@attribute" XPATH with direct getAttribute() + call. + +2012-05-25 Felix Wolfsteller + + Draw line of mainvalues to duration curve hit point to ground. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Also work for q-value case on second y-axis, refactored. + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java: + Doc and fix.Doc and fix. + +2012-05-25 Felix Wolfsteller + + Also draw lines to curve from q-mainvalues in dur. curve + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java: + In analogy to the W-case, calculate where line from main value hits + a wqday-curve from DurationCurve. + +2012-05-25 Felix Wolfsteller + + Draw line of w-mainvalue to duration curve hit point to ground. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + If StickyAxisAnnotation has a hit point set, also add line annotation + from the crossing point to the x-axis. + +2012-05-25 Felix Wolfsteller + + Draw line of w-mainvalue to duration curve, baby version. + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Added field "hitPoint", when a line to a point should be drawn + - leveraging this annotation into the second dimension. + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java: + Calculate where mainvalue hits a duration curve. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + If StickyAxisAnnotation has a hit point set, add line annotation + to hit (the duration) curve. + +2012-05-25 Raimund Renkert + + * doc/conf/themes.xml: + Added a warning to not use virtual themes for facets. + +2012-05-25 Raimund Renkert + + * doc/conf/themes.xml: + Added concrete themes for maps. + +2012-05-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Moved parameter of addAnnotations out, renamed to addVisibleAnnotation. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Adjusted. + +2012-05-25 Raimund Renkert + + * doc/conf/themes.xml: + Added concrete themes for areas. + +2012-05-24 Felix Wolfsteller + + * doc/conf/meta-data.xml: Load mainvalues in reference curves. + + * doc/conf/artifacts/winfo.xml: Add mainvalues to compatibility list + of reference curves; fix typo. + +2012-05-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Render mainvalues as annotations. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Render static wkms data. + +2012-05-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Cosmetic. + +2012-05-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java, + src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java: + (flipStickyAxis): Allow easy change of sticky axes. + +2012-05-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java + (getWaterlevelData): Exception for discharge case. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java + (getLocations): Exception for discharge case. + +2012-05-24 Raimund Renkert + + Issue 667. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Added data to jfreechart data source. + +2012-05-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/services/ThemeListingService.java, + src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/HYKArtifact.java, + src/main/java/de/intevation/flys/artifacts/AreaArtifact.java, + src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java, + src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java, + src/main/java/de/intevation/flys/themes/ThemeGroup.java: Removed + needless imports. + +2012-05-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: Reproject + geometries into the coordinate reference system defined in the + configuration. + +2012-05-24 Felix Wolfsteller + + * doc/conf/meta-data.xml: Include other "thematic" heights for + reference curve relative points dc conf. + +2012-05-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java: + Cosmetics. + + * src/main/java/de/intevation/flys/artifacts/model/RelativePointFacet.java: + Added TODO. + +2012-05-24 Felix Wolfsteller + + * doc/conf/artifacts/relativepoint.xml, + doc/conf/conf.xml: Remove relativepoint artifact remainders, so far + all cases are covered by facet. + +2012-05-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java: + Handle reference curve case, slightly refactored. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Handle points in doOut. + +2012-05-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java: + Expose data via blackboard. + +2012-05-24 Felix Wolfsteller + + * doc/conf/meta-data.xml: Serve fixations + with relative points for reference curves. + +2012-05-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java + (getReferenceStartKm, getReferenceEndKms): Made public. + +2012-05-24 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Add relative point to compatibility + list of reference curve out. + +2012-05-23 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Remove second facet from + StaticWKmsArtifact from compatibility list of duration curves. + + * doc/conf/themes.xml: Add basic theme for relativepoint. + +2012-05-23 Felix Wolfsteller + + * doc/conf/meta-data.xml: Serve floodprotections and heightmarks + with relative points for duration curves. + +2012-05-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Handle relative points in doOut. + +2012-05-23 Felix Wolfsteller + + * doc/conf/meta-data.xml: Serve fixations with relative points + for duration curves. + +2012-05-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/ExternalWMSArtifact.java: + Use superclass static field and method. + +2012-05-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/RelativePointFacet.java: + Handle duration curve case. Do a linear interpolation of the day. + +2012-05-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/DurationCurveFacet.java: + Be a DataProvider, provide the duration curve and its km. + +2012-05-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + (getWAtKmLin): Linear interpolating version of getWAtKm. + +2012-05-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/RelativePointFacet.java: + Add (dummy-) implementation of a relative point facet. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Use superclass infrastructure. Spawn RelativePointFacet. + + * doc/conf/winfo.xml: Add relativepoint facet to compatibility list + of duration curve out. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Add RELATIVE_POINT Facet Type. + +2012-05-23 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Function.java: + Allow instantiation of a function with concrete parameters. + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + Enable indexed access to parameter names. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FitResult.java: + New. Bundles the results of the fitting. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/DeltaWT.java: + New. Stores results of Delta W/t calcs. + + * src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java: + Calculate Delta W/t s, too. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Make component filters ('and', 'or') more easy to construct. + +2012-05-23 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java, + src/main/java/de/intevation/flys/themes/ThemeFactory.java: + Improved startup performance. + +2012-05-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java + (getDatacageIDValue): New, extracted from various duplicates. + + * src/main/java/de/intevation/flys/artifacts/HYKArtifact.java, + src/main/java/de/intevation/flys/artifacts/AreaArtifact.java, + src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java, + src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: + Use getDatacageIDValue() from superclass or static context. + +2012-05-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java: + Define XPath to access "id" value of element coming from datacage-document. + + * src/main/java/de/intevation/flys/artifacts/HYKArtifact.java, + src/main/java/de/intevation/flys/artifacts/AreaArtifact.java, + src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java, + src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: + Use xpath defined in superclass. + +2012-05-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/BlackboardDataFacet.java: + Whitespace-Cosmetics. + +2012-05-23 Felix Wolfsteller + + * doc/conf/relativepoint.xml: New artifact-state-config for upcoming + artifact. + + * doc/conf/conf.xml: Register artifact factory and artifact for + upcoming artifact. + +2012-05-23 Raimund Renkert + + * src/main/java/de/intevation/flys/themes/ThemeGroup.java: + New. A theme group takes a set of themes configured in the themes.xml. + + * src/main/java/de/intevation/flys/themes/ThemeFactory.java: + Read the theme groups configured in the themes.xml. + Improved reading the xml file. Thanks to Sascha for the patch. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Get a theme using the new parameter themegroup. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Create theme groups while configuring themes. + + * src/main/java/de/intevation/flys/artifacts/services/ThemeListingService.java: + New. This service returns a list with all configured theme groups, each + containing exactly one theme filtered by name. + The theme name has to be provided as parameter. + + * doc/conf/conf.xml: + Added new service to config. + + * doc/conf/themes.xml: + Introduced theme groups and added new group. + +2012-05-23 Felix Wolfsteller + + * doc/conf/meta-data.xml: Repair CS-DC-Conf, allow loading + waterlevels, add fixations and heightmarks. + +2012-05-23 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Cosmetics. + +2012-05-22 Felix Wolfsteller + + * doc/conf/meta-data.xml: Allow loading of fixations in cross-sections. + +2012-05-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/GaugeDischargeState.java: + More debugging of discharge curve issue. + +2012-05-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java + (getDischargeCurveData): Moved to more specific class. + + * src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeFacet.java: + Cosmetics, be louder in miscondition. + +2012-05-22 Felix Wolfsteller + + * doc/conf/meta-data.xml: Allow loading of fixations and thmatic + heights in longitudinal sections, make discharge-curve-misbehavior + testable with trunk. + +2012-05-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Render discharge outs (was own out once). + +2012-05-22 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Allow cross-section stuff in + dischargelongitudinal state. + + * src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java: + Add CrossSectionWaterLineFacets, will trigger the cross section output. + +2012-05-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/FixationArtifact.java: + Added vim line. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Removed empty line. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Removed invalid/not helpful comments. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java + (outputExists): Doc. + +2012-05-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/fixation/ReferencePeriod.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/AnalysisPeriods.java: + Adjusted ui providers to make parameter names unique in client. + +2012-05-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Fixed short evaluation problem. + + * src/main/java/de/intevation/flys/artifacts/FixationArtifactAccess.java: + Added more debuf output. + +2012-05-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FixationArtifactAccess.java: + New. Access the state data of fixings artifacts. + +2012-05-22 Sascha L. Teichmann + + * doc/conf/artifacts/fixanalysis.xml: Make "start" and "end" parameters + unique in fixings artifact states. + +2012-05-21 Felix Wolfsteller + + * doc/conf/winfo.xml: Extend compatibility lists. + + * doc/conf/conf.xml: Add gaugedischarge factory and artifact. + + * src/main/java/de/intevation/flys/artifacts/model/GaugeDischargeFacet.java, + src/main/java/de/intevation/flys/artifacts/GaugeDischargeArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/GaugeDischargeState.java: + New, State, Facet and Artifact to access discharge curves of gauges. + + * doc/conf/gaugedischarge.xml: New trivial state model for gaugedis. + +2012-05-21 Felix Wolfsteller + + * doc/conf/meta-data.xml: Allow loading of prev. reference curves. + +2012-05-21 Felix Wolfsteller + + * doc/conf/meta-data.xml: (yet unused) sceleton for ref-curve dc conf. + +2012-05-21 Raimund Renkert + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for fix analysis. + +2012-05-21 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/fixation/EventSelect.java: + Implemented static data for state. + + * doc/conf/artifacts/fixanalysis.xml: + Changed transition in 'volmer' states. + + +2012-05-21 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java: + Include km in names of duration curve facets. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Adjusted i18n for + duration curve facet names (now include km). + +2012-05-21 Felix Wolfsteller + + * doc/conf/meta-data.xml: Allow loading of previous duration curves and + fixations in duration curves. + +2012-05-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/SoundingsSelect.java: + Take the current km range into account in getOptions(). + +2012-05-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java, + doc/conf/artifacts/minfo.xml: Adapted facets for middle bed height. We + now distinguish between epochs and singles. + + * doc/conf/conf.xml: Registered new output generator for middle bed height. + + * doc/conf/themes.xml: Added new themes for middle bed height epoch and + single curves. + + * src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightCalculation.java: + Take the km range into account. + + * src/main/java/de/intevation/flys/artifacts/states/MiddleBedHeight.java: + Create facets for single and epochs. + + * src/main/java/de/intevation/flys/exports/MiddleBedHeightInfoGenerator.java, + * src/main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java: + Chart and info generator for middle bed height charts. + +2012-05-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightData.java: + Added new methods that create names for singles and epochs. + + * src/main/java/de/intevation/flys/utils/Formatter.java: Added number + formatters used to export middle bed heights values. + + * src/main/java/de/intevation/flys/exports/MiddleBedHeightExporter.java: + New exporter for middle bed heights values. + + * doc/conf/conf.xml: Registered new output generator for middle bed height + exports. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: New i18n strings for middle + bed height facets and csv export. + +2012-05-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightData.java: + New model class for storing data for middle bed height exports (chart, + data exports). + + * src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightCalculation.java: + New Calculation that generates new MiddleBedHeightData. + + * src/main/java/de/intevation/flys/artifacts/model/MiddleBedHeightFacet.java: + New Facet which is used for middle bed height charts. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + new facet type for middle bed height curves. + + * src/main/java/de/intevation/flys/artifacts/states/MiddleBedHeight.java: + Calculate middle bed height data using MiddleBedHeightCalculation and + create new facets for charts and csv export. + + * src/main/java/de/intevation/flys/artifacts/MINFOArtifact.java: Added new + methods that return the IDs of selected single bed heights and epoch bed + heights. + +2012-05-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/SoundingsSelect.java: + Implemented getOptions() and getLabelFor(). + +2012-05-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Stabilized legend item aggregation. + +2012-05-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Extensive - although mostly trivial - doc adds. + +2012-05-16 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: Added states and transitions for MINFO + middle bed height calculation. + + * src/main/java/de/intevation/flys/artifacts/states/MultiStringArrayState.java: + New. Nearly a copy of MultiIntArrayState but uses String values. + + * src/main/java/de/intevation/flys/artifacts/states/SoundingsSelect.java: + New subclass of MultiStringArrayState. It will be used for bed heights + selection. We need to do handle the values as string, because singles + and epochs are mixed, so the DB ID is not enough as parameter value. + + * src/main/java/de/intevation/flys/artifacts/states/MiddleBedHeight.java: + New. This state will trigger the calculation for middle bed height in + MINFO module. + +2012-05-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/MultiIntArrayState.java: + Do not add a element to the dynamic DESCRIBE but add the + directly to which allows using default mechanism + in FLYS client. + +2012-05-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Replaced event name by its description, which combines the + description of the fixing (= WST file description) and the name + of the column. + + * contrib/fixoverview2html.xsl: Adjusted. + +2012-05-16 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: Added a chart output and relevant facets to + flow velocity state. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + new facet types for mainchannel, totalchannel and tau of flow velocity + calculation. + + * src/main/java/de/intevation/flys/artifacts/model/FlowVelocityFacet.java: + New Facet that returns FlowVelocityData in getData(). + + * src/main/java/de/intevation/flys/artifacts/model/FlowVelocityData.java: + Added new methods that return xy points for mainchannel, totalchannel and + tau. + + * src/main/java/de/intevation/flys/artifacts/states/FlowVelocityState.java: + Create new mainchannel, totalchannel and tau Facets for each + FlowVelocityData instance retrieved by FlowVelocityCalculation. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Commented + legend aggregation out. + + * src/main/java/de/intevation/flys/exports/FlowVelocityInfoGenerator.java, + src/main/java/de/intevation/flys/exports/FlowVelocityGenerator.java: New + chart generator for flow velocity data and its info generator. + + * doc/conf/conf.xml: Registered the chart and chart info generator for flow + velocity data. + + * doc/conf/themes.xml: Added new themes for mainchannel, totalchannel and + tau of flow velocity calculation. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for flow + velocity facets. + +2012-05-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/MultiIntArrayState.java: + Add a 'label' attribute to each element in the static DESCRIBE. + In addition to that, the element created in this class can have + multiple elements which consist of a 'value' and a 'label' + attribute. This 'label' attribute is taken from getLabelFor() which is + abstract and needs to be implemented by subclasses. + + * src/main/java/de/intevation/flys/artifacts/states/DischargeState.java: + Implemented the abstract method getLabelFor(). + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties: New i18n strings for MINFO + parameter names. + +2012-05-16 Ingo Weinzierl + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: New i18n strings for MINFO + states. + +2012-05-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/FlowVelocityExporter.java: + Append the name of a location for the km row which is provided by + FLYSUtils.getLocationDescription(km); + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for flow + velocity CSV export headers. + +2012-05-16 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: Added new state and csv export for MINFO flow + velocity calculation. + + * doc/conf/conf.xml: Registered a new CSV exporter for flow velocity + values. + + * src/main/java/de/intevation/flys/artifacts/model/FlowVelocityCalculation.java: + New calculation for MINFO flow velocity. Actually, this is no + calculation but a bundling of data. + + * src/main/java/de/intevation/flys/artifacts/model/FlowVelocityData.java: + New model class that is used to store flow velocity relevant data. + + * src/main/java/de/intevation/flys/artifacts/states/FlowVelocityState.java: + New state that triggers the FlowVelocityCalculation and creates new + facets. Currently, only a CSV Facet is created. + + * src/main/java/de/intevation/flys/artifacts/MINFOArtifact.java: Added + methods to retrieve the IDs of main channels and total channels for the + flow velocity calculation. + + * src/main/java/de/intevation/flys/utils/Formatter.java: New formatters + that are used in CSV exporter for flow velocity. + + * src/main/java/de/intevation/flys/exports/FlowVelocityExporter.java: New + concrete subclasses of AbstractExporter that currently implements the + path to export FlowVelocityData as CSV. + +2012-05-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/HYKArtifact.java, + src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java: + Removed getDataAsDouble() which is now implemented in FLYSArtifact. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Implemented getDataAsDouble(). This method will return a Double based on + a given parameter name. + +2012-05-15 Raimund Renkert + + * doc/conf/artifacts/fixanalysis.xml: + Changed data type for state 'eventselect'. + +2012-05-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WMSQPSArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHydrBoundaryArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFixpointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodmapsArtifact.java, + src/main/java/de/intevation/flys/artifacts/FixationArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHwsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSCatchmentArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/QSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/ReferencePeriod.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationVolmerCompute.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/PreprocessingSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationPeriod.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FunctionSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/GaugeRange.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/LocationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/AnalysisPeriods.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java, + src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java, + src/main/java/de/intevation/flys/artifacts/WMSHydrBoundaryPolyArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSBuildingsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSGaugeLocationArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSLineArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Removed superfluous imports. + +2012-05-15 Raimund Renkert + + * doc/conf/artifacts/fixanalysis.xml: + Adjusted state data fields. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/ReferencePeriod.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/PreprocessingSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FunctionSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/AnalysisPeriods.java: + Implemented states. + +2012-05-15 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Function.java: + Fixed constructor. Descriptions are now available. + +2012-05-15 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: Added new transistions and states for + MINFO flow velocity calculation. + + * src/main/java/de/intevation/flys/artifacts/states/MultiIntArrayState.java: + New abstract states that might be used to append a list of available + integer values to the DESCRIBE document. + + * src/main/java/de/intevation/flys/artifacts/states/DischargeState.java: + Concrete subclass of MultiIntArrayState which implements the abstract + method getOptions(). + +2012-05-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Parameters.java: + New. Model for storing fitting results in cache. + +2012-05-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java: + Removed the computeFeed() method that created Facets for discharge + curves to make this state ready to use in MINFO calculations. + +2012-05-14 Ingo Weinzierl + + * doc/conf/artifacts/minfo.xml: New Artifact configuration for module + MINFO. + + * src/main/java/de/intevation/flys/artifacts/MINFOArtifact.java: New + Artifact for module INFO. + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelectMinfo.java: + New. The state is used for choosing the calculation in module MINFO. + + * doc/conf/conf.xml: Registered the MINFO Artifact. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: New strings for states and + calculations. + +2012-05-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Removed unused code. + +2012-05-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Doc. + +2012-05-13 Felix Wolfsteller + + * doc/conf/meta-data.xml: Allow duration_curve.q loading via datacage. + +2012-05-11 Felix Wolfsteller + + * doc/conf/meta-data.xml: Allow hyk loading also when in non- + recommendation mode. + +2012-05-11 Felix Wolfsteller + + Improved middle height calculations for waterlevels. + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java + (area): Improved or even corrected area calculation. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Corrected middle height calculated, have a very verbose label for + the time being. + +2012-05-11 Felix Wolfsteller + + Somewhat improve area calculation during line computation. + Still faulty. + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java + (fillWater): Piecewise calculate area in more cases. + +2012-05-11 Felix Wolfsteller + + Tackle water-through-mountain issue that exists since r4099. + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java + (addPoints): Add parameter that decides whether or not to skip NaNs. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Set new parameter to StyledSeriesBuilder.addPoints calls. + For waterlines it is important that NaNs stay included! + +2012-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSGaugeLocationArtifact.java: + New Artifact for storing geometries for gauges. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + a new facet type for WMSGaugeLocationArtifact 'floodmap.gaugelocation'. + + * doc/conf/artifacts/winfo.xml, + doc/conf/artifacts/map.xml: Added 'floodmap.gaugelocation' facet to the + list of valid facets for map and floodmap output. + + * doc/conf/conf.xml: Added a factory for creating + WMSGaugeLocationArtifacts. + + * doc/conf/themes.xml: Added a theme for 'floodmap.gaugelocation' facets. + + * doc/conf/meta-data.xml: Added a datacage section for gauge locations to + the floodmap and map section. + +2012-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + new facet types 'floodmap.hydr_boundaries' and + 'floodmap.hydr_boundaries_poly' + + * doc/conf/artifacts/winfo.xml, + doc/conf/artifacts/map.xml: Registered 'floodmap.hydr_boundaries' and + 'floodmap.hydr_boundaries_poly' for floodmap and map output types. + + * doc/conf/conf.xml: + + * doc/conf/themes.xml: Added themes for 'floodmap.hydr_boundaries' and + 'floodmap.hydr_boundaries_poly'. + + * doc/conf/meta-data.xml: Improved datacage configuration specific to + floodmaps and maps. + + * src/main/java/de/intevation/flys/artifacts/WMSHydrBoundaryArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHydrBoundaryPolyArtifact.java: + New artifacts to save information about hydrological boundaries. + + * src/main/java/de/intevation/flys/artifacts/WMSQPSArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFixpointsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodmapsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSHwsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSCatchmentArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSBuildingsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSLineArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java: + Moved the methods getRiverId() and getTitle() into WMSDBArtifact. + +2012-05-10 Ingo Weinzierl + + * doc/conf/mapserver/wsplgen_layer.vm, + doc/conf/mapserver/shapefile_layer.vm: Added a 'PROJECTION' section. + +2012-05-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java: + Minor refactoring, doc. + +2012-05-10 Ingo Weinzierl + + * doc/conf/mapserver/layer.vm: Added a 'PROJECTION' section. + +2012-05-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java: + Minimal doc, TODO. + +2012-05-10 Felix Wolfsteller + + Fix issue620: synchron navigation at impossible kms. + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java + (searchCrossSectionLine): Do not return a CrossSectionLine if there + is none found within 1km. + +2012-05-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Minimal cosmetics. + +2012-05-10 Felix Wolfsteller + + Preparations for fix issue620: Synchron navigation on non-existing km. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java + (getData): Return empty lines if no cross section found. + +2012-05-09 Felix Wolfsteller + + Display mittlere hoehe (which is not yet calculated). + + * doc/conf/themes.xml: Added theme prop to display middlere hoehe or not. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + (parseShowMiddleHeight): New, parse the new theme prop. + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java: + (fillWater, ListWithArea): Return new type wich also contains area. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Respect new theme prop and adjust label if set. + +2012-05-09 Felix Wolfsteller + + Beginning of calculation of Mittlere Hoehe: area calculation. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Adjusted to LineData constructor. + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java + (area): New, calculate area of a polygon. + Added todos where area calculation code paths are missing. + +2012-05-08 Ingo Weinzierl + + * doc/conf/meta-data.xml: Moved the hws layers out to an own node. + + * src/main/java/de/intevation/flys/artifacts/WMSCatchmentArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: Moved the + 'name' property from WMSCatchmentArtifact to WMSDBArtifact. + + * src/main/java/de/intevation/flys/artifacts/WMSHwsArtifact.java: Create + more specific filter and extent that takes the 'name' into account. + +2012-05-08 Ingo Weinzierl + + * doc/conf/meta-data.xml: Moved the catchments out to an own node. + + * src/main/java/de/intevation/flys/artifacts/WMSCatchmentArtifact.java: + Parse the name of required catchments fetch name specific catchments + only. + +2012-05-08 Ingo Weinzierl + + * doc/conf/artifacts/map.xml: Added the 'floodmap.floodmaps' facet to the + list of valid facets of the 'map' output. + + * doc/conf/themes.xml: Renamed the 'Line' theme used for floodmaps to + 'FloodmapLines'. + +2012-05-08 Ingo Weinzierl + + * doc/conf/mapserver/db_layer.vm: Added a PROJECTION section which is + filled by the LayerInfo object. + + * src/main/java/de/intevation/flys/artifacts/model/LayerInfo.java: Added + a 'srid' property. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Set the + 'srid' property of all LayerInfo objects. + +2012-05-07 Raimund Renkert + + * doc/conf/artifacts/fixanalysis.xml: + Changed state data and added new state. + + * src/main/java/de/intevation/flys/artifacts/states/fixation/QSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/EventSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationPeriod.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/GaugeRange.java: + Modified states and added new state for concrete event selection. + +2012-05-04 Felix Wolfsteller + + * doc/conf/themes: Add text-bg properties to Area style. + + * src/main/java/de/intevation/flys/themes/ThemeAccess.java + (TextStyle.apply): Apply text bg theme-properties to renderer. + + * src/main/java/de/intevation/flys/jfree/StyledAreaSeriesCollection.java: + Cosmetics. + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + Added field to store labels background color, calculate arithmetic + middles of polygons, to put label there (improves situation slightly). + +2012-05-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java + (parseShowArea): parse show area field of theme. + + * src/main/java/de/intevation/flys/themes/ThemeAccess.java + (TextStyle.apply): Be applicable to StableXYDifferenceRenderers. + + * src/main/java/de/intevation/flys/jfree/StyledAreaSeriesCollection.java: + Apply setting from theme to renderer. + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + Simplified area calculation (always calculate). Added getters and + setters for text for label style, respect most of that. + +2012-05-03 Felix Wolfsteller + + * doc/conf/themes: Let Area style not inherit from colorlines (as labels + work slightly different. Enable showarea property. Comment dupe Lines. + +2012-05-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java + (doArea): Add Lines.LineData datatype to areable data types. + +2012-05-03 Felix Wolfsteller + + * doc/conf/themes.xml: Add two new options for waterlevel label in cs. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + Parse new theme properties. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Adjust label according to chosen properties. + +2012-05-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java + (parseShowLineLabelBG): parse show line label bg field of theme. + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Respect show line label bg setting of theme. + + * src/main/java/de/intevation/flys/jfree/XYStyle.java: + Apply setting from theme to renderer. + +2012-05-03 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added a 'helpText' field to each state. + The 'helpText' field represents in this case a message in the i18n + resources which should be a link to a online help page. + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Append the 'helpText' to the DESCRIBE document. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added links to help text in + the FLYS wiki. + +2012-05-03 Felix Wolfsteller + + Use the colors specified in theme document for linelabel. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + New methods to find colors specified for linelabels. + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Store and use background and foreground color for linelabels. + + * src/main/java/de/intevation/flys/jfree/XYStyle.java: + Communicate colors of linelabels to renderer. + +2012-05-02 Felix Wolfsteller + + Actually use the font specified in theme document for linelabel. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + Fixed paths for linelabel-related fields in theme doc. + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Set font for linelabel. + +2012-05-02 Felix Wolfsteller + + * doc/conf/themes.xml: No default background show for linelabels. + +2012-05-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelInfoState.java: + Cosmetic, added annotation. + +2012-05-02 Felix Wolfsteller + + Parse font for linelabels, do not use it yet. + + * doc/conf/themes.xml: Add more theme properties related to linelabels. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java + (parseTextSize, parseLineLabelSize): New and slightly refactored. + (parseLineLabelFont): New. + (parseTextStyle, parseLineLabelStyle): New and slightly refactored. + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java + (setLineLabelFont, getLineLabelFont): New, accessors to + linelabelfont field. + + * src/main/java/de/intevation/flys/jfree/XYStyle.java + (applyLineLabelFont): New. + +2012-05-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Make it compile again after signature change in backend. + +2012-04-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Doc. + +2012-04-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java: + Added local class LineData and return it to also include + Length of lines. + + * src/main/java/de/intevation/flys/artifacts/WaterLineArtifact.java: + Changed signature of interfaces getWaterLines. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + (getWaterLines): adjusted signature. + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Adjusted to return type of Lines.createWaterLines. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Include length in label (stub). + + * src/main/java/de/intevation/flys/jfree/HasLabel.java: + New interface. + + * src/main/java/de/intevation/flys/jfree/StyledXYSeries.java: + Implement new HasLabel interface. + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Take into account that StyledXYSeries are HasLabel. + +2012-04-26 Raimund Renkert + + Initial transition configuration and artifact/state stubs for fixation + analysis. + + * doc/conf/artifacts/fixanalysis.xml: + New. Initial transition configuration. + + * doc/conf/conf.xml: + Added artifact and factory entry to config. + + * src/main/java/de/intevation/flys/artifacts/FixationArtifact.java: + New. Stub with initial implementation. + + * src/main/java/de/intevation/flys/artifacts/states/fixation, + src/main/java/de/intevation/flys/artifacts/states/fixation/QSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/ReferencePeriod.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationVolmerCompute.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/PreprocessingSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationPeriod.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FunctionSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/GaugeRange.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/LocationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/AnalysisPeriods.java, + src/main/java/de/intevation/flys/artifacts/states/fixation/FixationCompute.java: + New. Stubs for fixation states. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings. + +2012-04-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java: + Add method to calculate length of water lines. + +2012-04-26 Felix Wolfsteller + + Most of issue454: Label waterlevels. + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java + (drawSecondaryPass): Use correct label for lines. + +2012-04-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java + (showSeriesMinimunX, showLineLabel): Renamed field. + (isShowLineLabel, setShowLineLabel): Added getters and setters for + showLineLabel field. + (drawSecondaryPass): Respect showLineLabel field, draw static text + as placeholder for real label (stub). + + * doc/conf/themes.xml: Define theme prop 'showlinelabel' for Lines. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Parse theme + theme prop. + + * src/main/java/de/intevation/flys/jfree/XYStyle.java: Apply showline + theme prop. + +2012-04-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Cosmetics, doc. + +2012-04-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/Outlier.java: + Gah! Checked in out dated version. + + * src/main/java/de/intevation/flys/artifacts/services/FileUploadService.java, + src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java: + Removed superfluous imports. + +2012-04-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/Outlier.java: + New. Simple Grubb's outlier test. Needs testing. ;-) + +2012-04-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java + (isMinimumX): Implemented minimum finding for x in analogy to the ones for + y values. Stub to label dataset curves in plot. + +2012-04-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Cosmetics, added doc, TODO and an OPTIMIZE. + +2012-04-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FileUploadService.java: + Make it cross platform. + +2012-04-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FileUploadService.java: + Make it compilable. + +2012-04-18 Raimund Renkert + + Issue 657. + + * src/main/java/de/intevation/flys/artifacts/services/FileUploadService.java: + New. Service to upload a file as base64 string embedded in xml structure. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Extract shape files from zip archive and move them to artifact directory. + Add the user shapefile as parameter for wsplgen calculation. + + * src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java: + Remove the artifact directory on step back. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java, + src/main/java/de/intevation/flys/exports/MapGenerator.java: + Create layer to display the uploaded shapefile. + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java: + Create a facet to output the user defined layer. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added type for user shape file. + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENJob.java: + Resized array for '-lin' parameter. + + * doc/conf/artifacts/winfo.xml: + Added facet to diplay user defined shapefile. + + * doc/conf/conf.xml: + Added file upload service. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n string. + +2012-04-18 Raimund Renkert + + Issue 560. + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENLayerFacet.java: + New. Facet for WSPLGEN layers. + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java: + Create a new WSPLGEN facet when creating uesk layers. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java, + src/main/java/de/intevation/flys/exports/MapGenerator.java: + Use WSPLGENLayerFacet to create uesk layer. + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: + Switch back to false as return value in isQueryable(). + +2012-04-18 Raimund Renkert + + Issue 560. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: + Generate WSPLGEN-Layer with its own template and set the layertitle to + an i18n string. + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: + Call createUeskLayer with a CallContext. + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: + Set queryable to true. + + * doc/conf/mapserver/wsplgen_layer.vm: + New. Template for WSPLGEN-Layer. + +2012-04-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Removed superfluous imports. + +2012-04-18 Raimund Renkert + + * doc/conf/themes.xml: + Added mapping for manual points in historical discharge chart. + +2012-04-18 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Fixed duplicated legend entry for manual points. + +2012-04-18 Raimund Renkert + + Issue 494. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Create manual points with text annotations in time charts. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Add manual points to the chart. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added historical discharge to chart types. + + * doc/conf/artifacts/winfo.xml, + doc/conf/artifacts/manualpoints.xml: + Added manual points facet to output modes. + +2012-04-17 Sascha L. Teichmann + + * contrib/fixoverview2html.xsl: Render optional check boxes. + Use different font. TODO: Move to client, + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Ignore hours and seconds. + +2012-04-13 Raimund Renkert + + Issue 528, 637 + + * src/main/java/de/intevation/flys/artifacts/model/WWQQJRDataSource.java: + Added fields for new columns. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Added columns for 'W at gauge' and fixed column header. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added filenames for new pdf export templates. + +2012-04-13 Raimund Renkert + + * doc/conf/jasper/reference_gauge_end.jasper, + doc/conf/jasper/reference_gauge.jasper, + doc/conf/jasper/reference_gauge_start_end.jasper: + Small fixes in pdf templates. + +2012-04-12 Raimund Renkert + + Issue 528, 637. + + * doc/conf/jasper/reference_gauge.jasper, + doc/conf/jasper/reference_en_gauge.jasper: + Modified templates. + + * doc/conf/jasper/reference_gauge_end.jasper, + doc/conf/jasper/reference_gauge_start_end.jasper, + doc/conf/jasper/reference_en_gauge_end.jasper, + doc/conf/jasper/reference_en_gauge_start_end.jasper: + New. Templates for reference curve pdf export. + +2012-04-12 Raimund Renkert + + Issue 528, 637. + + * doc/conf/jasper/reference.jasper, + doc/conf/jasper/reference_en.jasper: + Fixed column header. + + * doc/conf/jasper/reference_gauge.jasper, + doc/conf/jasper/reference_en_gauge.jasper: + New. + +2012-04-11 Sascha L. Teichmann + + * contrib/check-i18n-properties.py: Checked in unsaved version. :-/ + +2012-04-11 Raimund Renkert + + Issue 656. + + * src/main/resources/messages_en.properties: + Added missing i18n strings. + +2012-04-11 Sascha L. Teichmann + + * contrib/check-i18n-properties.py: New. Script to check inconsistencies + of i18n properties files: Detects duplicates and keys not defined in other + properties files. Usage: + + $ find -name messages\*.properties | \ + xargs contrib/check-i18n-properties.py + +2012-04-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Generate error message when more than one Q is found for given + Q in "W auf freier Strecke". + + * src/main/java/de/intevation/flys/artifacts/model/Calculation.java: + Added feature to adopt problems from other reports. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n for the error message. + +2012-04-11 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Use factor to calculate steps in range input mode. + +2012-04-06 Sascha L. Teichmann + + * doc/conf/cache.xml: Increased number of fixings columns a bit. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsColumnFactory.java: + Corrected misspelled cache name. Added bebug output. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverviewFactory.java: + Added debug output. + +2012-04-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Small fixes: The service works as expected but there seems + to be a caching issue. + +2012-04-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Generate chart and deliver the image as the response of the service. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsColumnFactory.java: + Return null when looking for a fixing data column that does not exist. + +2012-04-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsColumnFactory.java: + Load ws and qs from database. Cache the fixings columns. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsColumn.java: + Removed column id and added q values. + + * doc/conf/cache.xml: Added cache for the columns of the fixings. + +2012-04-05 Raimund Renkert + + Fix for 'W free' validation and theme names. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Append the current Q values to theme name if the previous theme has + the same name. + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Use the start km to get min/max W values in distance mode and use the + first km to get min/max W values if in location mode. + +2012-04-05 Raimund Renkert + + Issue 499. + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Added validation for 'W free' using WstValueTable min/max values. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Added getter for WstValueTable. + +2012-04-05 Ingo Weinzierl + + * doc/conf/themes.xml: Defined a theme for WSPLGEN layers. + + * src/main/java/de/intevation/flys/artifacts/model/MapserverStyle.java: + Made style creation more robust against nullpointers and added an + Expression class. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Added a static + method createWSPLGENStyle() and some helpers to create a WSPLGEN style. + + * src/main/java/de/intevation/flys/exports/MapGenerator.java, + src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Methods + for creating the WSPLGEN layer now take a style document. + +2012-04-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + Extract parameters from input xml and fetch fixings filters and overview + to find the columns to be viewed. + TODO: Generate chart. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsColumn.java: Added + boolean result to indicate if value comes from table or is interpolated. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsColumnFactory.java: + New. Factory to fetch fixings column data from cache or database. Stub by now. + +2012-04-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + New. Service to generate a chart of fixings for given river and km applied + some filters. + + Usage: + $ curl http://localhost:8181/service/fixings-km-chart \ + -d @fix-overview.xml > chart.png + + The input XML is nearly the same as for the overview service. + Besides the river, filters and range it accepts elements + for passing the river km, + for the extent of the output chart, + for type of result. Currently ignored. + + ATM only a static fixed sized PNG image is delivered. + + * doc/conf/conf.xml: Added service to list of services. + +2012-04-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Made bullet proof for null filters and ranges. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsFilterBuilder.java: + Fixed bug which leeds to always generating a null range filter. + +2012-04-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Squashed performance bug introduced in rev4070, which slowed down + CSV export about 245 times! + + * src/main/java/de/intevation/flys/artifacts/model/QRangeTree.java: + Added debug output about savings when joining neighbored nodes. + +2012-04-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsOverviewService.java: + Removed the code for filter building. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsFilterBuilder.java: + New. Now contains the code for filter building. This useful because other + services like the "Fixierungs-Rohdaten am KM" service need this filtering, too. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Refactored the code to obtain a filtered list of fixings columns without + the XML serialization, too. The "Fixierungs-Rohdaten am KM" service + does not need the overview data but the ids of the fixing columns to be + displayed. + +2012-04-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/CacheInvalidationService.java, + src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java, + src/main/java/de/intevation/flys/artifacts/services/FLYSService.java: + Derive from XMLService now. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Removed superfluous import. + +2012-03-30 Ingo Weinzierl + + flys/issue460 (W-Differenzen: Frühere Berechnungen aus den Datenkorb werden doppelt geladen) + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Removed + code to find out all Outputs of this Artifacts. A method getOutputs() + had been implemented some time ago that does exactly this work. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Heavy + bugfix! Adding the current state id to the list of previous state ids + for temporary usage was no good idea! Now, the list of previous state + ids only modifified in advance(). This solves the problem of having + duplicated Outputs in the Artifact's DESCRIBE document. + +2012-03-29 Ingo Weinzierl + + flys/issue366 (W-INFO / Abflusskurve, Diagramm: Umbenennen von Themen und Anzeige im Diagramm) + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Use description from ArtifactAndFacet objects for JFreeChart Series + creation. + +2012-03-28 Ingo Weinzierl + + flys/issue362 (W-Info / Abflusskurve, Diagramm) + + * doc/conf/themes.xml: Adjusted text color of w and q main values for + computed discharge curves. + +2012-03-23 Sascha L. Teichmann + + flys/issue639: Bezugsliniendiagramm,Achsen-Intervall-Skalierung vereinheitlichen + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Render only axis ticks in meters. + +2012-03-22 Felix Wolfsteller + + * doc/conf/themes.xml: Let hyks have a text orientation in themes. + +2012-03-22 Felix Wolfsteller + + Fix flys/issue491, if area fill between curve and axis, draw not only + to zero. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java + (doArea): Add an artificial dataset to set lower bounds for area. + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java + (addPoints): New convenience method to be used in future. + (createGroundAtInfinity, createCeilingAtInfinity): Create artificial + datasets for better areas. + +2012-03-20 Raimund Renkert + + Issue 506. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Create the date from long values instead of the year. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: + Added method to transform a String into an array of long values. + + * doc/conf/artifacts/winfo.xml: + changed data type from intrange to longrange. + +2012-03-20 Ingo Weinzierl + + flys/issue544 (Historische ATs: Eingabeunterstützung W/Q) + + * src/main/java/de/intevation/flys/artifacts/services/GaugeInfoService.java: + New service that returns information for gauges based on a specified + river. + + * doc/conf/conf.xml: Registered the GaugeInfoService. + +2012-03-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/DischargeInfoService.java: + Skip DischargeTables that have no time interval set or that are marked + as master DischargeTable. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: Skip + DischargeTables that have no time interval set. + +2012-03-20 Ingo Weinzierl + + flys/issue146 (In WINFO Diagramm Abflusskurve raus, wenn nicht gewünscht) + + * doc/conf/artifacts/winfo.xml: Do not create outputs for discharge curves + at gauge any longer. + +2012-03-20 Ingo Weinzierl + + flys/issue252 (W-INFO: Wasserspiegellagenberechnung / Mitführung der Jährlichkeiten in der Diagramm-/Ergbnisausgabe) + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Added + the numeric value of a selected named main value to the WST column name. + +2012-03-16 Ingo Weinzierl + + * doc/conf/mapserver/db_layer.vm: Set the FILTER expression into double + quotes (") instead of single quotes (') which allows single quotes in + expressions. + + * doc/conf/meta-data.xml: Moved the floodmaps from kilometrage to its + parent folder. + + * src/main/java/de/intevation/flys/artifacts/WMSFloodmapsArtifact.java: + Fixed broken filter expression and set geometry type (MapServer does not + know a 'MULTIPOLYGON'). + +2012-03-16 Raimund Renkert + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Remove unnecessary outputs from attributes instead of copying outs to + new attribute element. + +2012-03-16 Ingo Weinzierl + + * Tagged module as 'pre2.7-2012-03-16'. + +2012-03-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Removed useless imports. + +2012-03-16 Ingo Weinzierl + + flys/issue523 (W-INFO / Bezugslinienverfahren / Linieneinstellungen / Min+Max anzeigen) + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Improved the look of the minimum and maximum shape of a series. They are + now rectangles with a darker fill color as the line color is. + +2012-03-15 Ingo Weinzierl + + flys/issue522 (W-INFO / Bezugslinienverfahren / Schriftgröße der Achsenbeschriftung) + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Label and + tick label fonts for axes will now always be the same. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Removed the createYAxis() method which is already implemented in an + upper class. There, the method also takes the ChartSettings into account. + +2012-03-15 Raimund Renkert + + Issue 547. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveExporter.java: + Use date format with MEDIUM style. + + * src/main/java/de/intevation/flys/utils/Formatter.java: + Added date format with MEDIUM style. + +2012-03-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartHelper.java: Added a new + method that returns the Bounds for a given XYDataset. Based on the + concrete type of the XYDataset, the call is dispatched to a more specific + method. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Removed the whole "range" stuff and some methods that are implemented in + upper classes. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Removed the + setXRange() and setYRange() methods. In our own code, we will use Bounds + instead of JFreeChart's Range instances to save range/bounds information. + This is necessary to save information which is not not from type double + (which is the case in Timeseries charts). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Replaced + usage of Range with Bounds in the whole class. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Adapted the method signature of zoom() and zoomX(). + +2012-03-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Copied the adjustAxes() method from XYChartGenerator which enables axes + label font sizes. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Removed unnecessary axes creation method which is implemented in upper + classes. + +2012-03-14 Raimund Renkert + + Issue 640. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Remove all unnecessary output settings from attributes. + +2012-03-09 Felix Wolfsteller + + Partial for flys/issue358, rough stub for legenditem aggregation. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Added rough stub for legend aggregation. + +2012-03-08 Ingo Weinzierl + + * doc/conf/themes.xml: Fixed broken XML syntax. + +2012-03-08 Ingo Weinzierl + + * doc/conf/meta-data.xml: Modified the datacage structure of 'floodmaps'. + +2012-03-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSFloodmapsArtifact.java: New. + This Artifacts allows loading 'floodmaps'. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added a + new Facet type "floodmap.floodmaps" which are created by + WMSFloodmapsArtifact. + + * doc/conf/artifacts/winfo.xml: Registered the "floodmap.floodmaps" facet + for "floodmap" output. + + * doc/conf/conf.xml: Registered the new WMSFloodmapsArtifact. + + * doc/conf/themes.xml: Added a theme for the "floodmap.floodmaps" facet. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n string for + "floodmap.floodmaps" title. + +2012-03-08 Ingo Weinzierl + + * doc/conf/meta-data.xml: Improved datacage configuration to serve + floodmaps. + +2012-03-05 Ingo Weinzierl + + flys/issue566 (ÜSK: Formalien in der Parametrisierung) + + * src/main/java/de/intevation/flys/artifacts/states/FloodplainChoice.java: + Override getLabelFor() method to return better I18N strings for selected + floodplain option. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added options + for floodplain (active/inactive) and adapted a german I18N string. + +2012-03-05 Felix Wolfsteller + + Fix flys/issue 528 for csv. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Fixed column order, reworked todos. + +2012-03-05 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Fixed column order. + +2012-03-05 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Stub to export the "W (cm)" column conditionally on Gauge presence. + +2012-03-05 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/StepCSVWriter.java: + New utility to handle csv rows of more "dynamical" length. + +2012-03-05 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/StepCSVWriter.java: + New utility to handle csv rows of more "dynamical" length. + +2012-03-01 Felix Wolfsteller + + Fix flys/issue501 (manual points have two legend entries). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Respect wish to not have a legend entry. + +2012-03-01 Felix Wolfsteller + + Fix flys/issue636 (cross-section: name of waterlevel facets). + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Corrected name for waterlevel facets. + +2012-03-01 Felix Wolfsteller + + Partial fix flys/issue615 (datacage: events for fixations). + + * doc/conf/meta-data.xml: Adjusted to make loading single events + possible. + +2012-03-01 Felix Wolfsteller + + Partial Dontcrash on flys/issue647 (NaNs from WstValueTable interpolation). + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java: + Do not add data pairs where a NaN is present. + +2012-03-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Cosmetics, doc. + +2012-02-27 Sascha L. Teichmann + + Added functions to be used for fitting in + the "Fixierungsanalyse" and "Extremwertermittlung". + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Function.java: New. + Abstract base class for functions to fit. Provides the name of the function, + a short description, the names of the parameters and an initial parameter guess + for the fit processe. Sub classes have to overwite the function evaluation and + the partial derivative of the function in respect to the parameters. + + TODO: Add a meachnism for the inverse function (needed for AT export) and + the first derivative (needed for the respective diagram). + + * src/main/java/de/intevation/flys/artifacts/math/fitting/FunctionFactory.java: + New. Factory to fetch a function by its name. + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Exp.java: New. + exp: W(Q) = m * a^Q + b + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Quad.java: New. + quad: W(Q) = n*Q^2 + m*Q + b + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Linear.java: New. + linear: W(Q) = m*Q + b + + * src/main/java/de/intevation/flys/artifacts/math/fitting/LogLinear.java: New. + log-linear: W(Q) = a*ln(m*Q + b) + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Log.java: New + log: W(Q) = m*ln(Q + b) + + * src/main/java/de/intevation/flys/artifacts/math/fitting/Pow.java: New. + pow: W(Q) = a*Q^c + d + + !!! This power function is new in the pool of functions to be fit. !!! + See my mail "Manuelle Punkte in der Fixierungsanalyse" 2011-10-27 for details. + The function exp-new found in the old FLYS function pool is omitted + because it is worthless and was maybe never used. + + * src/main/java/de/intevation/flys/artifacts/math/fitting/App.java: New. + Small test driver to check if the fitting is working. The points to + fit are read from stdin the function to fit is determined by the + system property 'function'. Example usage: + + $ mvn -e \ + -Dfunction=linear \ + -Dexec.mainClass=de.intevation.flys.artifacts.math.fitting.App exec:java < + + * src/main/resources/messages_de.properties: + Added ommitted translations. + +2012-02-27 Felix Wolfsteller + + fix flys/issue638. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java + (doArea): Ract to WKms as upper/lower area data again. + +2012-02-27 Felix Wolfsteller + + Partial fix flys/issue637. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java, + src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Modified translations. + +2012-02-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + - Calculate the extent of the river by the extents of the fixings. + Reason: The river Elbe has only has fixings up to km 351. The other half + of the river is empty which results in a sparse looking overview. + - Add the name of the river as name attribute to resulting element. + + * contrib/fixoverview2html.xsl: New. Demo XSL transformation to turn + the output of the overview service directly into HTML. Used in the + client a variant of this script could be used for producing the content + of the assistance widget. Usage: + + $ curl http://localhost:8181/service/fixings-overview \ + -d @fix-overview.xml | \ + xsltproc contrib/fixoverview2html.xsl - \ + > fixings-overview.html + +2012-02-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsOverviewService.java: + Made the filter mechanisms available via the incoming XML document. + + 1 - range: Simply add a element next to the + element. Optional. Defaults to full extent. + + 2 - filters: Add a element next to the element. + Optional. Defaults to accepting all. + The element can contain the following elements: + + : Creates an IdFilter. + : Creates a DateFilter. + : Creates a DateRangeFilter. + : Create a SectorRangeFilter. + ...: Creates a NotFilter. The nested element is negated. + ...: Create an AndFilter: The nested elements are 'and'ed. + ...: Create an OrFilter: The nested elements are 'or'ed. + + These filters need testing! + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Made date format a public constant. + +2012-02-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Added a filter mechanism for generating output. + + There are two kinds of filters: + + 1 - A range. Defaults to [-Double.MAX_VALUE, Double.MAX_VALUE] + The resulting sectors are cut to this range. Sectors outside + this range are omitted. + + 2 - column filters: Given a fixing column they can decide to keep + or not to keep it. Following filters exist: + + - IdFilter: Keep column if column id matches. + - DateFilter: Keep column if column date matches. + - DateRangeFilter: Keep column if column date is in range. + - SectorRangeFilter: Keep colum if one of its q sectors is in given range. + - NotFilter: Negates another nested filter. + - AndFilter: Keep column if all nested filters accept column. + - OrFilter: Keep column if at least one of the nested filters accepts it. + +2012-02-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + Refactored to build the Q sectors once at construction time and not + every time output is generated. + This will ease the job of applying filters to the Overview. + +2012-02-19 Sascha L. Teichmann + + Service to generate the data needed to build the "Fixerungen pro Fluss Uebersicht" + + * src/main/java/de/intevation/flys/artifacts/services/FixingsOverviewService.java: + New. A service that serves an XML overview version of the fixings of a given river. + + The input documents look like this: + + + + + + + The output documents looks like this: + + + + + + ... + + + + + + + + ... + + + + The element contains the extent of the whole river + and its db id. + The sections contains serveral elements. + They have a meassure date, db id, a name and a number of s. + These sectors are q classified from/to ranges. Classes are: + + 0: smaller (MNQ+MQ)/2 + 1: (MNQ+MQ)/2 to (MQ+MHQ)/2 + 2: (MQ+MHQ)/2 to HQ5 + 3: greater HQ5 + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + New. Cacheable instance of the overview. + TODO: Apply a filter mechanism when generating the output. + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverviewFactory.java: + New. Fetched the fixing overviews from cache if configured. + + * doc/conf/conf.xml: Added the service. + * doc/conf/cache.xml: Configured the cache for the fixing overviews. + +2012-02-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java(getMinMaxQ): + Argh! Forget to check in the range method. + +2012-02-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java(getMinMaxQ): + Symmetrical to getMinMaxW() add two methods to find min/max Q for a given + km or a range. The range method is maybe a bit slow. + +2012-02-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java(getMinMaxW): + Added signature to give w extend for a given km range. + +2012-02-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java(getMinMaxW): + Added method to find the w extent for a given km. Useful + for validating "W auf freier Strecke". + + * src/main/java/de/intevation/flys/artifacts/model/HYKFactory.java: + Removed superfluous import. + +2012-02-17 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java, + src/main/java/de/intevation/flys/utils/FLYSUtils.java, + doc/conf/artifacts/winfo.xml: + Renamed state data fields: wq_mode -> wq_isq + wq_free -> wq_isfree + wq_selection -> wq_isrange + +2012-02-17 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Write the description instead of the Q value to CSV file. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java: + Added parameter to overriden method. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: + Get Qs without range. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Adjusted i18n string for CSV metadata. + +2012-02-17 Ingo Weinzierl + + Part II/III flys/issue497 (Diagrammeigenschaften in Zeitseriendiagrammen) + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Apply legend specific settings (show/hide). + +2012-02-17 Ingo Weinzierl + + Part I/III flys/issue497 (Diagrammeigenschaften in Zeitseriendiagrammen) + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Moved + adjustPlot() from XYChartGenerator to ChartGenerator which enables the + TimeseriesChartGenerator to call this method as well. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Call adjustPlot() in generateChart() to apply the settings specific to + gridlines in the timeseries plot. + +2012-02-16 Raimund Renkert + + Refactored the wq data fields. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Changed the wq data fields to boolean values. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: + Changed the wq data fields to boolean values and added method that + returns the km input mode. + +2012-02-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Fixed W->Q conversion for "W fuer ungleichwertige Abflusslaengsschnitte." + +2012-02-16 Ingo Weinzierl + + flys/issue509 (Dauerlinie: Q-Achse sollte bei 0 beginnen) + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Set the lower bounds of the Q axis to 0 to avoid displaying negative + discharge values. + +2012-02-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WKmsImpl.java, + src/main/java/de/intevation/flys/artifacts/model/WKms.java: + (guessWaterIncreasing): Removed from interface. + +2012-02-16 Felix Wolfsteller + + Fix flys/issue150 (exposure of gravitational anomalies) + + * src/main/java/de/intevation/flys/artifacts/model/WKmsImpl.java, + src/main/java/de/intevation/flys/artifacts/model/WKms.java: + (guessWaterIncreasing): In analogy to W->WQ->WQKms defined and + implemented. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + (needInvertAxis): Changed Parameter type to WKms (was WQKms). + (doW): Use in this case weaker wkms cast to find out whether axis + has to be inverted. + +2012-02-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/HYKFactory.java: Fixed + SQL statement to fetch hyk formations for rivers with 'km_up' = 0. + +2012-02-14 Sascha L. Teichmann + + Another partial fix for flys/issue499: Do the W to Q conversions + needed for "W am Pegel" correctly. + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Repaired getQsForW(): The mapping from W to Q is not unique! There + could be more then one Q having the the same W. + Ws are not strictly monoton/sorted so doing a binary search on this + is just a fail. We now scan them linearly. + + XXX: The whole class is mess. The scaling stuff is a stupid + and there is no caching. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Fetch the master discharge table for converting Ws to Qs. Handle + the case that there are more Qs for a given W. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Adjusted to new semantic. + +2012-02-13 Felix Wolfsteller + + Partial Fix flys/issue500: text-orientation for texts. + + * doc/conf/themes.xml: Change default text orientation for text + annotations. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Minor cosmetics. + + * src/main/java/de/intevation/flys/themes/ThemeAccess.java: + Parse and apply text rotation field. + +2012-02-13 Sascha L. Teichmann + + Partial fix for flys/issue499 (Wasserspiegellagen: Berechnung für W frei und Pegel kaputt) + There are still validation issue in the client. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Fixed state evaluation for "W auf freier Strecke"/"W am Pegel". + There is still an issue in the client with the input validation + which prevents entering the right W values for + "W auf freier Strecke". :-/ + +2012-02-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Make it compilable again. + +2012-02-13 Felix Wolfsteller + + Partial Fix flys/issue500: text-backgrounds for manual points. + + * doc/conf/themes.xml: Added text-related style items to manual + point themes. + +2012-02-13 Felix Wolfsteller + + Partial Fix flys/issue500 + + * src/main/java/de/intevation/flys/themes/ThemeAccess.java: + Parse whether to show text background. Apply to textannotation. + +2012-02-13 Felix Wolfsteller + + Fix flys/issue490 + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Pass artifact and facet for doAnnotation. + +2012-02-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WWAxisTypes.java: + Use AddScaleFunction instead of LinearFunction. + + * src/main/java/de/intevation/flys/artifacts/math/AddScaleFunction.java: + New. f(x) = m*(x+b). I know its aequivalent to m*x + m*b but it + makes more clear that the datum [m] (PNP) is substracted before the + scaling to cm is done. + +2012-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Bugfix: take + care on empty ArtifactAndFacet objects in doAnnotations(). + +2012-02-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/NormalizedReferenceCurveGenerator.java: + Inherits from ReferenceCurveGenerator now which really simplifies it a lot. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Added to methods to be overwritten by sub classes. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Adjusted i8n. + +2012-02-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WWAxisTypes.java: + Indexed access to getInCm. + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java: + Simplified. Do not provide any data to blackboard. Only side effect the + call context. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Added convinience method to i18n string with defaulting to key name. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Label the axis according the scale types of the data. + TODO: Let the NormalizedReferenceCurveGenerator be a sub class of + this. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: i18n for the reference curve axes. + +2012-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveExporter.java: + Fixed wrong double array dimension for PDF exports and write correct + differences into PDF. + +2012-02-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java, + src/main/java/de/intevation/flys/artifacts/model/BlackboardDataFacet.java: + Adjust function to deliver data provider ('blackboard') keys. + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java: + Change the way we exploit the blackboard-mechanism. TODOs added. + +2012-02-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Argh! Finally found the stupid bug in the W~W relation: + Used iQ1 index on W2(Q2). + +2012-02-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Improved error messsages even more. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Adjusted messages. + +2012-02-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java: + Forget to put new created WWAxisType onto blackboard. + +2012-02-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WWAxisTypes.java: + Adjust offset of linear function by same factor as the values. + +2012-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: Write + correct min and max values for date axes into the info document. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Enabled zooming for timeseries charts. + +2012-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/Bounds.java, + src/main/java/de/intevation/flys/jfree/TimeBounds.java, + src/main/java/de/intevation/flys/jfree/DoubleBounds.java: Added a method + applyBounds(ValueAxis, int) that might be used to adapt the range of the + axis to the bounds adding a space to the left and right. + +2012-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Defined + new abstract methods for setting and getting Bounds. Modified and + renamed getValueAxisRange(). This method is now called + getValueAxisRangeFromRequest() and returns no longer a Range object but + a String array that consists of the raw string values speicified in the + request document. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Implemented the missing method getDomainAxisRange(). This method returns + a Range object based on the String array returned from + getValueAxisRangeFromRequest(). + +2012-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/TimeBounds.java: Added new + methods getLowerAsDate() and getUpperAsDate(). The toString() method + will now return a string that contains a human readable date string. + + * src/main/java/de/intevation/flys/jfree/DoubleBounds.java: Made 'lower' + always be smaller than 'upper' in the default constructor. + +2012-02-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Give more precise message when an error occurs in W~W relation. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Improved error messages. + +2012-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Modified + and renamend getDomainAxisRange(). This method is now called + getDomainAxisRangeFromRequest() and returns no longer a Range object but + a String array that consists of the raw string values specified in the + request document. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Implemented the missing method getDomainAxisRange(). This method returns + a Range object based on the String array returned from + getDomainAxisRangeFromRequest(). + +2012-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartHelper.java: Added a + helper function to determine the min and max bounds (x and y) for + TimeSeriesCollections. + +2012-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/TimeBounds.java, + src/main/java/de/intevation/flys/jfree/DoubleBounds.java: Removed + useless imports. + +2012-02-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WW.java: + Add accessors to relative heights. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Add relative heights (to gauge) to csv export. + +2012-02-09 Ingo Weinzierl + + * pom.xml: Added dependency to GeoTools swing module. + + * src/main/java/de/intevation/flys/artifacts/map/PrintMap.java: Standalone + demo application to print WMS layers to file. + +2012-02-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/TimeBounds.java, + src/main/java/de/intevation/flys/jfree/DoubleBounds.java, + src/main/java/de/intevation/flys/jfree/Bounds.java: New model classes that + should be used for adapting axes ranges later. + +2012-02-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation5.java: + Generate a valid intial i18n name. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java: + Pass call context to calculation. + +2012-02-09 Ingo Weinzierl + + flys/issue485 (Themen können umgenannt werden, dies wird nicht in der Legende reflektiert) + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Use ArtifactAndFacet.setFacetDescription() to set the description for + themes which are stored in the Collection's XML attribute. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/NormalizedReferenceCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Some refactoring of doXXXOut() methods. We pass the ArtifactAndFacet + objects of doOut() into those concrete doOut() methods which allows us to + generate series names for chart curves. + +2012-02-09 Felix Wolfsteller + + * doc/conf/meta-data.xml: Replaced dashes by underscores in entities + to ease translation. + +2012-02-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/NormalizedReferenceCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Fixed problem with including Y-Zeros. + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Removed superfluous imports. + +2012-02-09 Felix Wolfsteller + + Allow points in "new chart"s. + + * doc/conf/artifacts/chart.xml: Added manualpoint facets to + compatibility lists. + +2012-02-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/Style.java: New. A Style object + needs to implements a method applyTheme() which takes a + XYLineAndShapeRenderer. + + * src/main/java/de/intevation/flys/jfree/XYStyle.java: New. This subclass of + Style modifies the XYLineAndShapeRenderer specified in applyTheme(). + + * src/main/java/de/intevation/flys/jfree/StyledSeries.java: New. This + interface defines two methods getStyle() and setStyle() to adjust and + retrieve the Style of a series. + + * src/main/java/de/intevation/flys/jfree/StyledTimeSeries.java: New. + Implementation of StyledSeries that subclasses JFreeChart's TimeSeries. + + * src/main/java/de/intevation/flys/jfree/StyledXYSeries.java: Removed the + code for adapting a XYLineAndShapeRenderer. Instead of implementing this + stuff in StyledXYSeries itself, this instance now implements StyledSeries + and stores an instance of XYStyle. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Create new instances of StyledTimeSeries now which enables styling in this + chart. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Enabled + styling of series for all series that implement StyledSeries. + +2012-02-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java(relateWs): + Be more conservative about arrays and indices in "Bezugslinienverfahren". + +2012-02-09 Felix Wolfsteller + + Allow areas in new chart/longitudinal_section. + + * doc/conf/artifacts/chart.xml: Added area facet to compatibility + list. + +2012-02-09 Felix Wolfsteller + + Fix flys/issue490. Allow CollisionFree..Annotations to collide with + non-collision-free annotations. + + * src/main/java/de/intevation/flys/jfree/CollisionFreeXYTextAnnotationEntity.java: + New, to take advantage of cheap instanceof operator. + + * src/main/java/de/intevation/flys/jfree/CollisionFreeXYTextAnnotation.java: + Only avoid collisions with members of same family (i.e. allow + collision with annotations of other types). + +2012-02-09 Ingo Weinzierl + + * doc/conf/themes.xml: Added themes for historical discharge curves and + the differences to a reference curve. + +2012-02-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: Some + bugfixes and improvements: + 1) take only historical discharge tables into account for calculation + 2) use the correct values for computing differences + 3) moved timerange preparation into an own method + +2012-02-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/EnterMultipleLocationsState.java: + Fix call to StringUtils.join . + +2012-02-09 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n string for waterlevels (from datacage). + +2012-02-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/EnterMultipleLocationsState.java: + Locale-format multiple double values also. + +2012-02-09 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Registered a new facet for difference curves + to the historical discharge output. + + * src/main/java/de/intevation/flys/artifacts/model/HistoricalWQTimerange.java: + New model that is able to store a further double value "diff" besides a W, + Q and a Timerange. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: Create + new HistoricalWQTimerange instances with difference between the reference + discharge table and the historical discharge tables. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: New type + for historical differences. + + * src/main/java/de/intevation/flys/artifacts/model/WQTimerange.java: Cast + Timerange array in getTimeranges(). + + * src/main/java/de/intevation/flys/artifacts/model/HistoricalDischargeDifferenceFacet.java: + New Facet for historical discharge difference curves. + + * src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java: + Create new Facets for the difference curves if the processed data are from + type HistoricalWQTimerange. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Added doOut() path for difference curves. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveExporter.java: + Increased the size of a double array to be able to get results from + HistoricalWQTimerange. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added translation for warning + if no reference discharge table was found for the specified gauge. + +2012-02-09 Raimund Renkert + + Added PDF export to reference curve calculation. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Added PDF export. + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java, + doc/conf/artifacts/winfo.xml: + Add facet for PDF export to state. + + * src/main/java/de/intevation/flys/artifacts/model/WWQQJRDataSource.java: + New. Datasource for JasperReports containing reference curve data. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for JasperReports template file and calculation mode. + + * doc/conf/jasper/reference.jasper, + doc/conf/jasper/reference_en.jasper: + New. Templates for reference curve PDF export. + +2012-02-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java(getReferenceEndKms): + Prevent duplicates in end kms for reference curve calculation. + +2012-02-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + doc/conf/artifacts/winfo.xml: Renamed data item names to allow + translations. + +2012-02-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java: + Give (Normalized)ReferenceCurveFacets are more appropriate + description (to be seen in client). + +2012-02-08 Felix Wolfsteller + + Prepare Reference curves to eat multiple locations as 'Ziel'. + + * src/main/java/de/intevation/flys/artifacts/states/EnterLocationState.java: + Cosmetics. + + * src/main/java/de/intevation/flys/artifacts/states/EnterMultipleLocationsState.java: + New. State to provoke multi_location_panel. + + * doc/conf/artifacts/winfo.xml: Made end state of ref curves a (new) + EnterMultipleLocationState. + +2012-02-08 Ingo Weinzierl + + flys/issue483 (Historische Abflusstafeln ohne Ergebnis) + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: Add + a problem for the calculation report if no discharge tables were found + for the given timerange. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added translation for error + messages created by Calculation6. + +2012-02-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/Formatter.java: + Format kms in error reports at least with one digit after + the decimal separator. + +2012-02-08 Sascha L. Teichmann + + Fix flys/issue468 (Fehler beim Projekt-Duplizieren) + + * src/main/java/de/intevation/flys/exports/ReportGenerator.java: + Always create a new XML document when calling report generation. + XXX: There is a bug somewhere which calls error reporting twice + when cloning a collection. Speculation: It has something to do with + the settings stuff. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Remove superfluous imports. + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENCalculation.java: + Added missing Override annotation. + +2012-02-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Handle Manual Point Facets, added TODO. + +2012-02-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java: + Subclass BlackboardDataFacet to repair areas over cross sections. + +2012-02-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Let text + and line annotations placed at x or y axes always be in foreground. + +2012-02-08 Felix Wolfsteller + + Fix flys/issue474 (manual points in reference curves). + + * doc/conf/artifacts/winfo.xml, + doc/conf/artifacts/manualpoints.xml: + Add manualpoints to lists just so that really everybody knows. + + * doc/conf/themes.xml: Add styles for manual points in ref curves. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Add ref curve chart types. + + * src/main/java/de/intevation/flys/exports/NormalizedReferenceCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Handle manual point facets. + +2012-02-08 Felix Wolfsteller + + Partial Fix flys/issue474. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added translation for + normalized_reference_curve. + +2012-02-08 Felix Wolfsteller + + Fix flys/issue475. + + * doc/conf/themes.xml: Register theme for reference_curve_normalized. + +2012-02-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Add a "/" to the + URL of the user wms if the URL configured in conf.xml doesn't end with + a "/". + +2012-02-08 Felix Wolfsteller + + Fix flys/issue472. + + * doc/conf/themes.xml: Added theme for discharge_curve manualpoints. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added discharge_curve as chart type. + +2012-02-08 Sascha L. Teichmann + + Fix flys/issue484 ((i18n: Ungleichwertige... Report)) + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Fixed key spelling. + +2012-02-08 Felix Wolfsteller + + Fix flys/issue478 (Manuelle Punkte: Stil nicht änderbar). + + * doc/conf/themes: Map correct theme to manualpoint themes. + +2012-02-08 Felix Wolfsteller + + Partial fix flys/issue472 . + + * doc/conf/artifacts/winfo.xml: Add manual points to compatibility + list of cross_sections. + + * doc/conf/artifacts/manualpoints.xml: Add manualpoints to list of + generated facets. + +2012-02-08 Felix Wolfsteller + + * doc/conf/themes.xml: Commented styling option for show area until + area calculation works. + +2012-02-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation.java: + i18n the km of the error report. + + * src/main/java/de/intevation/flys/artifacts/resources/Resources.java: + Fixed potential race conditions. + + * src/main/java/de/intevation/flys/utils/Formatter.java: Added + formatter for error report kms. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java: + Removed superfluous imports. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Commented out some imports. They are used be out commented code. + +2012-02-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/LocationProvider.java: + Use the correct km key for an unspecific km for fetching the whole river + annotations. + +2012-02-07 Sascha L. Teichmann + + * doc/conf/conf.xml: Added missing config of chart info generator + of normalized reference curve. + +2012-02-07 Ingo Weinzierl + + * doc/conf/conf.xml: Fixed wrong chart info generator name for historical + discharge curves. + +2012-02-07 Raimund Renkert + + Added PDF export for historical discharge curve calculations. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveExporter.java: + Implemented PDF export for calculation results. + + * src/main/java/de/intevation/flys/artifacts/model/WQTJRDataSource.java: + New. Datasource for JasperReports. + + * doc/conf/artifacts/winfo.xml: + Added facet for PDF export to historical discharge curve output mode. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for historical discharge curve export. + + * doc/conf/jasper/historical-discharge.jasper, + doc/conf/jasper/historical-discharge_en.jasper: + New. Templates for JasperReports PDF creation. + +2012-02-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Handle WWQQs, extended CSV export of reference curves. + +2012-02-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/DurationCurveExporter.java, + src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java: + Recactored, moved Formatter accessors to base class AbstractExporter. + +2012-02-07 Felix Wolfsteller + + Let reference curve calculation result in specific WWQQ, extended CSV + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java + (getWW,getWWQQ): Renamed and changed result type. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation5.java, + src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java: + Result in WWQQs, not in WWs. + +2012-02-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Log error as warning. + +2012-02-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/LinearFunction.java: + New. Linear function f(x) = m*x + b. + + * src/main/java/de/intevation/flys/artifacts/model/WWAxisTypes.java: + Do the normalizing. Cascading functions is not required. + +2012-02-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/NormalizedReferenceCurveInfoGenerator.java: + Added missing chart info generator for the normalized reference curves. + +2012-02-06 Felix Wolfsteller + + * src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties: Fix i18n. + +2012-02-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WWAxisTypes.java: + Added optional boolean flag to indicated if the data should be 'normalized'. + TODO: Build the cascading normalising function call chain. + + * src/main/java/de/intevation/flys/exports/NormalizedReferenceCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Fetch WWAxisTypes from call context to do the right scaling. + +2012-02-06 Raimund Renkert + + Added service for discharge infos at a specific gauge. + + * doc/conf/conf.xml: Added service factory entry. + + * src/main/java/de/intevation/flys/artifacts/services/DischargeInfoService.java: + New. Returns description, start year and end year of discharges at a + specific gauge. + + * src/main/java/de/intevation/flys/artifacts/states/GaugeTimerangeState.java: + Return a more specific ui provider string. + +2012-02-06 Sascha L. Teichmann + + * doc/conf/conf.xml: Registered generator for normalized reference curves. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added "reference_curve_normalized". + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java: + Added facets for normalized reference curves. + + * src/main/java/de/intevation/flys/exports/NormalizedReferenceCurveGenerator.java: + Generator for normalized reference curves. + +2012-02-06 Sascha L. Teichmann + + * doc/conf/artifacts/winfo.xml: Added config for "reduzierte Bezugslinie". + +2012-02-06 Sascha L. Teichmann + + * doc/conf/artifacts/winfo.xml: Added error report. + +2012-02-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: Set + proper bounds for date axis elements; tell the transformation matrix which + type it is (number/date). + +2012-02-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Include location description string in csv output of referencecurve- + exporter. + +2012-02-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WW.java: Added constructor call. + * src/main/java/de/intevation/flys/artifacts/model/WWQQ.java: New. + Stores the Qs for the Ws, too. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation5.java: Create + WWQQs instead of WWs. + +2012-02-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Added further i18n stubs and slightly more data. + +2012-02-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java(relateWs): + Return the Qs of the Ws, too. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation5.java: + Adjusted to cope with the return Qs. TODO: Create WQWQ or WWQQ dataset + for storing the result. + +2012-02-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Added further i18n stubs. + Also added a second Y axis (experimental, to ease axis labeling etc.). + +2012-02-06 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Register new export output and csv + facet for reference curves. + + * doc/conf/conf.xml: Register Exporter for reference curve. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveExporter.java: + Primitive exporter, bland copy of another one. + +2012-02-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Enabled some i18n of labels. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Basic i18n for reference + curves added. + +2012-02-06 Ingo Weinzierl + + * doc/conf/conf.xml: Registered the HistoricalDischargeCurveInfoGenerator. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveInfoGenerator.java: + New. This info generator returns information of a + HistoricalDischargeCurveGenerator. + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: Add an + attribute "axistype" to axes nodex based on the JFreeChart Axis type. + Number axes get a "number", date axes a "date". + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Defined an + abstract method getRangesForAxis(). + + * src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: Awaits + now an instance of ChartGenerator instead of XYChartGenerator. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Implemented the getRangesForAxis() method (copied from XYChartGenerator). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Added + @Override annotation to getRangesForAxis(). + +2012-02-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java, + src/main/java/de/intevation/flys/exports/WDifferencesExporter.java: + Cosmetics. + +2012-02-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java: + Add CSV facet (not yet evaluated). + +2012-02-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveExporter.java: + New. This OutGenerator exports historical discharge curves to CSV and PDF. + Currently, only the CSV export is implemented! + + * doc/conf/artifacts/winfo.xml: Registered a new Output CSV for historical + discharge curves. + + * doc/conf/conf.xml: Registered the HistoricalDischargeCurveExporter. + + * src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java: + Generate new Facets for CSV and PDF output. + + * src/main/java/de/intevation/flys/utils/Formatter.java: Added new functions + that return number formatters for historical discharge curves and a date + formatter for short dates. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added strings for CSV header of + historical discharge curve export. + +2012-02-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Adjusted to name change in River ('hibernate fix'). + +2012-02-03 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Adapted the data type of W/Q input values + for historical discharge curve calculation (intarray -> doublearray). + + * src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeState.java: + Adapted the data type of W/Q input values. + +2012-02-03 Sascha L. Teichmann + + First steps to serve the data in cm if we are are gauges only. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Fetch map gauge station -> gauge datum from backend for reference curve. + + * src/main/java/de/intevation/flys/artifacts/math/LinearFilterFunction.java: + New. Linear transforms another function. + + * src/main/java/de/intevation/flys/artifacts/math/FilterFunction.java: + New. Allows cascading functions. + + * src/main/java/de/intevation/flys/artifacts/model/WWAxisTypes.java: + New. Classifier what kind of axis types are needed. + + * src/main/java/de/intevation/flys/artifacts/model/NormalizedReferenceCurveFacet.java: + Removed. Is now obsolete. + + * src/main/java/de/intevation/flys/artifacts/model/WW.java: + Stores gauge station kms for start and end km if they are any. + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java: + Should generate a WWAxisTypes classifier via side effect to the + call context. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation5.java: + Figure out for each start/end km if its a gauge station and store this + information in the result WWs. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Uses the WWAxisTypes classifier now to generate the right data. + TODO: Use the blackboard object. + +2012-02-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/EnterLocationState.java: + Removed superfluous imports. + +2012-02-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Set number of interpolation steps for relation curve to 200. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Do not sort the XYSeries. + +2012-02-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveInputState.java: + Removed. Was stub. + +2012-02-03 Felix Wolfsteller + + Improved Reference Curves. + + * doc/conf/artifacts/winfo.xml: Add start/end input step for reference + curves. + + * doc/conf/themes.xml: Add theme for reference curve. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Disable start/end point-hack for reference curve. Go with 'live' + values. + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java: + i18n. + + * src/main/java/de/intevation/flys/artifacts/states/EnterLocationState.java: + New. State to enter location. + + * src/main/java/de/intevation/flys/artifacts/states/InputDoubleState.java: + New. + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Take WW name to display in themepanel. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added translations. + +2012-02-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: Use + the current date for discharge tables which doesn't have a stop time set. + A warning message is written to log. + + * src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java: + Generate report facet before leaving the computeXXX() method when no + calculation results has been computed. + +2012-02-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a function + that returns the name of a reference gauge (for historical discharge + curves). + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Create title, subtitle and axes labels for charts of this type. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added title, subtitle and axes + labels for historical discharge curves. + +2012-02-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Fix. + +2012-02-03 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added translations for + states (will be shown in client). + +2012-02-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Ja!vadoc. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Declare getYAxisWalker as abstract to avoid weird issue with + overriden methods of this name. + +2012-02-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java: + Use the WW.ApplyFunctionIterator to fetch the data. + + * src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java: + Removed superfluous imports. + +2012-02-03 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Registered a ReportFacet for historical + discharge curve report. + + * doc/conf/conf.xml: Registered a ReportGenerator for historical discharge + curves. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: Add + problems if we were not able to find a Q for a given W. + + * src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java: + Generate a ReportFacet if there were problems during calculcation. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added error messages for the + case that we were not able to find a Q for a given W while calculating + historical discharge curve data. + +2012-02-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Improved adding new data for historical discharge curves: skip NaN + values; use JFreeChart's Day TimePeriod instead of Second. + +2012-02-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: Refactoring: + moved addDatasets(), applyThemes() and some other methods into + ChartGenerator; enhanced the AxisDataset interface. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Implemented necessary abstract methods and improved internal AxisDataset + class (added new methods). + +2012-02-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartHelper.java: Added a + function that expands a given range. Take care on NaN in getRanges(). + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Prevent of NullPointerExceptions in isMinimumShapeVisible() and + isMaximumShapeVisible(). + +2012-02-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Create new AxisDatasets and new TimeSeriesCollections for each Facet. + +2012-02-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WQTimerange.java: Added a + method getTimerange(idx) that returns the Timerange at a given index. + + * src/main/java/de/intevation/flys/artifacts/model/HistoricalDischargeFacet.java: + Return the correct WQTimerange object in getData(). + +2012-02-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: More + refactoring: the AxisDataset is defined by an interface in ChartGenerator + now. Each subclass of ChartGenerator should implement its own AxisDataset. + This allows us to provide multiple XYDataset types in different charts. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Implemented some necessary methods (abstract definitions of parent class) + and create new empty timeseries charts. + +2012-02-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartHelper.java: New helper + class for working with charts. + +2012-02-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Removed useless import. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: More + refactoring: moved more base code from XYChartGenerator to its parent + class ChartGenerator. + +2012-02-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java: + Refactored. Use supers static field. + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + Refactored. Use static field. + + * src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java, + src/main/java/de/intevation/flys/utils/FLYSUtils.java + (getMinMax, getRiverMinMax): Refactored. Moved to FLYSUtils. + + * src/main/java/de/intevation/flys/artifacts/states/MinMaxState.java: + Add so-called javadoc. + +2012-02-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: Moved + further base code from XYChartGenerator into its ChartGenerator. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Override generateChart() instead of generate() which is now implemented + in ChartGenerator. + +2012-02-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + New. This ChartGenerator should be used for timeseries charts. Currently, + this class is a stub only! WORK IS IN PROGRESS! + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Subclasses TimeseriesChartGenerator now instead of XYChartGenerator, + because historical discharge curve charts will have a time x axis set. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: Moved some + basic stuff from XYChartGenerator into ChartGenerator. + +2012-02-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/charts/TimeseriesStepChart.java: + Added standalone demo app for evaluating different timeseries charts. + +2012-02-02 Raimund Renkert + + Issue 466: CSV export for chart themes. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Export a CSV file if the requested format is 'csv'. + + * src/main/java/de/intevation/flys/exports/ChartExportHelper.java: + Generate the CSV file containing X-Y-data of all activated themes. + +2012-02-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Moved code to load values of a discharge table into an own static + function to be able to reuse it in Calculation6. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: + Implemented the findValueForW(). + +2012-02-01 Felix Wolfsteller + + Fake some reference curve input values to have working prototype + to work on. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Syntax-stunt fake reference inputs. + + * src/main/java/de/intevation/flys/artifacts/model/WW.java + (getW1): Accessor for first w at index (for the raw ww). + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java + (doReferenceOut): Plot the raw W-over-W. + +2012-02-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Create time + millis for timerange used in Calculation6. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: Added + the first step of the calculation: fetch relevant discharge tables based + on the given input parameters. The calculated values are not the right + ones! Finding Ws and Qs in discharge tables is still not implemented! WORK + IN PROGRESS! + + * src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java: + Create facets for each WQTimerange object calculated by Calculation6. + +2012-02-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/Timerange.java: Added a + new constructor that takes Date objects for start and end time. + +2012-02-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/W.java: + Forget to create ws data in constructor. + +2012-02-01 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Replaced Reference Curve input state + with LocationSelect-State for debugging purposes. Add output to + reference.curve- state. + +2012-02-01 Felix Wolfsteller + + * doc/conf/conf.xml: Register ReferenceCurve*Generators. + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java: + Cosmetics. + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java: + Added pro forma facet. + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java: + Added comment. + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added reference curve facet type. + +2012-02-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Fetch + necessary parameters for 'historical discharge curve' calculation and call + Calculation6 with those parameters. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: + Modified default constructor and calculate() signatures and added a + parameter check which is evaluated before the calculation starts. + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ReferenceCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ReferenceCurveInfoGenerator.java: + Added outline of a new chart-generator. + +2012-02-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/Timerange.java: New. + This class might be used to store timeranges. Start and end time are + stores as long (milliseconds since january 1, 1970). + + * src/main/java/de/intevation/flys/artifacts/model/WQTimerange.java: + New. This class should be used to save Ws, Qs and timeranges. + +2012-02-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added helper + methods to extract int[] and double[] from string. + +2012-02-01 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Registered new facet type + 'historical_discharge.historicalq' to the 'historical_discharge' output. + + * doc/conf/conf.xml: Registered new HistoricalDischargeCurveGenerator for + output type 'historical_discharge'. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + new facet type for HISTORICAL_DISCHARGE_Q. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + New. This ChartGenerator is used to generate new charts for historical + discharge curves. WORK IN PROGRESS! + + * src/main/java/de/intevation/flys/artifacts/model/Calculation6.java: New. + This class should 'compute' the historical discharge curves. WORK IN + PROGRESS! + + * src/main/java/de/intevation/flys/artifacts/model/HistoricalDischargeFacet.java: + New. This Facet is used during the calculation of historical discharge + curves. + + * src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Added stubs + to trigger the calculation of data used for generating historical + discharge curve charts. + +2012-02-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Removed needless imports. + +2012-02-01 Felix Wolfsteller + + * src/main/resources/messages_de.properties, + src/main/resources/messages_de_DE.properties: + Fixed "W bei ..m" -> "W fuer ...n" . + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Avoid NPE, add warning to log to not forget about it. + +2012-01-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation.java: + Fixed problems with unformatted numbers in error message. + +2012-01-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeState.java: + Override getLabelFor() to return the I18N string for the selected + evaluation mode. + +2012-01-31 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Modified types of parameters in the + 'historical discharge curves' transitions. + +2012-01-30 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Fix transition type (Stupid Bug 1.0 reverse). + +2012-01-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceGaugeState.java: + Override getLabelFor() method defined in DefaultState to return the name + of a Gauge based on the official number which is stored in the + parameterization. + +2012-01-30 Felix Wolfsteller + + Allow manual points in more diagram types. + + * doc/conf/artifacts/winfo.xml: Add respective facet types to + compatibility lists of output modes. + + * doc/conf/artifacts/manualpoints.xml: Mention facet types. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added ChartType enum to ease later iteration. + (IS.MANUALPOINTS): Added helper. + + * src/main/java/de/intevation/flys/artifacts/model/ManualPointsFacet.java: + Help artifact figuring out which data to provide by passing facet + name. + + * src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java: + Respond to getPointData with correct data item, depending on facet + name. + + * src/main/java/de/intevation/flys/artifacts/states/ManualPointsSingleState.java: + Iterate over chart types. Add facets if corresponding data is found. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Handle manual point facets. + +2012-01-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Clone + StateData model objects to save parameters in this Artifact - create + new StateData instances only if no StateData model was found for a + parameter. This solves the problem of loosing the type of a StateData. + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Implemented a getLabelFor() method that is used to format a parameter + value. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelSelectState.java: + Adapted method signature of transform(). + + * src/main/java/de/intevation/flys/artifacts/states/MinMaxState.java: + Override getLabelFor() method to create a well formatted label for min/max + values. + +2012-01-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/StateFactory.java: + Bugfix: use correct order of parameters in DefaultStateData constructor. + +2012-01-30 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Fixed a stupid bug. Use + ValueCompareTransition instead of DefaultTransition to evaluate values. + +2012-01-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/MinMaxState.java: + Write default values for min and max items into the DESCRIBE document. + +2012-01-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WW.java: + Added field 'startKm' and 'endKm' to make it easier to associate + gauge to km to return Ws in cm if km is at a gauge. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation5.java: + Construct the WWs with startKm and endKm. This is necessary because + if an error occurs in calcuting an in between km in a list of end kms + the index does not correspond to the input value any more. + +2012-01-30 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added transitions for "historical discharge + curves" calculation. + +2012-01-30 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + (doPoints): Skip 'inactive' points. + +2012-01-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WW.java: + Removed the createNormalized() method because it did not + solve all problems with the transformation of the W~W data we have. + + - We need to shift the values to be based in (0, 0). + - We need to linear transform the values if they are at gauges. + - Copying the data is memory expensive. + + Therefore there is now a new inner class ApplyFunctionIterator + that is able to transform the values in an iterator like manner. + The transform functions default to the identity. + + * src/main/java/de/intevation/flys/artifacts/math/Sub.java: New. + Simple function that subtract a scalar from the parameter. + + * src/main/java/de/intevation/flys/artifacts/model/W.java: Added + method minWs() to calulate the minimal W of the data. + + * src/main/java/de/intevation/flys/artifacts/model/NormalizedReferenceCurveFacet.java: + getData() returns a WW.ApplyFunctionIterator with identity transform. + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java: + getData() returns a WW.ApplyFunctionIterator with a base shift to (0, 0). + +2012-01-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WW.java: + Added method createNormalized() to shift the data to start in (0, 0). + + * src/main/java/de/intevation/flys/artifacts/model/NormalizedReferenceCurveFacet.java: + Returns the 'normalized' data of the reference curve. + +2012-01-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/NormalizedReferenceCurveFacet.java: + New. Facet for the normalized W~W relation. + TODO: Implement the on-the-fly creation logic. + + * src/main/java/de/intevation/flys/artifacts/model/ReferenceCurveFacet.java: + New. Facet for the W~W relation. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: Cosmetics. + +2012-01-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java: + Added stub loop for creating facets. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Cosmetics. + +2012-01-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Call the 'Bezugslinienverfahren'. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + I18N for the 'Bezugslinienverfahren' error messages. + +2012-01-27 Felix Wolfsteller + + * doc/conf/themes.xml: Better theme for manual points. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Theme text part of manual points. Offset it a bit. + +2012-01-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation5.java: + Fixed stupid bug. + +2012-01-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceGaugeState.java, + src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java, + src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeState.java, + src/main/java/de/intevation/flys/artifacts/states/GaugeTimerangeState.java: + New. States used in the 'historical discharge curve' calculation. + +2012-01-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/MinMaxState.java: New + state that eases adding min/max value pairs to describe document. + + * src/main/java/de/intevation/flys/artifacts/states/IntRangeState.java: + New. Subclasses MinMaxState and allows adding min/max integer value pairs. + +2012-01-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: Moved + code to add items to a data node for dynamich UI into an own method. + +2012-01-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WQKmsFacet.java: Removed + useless import. + +2012-01-27 Ingo Weinzierl + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added strings which are used n + the calculation "historical discharge curve". + +2012-01-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation5.java: + New. Calcutation to be created from WINFOArtifact + for the 'Bezugslinienverfahren'. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Added TODO about optimization of the 'Bezugslinienverfahren'. + Added number of default samples of the W~W relation. + + * src/main/java/de/intevation/flys/artifacts/model/WW.java: + Added convinience constructor to store the calculation results. + + * ChangeLog: Removed false TODO. + +2012-01-27 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java, + src/main/java/de/intevation/flys/exports/WDifferencesExporter.java: + Read jasper template file from resources to support i18n reports. + + * doc/conf/jasper/wdifferences.jasper, + doc/conf/jasper/duration.jasper, + doc/conf/jasper/computed-discharge.jasper, + doc/conf/jasper/waterlevel.jasper: + Updated report template. Resized left margin. + + * doc/conf/jasper/computed-discharge_en.jasper, + doc/conf/jasper/duration_en.jasper, + doc/conf/jasper/wdifferences_en.jasper, + doc/conf/jasper/waterlevel_en.jasper: + New. Templates for english reports. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for template files and modes. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Prevent second Legend Entry for points (prior was one for the + TextAnnotations and one for the points). + +2012-01-27 Felix Wolfsteller + + Blindly render Text of manual points if it does not collide with + other text. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Handle TextAnnotations, create some for manual points. + + * src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java: + Added setter for TextAnnotations, documentation. + +2012-01-27 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + +2012-01-27 Sascha L. Teichmann + + Refactored class hierachy to integrate model for W~W: + + NamedObjImpl + \-- W + +-- WW + \-- WQ + +-- WQDay + \-- WQKms + \-- WQCKms + + * src/main/java/de/intevation/flys/artifacts/model/W.java: + New. Base class + + * src/main/java/de/intevation/flys/artifacts/model/WW.java: + New. Model for W~W + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java, + src/main/java/de/intevation/flys/artifacts/model/WQDay.java, + src/main/java/de/intevation/flys/artifacts/model/WQ.java, + src/main/java/de/intevation/flys/artifacts/model/WQCKms.java: + Adjusted to follow the new class hierarchy. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java: + Removed superfluous imports. + +2012-01-27 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties, + src/main/java/de/intevation/flys/artifacts/states/ManualPointsSingleState.java: + i18n for ManualPointsFacets. + +2012-01-27 Raimund Renkert + + Issue 138: PDF output for calculations. + + * src/main/java/de/intevation/flys/exports/WDifferencesExporter.java: + Create the PDF data source and generate the PDF report output. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Add the PDF facet to state. Add export facets only once. + + * doc/conf/artifacts/winfo.xml: + Added PDF facet to state. + + * src/main/java/de/intevation/flys/artifacts/model/WKmsJRDataSource.java: + Added new field type 'differences'. + + * doc/conf/jasper/wdifferences.jasper: + New. Template for w-differences PDF export. + +2012-01-27 Raimund Renkert + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: + New method that creates and returns the chosen differences of w-difference + calculation as string. + +2012-01-27 Raimund Renkert + + Issue 138: PDF output for calculations. + + * src/main/java/de/intevation/flys/exports/DurationCurveExporter.java: + Create the PDF data source and generate the PDF report output. + + * src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java, + doc/conf/artifacts/winfo.xml: + Added PDF facet to state. + + * src/main/java/de/intevation/flys/artifacts/model/WKmsJRDataSource.java: + Added new field type 'day'. + + * doc/conf/jasper/duration.jasper: + New. Template for duration curve PDF report. + +2012-01-26 Raimund Renkert + + Issue 138: PDF output for calculations. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java: + Create the PDF datasource and generate the PDF report output. + + * src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java, + doc/conf/artifacts/winfo.xml: + Added PDF facet to state. + + * doc/conf/jasper/computed-discharge.jasper: + New. Template for computed discharge PDF report. + +2012-01-26 Raimund Renkert + + Issue 138: PDF output for calculations. + + * pom.xml: New Dependency to net.sf.jasperreports/jasperreports and + org.codehaus.groovy/groovy-all. + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: + Added methods for PDF generation. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Create the PDF data source and generate the PDF report output. + + * src/main/java/de/intevation/flys/artifacts/model/WKmsJRDataSource.java: + New. Data source for jasper reports containing the waterlevel calculation + result. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Added facet for PDF export to state. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added PDF facet type. + + * src/main/java/de/intevation/flys/exports/DurationCurveExporter.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java, + src/main/java/de/intevation/flys/exports/WDifferencesExporter.java: + Added stub for inherited abstract method. + + * doc/conf/artifacts/winfo.xml: + Added PDF facet to outputmode 'export'. + + * doc/conf/jasper, + doc/conf/jasper/waterlevel.jasper: + New. Folder for jasperreports templates and first template for + waterlevel report. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n string for calculation mode. + +2012-01-26 Felix Wolfsteller + + Renderer 'manual' points in LongitudinalSectionGenerator. + + * pom.xml: New dependency to org.json/json. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + (doOut): Handle manual points. + (doPoints): Add point- series. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added MANUALPOINTS Facet Type. + + * doc/conf/themes.xml: Added Default Theme for Manual Points. + + * doc/conf/artifacts/winfo.xml: Added manual point facet to + compatibility list of longitudinal section diagram. + +2012-01-26 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/artifacts/model/ManualPointsFacet.java, + src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java: + Removed obsolete imports. + +2012-01-26 Felix Wolfsteller + + Add initial infrastructure for user-provided data ('manual points'). + + * doc/conf/artifacts/manualpoints.xml: Trivial state model for new + Artifact. + + * doc/conf/conf.xml: Registered manualpoint artifact and factory. + + * src/main/java/de/intevation/flys/artifacts/model/ManualPointsFacet.java, + src/main/java/de/intevation/flys/artifacts/states/ManualPointsSingleState.java, + src/main/java/de/intevation/flys/artifacts/ManualPointsArtifact.java: + New. Basic infrastructure for ManualPoints. + +2012-01-25 Sascha L. Teichmann + + * doc/conf/artifacts/winfo.xml: Removed superfluous condition checks. + +2012-01-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Cosmetics, documentation. + +2012-01-25 Sascha L. Teichmann + + * doc/conf/artifacts/winfo.xml: Add states/transitions stubs for + "Bezugsllinenverfahren." + + * src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/ReferenceCurveInputState.java: + Stubs for the two new states. + +2012-01-25 Sascha L. Teichmann + + * contrib/visualize-transitions.xsl: Fixed output of the conditions + of the transitions. Now you can see the circumstances + when a branch is taken. + +2012-01-25 Raimund Renkert + + Issue 461. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Override buildChartSection() to disable the chart subtitle entry in + ChartSettings. + +2012-01-24 Sascha L. Teichmann + + I18N for WINFO calculations messages. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation.java: + Allow optional arguments in error messages to support meaningful + formatting containing e.g. numbers. + + * src/main/java/de/intevation/flys/artifacts/resources/Resources.java: + Added a convenience getMsg() method. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation2.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation3.java, + src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Adjusted the code to use the I18N symbols now. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added the I18N strings. + +2012-01-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Handle the case in "W auf freier Strecke" where more than + one Q is related to a W. TODO: Generate user report. + +2012-01-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Added code for the simple case of "Bezugslinienverfahren" ("W auf freier Strecke"). + TODO: Handle case if the model returns more than one Q for a given W. + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Micro optimizations. + +2012-01-23 Felix Wolfsteller + + Fix flys/issue452 (Annotations at second y-axis). + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new type (duration_curve.mainvalues.q). + + * doc/conf/themes.xml: Added theme mapping for new facet type. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Create another Facet. + + * doc/conf/artifacts/winfo.xml: Added new facet type to compatibility + list. + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Handle new Facet. + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Added field to be able to remember which axis to stick to. + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java: + Tell Annotations to stick to Q axis in the special duration_curve + environment. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (AxisDataset): Added plotAxisIndex to now have a + two-way-association. + Tell own axisDatasets to which 'jfreechart'-axis they are assigned. + Evaluate which axis the StickyAxisAnnotations should be sticked to, + and calculate text and line positions accordingly. + Removed junk. + +2012-01-23 Felix Wolfsteller + + Fix compilation. + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java: + Use StickyAxisAnnotations instead of XYTextAnnotations. + +2012-01-23 Felix Wolfsteller + + Some unification of Annotation handling. + + * src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java: + Add a third annotation type (now have text, hyk and sticky). + + * src/main/java/de/intevation/flys/jfree/CollisionFreeXYTextAnnotation.java: + Use double instead of float values, removed commented code. + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Reduced to keep information about placements etc only. Not a + Annotation (in JFreeChart sense) anymore. + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Use StickyAxisAnnotations instead of XYTextAnnotations. + + * src/main/java/de/intevation/flys/themes/ThemeAccess.java: + Added new LineStyle class. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Call addAnnotationsToRenderer later, where positioning information + is already known. + (addAnnotationsToRenderer): Deal with the three Annotation types. + Instead of StickyAnnotations, add + CollisionFreeXYText- and + XYLineAnnotations. + (Area): Helper class. + +2012-01-23 Felix Wolfsteller + + Some unification of Annotation handling. + + * src/main/java/de/intevation/flys/exports/ChartExportHelper.java: + +2012-01-23 Felix Wolfsteller + + Fix flys/issue395 (SVG/PDF-Export: Längsschitt enthält keine + Streckenfavoriten.) + + * src/main/java/de/intevation/flys/exports/ChartExportHelper.java: + Fix pdf/svg rendering of annotatios, by adding a + ChartRenderingInfo-object to the chart.draw call. + +2012-01-20 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Added new key and getter for a short subtitle. The short subtitle is + used if no range exists. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n string for shor subtitle. + +2012-01-20 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/ChartArtifact.java: + Removed state validation. Validation prevents drawing the diffenrences + diagramm and all states except of WDifferencesState always return + true. + +2012-01-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/CollisionFreeXYTextAnnotation.java: + New. Candidate to replace StickyAxisAnnotation eventually. + +2012-01-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java: + Added null-guards to functions parameters. + +2012-01-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/HYKFactory.java: + Respect flowing direction of river when finding valid + hykformations. + +2012-01-20 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Add an empty facet to this state if the artifact is a Chartartifact. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Do not add the range to subtitle if no range exists. + +2012-01-20 Raimund Renkert + + 'New chart' for cross sections. + + * doc/conf/artifacts/chart.xml: Updated the states and transitions for + new charts. + + * doc/conf/meta-data.xml: Added cross sections to datacage. + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + Changed cast from WINFOArtifact to FLYSArtifact. + + * src/main/java/de/intevation/flys/artifacts/ChartArtifact.java: + Changed artifact data strings for chart_type. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Changed i18n string for cross sections and logitudinal sections. + +2012-01-20 Felix Wolfsteller + + Add basic (text) styling for HYKs. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Minor cleanup, pass HYK theme on. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Apply TextStyle to TextAnnotation part for HYK zones. + + * src/main/java/de/intevation/flys/themes/ThemeAccess.java: + (TextStyle): New class to bundle text-styling info. + + * src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java: + Refactored constructors to ease setting Style in the newly + created usage scenario. + +2012-01-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/StaticHYKState.java: + Cleanup. Mark spot where State-based caching could happen. + +2012-01-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/HYKFacet.java: + Cosmetics. + +2012-01-20 Felix Wolfsteller + + * doc/conf/cache.xml: Added Cache for HYKS. + +2012-01-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/HYKFactory.java: + Made HYKFactory.Zone Serializable. + +2012-01-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/HYKArtifact.java: + Cosmetics. + +2012-01-20 Felix Wolfsteller + + Added style definition for hyks. + + * doc/conf/themes.xml: Added hyk style (text). + +2012-01-19 Sascha L. Teichmann + + * doc/conf/cache.xml: Removed cache "service-distanceinfo". + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java: + Now uses the annotations from the LocationProvider and the + XML documents are no longer cached. + +2012-01-19 Sascha L. Teichmann + + * doc/conf/cache.xml: Removed "annotations" cache. + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: + Removed annotation caching. + + * src/main/java/de/intevation/flys/artifacts/model/LocationProvider.java: + Changed internal data structure to FastAnnotations which are also cached. + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java: + Use FastAnnotations now which are fetched via the LocationProvider. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Added + time measurement for writing the CVS output. + + * src/main/java/de/intevation/flys/artifacts/states/StaticHYKState.java: + Removed superfluous import. + +2012-01-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Respect visibility flag of HYK facet. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Log malcondition, make colored hyk-box a bit smaller. + +2012-01-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFactory.java, + src/main/java/de/intevation/flys/artifacts/model/DataFacet.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java, + src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Cosmetics, docs, improved logging. + +2012-01-19 Felix Wolfsteller + + * doc/conf/meta-data.xml: Recommend hyks for current river if hit by + a crosssection-out. + +2012-01-19 Felix Wolfsteller + + Somewhat improved HYK handling and rendering. + + * src/main/java/de/intevation/flys/artifacts/HYKArtifact.java: + Store ids in more sensibly named data item and expose it. + Spawn all facets in inactive state. + + * src/main/java/de/intevation/flys/artifacts/model/HYKFactory.java: + Make HYK name accessible, do not query hyks by river, but by hyk-id, + made query more real-world. + + * src/main/java/de/intevation/flys/artifacts/states/StaticHYKState.java: + Use hyks name as facet name, pass hyk-id when asking for hyks. + +2012-01-19 Felix Wolfsteller + + Somewhat improved HYK handling and rendering. + + * src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java: + Added ability to store 'zones', next to text annotations. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (getLowestYValue, getUppestYValue, colorForHYKZone), + (addBoxAnnotations): New. Create box annotations from zones. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + (doHYK): New, handle hyk facets by adding zones to annotation + container. + +2012-01-19 Felix Wolfsteller + + Preparing improved HYK handling. + + * src/main/java/de/intevation/flys/artifacts/model/HYKFactory.java: + (Zone.getTo): New accesor. + TODOs and documentation added. + +2012-01-18 Raimund Renkert + + 'New Chart' for w-differences curve. + + * doc/conf/artifacts/chart.xml: Added empty facet to output mode. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Add an empty facet if the artifact is a ChartArtifact. + +2012-01-18 Raimund Renkert + + 'New Chart' for discharge longitudinal section curve. + + * doc/conf/artifacts/chart.xml: Added transition for location input. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Changed cast from WINFOArtifact to FLYSArtifact. + + * src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java: + Add an empty facet if the artifact is a ChartArtifact. + +2012-01-18 Raimund Renkert + + 'New Chart' for duration curve. + + * doc/conf/artifacts/chart.xml: Added state and transition for location input. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Changed cast from WINFOArtifact to FLYSArtifact. + + * src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java: + Add an empty facet if the artifact is a ChartArtifact. + +2012-01-18 Felix Wolfsteller + + Added accidentally ommitted HYKFacet, fixing build. + + * src/main/java/de/intevation/flys/artifacts/model/HYKFacet.java: + New, stubby facet for hyk infrastructure. + +2012-01-18 Raimund Renkert + + 'New Chart' for computed discharge curve. + + * doc/conf/artifacts/chart.xml: Fixed transitions and added state for km input. + + * src/main/java/de/intevation/flys/artifacts/model/EmptyFacet.java: + New. Added an empty facet to avoid deleting an empty output. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java, + src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java, + src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java: + Changed some return values if the artifact is a ChartArtifact. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java: + Changed casts from WINFOArtifact to FLYSArtifact. + + * src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java: + Add an empty facet if the artifact is a ChartArtifact. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Set a default axis range if the range is null. + +2012-01-18 Felix Wolfsteller + + Added stub hyk infrastructure. + + * doc/conf/artifacts/hyk.xml: Added trivial transition configuration + for hyk artifacts. + + * doc/conf/conf.xml: Register HYK artifact and its transition conf. + + * src/main/java/de/intevation/flys/artifacts/HYKArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/HYKFactory.java, + src/main/java/de/intevation/flys/artifacts/states/StaticHYKState.java: + Added static 'hyk' artifact, facet and state. + +2012-01-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Add 'hyk' facet type. + +2012-01-18 Felix Wolfsteller + + Add hyk facet to compatibility list of winfo.xml . + + * doc/conf/artifacts/winfo.xml: Add hyk facets to compatibility list. + +2012-01-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + method getDataAsLong that returns a Long representation of a data item or + null if no such data item is existing or it cannot be parsed as Long. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a function + that returns the selected reference gauge (specified by 'reference_gauge' + parameter) of a FLYSArtifact. + +2012-01-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/LocationProvider.java: + Cache a TreeMap of the annotation values of whole + rivers. This is _much_ more efficient than firing an HQL/SQL statement for + each km and caching these results. + +2012-01-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/FastCrossSectionLine.java: + Deleted. It is in the backend now. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/FastCrossSectionChunk.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java, + src/main/java/de/intevation/flys/artifacts/model/FastCrossSectionLineFactory.java, + src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java, + src/main/java/de/intevation/flys/artifacts/WaterLineArtifact.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Adjusted to use the fast cross section line from backend now. + + * doc/conf/cache.xml: Store cross section lines cache on disk. + + * src/main/java/de/intevation/flys/artifacts/states/StaticWQKmsState.java, + src/main/java/de/intevation/flys/artifacts/model/DataFacet.java, + src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: Removed + superfluous imports. + +2012-01-17 Felix Wolfsteller + + Fix assignment of stateId/hash in WaterlevelFacet. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: + More verbose logging, fix hash/stateid assignment. + + * src/main/java/de/intevation/flys/artifacts/model/BlackboardDataFacet.java: + (deepCopy): implemented. + +2012-01-17 Felix Wolfsteller + + "Ported" StaticWQKmsArtifact to use compute-type caching mechanism. + + * doc/conf/artifacts/staticwqkms.xml: Declare trivial info. + + * doc/conf/conf.xml: Register staticwqkms artifact and factory. + + * src/main/java/de/intevation/flys/artifacts/model/WQKmsFacet.java: + Sublacss DataFacet. + + * src/main/java/de/intevation/flys/artifacts/states/StaticWQKmsState.java: + New. State. + + * src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java: + Refactored. Most computation and stuff now done in State and Facet. + +2012-01-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Minor cosmetics. + +2012-01-17 Felix Wolfsteller + + Refactoring. + + * src/main/java/de/intevation/flys/artifacts/model/BlackboardDataFacet.java: + Added new constructor. + + * src/main/java/de/intevation/flys/artifacts/model/DataFacet.java: + Refactored, subclass BlackboardDataFacet. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: + Refactored, subclass DataFacet. + + * src/main/java/de/intevation/flys/artifacts/math/DifferenceCurveFacet.java: + Adjusted. + +2012-01-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/DataFacet.java: + Cosmetics, added new constructor. + +2012-01-16 Sascha L. Teichmann + + Use improved caching for cross section data. + !!! This commit needs heavy testing !!! + + * src/main/java/de/intevation/flys/artifacts/services/CrossSectionKMService.java: + Refactored to provide the map to determine the nearest cross section line + neighbors for a given km to the public. This is a bit hackish because + it hhould have its own factory which is then used by this service and + other parts of the code. + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + searchCrossSectionLine() now returns a FastCrossSectionLine. To find this + line efficiently it uses the map of the CrossSectionKMService which + already provides a nearest neighbor searching mechanism for cross + section lines. The FastCrossSectionLine is fetched with the + FastCrossSectionLineFactory which uses a cache as described in the + previous commit. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java + src/main/java/de/intevation/flys/artifacts/WaterLineArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java, + src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Uses + the FastCrossSectionLine instead of CrossSectionLines now. + + * src/main/java/de/intevation/flys/artifacts/model/FastCrossSectionLine.java: + Added method fetchCrossSectionProfile() to access the point data in + the profile generating compatible way. + + * src/main/java/de/intevation/flys/artifacts/ChartArtifact.java: Removed + superfluous import. + +2012-01-16 Sascha L. Teichmann + + * doc/conf/cache.xml: Added cache for fast section lines chunks. + + * src/main/java/de/intevation/flys/artifacts/model/FastCrossSectionChunk.java: + New. Chunks of FastCrossSectionLines. Stores cross section lines for ranges + of one KM. + + * src/main/java/de/intevation/flys/artifacts/model/FastCrossSectionLineFactory.java: + New. Access fast cross section lines. It uses the cache 'fast-cross-section-lines' + configured in cache.xml to store chunks of cross section lines. + + * src/main/java/de/intevation/flys/artifacts/model/FastCrossSectionLine.java: + New. Stores the important data (points) of a cross section line. + +2012-01-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + Added a new calculation option for historical discharge curves. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added translations for + historical discharge curves. + +2012-01-16 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Added certain facets to to + compatibility matrices. + +2012-01-16 Felix Wolfsteller + + * doc/conf/artifacts/annotation.xml: Fixed accidental change. + +2012-01-16 Felix Wolfsteller + + * doc/conf/artifacts/annotation.xml: Cosmetics. + +2012-01-16 Ingo Weinzierl + + * doc/conf/meta-data.xml: Enabled old floodmap calculations for output + type 'map'. + +2012-01-13 Raimund Renkert + + Initial implementation for module 'new chart'. + + * src/main/java/de/intevation/flys/artifacts/ChartArtifact.java: + New. Artifact for module 'new chart'. + + * doc/conf/artifacts/chart.xml: + New. Artifact description for the new artifact. + + * doc/conf/conf.xml: + Added new artifact to config. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for 'new chart' chart types. + +2011-01-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: + Cosmetics. + +2011-01-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Avoid NPE when copying data from one artifact to another. + +2011-01-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (expandRange): Prevent collapse due to negative values. + +2012-01-12 Raimund Renkert + + * doc/conf/artifacts/map.xml, + doc/conf/conf.xml, + src/main/java/de/intevation/flys/artifacts/MapArtifact.java: + Changed the MapArtifact name to 'new_map'. + +2011-01-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + Added code to calculate the area of the generated polygons. + TODO: Render the generated area sum to the plot. + +2011-01-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + Replaced System.err.println()s with proper logging. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelInfoState.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Removed + superfluous imports. + +2011-01-12 Felix Wolfsteller + + flys/issue450 (i18n: Datenkorb: longitudinal-section) + + * doc/conf/meta-data.xml: Replaced dash by underscore in + longitudinal-section. + +2011-01-12 Felix Wolfsteller + + Towards areas on other than the first axes. + + * src/main/java/de/intevation/flys/artifacts/model/BlackboardDataFacet.java: + Changed signature on which to provide data via the blackboard. + Include facets name to allow unique identification. + + * src/main/java/de/intevation/flys/artifacts/model/AreaFacet.java: + Store name of one of the facets involved in area creation. + (AreaFacet.Data): New class to hold result data. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + New methods to find out whether we have a general Q or W type of + facet. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + (doArea): Use new Result-Data object instead of Object[], resolve + which axis to put area to. + (axisIdxForFacet): New. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Subclass LongitudinalSectionGenerator. + +2011-01-12 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelInfoState.java: + Do not intefere with CrossSections. + +2011-01-12 Felix Wolfsteller + + Cosmetics, cleanups. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + (getCrossSections, getCrossSectionNames): Removed. + +2011-01-11 Felix Wolfsteller + + flys/issue439 (Streckenfavoriten lassen sich nicht über den Datenkorb + hinzuladen) + + * doc/conf/meta-data.xml: Made Annotations available via datacage + in longitudinal section, cosmetics. + +2012-01-11 Raimund Renkert + + * doc/conf/conf.xml: + Added output generator for output type 'map'. + + * doc/conf/artifacts/map.xml: + Changed output name to 'map'. + + * doc/conf/meta-data.xml: + Added new output type 'map'. + +2011-01-11 Felix Wolfsteller + + Fix flys/issue446 (Dauerline/Abflusskurve am Pegel: Eigenschaften vom + Hauptwertthema nicht aufrufbar) + + * doc/conf/themes.xml: Add default styles for mainvalues.q/w and other + themes. + +2012-01-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java: + Removed XPath injection security hole. A serious one because it allowed + inspecting the conf.xml file ... with all the db passwords. + +2012-01-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Removed superfluous imports. + +2012-01-11 Ingo Weinzierl + + * doc/conf/meta-data.xml: Added the definition of old calculation results + for floodmaps. + +2012-01-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: Added + methods getLayers() and removeLayer(). + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + method getFacets() which returns a list of Facets supported by this + Artifact. In addition, the FLYSArtifact is now more verbose while + filtering Facets for Outputs. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Implemented initialize() which now copies the shapefile directory of the + model Artifact and modifies its Facets (adapts the shapepath which is the + uuid of the Artifact). + +2012-01-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java, + src/main/java/de/intevation/flys/collections/OutputParser.java: Made + them more verbose for better debugging. + +2012-01-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Initialize() now also calls State.initialize() for each State. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Override initialize() which is defined in AbstractState. NOTE: Currently, + this method has no code. + +2012-01-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/CacheInvalidationService.java: + New. The service to invalidate the caches. (Argh! Forgot to 'svn add') + +2012-01-06 Ingo Weinzierl + + flys/issue298 (Karte: Automatischer Zoom auf Berechnungsergebnisse) + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java: Added a + debug statement that prints out the WSPLGEN extent. + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: Create new + Envelope instances for initial and max extent if they are not existing. + Some debug statements have now been removed. + +2011-01-06 Felix Wolfsteller + + Add cache for 'static' wqkms (e.g. BaseData) to default cache conf. + + * doc/conf/cache.xml: Add Cache Config for static wqkms. + + * src/main/java/de/intevation/flys/artifacts/model/StaticWQKmsCacheKey.java: + Adjust typo in cache name, minor cosmetic. + +2011-01-06 Raimund Renkert + + * src/main/java/de/intevation/flys/artifacts/MapArtifact.java: + The map artifact has two states now and overrides describe() to + generate UI sections in the describe response. + The map state overrides computeAdvance() instead of computeFeed(). + + * src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: + Changed the WMSDBArtifact in WMSDBState to FLYSArtifact and adjusted + constructors in state classes. + + * doc/conf/artifacts/map.xml: + Added initial state and transition. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added i18n strings for new state. + +2011-01-06 Felix Wolfsteller + + Partial fix for flys/issue437 (Querprofil: Zugeladene Basisdaten + ignorieren W/Q-heit, falsche Namen). + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Set name also for first column (zero based). + +2012-01-06 Ingo Weinzierl + + flys/issue196 (i18n/l10n: Zahlenformate einheitlich) + + * src/main/java/de/intevation/flys/artifacts/model/WQ.java: New method + getRawValue() that extracts the raw double value from 'name' parameter. + + * src/main/java/de/intevation/flys/utils/Formatter.java: New method + getRawFormatter() that returns a NumberFormat instance for the current + locale. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Localized the W/Q labels in CSV exports. + +2011-01-06 Felix Wolfsteller + + flys/issue442 (i18n: Datenkorb: flood-protections) + + * doc/conf/meta-data.xml: Replaced dash in flood-protection by + underscore to allow translation. + +2011-01-06 Felix Wolfsteller + + flys/issue438 (i18n: Datenkorb: additionals) + + * doc/conf/meta-data.xml: Fix typo. + +2011-01-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/CacheInvalidationService.java: + New. Uses the CacheFactory to invalidate caches by their names. + This can be used by external ETL processes like the AFT/DIPS importer + to prevent cache inconsistencies. + + Input documents look like this: + + + + ... + + + + Output documents look like this: + + + All elements removed. + ... + Error: Cache not found. + + + * doc/conf/conf.xml: Added the cache invalidation service. + + * src/main/java/de/intevation/flys/artifacts/services/FLYSService.java: + Added Override annotation. + +2011-01-05 Felix Wolfsteller + + flys/issue432 (Diagrammeigenschaften/Flächenrenderer: + Legenden-schriftgröße für Flächenthemen wird ignoriert) + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Respect legend item size when generating legend items for + area dataseries. + +2011-12-09 Raimund Renkert + + Implemented new module "new map". + + * src/main/java/de/intevation/flys/artifacts/MapArtifact.java: + New. Artifact for the new module, extends RiverAxisArtifact and + contains the MapState class. + + * src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: + Added empty constructor to embedded state classes to allow instantiation + of MapState that extends the RiverAxisState. + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: + Do not generate an initialExtent element if the initial extent is + empty. + + * doc/conf/artifacts/map.xml: + New. Describes the state for the new module. + + * doc/conf/conf.xml: + Added new config file. + +2012-01-05 Ingo Weinzierl + + flys/issue444 (error_no_export_found bei "W bei ungleichwertigem Abfluss") + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: If no boolean + value "wq_free" exists in getWQMode(), false is the default. + +2011-01-05 Felix Wolfsteller + + flys/issue443 (Querprofile: Hibernate LazyInitializationException) + + * doc/conf/cache.xml: Disable cache for cross-sections. + +2012-01-05 Ingo Weinzierl + + flys/issue447 (W-Differenzen: Fehler beim Hinzufügen einer Parameterisierung) + + * src/main/java/de/intevation/flys/collections/CollectionAttribute.java: + Added a new method cleanEmptyOutputs() which removes Outputs that have + no Facets set. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: Call + CollectionAttribute.cleanEmptyOutputs() at the end of write() to remove + empty Outputs that have been added during the merge process. + +2012-01-05 Ingo Weinzierl + + flys/issue440 (Karte: WSPLGEN Berechnungen für Mosel schlagen fehl) + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: Modified the + getRiverBoundary() method because the signature of + RiverAxis.getRiverAxis() has changed. This method will now take each + geometry into account, that is retrieved by + RiverAxis.getRiverBoundary(). + + * src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java: + Use GeometryUtils.getRiverBoundary() to determine the boundary of a + river. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Create the riveraxis shapefile with all geometries returned by + RiverAxis.getRiverAxis(). + +2012-01-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Repaired + broken items in legend. The new renderer requires the current plot. This + is set now. + +2012-01-04 Ingo Weinzierl + + * doc/conf/themes.xml: Added a new field 'pointsize' to the virtual theme + 'HiddenColorLines'. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Added methods to + parse the new field of 'HiddenColorLines'. + + * src/main/java/de/intevation/flys/jfree/StyledXYSeries.java: Apply the + pointsize defined in themes. + +2012-01-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Use correct keys for buffering in getMinimum() and getMaximum(). + +2012-01-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/StyledXYSeries.java, + src/main/java/de/intevation/flys/exports/StyledAreaSeriesCollection.java, + src/main/java/de/intevation/flys/exports/EnhancedLineAndShapeRenderer.java: + Moved to de.intevation.flys.jfree. + + * src/main/java/de/intevation/flys/jfree/StyledXYSeries.java, + src/main/java/de/intevation/flys/jfree/StyledAreaSeriesCollection.java, + src/main/java/de/intevation/flys/jfree/EnhancedLineAndShapeRenderer.java: + Moved from de.intevation.flys.exports. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Added necessary imports. + +2012-01-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/EnhancedLineAndShapeRenderer.java: + Buffered the computation results of getMinimum() and getMaximum(). + +2012-01-04 Ingo Weinzierl + + flys/issue393 (Themenstileditor: Minimum anzeigen / Beschriftung anzeigen) + + * src/main/java/de/intevation/flys/exports/EnhancedLineAndShapeRenderer.java: + New renderer that overrides JFreeChart's XYLineAndShapeRenderer. This + renderer brings the option to explicitly display the minimum and/or + maximum or a series as shape. Currently, there are no options to adjust + the style of those shapes. + + * doc/conf/themes.xml: Added a new virtual theme 'MinMaxPoints'. All line + theme inherit from that theme now. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Added methods to + parse the fields 'showminimum' and 'showmaximum' of 'MinMaxPoints' theme. + + * src/main/java/de/intevation/flys/exports/StyledXYSeries.java: Added + methods to apply the fields of the new Theme 'MinMaxPoints'. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Modified + the getRenderer() method which now always returns a new instance of + EnhancedLineAndShapeRenderer. + +2011-01-02 Felix Wolfsteller + + Allow styling of outline of areas. + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + Allow styling of outline of areas. + + * src/main/java/de/intevation/flys/exports/StyledAreaSeriesCollection.java: + Parse outline style for areas, apply it to renderer. + +2012-01-03 Ingo Weinzierl + + flys/issue104 (W-INFO: Wasserspiegellagenberechnung / Strecke) + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: Call + the new flys-backend method Wst.determineMinMaxQFree() to determine the + min/max Qs at a given kilometer. + +2011-01-02 Felix Wolfsteller + + * doc/conf/themes.xml: Reflect name chnage of longitudinal sections + area artifacts and include ColorLine style for area styles. + +2012-01-02 Ingo Weinzierl + + flys/issue370 (WINFO: Berechnungsausgabe W/Pegel [cm] fehlt bei Wasserspiegellage und W am Pegel) + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: New method that + extracts the double value of a WQ object's name. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Adapted + the header of CSV exports and the content of the "W at gauge" column. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java: + Adapted method signatures that have been changed in WaterlevelExporter. + +2012-01-02 Ingo Weinzierl + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added strings used in the CSV + export. + +2012-01-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Check + if the location of a CSV row is in range of the reference gauge. Write + "outside reference gauge" into CSV in such cases. + +2012-01-02 Ingo Weinzierl + + PART II of flys/issue125 (W-INFO: Wasserspiegellagenberechnung / tabellarische Berechnungsausgabe) + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Add the + named main value of a Q and the name of the gauge used for the calculation + if the WQ mode is "W at gauge" or "Q at gauge". + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java: + Adapted the method signatures that have been modified in + WaterlevelExporter. + +2012-01-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/StyledAreaSeriesCollection.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/AxisSection.java, + src/main/java/de/intevation/flys/exports/ExportSection.java, + src/main/java/de/intevation/flys/exports/LegendSection.java, + src/main/java/de/intevation/flys/exports/ChartSection.java: Removed + unused imports. + +2012-01-02 Ingo Weinzierl + + PART I of flys/issue125 (W-INFO: Wasserspiegellagenberechnung / tabellarische Berechnungsausgabe) + + * doc/conf/cache.xml: Registered a new Cache for the LocationProvider. + + * src/main/java/de/intevation/flys/artifacts/model/LocationProvider.java: + New. This class is able to return the description of a location based on a + river and kilometer parameter. The LocationProvider stores single + locations into a Cache if one is configured for this class. + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java: + Added a method that returns a single Annotation for a specific kilometer and + river. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a method + getLocationDescription() that might be used to determine the description + of a specified kilometer for a given river. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Make use + of FLYSUtils.getLocationDescription() to add a new column that contains + the location description. + +2011-12-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: Write + min/max values for free Qs into Artifact's DESCRIBE document. + +2011-12-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: Fixed + broken order to determine the step width of Qs and Ws. + +2011-12-28 Ingo Weinzierl + + flys/issue104 (W-INFO: Wasserspiegellagenberechnung / Strecke) + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Validate user defined free Q values. + +2011-12-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Compute better step width based on a maximal number of steps = 30. + Results with digits are rounded up. E.g.: + Q range = 9.6 - 1750 + Step width = 58.01 + Rounded result = 60 + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/AxisSection.java, + src/main/java/de/intevation/flys/exports/LegendSection.java, + src/main/java/de/intevation/flys/exports/ChartSection.java: Subclasses + TypeSection to be able to use convinience methods for string, integer, + double and boolean values. + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: The + getSize() method now returns null if no width and height is specified in + the request document or if width/height <= 0. It no longer returns the + result of getDefaultSize(). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Set the + size of a chart export to the size specified in the ChartSettings if + there are no valid values in the request document. + + * src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: Set the + chart size to ChartGenerator.getDefaultSize() if no valid values are + returned by ChartGenerator.getSize(). This has been done autoamtically + before. + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/TypeSection.java: New. This + Section defines some convinience methods to add/set string, integer, + double and boolean values. + + * src/main/java/de/intevation/flys/exports/ExportSection.java: New. + Subclasses TypeSection. The ExportSection currently offers attributes + 'width' and 'height'. + + * src/main/java/de/intevation/flys/exports/ChartSettings.java: Added + getter/setter methods to support an ExportSection. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Create an + ExportSection while initial ChartSettings creation. + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Added and + make use of a new method createLegendLabelFont() to create unified Fonts for + LegendItems. This method considers the user defined size for LegendItems. + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Implemented adjustAxes(). This method now sets the label Font of the X + axis. Its size is determined by getXAxisLabelFontSize(). + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/AxisSection.java: Added method + getFontSize() to retrieve the font size for an axis. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Modified createYAxis(int): call super.createYAxis(int) and adjust + necessary settings - no Axis creation takes place here. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Added + getXAxisLabelFontSize() and getYAxisLabelFontSize(int) to retrieve the + user defined font size for an axis. The getYAxisLabelFontSize() is used in + createYAxis(int) to set the font size for axes labels. + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Override getYAxisWalker(). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Create new + instances of IdentifiableNumberAxis in createYAxis(int) default + implementation. + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/AxisSection.java: Added + getLabel() to retrieve the axis label. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Override getDefaultXAxisLabel() and getDefaultYAxisLabel() defined in + XYChartGenerator. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Implement + getXAxisLabel() and getYAxisLabel(int). Both methods search for an axis + label defined in the ChartSettings first. If no label is specified or if + no ChartSettings is set, getDefaultXAxisLabel() or + getDefaultYAxisLabel(int) is called to retrieve the initial/default axis + label. + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartSettings.java: Modified the + signature of addAxisSection(). This method now accepts AxisSections only. + In addition, there is a new method getAxisSection(String) that returns an + AxisSection specified by its identifier. + + * src/main/java/de/intevation/flys/exports/AxisSection.java: Added new + methods getIdentifier(), isFixed(), getUpperRange() and getLowerRange() to + retrieve the attributes supported by this Section. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Make use + of axes ranges specified in ChartSettings if an axis is fixed. + +2011-12-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/IdentifiableNumberAxis.java: New. + Subclasses JFreeChart's NumberAxis and offers a getId() method which + returns an identifiable key. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Implements + a createNumberAxis() method that should be used by all subclasses to + create new axes. This method returns an instance of IdentifiableNumberAxis + which is required for zooming. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Create new NumberAxis instances by using XYChartGenerator.createNumberAxis(). + +2011-12-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Implemented the methods getChartTitle() and getChartSubtitle(). Both + methods try to get the required information from ChartSettings. If no + ChartSettings is set for this OutGenerator, these methods will call + getDefaultChartTitle() and getDefaultChartSubtitle(). + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Renamed getChartTitle() and getChartSubtitle() to + getDefaultChartTitle() and getDefaultChartSubtitle(). In addition, the + methods addSubtitles() became more robust - these OutGenerators add + subtitles only if the subtitle is not empty. + +2011-12-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/OutGenerator.java: Added a + setSettings(Settings) method. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Call OutGenerator.setSettings() before calling doOut() for each Facet. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Implemented + setSettings() and added convinience methods to access chart specific + settings. + + * src/main/java/de/intevation/flys/exports/MapGenerator.java, + src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java, + src/main/java/de/intevation/flys/exports/ATExporter.java, + src/main/java/de/intevation/flys/exports/ReportGenerator.java: Implemented + setSettings(). + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Make use + of the attributes specified in the Settings: the title, subtitle, + displayGrid and displayLegend settings are functional now. + +2011-12-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartSettings.java, + src/main/java/de/intevation/flys/exports/LegendSection.java, + src/main/java/de/intevation/flys/exports/ChartSection.java: Use more + concrete classes than Settings and Section in these classes to avoid a lot + of castings. + +2011-12-22 Ingo Weinzierl + + flys/issue242 (W-INFO: Fehlende Header in Datenexporten) + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added functions + getQs(), getWs(), getGauge(), getGaugename() and getRivername() that all + take a parameter FLYSArtifact. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Moved the + implementation of getGauge() to FLYSUtils. The getGauge() in this class + just calls and returns FLYSUtils.getGauge(). + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Write a + header into a CSV export containing meta information about this export. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added strings used in the CSV + export as header. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + (getKm): Removed, not called anymore. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Include km of cross-section-master in diagrams subtitle (fetched + from 'blackboard'. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: + Cosmetics, docs. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java + (getInitialFacetActivity): Only newest CrossSection is initially + active. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFactory.java + (isNewest): New, query whether a CrossSection is the newest for its + river, doc. + +2011-12-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + convinience method to retrieve the value of an data object stored at + FLYSArtifact as Boolean value. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a method that + returns the named value of a given double value. This method returns only + the named value, if the WQ mode is "Q at gauge" and if the value fits to a + named value. In addition to this method, there is a new method to retrieve + the selected WQ mode as 'WQ_MODE' enum. + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: + Removed prepareData() and its call. The data preparation had a bad side + effect: the modifications are "persisted" into cache, which has again bad + side effects. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Removed + prepareData(). The label creation for columns in the WST export will now + take place in addWSTColumn(). With help of the master Artifact (I forgot + this Artifact in my last commit) we are able to replace Q values with + their named main value. + +2011-12-21 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + Cover 'locations' case for initial km of cross section artifacts. + +2011-12-21 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + (initialize): Eat ld_from from master artifact. + (setup): Set cross_section.km to either masters km or the lowest + defined cross-section line, whatever is bigger. + +2011-12-21 Ingo Weinzierl + + flys/issue252 (W-INFO: Wasserspiegellagenberechnung / Mitführung der Jährlichkeiten in der Diagramm-/Ergbnisausgabe) + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a function + stripNamedMainValue(). The result of this function is a named main value's + base name without declaration of a year. + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: Added a + method pepareData() that is called in doOut() before the data supported by + the current Facet is added using addData(). + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Override + the prepareData() method to reset the name of WQKms objects. The Qs in a + waterlevel export should be the Q value or the named main value if the + value fits to a named main value. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Survive cases where the first dataset has an area-renderer assigned. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/AreaArtifact.java: + Store additional parameter (whether or not to fill everything in + between two curves.) + + * src/main/java/de/intevation/flys/artifacts/model/AreaFacet.java: + Deliver additional info from artifact. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Evaluate new parameter. + +2011-12-20 Felix Wolfsteller + + * doc/conf/themes.xml: Add transparency setting to area theme style. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Helper to + access transparency setting in theme. + + * src/main/java/de/intevation/flys/exports/StyledAreaSeriesCollection.java: + Respect transparency setting. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFacet.java: + Subclass BlackboardDataFacet to provide data for area calculation. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Cast data to WKms instead of WQKms. + +2011-12-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Use a ';' as seperator between Qs and Ws. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java + (doOut, doArea): Added handling for areafacets. Code yet mostly + copied from CrossSectionGenerator. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Refactoring, subclass BlackboardDataFacet, remove duplicate code. + +2011-12-20 Felix Wolfsteller + + Cosmetics. + + * doc/conf/artifacts/winfo.xml, + src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Renamed facet for consistency reasons. + +2011-12-20 Felix Wolfsteller + + Make Waterlevelfacet deliver data via blackbord. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: + Subclass BlackboardDataFacet. + +2011-12-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Create all formatted string labels for Ws and Qs in this class, because + this class is the only instance that knows that there are double values + to format. + +2011-12-20 Felix Wolfsteller + + Introduced new Facet that will deliver whatever getData returns via + blackbord under key which is defined by convention. Attention, the + data is not cached if handled this way. + + * src/main/java/de/intevation/flys/artifacts/model/BlackboardDataFacet.java: + New facet, will be useful for easing implementation of facets that + can contribute to area-computations. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/VisibleAttribute.java: + Removed obsolete imports. + +2011-12-20 Felix Wolfsteller + + Removed obsolete imports. + + * src/main/java/de/intevation/flys/artifacts/model/AreaFacet.java, + src/main/java/de/intevation/flys/artifacts/AreaArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/AreaCreationState.java, + src/main/java/de/intevation/flys/exports/StyledAreaSeriesCollection.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Removed obsolete imports. + +2011-12-20 Felix Wolfsteller + + With StableXYDifferenceRenderer, create legend items in rectangular + form, to discern "line" from "area" in legend. + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java + (legendLine, legendShape): Renamed. + (getLegendItem): Create LegendItem with fill, use PositivePaint for + that. + +2011-12-20 Felix Wolfsteller + + Added further 'area' infrastructure. + + * src/main/java/de/intevation/flys/exports/StyledAreaSeriesCollection.java: + New, "area dataset". + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java + (doOut): Use helper to decide if facet is an 'area' facet. + (doArea): Construct StyledAreaSeriesCollection instead of two + dataseries. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (AxisDataset.isArea): Distinguish area datasets with instanceof. + (AxisDataset.addArea): New. Replaces addAreaDataset. + (addAreaSeries): Simplified with new custom SeriesCollection. + (applyTheme): Register and style StableXYDifferenceRenderer for + StyledAreaSeriesCollections. + Added various TODOs and debug output to stabilize development. + +2011-12-20 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Added facets to compatibility + matrices. + + * doc/conf/themes.xml: Added Area theme defaults. + +2011-12-20 Felix Wolfsteller + + Lay ground for having areas in longitudinal section diagrams, too. + This is done by different naming of the facets. + + * src/main/java/de/intevation/flys/artifacts/model/AreaFacet.java: + Make the name dynamic. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added further facet types, helper. + + * src/main/java/de/intevation/flys/artifacts/AreaArtifact.java: + Store name for facets in data item, restrict access to some fields. + + * src/main/java/de/intevation/flys/artifacts/states/AreaCreationState.java: + Use AreaArtifacts data item to use name for facets. + +2011-12-20 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java, + src/main/java/de/intevation/flys/exports/StyledXYSeries.java: + Doc. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java, + src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Whitespace. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Doc and + whitespace. + +2011-12-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java + (parseBoolean): New, extracted, updated callers. + (parseFillColorField, parseShowBorder): New, for area styles. + +2011-12-19 Ingo Weinzierl + + flys/issue202 (W-INFo: Wasserspiegellagenberechnung / Vorbelegung Strecke) + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Added a system property which is used to determine, if the DESCRIBE + document of an Artifact should include default values (values, that have + been inserted by the user some time ago) or not. The default case is, + that the DESCRIBE does NOT include default values. To enable default + values, set "flys.use.default.values" to "true". + +2011-12-19 Ingo Weinzierl + + flys/issue419 (Themen-Name "Q(null)" bei W bei ungl. A.) + + * src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java: + Use correct variable to create Facet names. + +2011-12-19 Ingo Weinzierl + + flys/issue380 (W-INFO / Überschwemmungskarte, falsches DGM) + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + convinience method that returns a parameter of FLYSArtifact as Integer. + + * src/main/java/de/intevation/flys/artifacts/states/DGMSelect.java: Override + validate() to determine, if the DGM selected by the user is valid for the + current calculation range and river. + +2011-12-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Roll-back accidentally committed changes. + +2011-12-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java + (doOut): Hide 'invisible' (deleted) themes from Outgenerators. + +2011-12-19 Felix Wolfsteller + + Added area.name data item and access to areaartifact. + + * src/main/java/de/intevation/flys/artifacts/model/AreaFacet.java: + Rephrased debug output, do survive case where only one curve is + given for area calculation (this is the "above" or "under" case). + + * src/main/java/de/intevation/flys/artifacts/AreaArtifact.java + (getAreaName): Access "area.name" data item. + + * src/main/java/de/intevation/flys/artifacts/states/AreaCreationState.java: + Respect area.name data of artifact when reproducing facets. + +2011-12-16 Felix Wolfsteller + + * doc/conf/conf.xml: Fix, accidentally added wrong factory in last + commit. + +2011-12-16 Felix Wolfsteller + + * doc/conf/conf.xml: Register area artifact factory. + +2011-12-16 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Added area artifacts to cross-section + compatibility matrix. + +2011-12-16 Felix Wolfsteller + + Add area dataseries when facet delivering one. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java + (doOut): Handle area facets. + (doArea): Register areas for area facets. + +2011-12-16 Felix Wolfsteller + + Add simple area registerig functions. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (AxisDataset.addAreaDataset): New, add an area dataset. + (AxisDataset.isArea): New. + (addAreaSeries): New. Add Area Dataset. + (applyThemes): Pass info if we have an area, to set different + renderer. + +2011-12-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/StaticState.java: + Added convenience function and easy sybclassing. + +2011-12-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Register AREA ("area") facet type. + +2011-12-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Register blackboard key uuid+index and respond with data to it, as + assumed by the areaartifact and facet. + +2011-12-16 Felix Wolfsteller + + Added partial area-infrastructure. + + * src/main/java/de/intevation/flys/artifacts/model/AreaFacet.java, + src/main/java/de/intevation/flys/artifacts/AreaArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/AreaCreationState.java: + New artifact, facet and state for area rendering. + +2011-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Defined an + interface YAxisWalker that allows to walk over each Y axis definition in + subclasses. This walker can be retrieved using the new getYAxisWalker() + method. The AxisSections are built in this class now. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Implemented the YAxisWalker interface and the getYAxisWalker() method. + Removed the code to build AxisSections. + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Implemented getYAxisLabel(int pos) and getYAxisWalker(). + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Implemented the getYAxisWalker() method. + +2011-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Some optimizations during out() operation - the CollectionAttribute is + parsed a single time now (*i guess*). This code really needs some + refactoring! + +2011-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Added an INFO message that displays the duration time for the out() + operation. + +2011-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Calls super.buildAxisSections(). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Implemented the method buildAxisSections(). The result list will contain + an AxisSection for the X axis. + +2011-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: Bugfix: + Add new Outputs to the current CollectionAttribute if no old one is + existing. + +2011-12-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + Directly fetch key/value pairs when writing a collection attribute. + +2011-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartSettings.java: Added new + functions that allow parsing a ChartSettings object from DOM Node. + + * src/main/java/de/intevation/flys/collections/AttributeParser.java: Parse + the Settings of each Output. + +2011-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/CollectionAttribute.java: + Added a method to set a new Settings object for a specific Output and a + method to clear the list of Facets of a specific Output. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: The + AttributeWriter no longer creates new CollectionAttributes - it only + modifies the old CollectionAttribute. At first, it clears the Facets of + all Outputs. Finally, the merged Facets are added to the Outputs. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Added the CollectionAttribute to the AttributeWriters constructor. + +2011-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/DoubleAttribute.java: New. An + Attribute that stores double values. + + * src/main/java/de/intevation/flys/exports/AxisSection.java: Added methods + to set values for 'fixation', 'font-size', 'lower' and 'upper'. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Set new attributes mentioned above for each axis' AxisSection. + +2011-12-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/AxisSection.java: Added methods + to set the axis label and id. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Improved + the ChartSettings that will now contain a set of AxisSections. The new + buildAxisSections() method in this class is not implemented and needs to + be implemented by subclasses. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Override buildAxisSections() of XYChartGenerator to create an AxisSection + for each axis that is able to be displayed in this sort of chart. In + addition, there is a new method getYAxisLabel(int) that returns the label + for a specific Y axis. + +2011-12-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/IntegerAttribute.java: New. + Concrete subclass of a DefaultAttribute for storing integer values. + + * src/main/java/de/intevation/flys/exports/LegendSection.java: New. A + concrete Section subclass to store legend specific attributes. + + * src/main/java/de/intevation/flys/exports/BooleanAttribute.java, + src/main/java/de/intevation/flys/exports/StringAttribute.java: Removed + needless import of org.w3c.dom.Attr. + + * src/main/java/de/intevation/flys/exports/ChartSettings.java: ChartSettings + is able to store a Section for legends now. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Added + methods to retrieve the font size of legends and if the legend should be + visible or not. In addition, the ChartSettings returned by this instance + will now contain a LegendSection as well. + +2011-12-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Introduced + methods getChartSubtitle() and isGridVisible(). getChartSubtitle() returns + in this implementation null. Concrete subclasses should override this + mehtod if they require subtitles in charts. isGridVisible() determines if + the grid in the chart should be visible or not. This method return always + true in this implementation. + In addition, the Settings object returned by getSettings() will now have a + ChartSection set properly. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Override getChartSubtitle(). + +2011-12-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Prepare the OutGenerator (process each of the Output's Facets) during the + describe() operation to be able to return an initial Settings object. + +2011-12-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/BooleanAttribute.java, + src/main/java/de/intevation/flys/exports/VisibleAttribute.java, + src/main/java/de/intevation/flys/exports/StringAttribute.java: Fixed wrong + usage of DOM operations. + +2011-12-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/BooleanAttribute.java, + src/main/java/de/intevation/flys/exports/VisibleAttribute.java, + src/main/java/de/intevation/flys/exports/StringAttribute.java: New. + Concrete subclasses of a DefaultAttribute. + + * src/main/java/de/intevation/flys/exports/ChartSettings.java, + src/main/java/de/intevation/flys/exports/AxisSection.java, + src/main/java/de/intevation/flys/exports/ChartSection.java: + Implementations for chart settings. WORK IN PROGRESS! + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Override + the getSettings() method. The implementation here returns a ChartSettings + instance. + + * src/main/java/de/intevation/flys/exports/EmptySettings.java: Modified the + node name of the settings ("art:settings" -> "settings"). + +2011-12-14 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + Cosmetics, doc. + +2011-12-14 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + Remove needless imports. + +2011-12-14 Felix Wolfsteller + + Fix/Guard certain misconditions. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Do + not crash when given null-range. + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java: + Do not crash when given malformed array. + +2011-12-14 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/artifacts/math/DifferenceCurveFacet.java, + ChangeLog: Whitespace cosmetic. + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + Annotation cosmetic. + + * src/main/java/de/intevation/flys/artifacts/ExternalWMSArtifact.java: + Convenience cosmetic. + + * src/main/java/de/intevation/flys/utils/DataUtil.java: + vim-magicosmetic. + +2011-12-14 Felix Wolfsteller + + Implement new WaterLineArtifact where needed so far. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Declare that we implement WaterLineArtifact. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + (getWaterLines): Implement to fulfil new WaterLineArtifact- + interface-impl. Also generate new Facet. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Do not depend on WINFOArtifacts, but on WaterLineArtifacts instead. + +2011-12-14 Felix Wolfsteller + + Added interface WaterLineArtifact to be implemented by artifacts + that know how to create a water line "against" a cross section. + + * src/main/java/de/intevation/flys/artifacts/WaterLineArtifact.java: + New, straight-forward interface. + +2011-12-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/EmptySettings.java: An + implementation of the Settings interface defined in the artifact-database + module. This implementation accepts no Section objects at all and creates + an empty "settings" Node in its toXML() operation. + + * src/main/java/de/intevation/flys/exports/OutGenerator.java: Defined a new + method getSettings() that returns a Settings instance. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/ReportGenerator.java, + src/main/java/de/intevation/flys/exports/MapGenerator.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java, + src/main/java/de/intevation/flys/exports/ATExporter.java, + src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: + Implemented the getSettings() operation. All OutGenerators will currently + return an instance of EmptySettings. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Before the DESCRIBE document is created, we gonna evaluate each Output + defined in the Collection's attribute document, if it has a Settings + object set. If this is not the case, the relevant OutGenerator is called + to retrieve a new instance of Settings. + + * src/main/java/de/intevation/flys/collections/CollectionAttribute.java: + Append the Settings of Outputs to the Output nodes in the XML + representation. + +2011-12-13 Felix Wolfsteller + + Recommend cross-sections. + + * doc/conf/meta-data.xml: When having a cross-section out, recommend + respective artifacts. + +2011-12-13 Felix Wolfsteller + + Register factory for CrossSectionArtifacts. + + * doc/conf/conf.xml: Register CrossSectionArtifact-Factory. + +2011-12-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/CollectionAttribute.java: + New. This class will store the information provided in the Collection's + attribute (which is a DOM document). + + * src/main/java/de/intevation/flys/collections/CollectionDescriptionHelper.java: + Store an instance of CollectionAttribute and append its XML representation + to the DESCRIBE document. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: Removed + all DOM operations from this writer. Its new task is to create a new + CollectionAttribute object which represents a merged version of the old + CollectionAttribute and the information provided by the Collection's child + Artifacts. + + * src/main/java/de/intevation/flys/collections/AttributeParser.java: The + result of AttributeParser's parse() operation is a CollectionAttribute + object now. The methods getOuts() and getFacets() are as of now proxy + methods that call the relevant methods of CollectionAttribute. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Some structural changes in the process to build the attribute Document of + the Collection's DESCRIBE. We will no longer work with Document during + this process but with instances of CollectionAttribute. + +2011-12-13 Felix Wolfsteller + + Server-side of newer Cross-Section diagram construction architecture. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java + (searchCrossSectionKmLine, getCrossSectionSnapKm), + (getCrossSectionData): Removed, most functionality contained in + CrossSectionArtifact. + (getWaterLines): Now get CrossSectionLines to calculate water line. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Get a CrossSectionLine from blackboard. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Hard TODO, commented out function needed for subtitle to allow + compilation. + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java: + Added Empty-Dataset- guard. + +2011-12-13 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Cosmetics. + +2011-12-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/CrossSectionKMService.java, + src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + Removed superfluous imports. + +2011-12-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/CollectionDescriptionHelper.java: + New. This class helps generating the DESCRIBE document of a collection. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Moved some of the code to create the DESCRIBE document out to + CollectionDescriptionHelper. + +2011-12-12 Felix Wolfsteller + + Resolve todo about wrongly named cross sections. + Open StaticState to allow that facets survive a compute. + + * src/main/java/de/intevation/flys/artifacts/states/StaticState.java + (computeAdvance, computeFeed, computeInit): Override to call + staticCompute. + (staticCompute): New. Do nothing but be able to be overridden. + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java + (setup): Fetch facets name from db (resolves todo). + (getCurrentState): override staticstates staticcompute to let + facets survive a compute. + +2011-12-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/wsplgen/JobExecutor.java, + src/main/java/de/intevation/flys/wsplgen/WSPLGENCallable.java: Renamed + JobExecutor to WSPLGENCallable (because it is a Callable now). In addition + to the call() method which starts the WSPLGEN process, this Callable + offers a cancelWSPLGEN() method to destroy a running WSPLGEN process. + + * src/main/java/de/intevation/flys/wsplgen/WSPLGENFuture.java: A FutureTask + that overrides cancel(boolean). Before this instance call + super.cancel(boolean), it executes WSPLGENCallable.cancelWSPLGEN() to kill + a running WSPLGEN process. + + * src/main/java/de/intevation/flys/wsplgen/Scheduler.java: The Scheduler is + no longer a Runnable. It makes now use of a ScheduledThreadPoolExecutor to + schedule the incoming WSPLGENJobs. The ScheduledThreadPoolExecutor has a + fixed number of worker threads that process the jobs. The number is 1 per + default; it can be modified using a System property "wsplgen.max.threads". + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java: Added + a string constant SCHEDULER. + + * src/main/java/de/intevation/flys/wsplgen/SchedulerSetup.java: A + LifetimeListener that currently implements the systemUp() method to create + an instance of Scheduler. After its creation, the Scheduler is put into + the GlobalContext using FLYSContext.SCHEDULER as key. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Fetch the Scheduler from GlobalContext. + + * doc/conf/conf.xml: Registered SchedulerSetup as LifetimeListener. + +2011-12-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java: + (describe): Add data items to StaticFLYSArtifacts describe-doc. + +2011-12-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/StaticState.java: + (addDefaultChartOutput): Convenienve function to add a chart-output. + +2011-12-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java: + Play nice with CrossSectionArtifact. Employ blackboard. + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + Spawn a CrossSectionFacet, handle various data. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Do not produce CrossSectionFacets anymore, these now "belong" to + CrossSectionArtifacts. + +2011-12-09 Felix Wolfsteller + + * doc/conf/cache.xml: Added cross_sections cache. + +2011-12-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFactory.java: + (getCrossSection, getCrossSectionUncached): New, access specific + CrossSection, employ caching. + +2011-12-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java: + New artifact to handle cross-section access. + +2011-12-09 Raimund Renkert + + Issue 413. + + * src/main/java/de/intevation/flys/exports/StyledXYSeries.java: + Apply point size from theme attribute linewidth. + +2011-12-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFactory.java, + src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java, + src/main/java/de/intevation/flys/exports/OutGenerator.java, + src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Cosmetics. + +2011-12-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/services/CrossSectionKMService.java: + Documentation added, let a value be its own neighbour (distance 0). + +2011-12-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + Added "Bezugslinie" to list of calculation alternatives. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties: Added I18N. + +2011-12-06 Felix Wolfsteller + + Further flys/issue420 fix (No Discharge Curves for Mosel). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (includeYRange, mergeRanges): Moved NaN-guard to lowest level. + (combineXRanges): Also NaN guard the X Axis extent. + +2011-12-06 Felix Wolfsteller + + Partial fix for flys/issue420 (Berechnete Abflusskurve: Kein Diagramm für + Mosel). Protect axis extent calculation from empty or invalid + datasets. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (includeRange, includeYRange): Renamed, updated callers. + (includeYRange): Protect from merging extent with NaNs. + (debugDatasets): Be more verbose on the datasets. + (zoom): Doc. + +2011-12-06 Felix Wolfsteller + + Fix flys/issue423 (Diagramm: Hauptwerte bei Abflusskurve am Pegel + werden an Y-Achse nicht angezeigt) - show not "raw" (vs interpolated) + values at Gauge. + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java: + Add parameterization to let facet know whether to fetch data at + Gauges or at Artifacts position. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Let the MainValueFacets know whether to ask for interpolated + MainValues; (do not interpolate for Gauges Main Values). + (getMainValuesQ, getMainValuesW): Added parameter to control + interpolation. + +2011-12-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Modified + prefix constants for Mapserver layers and renamed constants (which have + been postfixes before). + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java: Adjusted + usage of Mapserver constants to the changes described above. + +2011-12-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Bugfix: Evaluate the correct parameter whether to set the floodplain or + not. In addition, the scenario parameter used by WSPLGEN is now set + correctly. + +2011-12-05 Felix Wolfsteller + + Allow longitudinal_section.q facets in wdiff states output. + + * doc/conf/artifacts/winfo.xml: Added longitudinal_section.q facets + to w-diff states out compatibility- matrix. + +2011-12-05 Felix Wolfsteller + + Refactored Longitudinal*/WDiff-*Generator hierarchy and change axis + ordering, resolved label-i18n TODO. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Merge, avoid duplicate code, fix axis ordering in w-diff diagram, + label in ls-diagramm. + +2011-12-05 Ingo Weinzierl + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added missing state titles. + +2011-12-05 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Do not include zero on first axis. + +2011-12-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + (buildArtifactNode): Include artifacts state data in description + document of collection. + +2011-11-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/ReportGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java, + src/main/java/de/intevation/flys/exports/ATExporter.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/OutGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Removed superfluous imports. + +2011-11-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Removed import to make it compileable again. + +2011-11-30 Felix Wolfsteller + + Introduce pre-rendering inter-facet communication phase ('blackboard + pass'). + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java + (doBlackboardPass): New. Before actually calling doOut, bundle + ArtifactAndFacets and let them register + themselfes as DataProvider in CallContext if they + want ("announce on blackboard"). + +2011-11-30 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java + (doOut): Adjusted signature. + +2011-11-30 Felix Wolfsteller + + Changed doOut signature to use ArtifactAndFacet, which will be + side effect of upcoming "blackboard" feature. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java + (getRangesForDataset, getRangesForAxis): Renamed, removed TODO. + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java + (createAxis): Update call to XYChartGenerator.getRangesForAxis, + cosmetics. + + * src/main/java/de/intevation/flys/exports/OutGenerator.java + (doOut): Changed Signature to accet ArifactAndFacet instead of + Artifact and Facet. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/ReportGenerator.java, + src/main/java/de/intevation/flys/exports/MapGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java, + src/main/java/de/intevation/flys/exports/ATExporter.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java + (doOut): Adjusted to new signature. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + (adjustAxes): Removed, we do not need a (manual) second axis. + +2011-11-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Fix compilation, use features of XYChartGenerator. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Set default behaviour such that 0 is not included in ranges. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Set behaviour of axis such that 0 is not (automagically) included. + +2011-11-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java: + Fix wrong documentation. + +2011-11-28 Felix Wolfsteller + + Fix LongitudinalSections multi-axes plotting behavior. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Removed obsolete functions, use better working multi-axis + magic by XYChartGenerator. + +2011-11-28 Felix Wolfsteller + + Overhaul dataset/axis/renderer housekeeping in Mother of all + ChartGenerators. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Refactored, keep axis/rendering relevant information in objects + of new class AxisDataset. Removed some obsolete code while adding + documentation. + +2011-11-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java(relateWs): + Added the implementation of the 'Bezugslinienverfahren'. Should + be complete but needs testing! + TODO: Setup a Calculation and integrate it into WINFO. + +2011-11-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Refactored the code for the "berechnete Abflusskurve" to enable + the "Bezugslinienverfahren" to use the same code paths. It also + removes a good deal of already existing code duplication. + +2011-11-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java(findQsForW): + Added method findQsForW(w, km) to retrieve the Qs that correspond + for the given w and km. + + This is to be called when doing a "W auf freier Strecke" calculation + to find out the Qs belonging to the user given W. + + * src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Removed superfluous imports. + +2011-11-25 Felix Wolfsteller + + Fix bug when adding Q data in LongitudinalSectionGenerator. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Add data from Q -Facet as Q over Km points. + +2011-11-25 Felix Wolfsteller + + Added handling of empty plots. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (createAxes, removeEmptyRangeAxes): Survive empty datasets map, create + primary axis. + (recoverEmptyPlot): New. + +2011-11-25 Felix Wolfsteller + + Let first visible axis be always on the left. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (createAxes): When creating axes, keep track of which is the first + one. Set its location to "left". + +2011-11-24 Felix Wolfsteller + + Use multiple axis in relevant generators. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + (createYAxis): Implemented. + Define and use YAXIS enum for axes. + +2011-11-24 Felix Wolfsteller + + Fix theming and legend items for plot with multiaxis feature. + Decouple renderer index from dataset index. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + (applyThemes): Do not get renderer based on dataset/axis-index but + count. + +2011-11-24 Felix Wolfsteller + + In XYChartGenerators allow more than two datasets. + Assign axis to indices of datasets, do not show axis if corresponding + dataset is set to be not visible. + Do proper axis-setting in LongitudinalSectionGenerator only (other + will follow). Based on a patch by Sascha Teichmann. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Keep relation between index and dataset, once its added. Compute + ranges per index. Allow subclasses to override createAxes to specify + internationalized labels etc. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java: + Add datasets to first index. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Implement createYAxis to create correct first, second and third + axis. Added enum to easy identification of axis. Stripped down + adjustAxis which was used to create second axis. + Add datasets at correct indices. + +2011-11-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/StackFrames.java, + src/main/java/de/intevation/flys/artifacts/datacage/templating/FunctionResolver.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Cosmetics, docs. + +2011-11-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Cosmetics, docs. + +2011-11-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableCacheKey.java: + Cosmetics, docs. + +2011-11-23 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java: + Resolved TODO about caching certain WstValueTables. + +2011-11-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/ExternalWMSArtifact.java: New. + This Artifact is used to allow users adding external WMS layers to their + floodmaps. An ExternalWMSArtifact stores an URL of a WMS, the name and the + title of the WMS layer. The internal State extends WMSBackgroundState. + + * doc/conf/conf.xml: Registered the ExternalWMSArtifact. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added a + new type "floodmap.externalwms" which is used by the ExternalWMSArtifact. + + * doc/conf/artifacts/winfo.xml: Allowed the "floodmap.externalwms" facet for + floodmaps. + + * src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java: + Some refactoring to allow easier subclassing. + +2011-11-22 Felix Wolfsteller + + Fixed flys/411. + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java: + Use different queries to avoid costy joins. + +2011-11-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java: + Use different queries to avoid costy joins. Patch by Sascha + Teichmann, minor typo-fix. + +2011-11-17 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Added other.wkms.interpol facet + to compatibility matrix for computed discharge curves. + +2011-11-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Resolve cosmetic todo, use importData-convenience method. + +2011-11-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Handle STATIC_WKMS_INTERPOL and WQ/Points as Annotations. + +2011-11-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java: + Give Facet different name when its a flood*, so that it can be + understood to be e.g. a flood-protection further down the processing + line. + +2011-11-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Prevent ArrayIndexOutOfBounds, log method entry. + +2011-11-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new Facet Type: Interpolated W/Km values. + +2011-11-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java, + src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java, + src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Avoid + WMS layer names that begin with digits. This would lead to invalid + WMSGetFeatureInfo responses, where the name of a layer is the name of a + XML node. + +2011-11-16 Felix Wolfsteller + + * doc/conf/meta-data.xml: Added and use *_wq macros for interpolated + w/q data (currently used in computed discharge curve only). + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Handle STATIC_WQ_ANNOTATION type facets, build and add annotations + for these. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java: + Set Facet type (name) based on static datas name (special case + everything starting with "height"). + +2011-11-16 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Extended compatibility matrices. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new STATIC_WQ_ANNOTATIONS Facet Type. + +2011-11-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: + Added a method isQueryable() that determines if a layer is queryable via + WMS GetFeatureInfo request. This method returns false as default. + + * src/main/java/de/intevation/flys/artifacts/model/WMSDBLayerFacet.java: + Override isQueryable(). All WMSDBLayerFacets are queryable via WMS + GetFeatureInfo request. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java: + Added functionality to artifact to use single column wst + interpolators. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java: + Added methods to create WstValueTables (interpolators) for specific + columns of wsts. + +2011-11-16 Felix Wolfsteller + + * doc/conf/themes.xml: Added Point Style for other.wq data. + +2011-11-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Do not re-evaluate constant size() in for-loops. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java: + Get ld_locations not locations data item to determine km. + (getDataAsDouble): New helper function to get data item as double. + +2011-11-16 Felix Wolfsteller + + * doc/conf/meta-data.xml: Recommend fixations for computed discharge + curve outs, minor refactoring of dc conf. + +2011-11-16 Felix Wolfsteller + + * doc/conf/conf.xml: Added wqinterpol factory to produce + WQKmsInterpolArtifacts. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Use StyledSeriesBuilder to add WQ data from WQKms to Series. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Handle interpolated WQ data. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java: + Adjusted to similar implementations. Added TODO about merging with + these similar implementations. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Removed logging noise, find better suited rows for interpolation. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java: + Cache WstValueTables that were fetched by wst_id. + +2011-11-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java: + (getWstName): Fix and use SQL statement. + +2011-11-15 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WQFacet.java, + src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java: + Added new Facet and Artifact to access W over Q data. + +2011-11-15 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + (importData): New function to copy data from one artifact to + another. + +2011-11-15 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java + (getTable): New methods to get WstValueTable for given wst_id. + Prepolate Arrays with NaNs. + +2011-11-15 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java: + (getWKmsName): Fix definition. + +2011-11-15 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java: + (getWKmsName): New function. Get name (description) of a WST. + +2011-11-15 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new "other.wq"/STATIC_WQ Facet-Type, e.g. for fixations in + discharge curves. + +2011-11-15 Felix Wolfsteller + + Picky cosmetics. + + * src/main/java/de/intevation/flys/artifacts/model/QRangeTree.java, + src/main/java/de/intevation/flys/artifacts/model/ManagedFacetAdapter.java, + src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java, + src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java: + Cosmetics, docs. + +2011-11-15 Felix Wolfsteller + + Added translations for Mosel, Elbe and Saar. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added translations + for Mosel, Elbe, Saar. + +2011-11-15 Felix Wolfsteller + + Added new interpolation mechanism to WstValueTable to interpolate + given columns only. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java + (linearW): New, interpolate a given columns w's between given rows. + (interpolateWQColumnwise): New, interpolate between rows ws at a + given column and km. + +2011-11-14 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Minor doc added. + +2011-11-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/DifferenceCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WQKmsFactory.java, + src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java, + src/main/java/de/intevation/flys/themes/ThemeFactory.java: + Removed dead ';' from empty bodies. + +2011-11-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + s/reset/resetQuick/s in TDoubleArrayLists. + +2011-11-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Added system properties 'waterlevel' and 'km'. Useful to + init the UI with a given waterlevel and drawing the cross-sections + at the given km. + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + Spliting by NaNs definition holes _should_ work now. Needs + some more testing. + TODOs: + - Use log4j instead of println for logging. + - Subclass XYDifferenceRenderer instead of replacing it totally. + +2011-11-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Draw water, too. + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + First code to split datasets by NaNs. WIP. + +2011-11-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Draw ground with StableXYDifferenceRenderer. + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + Removed XYDatasetToZeroMapper stuff. Not needed any longer + because we use rendereres on dataset basis now. + + * src/main/java/de/intevation/flys/jfree/XYDatasetToZeroMapper.java: + Removed.Not longer needed. + +2011-11-11 Felix Wolfsteller + + * doc/conf/meta-data.xml: Include computed discharge curves in dc + conf. + +2011-11-11 Felix Wolfsteller + + * doc/conf/meta-data.xml: Somewhat unify user-part of dc config. + +2011-11-11 Ingo Weinzierl + + * doc/conf/themes.xml: Modified some floodmap styles and added a + backgroundcolor attribute to polygon themes. + + * src/main/java/de/intevation/flys/artifacts/model/MapserverStyle.java: + Added support for backgroundcolor. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Parse + backgroundcolor from theme document. If a value is given, the + backgroundcolor is set on the Mapserver style. + +2011-11-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/MapserverStyle.java: + Set correct Mapserver attribute name to adjust the width of a line. + +2011-11-11 Ingo Weinzierl + + * doc/conf/themes.xml: Added 'textcolor' and 'textsize' attributes to the + existing 'Kms' theme. + + * doc/conf/mapserver/fontset.txt: Defined a 'DefaultFont' that is used as + default font for Mapserver labels. + + * doc/conf/mapserver/db_layer.vm: Add a Mapserver LABELITEM if a value is + provided by LayerInfo object. + + * src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: Added a + getLabelItem() method that returns null as default. + + * src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java: Override + getLabelItem() to return "km" which is the database field that contains + the kilometer information. + + * src/main/java/de/intevation/flys/artifacts/model/LayerInfo.java, + src/main/java/de/intevation/flys/artifacts/model/WMSDBLayerFacet.java: + Added an attribute labelItem with appropriate getter/setter methods. + + * src/main/java/de/intevation/flys/artifacts/model/MapserverStyle.java: + Splitted up the internal class Clazz. Now, there are two new inner + classes Style and Label that fulfill the appropriate Mapfile sections of + Mapserver. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Also Read font + attributes and add new Clazz Label for the Mapserver layer. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Set the + "labelItem" attribute on the LayerInfo object used to fill DB layer + templates. + +2011-11-11 Felix Wolfsteller + + * doc/conf/meta-data.xml: Re-use macros to include more data to + datacage in more situations. + +2011-11-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: + Removed needless imports. + +2011-11-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSFixpointsArtifact.java: New + WMSDBArtifact that creates facets for "fixpoints" relation. + + * doc/conf/artifacts/winfo.xml: Registered "floodmap.fixpoints" as valid + "floodmap" facet. + + * doc/conf/conf.xml: Registered the new WMSFixpointsArtifact. + + * doc/conf/themes.xml: Added a theme for "floodmap.fixpoints". + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + Facet type "floodmap.fixpoints". + + * doc/conf/meta-data.xml: Made "floodmap.fixpoints" available via datacage. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added titles for + "floodmap.fixpoints" facets. + +2011-11-10 Felix Wolfsteller + + * doc/conf/meta-data.xml: Refactored and (re)use macros. + +2011-11-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSBuildingsArtifact.java: New + WMSDBArtifact that creates facets for "buildings" relation. + + * doc/conf/artifacts/winfo.xml: Registered "floodmap.buildings" as valid + "floodmap" facet. + + * doc/conf/conf.xml: Registered the new WMSBuildingsArtifact. + + * doc/conf/themes.xml: Added a theme for "floodmap.buildings". + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + Facet type "floodmap.buildings". + + * doc/conf/meta-data.xml: Made "floodmap.buildings" available via datacage. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added titles for + "floodmap.buildings" facets. + +2011-11-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSLineArtifact.java: New + WMSDBArtifact that creates facets for "lines" relation. + + * doc/conf/artifacts/winfo.xml: Registered "floodmap.lines" as valid + "floodmap" facet. + + * doc/conf/conf.xml: Registered the new WMSLineArtifact. + + * doc/conf/themes.xml: Added a theme for "floodmap.lines". + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + Facet type "floodmap.lines". + + * doc/conf/meta-data.xml: Made "floodmap.lines" available via datacage. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added titles for facets. + +2011-11-10 Felix Wolfsteller + + * doc/conf/meta-data.xml: Adjusted DC configuration to + also allow heightmarks and base data in discharge longitudinal + sections. Minor refac. + +2011-11-10 Felix Wolfsteller + + * doc/conf/meta-data.xml: Adjusted DC configuration to let old + calculations be available for discharge longitudinal sections. + +2011-11-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java: + Handle other WQKm and WKm Facets. + +2011-11-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java + (IS): New inner class with static method to allow queries whether + a type belongs to a however-defined "group". + +2011-11-10 Felix Wolfsteller + + * doc/conf/conf.xml: Reverted accidental commit. + + * doc/conf/meta-data.xml: Extracted annotations-macro, add recommendation + for discharge longitudinal sections. + +2011-11-10 Felix Wolfsteller + + * doc/conf/conf.xml: Reverted accidental commit. + + * doc/conf/meta-data.xml: Extracted annotations-macro, add recommendation + for discharge longitudinal sections. + +2011-11-10 Felix Wolfsteller + + Made discharge longitudinal section out compatible with annotations. + + * doc/conf/artifacts/winfo.xml: Added facets to compatibility list + for discharge longitudinal section outs. + +2011-11-10 Felix Wolfsteller + + Extracted Annotations-Macro in dc conf, recommend Annotations for + discharge longitudinal sections. (Note correction two commits later). + + * doc/conf/conf.xml: Extracted annotations-macro, add recommendation + for discharge longitudinal sections. + +2011-11-10 Felix Wolfsteller + + Handle Annotations in DischargeLongitudinalSection diagrams. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java: + Call doAnnotations for LONGITUDINAL_ANNOTATION facets. + +2011-11-10 Felix Wolfsteller + + Resolve code duplicate. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java + (doAnnotationsOut): Removed duplicate code. + Theoretically handle WQKMS data. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Adjusted call to doAnnotationOut. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java + (doAnnotations): Doc from LongitudinalSectionGenerator. + +2011-11-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Include exception when logging issue with spline creation. + +2011-11-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java: + When during XPath evaluation an exception is thrown, log the + expression that caused the trouble. + +2011-11-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Use separate XYDataset for each curve. This is needed because + "Raum/Flaeche" needs specialized renderers, which are not compatible + with the standard renderers. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: + Removed superfluous import. + +2011-11-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSFloodplainArtifact.java: New + Artifact that is used to create WMS layers for floodplains in maps. + + * doc/conf/conf.xml: Registered the new WMSFloodplainArtifact. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + a new type 'floodmap.floodplain'. + + * doc/conf/artifacts/winfo.xml: Registered the 'floodmap.floodplain' facet + for floodmaps. + + * doc/conf/themes.xml: Added a theme for 'floodmap.floodplain' facets. + + * doc/conf/meta-data.xml: Added configuration for 'floodplain'. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added facet titles for + 'floodmap.floodplain' facets. + +2011-11-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSCatchmentArtifact.java: New + Artifact that is used to create WMS layers for catchments in maps. + + * doc/conf/conf.xml: Registered the new WMSCatchmentArtifact. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + a new type 'floodmap.catchment'. + + * doc/conf/artifacts/winfo.xml: Registered the 'floodmap.catchment' facet + for floodmaps. + + * doc/conf/themes.xml: Added a theme for 'floodmap.catchment' facets. + + * doc/conf/meta-data.xml: Added configuration for 'catchments'. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added facet titles for + 'floodmap.catchment' facets. + +2011-11-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSHwsArtifact.java: New + Artifact that is used to create WMS layers for flood protected works. + + * doc/conf/conf.xml: Registered the new WMSHwsArtifact. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + a new type 'floodmap.hws'. + + * doc/conf/artifacts/winfo.xml: Registered the 'floodmap.hws' facet for + floodmaps. + + * doc/conf/themes.xml: Added a theme for 'floodmap.hws' facets. + + * doc/conf/meta-data.xml: Added configuration for 'hws'. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added facet titles for + 'floodmap.hws' facets. + +2011-11-09 Ingo Weinzierl + + * doc/conf/mapserver/dbconnection.include: Removed. DB connections are + supported by LayerInfo objects now. So, we do not need to configure it any + more. + + * doc/conf/mapserver/db_layer.vm: The database connection is provided by + LayerInfo objects. The "INCLUDE dbconnection.include" has been replaced. + + * src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: The inner + State class got two new methods that provide information about db + connection string and connection type. + + * src/main/java/de/intevation/flys/artifacts/model/WMSDBLayerFacet.java, + src/main/java/de/intevation/flys/artifacts/model/LayerInfo.java: Both + classes support getter/setter for connection and connectionType. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Fill + LayerInfo objects used to create DB layers with the connection and + connection type provided by WMSDBLayerFacet. + +2011-11-09 Felix Wolfsteller + + Allow height marks with points style in w-differences diagrams. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Handle HEIGHTMARKS_POINTS facets. + +2011-11-09 Felix Wolfsteller + + Made Q Duration curve initially inactive. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java + (getInitialFacetActivity): Return 0 for DURATION_Q facets. Minor + cosmetics. + +2011-11-09 Felix Wolfsteller + + Recommend mainvalues for Duration Curve Diagrams. + + * doc/conf/meta-data.xml: Recommend mainvalues for duration curve + diagrams. refactored into macro. + +2011-11-09 Felix Wolfsteller + + Handle MainValue Facets in Duration Curve Diagrams. + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Handle MainValues. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Adjusted to call doAnnotations. + +2011-11-09 Felix Wolfsteller + + Move do*Annotation* (like mainvalue) in XYChartGenerator. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java + (doAnnotations): New, moved from DischargeCurveGenerator. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java + (doMainValueAnnotations): Moved to superclass. + +2011-11-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Removed duplicate code. + +2011-11-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java + (): Minor cosmetics, added stability. + (getInitialFacetActivity): Let facets be inactive in duration curve + diagrams. + +2011-11-09 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Allow other.wqkms facets in many + outputs, mainvalues in duration curves. + +2011-11-09 Ingo Weinzierl + + * doc/conf/mapserver/dbconnection.include: Adapted connection params for + using an oracle database. + + * src/main/java/de/intevation/flys/artifacts/WMSQPSArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java: + Added Oracle support for Mapserver's DATA attribute. Oracle doesn't allow + a "USING UNIQUE id" string in this attribute which is required by Postgis. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Modified the geometry type of "talaue.shp" from MultiPolygon to Polygon. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a function + which returns true, if the backend uses an Oracle db instance. Otherwise, + it returns false. + +2011-11-08 Felix Wolfsteller + + Fix flys/issue406 (Themestyle-editor: themes for "other.wkms" and + "other.wqkms" missing) + + * doc/conf/themes.xml: Fixed typos in WKms and WQKms theme names. + +2011-11-08 Felix Wolfsteller + + Fix flys/issue405 (Datacage: Recommendations get loaded twice). + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java + (setup): Do not try/catch exception. + (spawn_state): Generate just one "general" output. + +2011-11-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Added a log.warn() which prints out an exception - previously it was + just skipped. + +2011-11-08 Ingo Weinzierl + + * doc/conf/meta-data.xml: Removed orphaned datacage configuration which is + no longer loadable. + +2011-11-07 Ingo Weinzierl + + * doc/conf/conf.xml: Added an "post-describe" hook which is necessary to + load recommendations for "floodmaps". + +2011-11-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java + (loadRows, loadColumns, loadQRanges): Refactored in preparation to + ability to create WstValueTables for given wst_id and + column_pos (interpolation for static data). + +2011-11-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java: + Minor, picky cosmetics. + + * src/main/java/de/intevation/flys/artifacts/model/WQKmsFactory.java: + Removed junk. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Added documentation. + +2011-11-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Be more specific in what to catch. + +2011-11-04 Ingo Weinzierl + + * doc/conf/meta-data.xml: Added the CrossSectionTracks to the "floodmap" + datacage configuration. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added a + FacetType "floodmap.qps". + + * doc/conf/conf.xml: Defined an ArtifactFactory for the "wmspqsartifact" + string. The factory will create new instances of WMSQPSArtifact. + + * src/main/java/de/intevation/flys/artifacts/WMSQPSArtifact.java: New. This + Artifact is used to create "floodmap.qps" facets. It has an internal fixed + State WMSQPSState. + + * doc/conf/artifacts/winfo.xml: Added the "floodmap.qps" layer to the + "floodmap" output. + + * doc/conf/themes.xml: Added a theme for "floodmap.qps" facets. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added strings for the QPS WMS + layer used in floodmaps. + +2011-11-04 Felix Wolfsteller + + Re-enable mainvalue-recommendations for computed discharge curves, + as the NPE should be gone. + + * doc/conf/meta-data.xml: Uncomment mainvalue recommendations. + +2011-11-04 Felix Wolfsteller + + When querying metadata/datacage, use only output-names of outputs that + actually exists (in the sense of having facets). + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: + Get output names from artifact, not from state. + +2011-11-04 Ingo Weinzierl + + * doc/conf/meta-data.xml: Removed DEMs from floodmap configuration, + because we are not able to draw DEMs into maps. + +2011-11-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java: + Subclasses WMSDBArtifact now and defines an inner class RiverAxisState + which subclasses WMSDBState. + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: + Removed. The RiverAxisState is an inner class of RiverAxisArtifact now + which subclasses WMSDBState. + + * doc/conf/artifacts/riveraxis.xml: Removed, because the RiverAxisArtifact + has a fixed static State only. + + * doc/conf/conf.xml: Removed riveraxis.xml definition. + +2011-11-04 Felix Wolfsteller + + For a Flys-Collection, add outputt to attributes-part of describe + document only if they contain facets. -> Prevent empty output nodes + in flys-collections outputs. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + (writeFacets): Added return type to indicate whether any facet was + written. Decide whether to add an output-node depending on this + return value. + +2011-11-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Create + line and polygon layers for barriers only if they are really existing. + +2011-11-04 Felix Wolfsteller + + Disable mainvalue-recommendations for discharge curves as they trigger + a yet-to-be understood NPE. + + * doc/conf/meta-data.xml: Comment mainvalue-recommendations for + discharge curves. + +2011-11-04 Felix Wolfsteller + + Added new matching condition for theme-mappings: the name of + the output. + + * src/main/java/de/intevation/flys/themes/ThemeMapping.java: + Added output field and function to match it against a given + output name. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Createing ThemeMapping with output attribute from configuration. + + * src/main/java/de/intevation/flys/themes/ThemeFactory.java: + (getTheme(FLYSContext, string)): Removed, never called. + (getTheme): Added outputName argument, match it. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Pass outputs name until it can be matched against mapping. + +2011-11-04 Felix Wolfsteller + + * doc/conf/themes.xml: Added default themes for other.w(q)kms. + +2011-11-04 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Cosmetics, reduce logging noise. + +2011-11-03 Felix Wolfsteller + + Added access to static W_Q_Kms - data in much the same way then static + WKms. + + * src/main/java/de/intevation/flys/artifacts/model/StaticWQKmsCacheKey.java: + Cache Key for static wqkms data. + + * src/main/java/de/intevation/flys/artifacts/model/WQKmsFacet.java: + Facet for WQKms. + + * src/main/java/de/intevation/flys/artifacts/model/WQKmsFactory.java: + Factory to access WQKms. + + * src/main/java/de/intevation/flys/artifacts/StaticWQKmsArtifact.java: + Artifact that provides 'static' WQKms. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added STATIC_WQKMS type. + +2011-11-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/XYDatasetToZeroMapper.java: + New. Maps series to zero to be compatible with XYDifferenceRenderer. + It returns an iterator over XYDatasets to enable splitting by NaNs, + which still needs to be implemented. + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + Uses a XYDatasetToZeroMapper now. Fixed package name. + +2011-11-03 Felix Wolfsteller + + Added new matching options for theme-mappings to allow more + overspecification of defaults (e.g. now name,description-pattern and + master-artifacts attributes are matched). The first full match from + the configuration file is done. + New matching option in the masterAttr- field of a mapping are + super-basic until new use-cases come up. + Concrete new themes are point-styles of Ws when locations where chosen + to calculate. + + * doc/conf/themes.xml: Added newly defined Themes. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Put master-artifact in flys-context. + + * src/main/java/de/intevation/flys/themes/ThemeMapping.java: + Accept masterAttr in constructor. + (masterAttrMatches): New, check masterAttr-condition against + artifact. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + When creating ThemeMappings, pass in masterAttr. + + * src/main/java/de/intevation/flys/themes/ThemeFactory.java: + (getTheme): Evaluate masterAttr-condition, always return first full + match. + +2011-11-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java: + Added ARTIFACT key, documentation. + +2011-11-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java: + New. At the moment a pure copy of JFreeChart's XYDifferenceRenderer. + Needs to be refactored to cope with its limitations: + + - Series numbers need to be zero based. We have more than two series + in our diagrams. + + - Cannot handle definition holes indicated by NaNs. We have these + cases e.g. more than one "Fliessbereich". + +2011-11-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Reenabled dumping data to disk. + +2011-11-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Removed superfluous import. + +2011-11-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java: + Use new pair in stack of results and connections because they are + always used in pairs. Maintaining two separate stacks is not + needed any longer. + +2011-11-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/Pair.java: New. A generic pair. + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Rewritten to useful as test bed for "Raum/Flaeche" operations. + +2011-11-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/LayerInfo.java: Added + setter methods for all parameters and removed the constructors. There is + just an empty constructor - all parameters need to be set via setter + methods. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Modified the + creation of LayerInfo objects. + + * src/main/java/de/intevation/flys/artifacts/model/DBLayerInfo.java: + Removed, because the internal structure and constructors of LayerInfo have + changed, so that we gonna use LayerInfo for all layers now. + + * doc/conf/themes.xml: Modified the color definitions of + 'floodmap.riveraxis' and 'floodmap.kms' themes and added a 'symbol' field + to 'floodmap.kms'. + + * doc/conf/mapserver/symbols.sym, + doc/conf/mapserver/fontset.txt: New. Required by Mapserver. + + * doc/conf/mapserver/db_layer.vm: Added an 'EXTENT' field that is filled + using LayerInfo.getExtent(). + + * doc/conf/mapserver/mapfile.vm: Modified FONTSET directory and added a + SYMBOLSET. + + * src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: Added an + abstract method getGeometryType(). + + * src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java: Override + getGeometryType() of WMSDBArtifact. This Artifact provides "POINT"s. + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: + Create new WMSDBLayerFacets with geometry type "LINE". + + * src/main/java/de/intevation/flys/artifacts/model/WMSDBLayerFacet.java: + Added a 'geometryType' attribute and getter/setter methods. This attribute + determines the type of geometry provided by this database wms layer. Types + could be "POLYGON", "POINT", "LINE" and so on. + + * src/main/java/de/intevation/flys/artifacts/model/MapserverStyle.java: + Added a 'symbol' attribute to the inner class Clazz. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Added a function to + parse the symbol field of a theme. This symbol is used for + MapserverStyle.Clazz. + +2011-11-02 Felix Wolfsteller + + Apply point theme to heightmarks when imported in longitudinal + section diagram. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new FacetType HEIGHTMARK_POINTS. + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFacet.java: + Allow name to be given in constructor. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + If heightmarks were loaded, give respective name in WKmsFacet + generation. + + * doc/conf/themes.xml: Added virtual "Points" and concrete + heightmark_points - theme. + + * doc/conf/artifacts/winfo.xml: Made longitudinal_section output + compatible with heightmarks_points. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Render heightmarks like other wkms. + + * doc/conf/meta-data.xml: Changed heightmark ids such that it can be + identified in StaticWKmsFacet . + +2011-11-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/StyledXYSeries.java: + Documentation added. + +2011-11-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/ManagedDomFacet.java: + Fix bug where (wrong) active-attribute was set, doc. + +2011-11-02 Felix Wolfsteller + + Refactoring to allow mainvalues in both discharge and computed + discharge curve diagrams. + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java + (addPointsQW): New helper function. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Moved doMainValueQAnnotations, doMainValueWAnnotations from child- + to parent-class, extracetd doDischargeOut. Use + StyledSeriesBuilder.addPointsQW . + +2011-11-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Removed logger/debugging noise. + +2011-11-02 Felix Wolfsteller + + 1) Pass outputs name to artifacts getInitialFacetActivity(). + 2) Do not allow "gaps" in positions of facets in outputs in attributes + of collection (prevent e.g. positions 1,3,5; will become 1,2,3 + instead). + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + Pass outputname to artifacts getInitialFacetActivity(), prevent + gaps in facets positions in outputs (1,3,10 become 1,2,3). + +2011-11-02 Felix Wolfsteller + + 1) Give Artifacts information about the out when they have to decide + whether a given facet is initially in/active by adding parameter + to getInitialFacetActivity(+outputName). + 2) Generate separate Set of MainValueFacets for discharge curves. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java, + src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + (getInitialFacetActivity): Adjusted, new parameter outputName. + Added MAINVALUES_{Q,W} definition. + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java: + Accept name in constructor. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Create second pair of MainValuesFacets, give distinguishable names. + +2011-11-02 Felix Wolfsteller + + Added compatibility of (computed)discharge-curve diagrams with + mainvalues. + + * doc/conf/artifacts/winfo.xml: Added mainvalues to compatibility list + of (computed) discharge curve outputs. These facet-definitionss can + differ in names because we can can have up to 4 mainvalue facets in + one state. + +2011-11-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java: Determine + the extent of such WMS layer based on the list of RiverAxisKm objects + returned by the backend. + +2011-11-01 Ingo Weinzierl + + * doc/conf/meta-data.xml: Added a datacage node that represents a + kilometer WMS layer. + + * doc/conf/conf.xml: Added a new Artifact WMSKmArtifact. + + * doc/conf/themes.xml: Added a style for 'floodmap.kms' facets. + + * doc/conf/artifacts/winfo.xml: Defined 'floodmap.kms' as valid floodmap + facet. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + a 'floodmap.kms' facet. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a method to + determine the srid of a river based on its name. + + * src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java: New. This + Artifact should act as base Artifact for WMS layers that represent data + from database datastore. + + * src/main/java/de/intevation/flys/artifacts/WMSKmArtifact.java: New. This + Artifact is used to generate facets for kilometer WMS layers. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added default descriptions + for 'floodmap.kms' facets. + +2011-11-01 Felix Wolfsteller + + Fix incompilability. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelInfoState.java: + Adjust to changed CrossSectionFacet. + +2011-11-01 Felix Wolfsteller + + Minor preparations to handle multiple cross sections in one + diagram/artifact, faking certain aspects (e.g. ability to display + multiple cross sections, but let these fetch the exactly same data + for now). + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Parameterize but fake access to cross-section (always take first + one). + (getCrossSectionName,getCrossSectionNames): Renamed, access names + of all cross-sections, so that at least facets with different names + are created (they will still deliver the same data). + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java: + Allow indexing. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Index created cross-sections. + +2011-11-01 Felix Wolfsteller + + Show multiple water lines and facets in cross-section diagram if + multiple waterlevel values had been entered. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java + (appendBackgroundActivity): Made static. + (getWaterLines): Add 'idx' argument to specify index of queried + waterlevel. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + Add index. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Add one Facet for each of the computed waterlevels. + +2011-10-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/VectorUtils.java: + Added code to calculate intersection points. + + * src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java: + Added polygons for trivial cases. WIP + +2011-10-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java: + Made it compilable again. + +2011-10-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/VectorUtils.java: + Made X() and Y() access macros public. + + * src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java: + More code. WIP. + +2011-10-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java: + Handle start points when building polygons. Work in progress. + +2011-10-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/VectorUtils.java: + New. Vector operations on Point2D. + + * src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java: + Moved vector operations to VectorUtils. + +2011-10-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java: + Do not call size() in for loop again and again. + +2011-10-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java: + Interim check in. Work in progress. + +2011-10-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/Polygon2D.java: New. + Polygon class to help creating "Raum/Flaeche" renderers with gaps in + their definitions. WORK IN PROGRESS! + +2011-10-28 Ingo Weinzierl + + * doc/conf/themes.xml: Added a default theme for the riveraxis used in the + floodmap. + + * src/main/java/de/intevation/flys/artifacts/model/MapserverStyle.java: + New. This class is used by ThemeUtil to create a style which is + compatible for Mapserver- + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: Added a method to + retrieve a Mapserver compatible style (as string) based on a given + Document (that comes from CollectionItem's attribute). + + * src/main/java/de/intevation/flys/artifacts/model/LayerInfo.java: + Implemented the setStyle() and getStyle() methods. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Added a + new parameter 'style' to createDatabaseLayer(). This parameter is set on + LayerInfo. + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: Create + Mapserver compatible styles and call createDatabaseLayer() with this + style. + +2011-10-28 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Defined "floodmap.riveraxis" and + "floodmap.wmsbackground" as compatible layers for the floodmap output. + + * doc/conf/mapserver/db_layer.vm: New. This layer template is used for + Mapserver layers with database datastore. + + * doc/conf/mapserver/dbconnection.include: New. The database configuration + used in the db_layer template. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a method + getUserWMSUrl() that returns the URL to the user specific WMS server. + This method requires a UUID of an Artifact to identify the owner of the + Artifact. + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java: Use + FLYSUtils.getUserWMSUrl() to create the URL to the user WMS for + WMSLayerFacets creation. + + * src/main/java/de/intevation/flys/artifacts/model/WMSDBLayerFacet.java: + New. Subclasses WMSLayerFacet to save data and filter parameters used + for database storage in Mapfiles. + + * src/main/java/de/intevation/flys/artifacts/model/DBLayerInfo.java: New. + Subclasses LayerInfo to save database relevant parameters. + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: + Creates new WMSDBLayerFacets, so that the riveraxis layer data is + fetched from database. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Added a + public method that allows creating layers (type LINE) based on + WMSDBLayerFacets. + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: Enabled + support for Facets other than "floodmap.wsplgen" and "floodmap.barriers". + Those other Facets are supposed to be WMSDBLayerFacets. + +2011-10-28 Felix Wolfsteller + + Refactored, added StyledSeriesBuilder to unify adding points to + XYSeries. + + * src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java: + New class to help with adding points to XYSeries. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Use StyledSeriesBuilder to add points to series. + +2011-10-28 Felix Wolfsteller + + Added DC-conf, such that static data can be loaded from w-difference + diagrams datacage. + + * doc/conf/meta-data.xml: Minor "refactoring" (definition of two + macros, allow certain static data to be loaded via datacage to + w-difference diagrams, too. + +2011-10-28 Felix Wolfsteller + + Load and display annotations in w-differences, minor polishing. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Use FacetType 'instead' of string. Allow Annotations in + WDifferences- diagram. + + * doc/conf/meta-data.xml: Recommend annotations in w-differences case. + +2011-10-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + Survive case where a given output doesnt exist in compatibility + matrix. + +2011-10-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/StaticState.java: + Added simpler constructor. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Adjusted construction of StaticStates. + +2011-10-28 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Allow Annotations in longitudinal and + w-differences diagrams. + +2011-10-28 Felix Wolfsteller + + Use artifacts configuration (e.g. winfo.xml) to define which facets + can be used in which output. Hide no-matches. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Added use of "compatibility matrix". Only include facets in in + collections description document that are marked compatible in the + masterartifacts configuration (e.g. winfo.xml). + +2011-10-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java + (mergeAttributes, getMasterArtifact): Extraced, updated caller. + Cosmetics to reduce indentation one step. + +2011-10-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java + (getStateHistoryIds): New, return list of current and all previous + state ids. + +2011-10-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Trigger the re-creation of FLYS mapfile if endOfLife() of this state is + called. + +2011-10-28 Ingo Weinzierl + + * doc/conf/mapserver/mapfile.vm: The "layers" injected by VelocityEngine is + now used to include layers. A single string in this list represents the + path to a file which contains a LAYER section for Mapserver' Mapfile. + + * src/main/java/de/intevation/flys/wsplgen/JobExecutor.java: Removed the + update() call of MapfileGenerator. Mapfiles are generated by MapGenerator + only which requires a FLYSArtifactCollection.doOut()! + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: Call update() + of MapfileGenerator to trigger the re-creation of mapfile(s). + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Collect all + LAYER snippets from filesystem and inject the filepath for each snippet + into the Mapfile template. + +2011-10-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java, + src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Cosmetics, doc. + +2011-10-28 Felix Wolfsteller + + Let OutputParser and AttributeParser collect all facets on the way. + + * src/main/java/de/intevation/flys/collections/OutputParser.java, + src/main/java/de/intevation/flys/collections/AttributeParser.java: + Collect all facets while iterating over Outputs and Attributes, + documentation added. + +2011-10-28 Felix Wolfsteller + + Extracted getFlysContext from FLYSArtifacts into FLYSUtils. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java + (getFlysContext): Added, extracted from FLYSArtifact. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + (getFlysContext): Moved to FLYSUtils, updated callers. + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Update callers to getFlysContext. + +2011-10-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: Bugfix: + Catch IOException - flys-artifacts compiles again. + +2011-10-28 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Defined "floodmap.barriers" as valid facet + for floodmaps. + + * doc/conf/mapserver/shapefile_layer.vm: New. Currently a copy of + layer.vm. This template will evolve to a special mapserver layer + template with a shapefile data source. + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java: Fixed broken + facet name of barriers. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Added + public methods for creating wsplgen and barriers layer files for + mapserver. + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: Use + MapfileGenerator to create new layer files for wsplgen and barriers. + +2011-10-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: Added new + method gerRiverBoundary() which returns an Envelope object (which + represents the bounding box of a Geometry) of a riveraxis specified by its + rivername. + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: Use + Geometry.getRiverBoundary() to determine the max extent of a river. + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java, + src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: Use + JTS Envelope to save the bounding boxes of WMS layers. + + * src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java: + Adapted the code to apply the changes in GeometryUtils (use Envelope to + determine the max extent of the river axis). + + * src/main/java/de/intevation/flys/exports/MapGenerator.java: New (work in + progress). This Generator will currently return a map configuration in XML + which consists of parameters required by OpenLayers to create a map. + + * doc/conf/conf.xml: Registered the new MapGenerator. + +2011-10-27 Felix Wolfsteller + + * doc/conf/meta-data.xml: Do not recommend historical data to load + when having computational discharge curves. + +2011-10-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Reduce noise, given "error" message was more of "debug" nature. + +2011-10-27 Felix Wolfsteller + + Restore mapping of state id to facets (essentially revert, revision + 3083 and 3088). + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + (getInitialFacetActivity): Be more explicit on which facets to + introduce inactivated. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Minor refactoring, declare a string final static. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSBackgroundArtifact.java, + src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Restore association from state id to facets. + +2011-10-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java, + src/main/java/de/intevation/flys/collections/OutputParser.java: + Cosmetics, documentation. + +2011-10-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Prepare rendering of "other/static wkms" (functional) and + w-differences (not yet fully functional). + +2011-10-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Cosmetics. + +2011-10-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java: + Do not store facets in a map from stateId to list of facets, but in + a pure list instead. + +2011-10-26 Felix Wolfsteller + + * doc/conf/artifacts/winfo.xml: Adjusted to newer semantics, + minor cleanups. + +2011-10-26 Felix Wolfsteller + + Resolve association of facets to states in artifacts. This eases + merging of outputs and facets and inhibition of unwanted outputs + substiantially (at the price of slightly more expensive merging). + Also, the semantics of artifacts configuration files (e.g. winfo.xml) + is changed (facet elements within an output elements are used for + merging). + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java, + src/main/java/de/intevation/flys/artifacts/WMSBackgroundArtifact.java, + src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Do not store facets in a map from stateId to list of facets, but in + a pure list instead. + +2011-10-26 Felix Wolfsteller + + * doc/conf/meta-data.xml: Added dc configuration for some data + that can be loaded from longitudinal section diagrams. + +2011-10-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Cosmetics, docs. + +2011-10-25 Felix Wolfsteller + + Let Qs in Longitudinal Diagram be inactive, initally. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + (getInitialFacetActivity): Do not let Facets ending with a 'q' + enter in active state. + +2011-10-25 Felix Wolfsteller + + * doc/conf/meta-data.xml: Fix broken datacage config. + +2011-10-25 Felix Wolfsteller + + * doc/conf/meta-data.xml: Configured to include correct id to + clone artifact that produces w-diff. + +2011-10-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Revert correct behaviour of Annotations (the small axis tick shall + always be drawn). Minor refactoring. + +2011-10-25 Felix Wolfsteller + + * doc/conf/meta-data.xml: Added configuration to include differences + in datacage when longitudinal sections are shown (yet not + functional). + +2011-10-25 Felix Wolfsteller + + * doc/conf/meta-data.xml: Cosmetics. + +2011-10-24 Felix Wolfsteller + + * doc/conf/themes.xml: Added theme for w_differences facets. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java + (createSecondAxisRange): Survive parameter-nullness for now. + Added documentation. + +2011-10-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/themes/ThemeAccess.java: + New. Caching wrapper around an XML document theme. It uses ThemeUtil + to access the values and stores them in instance variable. + Background: ThemeUtil use XPath a lot which is expensive. + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Use ThemeAccess to style the annotations. + + * src/main/java/de/intevation/flys/exports/StyledXYSeries.java: + Removed some XPath strings. They are in ThemeUtil. + +2011-10-21 Raimund Renkert + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + Added methods to parse further attributes. + + * src/main/java/de/intevation/flys/exports/StyledXYSeries.java: + Apply the theme attributes and use ThemeUtils to get the attribute values. + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Removed the spamy debug output. + +2011-10-21 Sascha L. Teichmann + + To obtain the size of a diagram it is rendered twice. The + second time the generated image is omitted so the concrete + rendered image is not needed. To save CPU cycles in this pass + the image is rendered to to /dev/null Graphics2D object. + + * src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: + Added boolean system property "info.rendering.nop.graphics" (default: false). + With this property set the info rendering is done via a new + NOPGraphics2D opbject which does not render the image. + + * src/main/java/de/intevation/flys/java2d/NOPGraphics2D.java: + New. Implements java.awt.Graphics2D trivial empty methods. + This prevents rendering. + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Commented out spamy debug output + +2011-10-21 Raimund Renkert + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Draw the text background and use orientation attribute. + +2011-10-21 Raimund Renkert + + * doc/conf/themes.xml: + Renamed 'textbackground' to 'backgroundcolor' to have 'color' in the + attribute name. + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + Process text attributes correctly. + +2011-10-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/CrossSectionKMService.java: + New. Service to lookup the Nth nearest neighbors for a set of given + cross section ids and kms. + + * doc/conf/conf.xml: Registered service. + + * doc/conf/cache.xml: Cache config. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java: + Removed superfluous imports. + +2011-10-20 Raimund Renkert + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + Added methods to extract further attributes from theme. + +2011-10-20 Ingo Weinzierl + + * doc/conf/themes.xml: Added main value themes for longitudinal section + charts. + + * src/main/java/de/intevation/flys/themes/ThemeMapping.java: New. This + class stores the name of a facet, the related theme and a pattern + string. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Read the pattern string and store a list of ThemeMapping objects in the + FLYSContext. + + * src/main/java/de/intevation/flys/themes/ThemeFactory.java: Modified + getTheme() which now takes the FLYSContext, the name of a facet and an + optional pattern string. Now, we can have specialized Themes for each + chart type. E.g. the facet "longitudinal_section.w" maps the default + Theme for W lines in longitudinal section charts. If the optional + pattern string matches the pattern ".*(HQ1000)(\D.*)*", the ThemeFactory + will return the Theme "LongitudinalSectionW_HQ1000". + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Use the description of a facet as pattern string to get the relevant + Theme from ThemeFactory. + +2011-10-20 Raimund Renkert + + * doc/conf/themes.xml: + Added new theme attributes. + +2011-10-19 Felix Wolfsteller + + Fix WDifference plots where masterartifact has no range set. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + (addSubtitles): Overridden, the master artifact has no + range. + +2011-10-19 Felix Wolfsteller + + Fix masterartifact in collections in cases where the original + masterartifacts facets do not come first in certain list. Query + 'backend'/db instead. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Set 'real' master artifact, defined to be oldest belonging to this + collection. + +2011-10-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelSelectState.java, + src/main/java/de/intevation/flys/artifacts/states/DGMSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java: + Modified the method signature of createStaticData() which now also + requires a FLYSArtifact. + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Override createStaticData() to create titles for Qs manually - we want + to display the named main values if existing for the selected Qs. + +2011-10-19 Raimund Renkert + + * doc/conf/themes.xml: + ComputedDischargeCurveW and ComputedDischargeCurveQ inherit attributes from + theme 'Text'. + +2011-10-19 Sascha L. Teichmann + + Fix for flys/issue316 + + * src/main/java/de/intevation/flys/exports/StyledXYSeries.java: Added + constructor to not sort the data. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Use the not sorting constructor of StyledXYSeries. + +2011-10-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + moved the code to create WSP W and Q facet names to FLYSUtils. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: New functions for + creating WSP W and Q facet names and for querying a named main value + based on a given gauge and value. The names of W and Q facets will now + depend on the selected Q and Q mode: if the mode is "q at gauge" and a + named value is found for the given value, the facet's name contains the + named value instead of the value itself. + +2011-10-19 Felix Wolfsteller + + Fix datacage configuration to let client load ZUS and flood + protections. + + * doc/conf/meta-data.xml: Use 'ids' instead of 'id' to help client. + +2011-10-19 Raimund Renkert + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + Added methods to parse text attributes from theme document. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java, + src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Apply a theme to axis annotations. + +2011-10-19 Felix Wolfsteller + + Create (data) Label from data string (client will be adjusted to send + the name). + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java: + Create label from input data string, documentation added, junk + removed. + +2011-10-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java(zoom): + Do not crash if no axis is given. + +2011-10-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Added + getFormat() which extracts the format string from XML request document. + + * src/main/java/de/intevation/flys/exports/ChartExportHelper.java: Adapted + method signatures of exportImage(), exportSVG() and exportPDF(). All + methods now take a CallContext object which stores extra chart export + parameters. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Enabled PDF and SVG chart exports based on the "format" string given in + the XML request document. + +2011-10-18 Felix Wolfsteller + + Simplify rendereing W(Q)Kms in WDifferencesCurveGenerator. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + (doWOut, doWOut): Simplified. + +2011-10-18 Felix Wolfsteller + + Render zus and flood-protections in WDifferences-diagrams. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Added basic respect of "other.wkms"- facets. + + +2011-10-18 Felix Wolfsteller + + Adjusted Datacage-Configuration to fetch "extra longitudinal...." + (.zus) - waterlevels in certain case (in system-part). + + * doc/conf/meta-data.xml: Adjusted to present extra-kms with + staticwkms factory in certain case. + +2011-10-17 Raimund Renkert + + * doc/conf/themes.xml: + Added new virtual theme for text with the attributes 'font', 'textcolor' + and 'textsize'. + +2011-10-18 Felix Wolfsteller + + Give StaticWKmsArtifacts proper names, and pre-deselect them. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + (getInitialFacetActivity): Overridden to let facets enter plot + inactively. + (setup): Give Facets the name of the Wst. + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java: + Refactored to expose getWKmsName separately. + +2011-10-18 Felix Wolfsteller + + Adjusted Datacage-Configuration to fetch flood-protections when + waterlevels are requested (in system-part). + + * doc/conf/meta-data.xml: Adjusted to present flood-protections with + staticwkms factory in certain case. + +2011-10-18 Felix Wolfsteller + + Register staticwkms factory. + + * doc/conf/conf.xml: Register staticwkms factory to spawn StaticWKms- + Artifacts. + +2011-10-18 Felix Wolfsteller + + Fetch name of static WKms. + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java: + Removed dependence on "kind", but fetch name for created WKms. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Remove dependence on Kind. + +2011-10-18 Felix Wolfsteller + + Store parameterization in data, not in Artifact. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + Resolve col_pos and wst_id field, use data instead. + +2011-10-18 Felix Wolfsteller + + Add convenience-method to add defaultdata (string). + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + (addStringData): Add Default (String) Data . + +2011-10-18 Felix Wolfsteller + + Add a new Artifact and Facet (StaticWKmsArtifact, WKmsFacet) to + access WKms obtainable with the WKmsFactory. + + * src/main/java/de/intevation/flys/artifacts/StaticWKmsArtifact.java: + New, artifact with single state to get WKms from WKmsFactory. + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFacet.java: + New Facet to display W over km. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new type name. + +2011-10-18 Felix Wolfsteller + + Add WKMsFactory to access 'static' wst-data. + + * src/main/java/de/intevation/flys/artifacts/model/StaticWKmsCacheKey.java: + Cache Key for the static WKms data. + + * src/main/java/de/intevation/flys/artifacts/model/WKmsFactory.java: + New, creates WKms from wst-id and column. Does not yet fetch the + name. + + * doc/conf/cache.xml: Added cache configuration for static wkms data. + +2011-10-18 Felix Wolfsteller + + Cosmetics, docs. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java, + src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java: + Cosmetics, docs. + +2011-10-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/WKmsImpl.java: + Added constructor that takes name, docs. + +2011-10-18 Felix Wolfsteller + + Fix issue that Annotations do not come with theme/style. + + * doc/conf/themes.xml: Added "Annotations" default style. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Set style of annotations, minor cosmetics. + +2011-10-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Made inner class ThemeList static. + s/new Integer(small)/Integer.valueOf(small)/ + +2011-10-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + The inner class ThemeList makes now use of ManagedDomFacet to read the + attributes of Facets saved in the Collection's attribute. + +2011-10-17 Sascha L. Teichmann + + flys/issue314: Variables in datacage are now case insensitive. + (H2 returns meta data variables uppercase) + + * doc/conf/meta-data.xml: + Made a statement more precise. Added some debug output. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/CompiledStatement.java: + Use uppercase variable names. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/StackFrames.java, + src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java, + src/main/java/de/intevation/flys/artifacts/datacage/templating/FunctionResolver.java, + src/main/java/de/intevation/flys/artifacts/datacage/templating/ResultData.java: + Variables are now treated as uppercase. + + * src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java: + Input variables are now treated uppercase. + +2011-10-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/ManagedDomFacet.java, + src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java, + src/main/java/de/intevation/flys/artifacts/model/ManagedFacetAdapter.java: + Prepared Facets to support a "visible" attribute. + + * src/main/java/de/intevation/flys/collections/OutputParser.java: Adapted + the constructor call of ManagedFacetAdapter. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + The inner class ThemeList now supports the "visible" attribute of + ManagedFacets. + +2011-10-17 Raimund Renkert + + * src/main/java/de/intevation/flys/exports/StyledXYSeries.java: + Added method to apply line type. + + * doc/conf/themes.xml: + Changed initial default value for line type. + +2011-10-17 Ingo Weinzierl + + flys/issue226 (W-INFO: Dauerlinienberechung /Abbbildung x-Achse) + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Set the upper bound of these charts to 364. + +2011-10-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/GaugesFactory.java: + Added a function that returns a Gauge based on its name. + + * src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java: + Create proper descriptions for facets. + + * src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java: Added a + setter for labels. + + * src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Use the string returned by Facet.getDescription() as series names. The + ThemePanel and the Legend will always display the same titles for curves + now. + + +2011-10-17 Felix Wolfsteller + + Fix flys/issue363 (W-INFO/ Abflusskurve, Extremwert-Rendering). + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + (parseLineWidth): New. Get line width from Document. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + When adding annotations, parse line width from theme, set it. + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + When painting, set Paint and stroke early enough. + +2011-10-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Put the + config directory into the Velocity context. It is available as + '$CONFIGDIR' in templates. + + * doc/conf/mapserver/mapfile.vm: Set the debug file to + "$CONFIGDIR/flys-user-wms.log" and added a LEGEND section. + + * doc/conf/mapserver/wsplgen_class.vm: Adapted the class names. Those + names are displayed in the image served by GetLegendGraphic. + +2011-10-14 Felix Wolfsteller + + Add possibility of programmatic configuration of initial "activity" + state (active or inactive) of (Managed)Facets by introducing + FLYSArtifact.getInitialFacetActivity. This method shall be overriden + by subclasses where Facets are wanted to come to live inactive. + Artifacts will be asked only once how the MangedFacet should come to live, + namely when AttributeWriter finds a genuinely new Facet. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java + (getInitialFacetActivity): + New function to let Artifact decide whether a ManagedFacet shall + initially be set to active or inactive. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + Accept database in constructor. For genuinely new Facets, spawn its + mother artifact and ask whether the (Managed)Facet shall be active + or inactive (initially). + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java + (buildOutAttributes): Pass database to AttributeWrite (which needs it + to spawn artifacts), rename items parameter to reflect content. + +2011-10-13 Felix Wolfsteller + + Cosmetics, removed obsolete imports. + + * src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Removed obsolete imports. + +2011-10-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Added a further attribute "mark.selected" to the barriers feature type. + This attribute is used in the client, where we are not able to remove it + properly. Reading the GeoJSON string without this attribute is no longer + possible... strange! + +2011-10-12 Felix Wolfsteller + + Added i18n for label of wdiff "pair select" states data. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n for + state.winfo.waterlevel_pair_select . + +2011-10-12 Felix Wolfsteller + + Addressed "Wrong labels" [6] part of flys/issue371 (W-INFO / Differenzen: + Anmerkungen zur Umsetzung) . + + * src/main/java/de/intevation/flys/exports/WDifferencesExporter.java: + Adjusted variable names to avoid conflict in subclasses, adjusted + default value for i18n string. + +2011-10-12 Felix Wolfsteller + + Cosmetics, docs. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Cosmetics: Space after full stop in commments, slightly improved + documentation, added one debug message. + +2011-10-12 Felix Wolfsteller + + Fix remainder of flys/issue304 (Erweiterte Funktionen W-Differenzen) . + + * doc/conf/artifacts/winfo.xml: Removed obsolete data of + WDifferencesState. + + * src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java: + Re-enable facet-filtering, but adjust filters before that happens + (former longitudinal_section output is now w_differences output). + +2011-10-11 Felix Wolfsteller + + Added wdiff-chart translations. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n for wdiff. + +2011-10-11 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Expose translateable Strings as constants. + +2011-10-11 Felix Wolfsteller + + Fix most labels in w-differences charts. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Remove most static final i18n-variables in favor of direct String + usage or usage of methods. By this, allow easier adoption of labels + in subclasses. + +2011-10-11 Ingo Weinzierl + + flys/issue383 (Zweite Y-Achse wird beim Zoomen/Verschieben nicht angepasst.) + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Call adjustAxes() before applying zoom settings with autoZoom(). We need + to add new y-axes first before we adjust their ranges. + +2011-10-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + s/new Integer(small)/Integer.valueOf(small)/ + +2011-10-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Do not fire change events for each and every data point added. + +2011-10-10 Felix Wolfsteller + + Fix WDifferences with more than one Pair (crashed due to incorrect index for + facets.) + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Fix wrong index for difference facets (allows for more than one + difference facet per artifact without crashes). + +2011-10-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Use slightly modified doWOut-implementation from + LongitudinalSectionGenerator (here need to add Ws to different axis). + +2011-10-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java: + Fix import/reference. + +2011-10-10 Felix Wolfsteller + + Let WaterlevelPairSelectState include diffids-data (if any) to enable + future work on repopulation of Grid in GUI when jumping back + (reparameterization). + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java: + (createItems): Override to include old data. + +2011-10-10 Ingo Weinzierl + + flys/issue150 (Diagramm: Anzeige von W bergauf) + flys/issue345 (W-INFO / Wasserspiegellagenberechnung, Diagrammausgabe) + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Corrected the determination to invert the x axis, so that waterlines + will start with their highest value at the left and end with their + lowest values at the right. + +2011-10-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/math/DifferenceCurveFacet.java: + Cosmetics, added an (@Override) annotation. + + * src/main/java/de/intevation/flys/artifacts/model/CalculationResult.java, + src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Cosmetics, added documentation. + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Cosmetics, whitespace after full stops in comments, added + (@Override) annotation. + +2011-10-10 Ingo Weinzierl + + flys/issue220 (Diagramm: Achsenbeschriftungen an verschiedenen Achsen müssen gleich aussehen) + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Adjusted the label font of the 2nd y-axis - now, both axes labels look + equal. + +2011-10-10 Ingo Weinzierl + + flys/issue189 (WINFO/Dauerlinie: Sortierung der Berechnungsausgabe nach Dauerzahlen aufsteigend) + + * src/main/java/de/intevation/flys/artifacts/model/WQDay.java: Added a + method that determines if the items (days) in this object are increasing + or not. + + * src/main/java/de/intevation/flys/exports/DurationCurveExporter.java: + Changed the order of the CSV export - the highest day is at the top of + the export; the lowest day is at the bottom. + +2011-10-07 Sascha L. Teichmann + + Worked on flys/issue150 (Diagramm: Anzeige von W bergauf). + Still does not work in all cases. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java (generateChart()): + Reordered calls to ensure that the inversion of the x axis is + not eliminated by other chart generation steps as a side effect. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Assuming that JFreeChart is inverting axis automatically if the + KMs are reversed ordered only do invert only in some situations. + + Do not invert axis for Q (@Ingo: This is wrong! We must do this + if we are only displaying the Qs and the Ws are deactived). + +2011-10-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Take care on empty ranges while preparing ranges for single points. + +2011-10-07 Ingo Weinzierl + + flys/issue114 (W-INFO: Wasserspiegellagenberechnung / Ort (Spezialfall: Generierung eines Diagramms bei punkthafter Berechnung)) + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Expand + ranges for x and y axes if there is just a single point in a series - + JFreeChart requires a range where lower <> upper. + +2011-10-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java, + src/main/java/de/intevation/flys/artifacts/states/DistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/RangeState.java, + src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Add whitespace after full stop in comments, minor doc improvements. + +2011-10-07 Ingo Weinzierl + + flys/issue353 (W-INFO / Wasserspiegellagenberechnung, Diagramm) + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Adapted the process of collecting outs for Artifacts/Facets. We will now + call OutGenerator.doOut() for each Artifact and Facet - never mind if + the facet is activated (visible) or not. The OutGenerator should decide + on its own whtat to do with facets which are "marked" as _not_ visible. + + * src/main/java/de/intevation/flys/exports/OutGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/ReportGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java, + src/main/java/de/intevation/flys/exports/ATExporter.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: + Adapted the signature of OutGenerator.doOut(). There will be a new + boolean parameter "visible" that determines if the facet specified in + this method is visible for this output or not. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Now, + that we walk over every Artifact/Facet, we are able to collect min/max + data for all axes. We store these information and use them to set the + ranges of x and y axes. The result of this: a chart can have proper axes + set without any data in it. + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: Use + min/max ranges stored while calling doOut() for each Artifact/Facet + instead of fetching those information from chart's Datasets (which could + be null). + +2011-10-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/Formatter.java: Changed the max + number of digits for AT exports from 0 to 2. + +2011-10-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/ATWriter.java: Get rid + of buggy first line code. + +2011-10-05 Sascha L. Teichmann + + fixed flys/issue201 + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Replace >= with > in km index lookup because last km was not found. + +2011-10-05 Sascha L. Teichmann + + fixed flys/issue177 + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Revert rev2245. Code works fine now! :-) + +2011-10-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java: Stores a + list of XYTextAnnotations instead of FLYS specific Annotations. This + makes this class suitable for other annotation types as well. + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java: + Both facets' getData() will now return an instance of FLYSAnnotation. + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java: + Create XYTextAnnotations used to instantiate an object of + FLYSAnnotation. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Removed the code to add annotations to the plot. This task is general + enough to move this code to parent class. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Instances of this class are now able to store - besides first and second + axes datasets - a list of annotations. This annotations are added to the + plot after the datasets have been added. To support LegendItems for + those annotions, it was necessary to create a the LegendItemCollection + by ourself. This work is done while applying the themes for each series + in the chart. + +2011-10-05 Sascha L. Teichmann + + Removed code duplication of guessWaterIncreasing() + + * src/main/java/de/intevation/flys/artifacts/model/WKms.java(allKms, allWs): + Added methods to fetch all kms and all ws. + + * src/main/java/de/intevation/flys/utils/DataUtil.java: Generalized to + get WKms as arguments. + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java, + src/main/java/de/intevation/flys/artifacts/model/WKmsImpl.java, + src/main/java/de/intevation/flys/artifacts/model/WQ.java: Implements + the extended WKms interface. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Uses the generalized DataUtil.guessWaterIncreasing(). + +2011-10-05 Ingo Weinzierl + + flys/issue347 (W-INFO / Wasserspiegellagenberechnung, Längsschnittdiagramm) + flys/issue303 (Keine Streckenfavoriten, wenn nur Q im Längsschnittdiagram ausgewählt) + flys/issue353 (W-INFO / Wasserspiegellagenberechnung, Diagramm) + + * src/main/java/de/intevation/flys/jfree/FLYSAnnotation.java: New. A + wrapper for Annotations which allows us to provide a description for a + set of annotations. + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java: + The getData() will now return an instance of FLYSAnnotation that wraps + the Annotations returned by the AnnotationArtifact. The lebel of + FLYSAnnotation is the description of this Facet. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Modified the way to add Annotations. We will no longer create an empty + series to support a LegendItem for a set of Annotations, but we will add + a LegendItem manually to the LegendItemCollection of the plot. In + addition, we are now able to display annotations if one of the two + y-axes are missing. If there are no y-axes existing, we are not able to + display annotations yet. + +2011-10-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java: + Lifted the wrong point. Now all backjump corrections look fine. :-) + +2011-10-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: + Fixed bugs and make use of a cache for annotations now. + +2011-10-04 Sascha L. Teichmann + + Worked on flys/issue31 + + * src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java: + Simplified the code a lot. Needs testing. Maybe flys/issue31 is gone + +2011-10-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Fetch the WstUnit value from river - the Wst itself no longer supports a + Unit iself. + +2011-10-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java, + src/main/java/de/intevation/flys/utils/DoubleUtil.java: Moved some generic + double array code to DoubleUtil. + +2011-10-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/DoubleUtil.java (interpolateSorted): + Added code to linear interpolate double values in a sorted array. + Keys and values are given as double arrays. Keys need to be sorted. + +2011-10-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java: + Removed superfluous imports. + +2011-10-04 Ingo Weinzierl + + flys/issue330 (Dauerlinie kann nicht berechnet werden) + + * src/main/java/de/intevation/flys/artifacts/model/Calculation3.java: + Add a problem if no data was found for duration curves. + +2011-10-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/themes/Theme.java, + src/main/java/de/intevation/flys/themes/DefaultTheme.java: Added + getter/setter methods to provide a facet (string) and index (int). Both + values are written as attribute to the Theme's XML representation. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Set the "facet" and "index" values of themes. + +2011-10-04 Ingo Weinzierl + + flys/issue346 (W-INFO / Anzeige der Höheninformation) + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Modified x and y axis title. The x axis title is now "RIVERNAME-km"; the + y axis title is now "W[WST_UNIT]" where WST_UNIT depends on the unit of + the WST. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Modified i18n expressions for + x and y axis of longitudinal section charts. + +2011-09-30 Ingo Weinzierl + + flys/issue351 (W-INFO / Wasserspiegellagenberechnungen) + + * src/main/java/de/intevation/flys/utils/DoubleUtil.java: Modified the + explode() function that returns a list of values specified by min, max + and an interval. If the last value, determined by the interval, is + bigger than the max value, it is not included in the result list. + +2011-09-30 Felix Wolfsteller + + flys/issue334 (Querprofil-Diagramm: Ausgabe dieses Diagrammtyps + möglich, obwohl WSP Berechnung keine Ergebnisse liefert) + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + (compute): Add Facets regarding CrossSections only if data available. + +2011-09-29 Ingo Weinzierl + + flys/issue176 (Diagramm: Benennung eines Abflusses bei gewählter Höhe am Pegel) + flys/issue349 (W-INFO / Wasserspiegellagenberechnung, Längsschnittdiagramm) + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Create titles for W and Q waterlevel facets with proper fractions. + +2011-09-30 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java: + (createStaticData, getLabels): Create proper labels for differences. + +2011-09-29 Sascha L. Teichmann + + flys/issue244 (WINFO: Export von AT-Dateien im ersten Teil unterschiedlich) + flys/issue332 (W-INFO / Berechnung Abflusskurve, Export, FLYS 2.5) + + * src/main/java/de/intevation/flys/exports/ATWriter.java: Due to a rounding + issue the w's of the first line underun the minimal w of the curve at times. + An extra test was introduced to suppress the output of the q's of the wrong w's. + +2011-09-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Use StringUtil.wWrap , fix wrong loop, minor refac and cosmetics. + +2011-09-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelSelectState.java: + Extracted/use StringUtil.wWrap . + +2011-09-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/MainValuesService.java: + Log the gauge which has been determined. + +2011-09-28 Ingo Weinzierl + + flys/issue332 (W-INFO / Berechnung Abflusskurve, Export, FLYS 2.5) + + * src/main/java/de/intevation/flys/exports/ATExporter.java: Store the + master Artifact which is set via setMasterArtifact(). This is required + for meta information used while preparing the header row of AT exports. + + * src/main/java/de/intevation/flys/exports/ATWriter.java: Print a header + row into the AT export for being compatible with desktop FLYS. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added header row for AT + export files. + +2011-09-28 Ingo Weinzierl + + flys/issue328 (W-INFO / ÃœSK: Auswahl der Wasserspiegellage / Auswahlunterstützung) + + * doc/conf/meta-data.xml: Added an out 'waterlevels' that might be used to + fetch user specific waterlevels (same as longitudinal sections, but + without Q facet). + In addition, the system specific datacage stuff is now fetched, when: + a) no user-id is given + b) a user-id is given and there is a parameter 'load-system' + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelSelectState.java: + If the label of the WQKms object specified by the waterlevel selection + begins with a "Q", the label is wrapped into a "W()", e.g. "W(Q=1200)". + +2011-09-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Made + feed() able to remove existing data items from Artifact's data pool. + Therefore, the value for the item which should be removed needs to an + empty string. + +2011-09-28 Felix Wolfsteller + + Extracted StringUtil.unbracket from WaterlevelSelectState.strip. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelSelectState.java: + Extract and use StringUtil.unbracket, minor doc. + +2011-09-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Changed access of getCurrentState() from protected to public. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: We + use the configured Outputs instead of the actuel Outputs of an Artifact + to make recommendations, now. This has the bad side effect of giving + recommendations for Outputs that we might _NOT_ be able to produce. But + otherwise, we would not be able to give recommendations for states with + long calculation times that start background threads for calculation (as + WSPLGEN caluclations does). + +2011-09-27 Felix Wolfsteller + + Enable "auto-scaling" axis for waterlevels in WDifference-plots. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + (createSecondaryAxis, zoomY): Refactored to allow modification in + siblings. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + (createSecondaryAxisRange): Override to achieve expected behavior. + Also adjusted label. + +2011-09-27 Felix Wolfsteller + + In W-Difference Calculation, respect indices of selected facets. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + (computeAdvance): Respect index of selected facets. + +2011-09-27 Sascha L. Teichmann + + flys/issue317: (Querprofil-Diagramm: Referenzen auf CrossSectionApp entfernen) + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Removed dependency to demo app. + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Refactored to use logic from the models. + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java: + Moved some logic from the demo app to this model. + +2011-09-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/wsplgen/FacetCreator.java: New. Code + from FloodMapState moved to its own class with the intent, to use it in + classes different from FloodMapState. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Removed the inner class FacetCreator. + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENJob.java: Stores + an instance of FacetCreator. + NOTE: Maybe we should move the WSPLGEN parameters into an own class + which might be serializable. + + * src/main/java/de/intevation/flys/wsplgen/JobExecutor.java: Use the + FacetCreator instance stored in the WSPLGENJob to create a new WSPLGEN + facet if the calculation was successfully (without errors). Finally, the + facets of FacetCreator are added to the Facet list of the FLYSArtifacts. + +2011-09-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Put Artifact in background mode first before starting WSPLGEN, otherwise + a very fast errors (call CallContext.afterBackground() before Artifact is + in Background mode) might lead to an inconsistent state. + + * src/main/java/de/intevation/flys/wsplgen/ProblemObserver.java: Repaired + broken error num parsing. + +2011-09-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/wsplgen/ProblemObserver.java: Track + critical errors as well (improved regular expression for errors). + +2011-09-27 Sascha L. Teichmann + + * ChangeLog: Fixed whitespace usage. + +2011-09-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/RiverService.java, + src/main/java/de/intevation/flys/artifacts/math/DifferenceCurveFacet.java + src/main/java/de/intevation/flys/artifacts/model/ManagedDomFacet.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Removed superfluous imports. + +2011-09-27 Ingo Weinzierl + + flys/issue68 (Diagramm: Werte an der Y-Achse benötigen i18n) + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Added a + method to retrieve the current/preferred locale specified by CallMeta. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Introduced two methods localizeDomainAxis() and localizeRangeAxis(). + Both methods of this class override the NumberFormat used to format axes + numbers. Those methods are called by localizeAxes() - which has private + access - for each domain and range axis of the current XYPlot. + +2011-09-27 Sascha L. Teichmann + + * doc/conf/cache.xml: Number of cached annotations was much + to low. + +2011-09-27 Felix Wolfsteller + + Improved w-differences diagram generation where multiple differences + can be shown. + + * src/main/java/de/intevation/flys/artifacts/math/DifferenceCurveFacet.java: + New facet type. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Employ new DifferenceCurveFacet, return CalculationResult that can + store more than one WKms. + +2011-09-27 Ingo Weinzierl + + flys/issue320 (ÃœSK:Mapserver hat Probleme beim Shapefilepath mit "../" im Pfad) + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Use + File.getCanonicalPath() to substitute "../" in shapefile directories. + +2011-09-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + The extent of the WSPLGEN result layer is now specified by the extent of + the CrossSectionTracks that matches the start and end kilometer of the + WSPLGEN calculation. + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: New function + that creates the OpenLayers bounding box based on two Geometries. + +2011-09-26 Felix Wolfsteller + + Improved w-differences diagram generation with included "absolute" + values. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Fixed one (of two) incorrect labels. + (doWaterlevelOut): Survive non-found gauge, fetch kilometer and w + instead of values for w and q. + +2011-09-26 Felix Wolfsteller + + Add positional-conflict-awareness when merging Facets for a + FLYSArtifactCollection. First come first serve. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + (writeFacets): First, sort incoming facets into 2 groups: + "genuinely new" and "already there", then for each new check + whether the position is already taken. If so, push "up" (position++) + until no conflict exists anymore. + +2011-09-26 Ingo Weinzierl + + flys/issue296 (Karte: Bezeichnungen verbessern) + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + I18N of the WSPLGEN and barriers facets (WMS layers). + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added strings for the wsplgen + and barriers WMS layers. + +2011-09-26 Felix Wolfsteller + + Fix (revert) access to position in ManagedDomFacet. + + * src/main/java/de/intevation/flys/artifacts/model/ManagedDomFacet.java: + (getPosition): Do not add prefix when querying position ("pos") + attribute, add a logger for faster future debugging. + +2011-09-23 Felix Wolfsteller + + Squash positional conflict-bug. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + (mergeFacets): Removed, replaced in parts by pickFacet. + (pickFacet): New, return facet to be added to document. + Documentation added. + +2011-09-23 Felix Wolfsteller + + Squash a bug about wrongly named "art:pos" attribute in ManagedDomFacet (was + "pos"). Added documentation from commit message. + + * src/main/java/de/intevation/flys/artifacts/model/ManagedDomFacet.java: + Added documentation (commit message with minor adjustments). + (getPosition, setPosition): Include PREFIX in attribute name. + +2011-09-23 Felix Wolfsteller + + Refactoring, doc. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + (mergeFacets): Removed, replaced in parts by pickFacet. + (pickFacet): New, return facet to be added to document. + Documentation added. + +2011-09-23 Felix Wolfsteller + + Cosmetics, docs. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + Documentation added. + +2011-09-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Subclasses the FLYSService now - this should improve the database + connection handling. + +2011-09-22 Bjoern Schilberg + + * doc/mapserver/mosel-mapfile.map: + Full blown mosel wms mapfile. + +2011-09-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/FLYSService.java: + New. A subclass of DefaultService which is used in FLYS to init and + shutdown database connections. + + * src/main/java/de/intevation/flys/artifacts/services/MainValuesService.java, + src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java, + src/main/java/de/intevation/flys/artifacts/services/RiverService.java: + Centralized the initialization and shutdown of database connections. + These services now subclass FLYSService which handles the database stuff. + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java: The + current database connection is not closed here - this is done in a + Service or in the CallContext. + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: It's + not necessary to create new database connections here. We already have + an existing connection which is initialized by CallContext. + +2011-09-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DistanceOnlySelect.java: + Override validate() of parent classes to suppress "step" validation + which is not present in this state. + + * src/main/java/de/intevation/flys/artifacts/states/RangeState.java: Added + new method validateBounds() which really just validates a boundary + without "step" parameter. + +2011-09-21 Felix Wolfsteller + + Added WaterlevelArtifact to accompany WINFOArtifacts in WDifferencesPlots. + + * src/main/java/de/intevation/flys/artifacts/WaterlevelArtifact.java: + New WaterlevelArtifact. + + * doc/conf/conf.xml: + Added configuration for WaterlevelArtifact configuration (path to state-xml) + waterlevel-factory. + + * doc/conf/artifacts/waterlevel.xml: + New, trivial state description for Waterlevelartifact. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelInfoState.java: + New, only state for WaterlevelArtifact. + +2011-09-21 Felix Wolfsteller + + Cosmetics, docs. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/collections/AttributeWriter.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Cosmetics, documentation. + +2011-09-21 Felix Wolfsteller + + Added WaterlevelOut-processing ability to WDifferencesCurveGenerator. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Process LONGITUDINAL_W facets. + +2011-09-21 Felix Wolfsteller + + Improved WDifferenceState in preparation to be able to deal with multiple + pairs for differences. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Prepare multiple-pairs-case. + +2011-09-21 Ingo Weinzierl + + flys/issue315 (Ãœberschwemmungsfläche: String bei Streckenauswahl) + + * doc/conf/artifacts/winfo.xml: Added a new state for floodmap's range + input. This state will accept a km range only, there is no step width. + + * src/main/java/de/intevation/flys/artifacts/states/DistanceOnlySelect.java: + New. The state which is used to enter a km range with step width. + +2011-09-21 Felix Wolfsteller + + Cosmetics, improved debug output, doc. + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Improved debug output. + + * src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java: + Added documentation. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java, + src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: + Removed commented code. + + * src/main/java/de/intevation/flys/collections/AttributeParser.java: + Whitespace cosmetics. + +2011-09-21 Felix Wolfsteller + + Avoid NullPointerException when drawing XYChart without data. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Guard calls to dataset to avoid NullPointerException. + +2011-09-21 Ingo Weinzierl + + flys/issue325 (FLYS Client: Auswahl des DGM zeigt numerischen Wert an) + + * src/main/java/de/intevation/flys/artifacts/states/DGMSelect.java: Write + a better label for the selected DEM into the static DESCRIBE. Use the + name of the DEM file as label instead of the database id. + +2011-09-16 Bjoern Schilberg + + * doc/mapserver/fontset.txt: + Added initial font set for km_annotation layer. + * doc/mapserver/symbols/symbols.sym: + Added square symbol for km and fixpoint layer. + * doc/mapserver/saar-mapfile.map: + Adjust styling in the flys karte-archiv way. + +2011-09-19 Ingo Weinzierl + + Tagged RELEASE 2.5 + + * Changes: Prepared changes for release. + +2011-09-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelSelectState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java, + src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Removed + needless imports. + +2011-09-16 Ingo Weinzierl + + * doc/conf/meta-data.xml: Improved datacage configuration for DEMs. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Query DGMs by the given ID in the FLYS data pool - not by given range + values. + +2011-09-16 Ingo Weinzierl + + * doc/conf/meta-data.xml: Added a section for DEMs to the floodmap + section. + +2011-09-16 Felix Wolfsteller + + Fix build. + + * src/main/java/de/intevation/flys/artifacts/state/WDifferencesState.java: + Fix build. + +2011-09-16 Felix Wolfsteller + + Take a given WaterlevelPair-String, load artifact and plot the diff. + + * src/main/java/de/intevation/flys/artifacts/state/WDifferencesState.java: + Load correct artifacts. + +2011-09-16 Bjoern Schilberg + + * doc/mapserver/*: Added inital mapserver configuration files. + +2011-09-16 Ingo Weinzierl + + * doc/conf/meta-data.xml: Moved the system specific configuration into a + macro to the top of the configuration document. Call this macro at the + end of the user specific part and in the part that should contain the + system specific stuff only! + +2011-09-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Defined createItem() here and adapted some method signatures, because I + need the CallContext deeper in code than expected. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelSelectState.java: + Write the name of the selected waterlevel into the static DESCRIBE. + + * src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java: + Adapted method signatures that have been changed in DefaultState. + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + Removed method createItem() which is now defined in the upper class + DefaultState. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added string for selected + waterlevel that is displayed in static UI. + +2011-09-16 Ingo Weinzierl + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added state label for + waterlevel selection. + +2011-09-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelSelectState.java: + Validate incoming data string and strip brackets. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Fetch waterlevel data from external Artifact if existing. If no external + Artifact is specified that provides waterlevel data, we gonna try to + fetch it from the current Artifact. + +2011-09-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java: + Removed needless import which caused compile errors. + +2011-09-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Added a transform() method. This method should be used to transform + input data in form of a string into a better data structure. This state + provides a simple implementation which just returns a StateData object + that contains exactly the input string. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Transform + input strings using DefaultState.transform() before they are added to + its data pool. + +2011-09-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Made collection solid for the case if it has no Artifacts. + +2011-09-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Fetch Artifact + from ArtifactDatabase properly. Write better error logs if that process + fails. + +2011-09-14 Felix Wolfsteller + + Extend WDifferences branch to have calculations in dedicated, new state. + + * doc/conf/artifacts/winfo.xml: Added new State and Transition in + WDifferences-branch. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelPairSelectState.java: + New state. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Specify to not take input, prepare getting other facets. + +2011-09-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DGMSelect.java: This + state now desires the UIProvider 'dem_datacage_panel'. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelSelectState.java: + New. This state is used to define the desired UIProvider + 'wsp_datacage_panel'. + + * doc/conf/artifacts/winfo.xml: Added a new way to start a WSPLGEN + calculation when choosing the calculation type 'floodmap'. + +2011-09-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: Merge + facets only if their name AND their owner artifact are equal. + +2011-09-14 Felix Wolfsteller + + Partial Fix flys/issue304 (3) (Baseline). + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Show Baseline in WDifferencesPlot. + +2011-09-14 Felix Wolfsteller + + Fix flys/issue310 (cross-section theme). + + * doc/conf/themes.xml: CrossSection-Themes: profile thin, water blue. + +2011-09-14 Felix Wolfsteller + + Fix flys/issue310 (cross-section theme). + + * doc/conf/themes.xml: CrossSection-Themes: profile thin, water blue. + +2011-09-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Add an quick and simple error to the report if an error occured while + WSPLGENJob creation. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added error messages for + WSPLGEN job creation errors. + +2011-09-13 Felix Wolfsteller + + Fix crash when drawing StickyAxisAnnotation when no range was given. + User-directed issues remain ( flys/issue303 ). + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java + (draw): + Guard access to domainAxis, rangeAxis and the corresponding ranges. + Warn and exit if any was null. + +2011-09-13 Ingo Weinzierl + + flys/issue290 (Karte: Eingabe von Differenzen zw. WSP und Gelände findet + keine Ausprägung in der Karte) + + * doc/conf/mapserver/wsplgen_class.vm: Added styles for DIFF attribute. + + * doc/conf/mapserver/mapfile.vm: Set debug default to '5'. + +2011-09-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Add a first WSPLGEN status message (notifies the user about a + queued job) after the job has been added to the Scheduler. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added english and german + status message text. + +2011-09-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: Write + shapefiles only if there are features for it existing. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + A WSPLGEN facet is only created, if the calculation was successfully + added to the Scheduler. A barrier facet is only created if the WSPLGEN + calculation has been added to the scheduler AND if there are digitized + geometries existing. + +2011-09-12 Felix Wolfsteller + + Copied and slightly modified implementation of guessWaterIncreasing from + WQKms to (new) DataUtils. Accidentally commited usage in last commit, to + correct orientation of diagram (invert x axis). + + * src/main/java/de/intevation/flys/utils/DataUtils.java: + New file with guessWaterIncreasing implementation from WQKms, + slightly adjusted. + +2011-09-12 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + src/main/java/de/intevation/flys/artifacts/model/WKmsImpl.java: + Cosmetics. + +2011-09-12 Felix Wolfsteller + + Added CSV Export for W-Differences. + + * doc/conf/conf.xml: Added Exporter. + + * doc/conf/artifacts/winfo.xml: Removed transition over distances + state, added export outputmode and facet. + + * src/main/java/de/intevation/flys/exports/WDifferencesExporter.java: + New, CSV-Exporter for WDifferences. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Add export facet. + +2011-09-12 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/DataFacet.java: + Cosmetics, docs. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java: + Cosmetics. + +2011-09-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Sourced the code to append a concrete data item to the static DESCRIBE + part out to an own method (appendStaticData()). + + * src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java: + Override appendStaticData() to suppress the GeoJSON string to be + included in the static DESCRIBE. + +2011-09-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFactory.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java, + src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java, + src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java, + src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Removed needless imports. + +2011-09-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/CalculationMessage.java: + New. A subclass of Message (in the Artifacts system). It stores a + string message and a progress (in form of step x/y). + + * src/main/java/de/intevation/flys/wsplgen/JobObserver.java: The observer + now writes background messages into the artifact system using the + CallContext.addBackgroundMessage(). We use instances of + CalculationMessage here, that makes the WINFOArtifact able to put + progress information into the Artifact's DESCRIBE as well. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Write + status message and progress information into the DESCRIBE if the + Artifact has started a background process. + +2011-09-09 Felix Wolfsteller + + Fix flys/issue280 . + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Do not draw boxes around annotations. + +2011-09-09 Felix Wolfsteller + + Fix flys/issue279 . + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Fix behaviour in various thinkable malconditions. + +2011-09-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Made one case of cross section fetching more robust. + +2011-09-09 Felix Wolfsteller + + Fix Facet name and Legend of W-Differences, also insert state to specify + distance. + + * doc/conf/artifacts/winfo.xml: Add additional transitions to walk over + distances state. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + Set facets description. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + Take facets description as legend. + +2011-09-09 Felix Wolfsteller + + Added configuration to kick-in w-differences branch of winfo. + + * doc/conf/conf.xml: Register new (w-differences) OutputGenerators. + + * doc/conf/artifacts/winfo.xml: Register new state and transitions. + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + Added new (w-differences) calculation mode. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveInfoGenerator.java: + New file, implementing naive approach to display w-differences + (accidentially omitted in last commit). + +2011-09-09 Felix Wolfsteller + + Added very stubby WDifferences State/OutGenerator for WINFOArtifact. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added w_differences facet type. + + * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java: + New file, implements naive approach to calculate w-differences (of + calculations identified by hardcoded uuids!) and register respective facet. + + * src/main/java/de/intevation/flys/exports/WDifferencesCurveGenerator.java: + New file, implementing naive approach to display w-differences. + +2011-09-09 Felix Wolfsteller + + Implement getArtifact(uuid,context) in FLYSUtils. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java (getArtifact): + Added implementation, partially resolving a TODO. Added logger instance. + +2011-09-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENCalculation.java: + New. This sublcass of Calculation saves warnings and errors that occur + while WSPLGEN is running. + Note, that the interface of this class doesn't exactly apply the interface + of Calculation. Maybe, we should generalize this interface! + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENJob.java: Stores + an instance of WSPLGENCalculation now. We use this instance to save + warnings and errors. + + * src/main/java/de/intevation/flys/wsplgen/ProblemObserver.java: Use the + WSPLGENCalculation to save errors and warnings. + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENReportFacet.java: + New. This facet is used for WSPLGEN reports. It stores an instance of + WSPLGENCalculation which saves ERRORS and WARNINGS that occur while + WSPLGEN execution. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Create a WSPLGENReportFacet for WSPLGEN reports. + + * doc/conf/conf.xml: Added an OutputGenerator 'report' for WSPLGEN + reports. + + * doc/conf/artifacts/winfo.xml: Added an output 'report' for WSPLGEN + reports. + +2011-09-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/math/WKmsOperation.java, + src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + Cosmetics, docs. + +2011-09-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/wsplgen/JobObserver.java: Small + adjustments that makes it easier to subclass this observer. + + * src/main/java/de/intevation/flys/wsplgen/ProblemObserver.java: New. A + sublcass of JobObserver which analyses the WSPLGEN output for errors and + warnings. + + * src/main/java/de/intevation/flys/wsplgen/JobExecutor.java: Use + JobObserver and ProblemObserver to track the whole WSPLGEN output and + print number of errors/warnings to log output. + +2011-09-08 Felix Wolfsteller + + Added translation of w_differences. + + * src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages.properties: + Added "w_differnces" translation. + +2011-09-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Appended + a new attribute 'background-processing' to the DESCRIBE of this + Artifact. Its value is 'true' if this Artifact has started a background + thread which has not finished yet - otherwise it is 'false. + +2011-09-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java, + src/main/java/de/intevation/flys/utils/GeometryUtils.java: Moved the + code to determine the extent of a river based on its axis to + GeometryUtils. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Determine the extent of the selected river and set the WMSLayerFacet's + extent attribute. + +2011-09-07 Felix Wolfsteller + + Added Themeing support for CrossSection Diagrams. + + * doc/conf/themes.xml: + Added new themes and mappings, slightly modified longitudinalsection + theme. + +2011-09-07 Felix Wolfsteller + + In CrossSection Diagram fix subtitle to display the km of which the data is + actually displayed (maybe contrasting users wish). + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + (getCrossSectionSnapKm): New method to fetch the actual km of crosssection. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Add correct km to charts subtitle. + +2011-09-07 Felix Wolfsteller + + Fix various display-issues like i18n in cross-section diagram. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Set description of facets to expected values. + + * src/main/java/de/intevation/flys/artifacts/exports/CrossSectionGenerator.java: + Fix i18n of chart title. Set subtitle to expected value, pass facets + description to StyledSeries to see expected legend. + +2011-09-07 Felix Wolfsteller + + Cosmetics, resolved refactoring todo. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java + (compute, computeAdvance, computeFeed): Refactored, extracted method, + resolving duplicate code and TODO. + +2011-09-07 Felix Wolfsteller + + Fix waterline "calculation" at given km. Chosen approach is + "head-through-wall". + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Some refactoring to do the same calculation twice easier and be able + to "cross" waterline against correct profile data. + + +2011-09-07 Felix Wolfsteller + + Fix setting of kilometer for profile (not yet waterlevel) of cross section + diagram. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + (getCrossSectionData): Respect corss_section.km data; do naive linear + search for profile data for this km. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java: + Declare a ComputeType. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Implement computeFeed. + +2011-09-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Minor cosmetics. + +2011-09-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java, + src/main/java/de/intevation/flys/artifacts/model/DataFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java, + src/main/java/de/intevation/flys/artifacts/state/DefaultState.java: + Cosmetics, docs. + +2011-09-06 Ingo Weinzierl + + * doc/conf/mapserver/barrier_polygons_class.vm, + doc/conf/mapserver/barrier_lines_class.vm, + doc/conf/mapserver/wsplgen_class.vm: Default Mapserver styles for + barriers and WSPLGEN results. Those styles are only used as long as we + don't have map specific themes (as already used in charts). + + * doc/conf/mapserver/layer.vm: Implements a fallback mechanism for styling + barrier lines/polygons and WSPLGEN results. + + * src/main/java/de/intevation/flys/artifacts/model/LayerInfo.java: Added a + getStyle() method that currently returns "null". This method needs to be + implemented when map themes are introduced. + +2011-09-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/LayerInfo.java: Renamed + some attributes to make their job in the mapfile more obvious. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + new facet type for barriers. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: Add + a facet for the barriers layer. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: Parse + barriers (lines and polygons) and create two new layers for each type - + those layers are grouped. + + * doc/conf/mapserver/layer.vm: Renamed attribute based on changes in + LayerInfo and added support for Group-Layers. + +2011-09-06 Raimund Renkert + + * doc/conf/conf.xml: + Added driver to database configuration for use with postgresql. + +2011-09-06 Ingo Weinzierl + + * doc/conf/mapserver/mapfile.vm: Removed FONTSET attribute and set quotes + for SHAPEPATH. + +2011-09-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENFacet.java: + Removed. We gonna use the WMSLayerFacet until now. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Add a WMSLayerFacet after we triggered the Scheduler to start a WSPLGEN + calculation. + +2011-09-05 Ingo Weinzierl + + * doc/conf/mapserver/layer.vm, + doc/conf/mapserver/mapfile.vm: Small bugfixes and style improvements. + + * src/main/java/de/intevation/flys/wsplgen/JobExecutor.java: Trigger the + MapfileGenerator after a WSPLGEN job has finished regardless if it has + been finished successfully or not. + +2011-09-05 Ingo Weinzierl + + * pom.xml: Added Apache Velocity 1.7 for templating support. + + * doc/conf/conf.xml: Added config options for mapserver/template relevant + stuff. + + * doc/conf/mapserver/mapfile.vm, + doc/conf/mapserver/layer.vm: New. A default mapfile template and a + template used for layers. + + * src/main/java/de/intevation/flys/artifacts/model/LayerInfo.java: New. + This class is used while reading WMS layer relevant information from + filesystem. + + * src/main/java/de/intevation/flys/utils/MapfileGenerator.java: New. This + thread is used for creating mapfiles for Mapserver. The MapfileGenerator + runs in daemon mode (own thread) and creates mapfiles based on WMS + layer relevant information read from filesystem. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java, + src/main/java/de/intevation/flys/utils/FLYSUtils.java: Moved shapefile + specific XPath expressions from FloodMapState to FLYSUtils which is a + better place to use it in other classes (as MapfileGenerator). + +2011-09-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENJob.java: + Bugfixed broken attribute assignment. + + * src/main/java/de/intevation/flys/wsplgen/JobExecutor.java: Call + CallContext.afterBackground() after a WSPLGEN job has finished to remove + the background lock from Artifact. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Call CallContext.afterCall(BACKGROUND) to lock the Artifact for + background processing. + +2011-09-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/wsplgen/JobExecutor.java: New. This + class is used to start WSPLGEN for a specific WSPLGENJob. The System + property "wsplgen.bin.path" tells the JobExecutor where the WSPLGEN + binary is placed (which means in general, the property points to the + 'wsplgen.exe'). + + * src/main/java/de/intevation/flys/wsplgen/Scheduler.java: New. This + scheduler currently allows to start just a single WSPLGEN Thread. All + WSPLGEN calculations should be started using Scheduler.addJob(). + + * src/main/java/de/intevation/flys/wsplgen/JobObserver.java: New. This + thread reads log messages from WSPLGEN and listens for specific + messages. It should be used to update status messages of the WSPLGEN + calculation that is currently running. + There is a System property that tells the JobObserver to log all WSPLGEN + output to log4j: enable WSPLGEN output with "-Dwsplgen.log.output=true". + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENJob.java: Added + the FLYSArtifact, the current working directory and the CallContext. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Use the Scheduler to start new WSPLGEN calculations. + +2011-09-02 Felix Wolfsteller + + Add CrossSectionInfoGenerator. + + * src/main/java/de/intevation/flys/exports/CrossSectionInfoGenerator.java: + New, trivial implementation of CrossSectionInfoGenerator. + + * doc/conf/conf.xml: + Register CrossSectionInfoGenerator. + +2011-09-01 Felix Wolfsteller + + Cleanups of CrossSection*. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + New methods to retrieve name of utilized CrossSection. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Cleanup, get rid of copied unused method, documentation and more sensible + translations. + + * src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages.properties: + Added cross_section* translations, also cleanups. + +2011-09-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Set the "typ" attribute of lines and polygons in barrier shapefiles. + +2011-09-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Set the Z values of line and polygon barrier geometries. Both barrier + shapefiles will contain 3D geometries now. + +2011-09-01 Felix Wolfsteller + + Get real data to display in CrossSection (although ignorant of + parameterization), making use of the showcase code of the CrossSectionApp- + Standalone application. + + * doc/conf/artifacts/winfo.xml: Add new facet (~waterline) to state/out. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + New methods to get relevant data. So far just takes the first value of + everything and assuming a waterlevel at 130m. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionWaterLineFacet.java: + New Facet responsible of water level in cross section. + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Made some functionality publicly and statically available. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java: + Update call. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added new + Facet type. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Added new Facet to out. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Respect new facet and facets data. + +2011-09-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: Close an open + shapefile transaction and catch exceptions which are thrown while + shapefile creation here. If there occured an error, this functions + returns FALSE, otherwise TRUE. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Removed exception handling while shapefile creation - this is done in + GeometryUtils now. + +2011-09-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Renamed the file for WSPLGEN required waterlevels to "waterlevels.wst". + WSPLGEN did not work with the former "waterlevels.txt" file. + +2011-09-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: New static + function that builds new SimpleFeatureTypes with additional attributes. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Write attributes "ELEVATION" and "KILOMETER" into the crosssection + tracks shapefiles. + +2011-08-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a method + stub that should return a FLYSArtifact based on a given UUID. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Write the selected WST file for WSPLGEN. Note, that this is the WST file + of the current WINFO artifact. Furthermore, there is currently no way + for the user to select a column from WST file, so we currently use the + column that is written to WST file at first. + +2011-08-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Changed + the parameter order of a compute(...) method. This makes me able to call + this without a hash value. + + * src/main/java/de/intevation/flys/artifacts/model/DataFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java, + src/main/java/de/intevation/flys/artifacts/model/ReportFacet.java: + Adapted the parameter order of the compute() call (see above). + +2011-08-31 Felix Wolfsteller + + More bones to CrossSection sceleton. + + * src/main/java/de/intevation/flys/artifacts/model/CrossSectionFactory.java, + src/main/java/de/intevation/flys/artifacts/model/CrossSectionFacet.java: + New, yet trivial implementations of Factory and Facet for CrossSections. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Add new CrossSection- (instead of Default-)Facet. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Adjusted to use (touch) new Factory and Facet. + +2011-08-31 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Cosmetics. + +2011-08-31 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java, + src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + Removed obselete imports. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Removed obselete imports, whitespaces. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Whitespaces, docs. + +2011-08-31 Felix Wolfsteller + + Fix translations of Main Values Facets. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Do acrobatics to keep state transient but get translated title. + + * src/main/java/de/intevation/flys/artifacts/MainValuesQFacet.java, + src/main/java/de/intevation/flys/artifacts/MainValuesWFacet.java: + Changed constructor to get description (which is then already be translated) + dynamically, adjust deepCopy. + + * src/main/java/de/intevation/flys/states/StaticState.java: + Adjust constructor accordingly. + +2011-08-31 Felix Wolfsteller + + Add sceleton for CrossSection outs. + + * doc/conf/artifacts/winfo.xml: + Added new output mode to respective state of winfo artifact configuration. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Add new Dummy-Facet in state. + + * doc/conf/conf.xml: + Registered new OutputGenerator. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new CROSS_SECTION type. + + * src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java: + New, stubby skeleton for an CrossSectionGenerator. + + * src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages.properties: + Added cross_section translation, also cleanups (e.g. main values). + +2011-08-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENJob.java: Marked + required parameters with a comment. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Export floodplains (german 'Talaue') to shapefile and write its file + path into the WSPLGEN job. + +2011-08-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Search for a DGM that fits to the current river and km range and write + its file path into the WSPLGEN job. + +2011-08-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: Improved + exception handling: exceptions are catched in GeometryUtils now. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Write river axis and crosssections to shapefiles and save shapefile + pathes in WSPLGENJob. + +2011-08-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Use the coorect SRID for reading GeoJSON and writing line/polygon + shapefiles. + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: Use a + concrete coordinate system while feature type creation. + +2011-08-30 Ingo Weinzierl + + * pom.xml: Added GeoTools 2.7.2 dependencies for Shapefile, GeoJSON and + EPSG support. + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENJob.java: Store + 'LIN' parameter in a list now. A WSPLGEN parameter might contain many + LINs. + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: New functions + to create FeatureTypes and to write shapefiles. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Write user specified barriers into a shapefile placed in the artifact + directory. + +2011-08-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: Added a function + that extracts the SRID defined in the global configuration file for a + given river. + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: + Removed the code that extracts the river SRID - use FLYSUtils instead. + +2011-08-29 Felix Wolfsteller + + Use FLYSUtils.getRiver instead of WINFOArtifact.getRiver. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Use FLYSUtils.getRiver instead of WINFOArtifact.getRiver. + +2011-08-29 Felix Wolfsteller + + Use FLYSUtils.getRiver instead of WINFOArtifact.getRiver. + + * src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java, + src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Use FLYSUtils.getRiver instead of WINFOArtifact.getRiver. + +2011-08-29 Felix Wolfsteller + + Commit accidentally omitted result of refactoring (WINFO/FLYSUtils/getRiver). + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Removed implementations of getRiver, update calls to use FLYSUtils. + +2011-08-29 Felix Wolfsteller + + Interpolate Q main values, generate interpolated W main values on the fly from + Q main values. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + (getGaugeDatum): removed, obsolete + (getLocation): new, gets location + Use WstValueTable to look up interpolated Qs of MainValues. In absence of + the same functionality for Ws, generate W Main Values from Q Main Values. + +2011-08-29 Felix Wolfsteller + + Use new helper class FLYSUtils, minor refactorization. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Use new functionality of helper class, convenience of FLYSArtifact. + +2011-08-29 Felix Wolfsteller + + Refactored to use new Helper class FLYSUtils, moved getRiver-functionality + in there. + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java (getRiver): + New function to retrieve river of an artifact, slightly modified from + WINFOArtifact. + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: + Removed implementations of getRiver, update calls to use FLYSUtils. + +2011-08-29 Felix Wolfsteller + + Minor cosmetics. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Resolved a TODO. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Added some documentation. + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: + Minor cosmetic. + +2011-08-26 Sascha L. Teichmann + + * doc/conf/meta-data.xml: Made it Oracle compatible. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/CompiledStatement.java: + If running in debug mode log executed statements. + Helps debugging Oracle connections. + +2011-08-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Set some WSPLGENJob parameters which are stored at FLYSArtifact. + +2011-08-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/FLYSUtils.java: New. This helper + class should provide some basic FLYS stuff. Currently, there are functions + that return the km range/location. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Removed + the methods that return the km range/locations. This is implemented in + FLYSUtils now. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: Adapted + the WINFO method calls to retrieve the km range/locations - call + FLYSUtils now. + +2011-08-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: New method + to destroy a single state. + +2011-08-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Cosmetic, remove debug output and comments, minor style adjustments. + +2011-08-26 Felix Wolfsteller + + Added limited themeing-support for MainValues. + + * doc/conf/themes.xml: + Added Q/W-MainValues themes. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Added limited theming support, add legend entry for main values. + +2011-08-26 Ingo Weinzierl + + * doc/conf/conf.xml: Added a configuration node that points to the directory + where shapefiles should be stored in. + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENJob.java: New. + This class is used to save/write the parameter for a WSPLGEN calculation. + WSPLGEN's *.par files are written using the toFile() method. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + A directory for all WSPLGEN stuff is created in computeAdvance() - those + directory and all its contained files are removed in endOfLife(). + +2011-08-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/utils/ThemeUtil.java: + New Util to work with theme-related stuff. + +2011-08-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Use NamedDoubles instead of MainValues, try to adjust scale of Ws. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Use NamedDoubles instead of MainValues, generalize annotation handling, to + allow easier reusability and themeing. + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Added convenience constructor, exemplary switch on bordered text. + +2011-08-26 Felix Wolfsteller + + * doc/conf/meta-data.xml: + Recommend MainValues for Computed discharge curves. + +2011-08-26 Felix Wolfsteller + + New NamedDouble class which implements a -pair. + + * src/main/java/de/intevation/flys/artifacts/model/NamedDouble.java: + New, implementation of a double with a string or vice versa. + +2011-08-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Call + State.endOfLife() for all States when endOfLife() of the Artifact is + called. + +2011-08-26 Felix Wolfsteller + + Also plot "W"-MainValues (on vertical axis), take correct parameters, but + do not convert to correct scale (cm vs NN+m). + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Naive attempt at allowing the vertical axis to be sticked at. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Store Q and W MainValues separately, add them to plot as annotations. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Serve the MainValues, parameterized on river and location, Q and W. + Removed Facet-implementation. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Updated Facet Types. + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesQFacet.java: + src/main/java/de/intevation/flys/artifacts/model/MainValuesWFacet.java: + New, trivial facets, extracted from MainValuesArtifact. + +2011-08-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Call + State.endOfLife() of each State that is no longer in the queue of the + artifact when this artifact steps back to a previous state. + +2011-08-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Plot MainValues delivered by MainValuesFacet in much the same ways than + Annotations in LongitudinalSection plots. + +2011-08-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Prepare further differentiation between Annotations that stick to X or Y- + Axis, copied some positioning logic into StickyAxisAnnotation + implementation. + +2011-08-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Minor cosmetics. + +2011-08-25 Felix Wolfsteller + + Added MainValue-Fetching-Capabilities to MainValuesArtifact. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java + (initialize, getMinValues): + Let MainValuesArtifact return "real" MainValues, although ignorant of all + parameterization. + +2011-08-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java + (MainValueFacet): + Improved and straightened implementation, added code-Annotations and Todos. + +2011-08-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java + (MainValueFacet): + Improved and straightened implementation, added code-Annotations and Todos. + +2011-08-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java + (getState): + Resolved multiple creation of state (yet not very clean). + +2011-08-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Cosmetics, docs. + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: + Cosmetics. + +2011-08-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added new (MainValues) Facet-Type. + +2011-08-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java: + Added a method that returns a River object based on its database id. + + * src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java: The + data that is required for this artifact is fetched from database instead + from a Master-Artifact. The creation of static artifacts should use + database ids instead of cloning a Master-Artifact. + +2011-08-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Removed needless imports. + +2011-08-24 Felix Wolfsteller + + Added configuration for factory and rule for MainValueArtifacts. + + * doc/conf.xml: + Add a mainvalue factory to serve MainValueArtifacts. + + * doc/conf/meta-data.xml: + Recomment mainvalue artifact when computed_discharge_curve can be put out. + +2011-08-24 Felix Wolfsteller + + Let MainValuesArtifact have a state, outputmode and facet. + + * src/main/java/de/intevation/flys/artifacts/states/StaticState.java: + New, a non-abstract DefaultState. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Progressed with implementation, use StaticState to hook output modes and + facet in; use (Static)FLYSArtifact implementation. + +2011-08-24 Felix Wolfsteller + + Smaller cosmetics. + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Cosmetics in comments. + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: + Added @Override annotations. + + * src/main/java/de/intevation/flys/artifacts/model/DataFacet.java: + Use brackets to improve readability of ternary operator. + +2011-08-24 Sascha L. Teichmann + + * doc/conf/meta-data.xml: Use "ids" in user specific part, too. + +2011-08-24 Sascha L. Teichmann + + * doc/conf/meta-data.xml: s/db-ids/ids/g to unify system and user specific + loading. + +2011-08-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Extracted access to state and states in order to have fewer places to + modify when going for single/trivial state- artifacts. + +2011-08-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java: + Append the river's srid to the WMSLayerFacet. + +2011-08-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Minor fixes, ressurect Facet implementation as inner class. + +2011-08-24 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Moved the input of barriers one state + earlier where the scenario is selected as well. + + * src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java: + This state now desires the "map_digitize" UI provider and returns both + items "scenario" and "uesk.barriers" in the dynamic describe part. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Removed the UI provider and the computeFeed() which is no longer needed, + because there is no more user input in this state. + +2011-08-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java, + src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: + Repaired broken xpath expressions (the config changed in one of the last + commits) and make use of the variable support in xpath expressions to + replace the rivername. + + * src/main/java/de/intevation/flys/artifacts/WMSBackgroundArtifact.java: + Save the rivername while initializing this artifact. This is now + necessary, because each river can have its own background wms + configured. + +2011-08-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Repaired broken river-wms initialization. + +2011-08-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java, + src/main/java/de/intevation/flys/artifacts/model/DataFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java, + src/main/java/de/intevation/flys/artifacts/model/ReportFacet.java, + src/main/java/de/intevation/flys/artifacts/model/DurationCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java, + src/main/java/de/intevation/flys/artifacts/model/ManagedFacetAdapter.java, + src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java, + src/main/java/de/intevation/flys/artifacts/model/WSPLGENFacet.java: + Made facets cloneable with the right type. + + * src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Removed superfluous imports. + +2011-08-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Declare the first artifact of an output as master artifact (artifacts + are ordered by their creation time). + +2011-08-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + Removed facet interface. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Make artifacts cloneable. TODO: Override deepCopy() in subclassed + states and facets. + +2011-08-23 Ingo Weinzierl + + * doc/conf/conf.xml: Added the MapInfoService and adapted the floodmap + configuration. Now, each river can have its own background wms layer + defined. + + * src/main/java/de/intevation/flys/artifacts/services/MapInfoService.java: + New. This service returns some basic information used to create maps for + a specific river. The name of the desired river needs to be defined at + "/mapinfo/river/text()". + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: + Adapted an xpath expression that points to the srid of a river in the + floodmap configuration (which changed). + +2011-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Build out/facet filter from XML document passed at creation time. + +2011-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Added some code to filter outs/facets by an optional positive list. + This is needed to only expose parts of the facets. This + is needed for artifacts which are loaded into a collection. + TODO: create the filter from the XML document passed at creation + time. + +2011-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Moved all + WINFO specific code to WINFOArtifact. FLYSArtifact is now only revolving + about state affairs. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Re-inserted + the specific stuff here. + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java, + src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java, + src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Adjusted the casts. + +2011-08-22 Sascha L. Teichmann + + * doc/conf/meta-data.xml: Filter by outs in user template part. + +2011-08-22 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Defined an input value for the GeoJSON + string to save user defined barriers in the map. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + Added a computeFeed() method. In addition, this state now prefers the + "noinput" UI provider. + +2011-08-19 Ingo Weinzierl + + * doc/conf/conf.xml: Each river requires a SRID definition. This + definition is used to transform the river's geometries into the desired + projection. + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: + This facets are able to save a SRID. + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: + The extent that is written into the WMSLayerFacet is determined by the + boundary of the geometry. + + * src/main/java/de/intevation/flys/utils/GeometryUtils.java: New. A + utility class that provides helper functions for geometries. Currently, + one function is defined, that creates a boundary string for OpenLayers. + +2011-08-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/DGMSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java, + src/main/java/de/intevation/flys/artifacts/states/ProfileDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/RangeState.java: + Removed superfluous imports. + +2011-08-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Removed CallContext from state validation. It is not needed and hindered + the extraction of all out of an artifact if you don't have a + call context (like initial scan of datacage database). + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Extract all outs now. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/FloodplainChoice.java, + src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java, + src/main/java/de/intevation/flys/artifacts/states/DGMSelect.java, + src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java, + src/main/java/de/intevation/flys/artifacts/states/ProfileDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java, + src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/DefaultState.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java, + src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java, + src/main/java/de/intevation/flys/artifacts/states/RangeState.java, + src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java, + src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Adjusted calls. + +2011-08-19 Felix Wolfsteller + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Added lacalization of "Streckenfavoriten". + +2011-08-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Picky white-space cosmetics. + +2011-08-19 Felix Wolfsteller + + Added stub implementation of new MainValuesArtifact. + + * src/main/java/de/intevation/flys/artifacts/MainValuesArtifact.java: + New. Stub implementation for new MainValuesArtifact. + +2011-08-19 Sascha L. Teichmann + + Fixed flys/issue262 + + * src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java: + Unified user and system tempate. + Looks for "/artifact-database/metadata/template/text()" + in conf.xml. Defaults to "${artifacts.config.dir}/meta-data.xml". If user id is + given its the default connection for contexts. + + * doc/conf/conf.xml: Adjusted + * doc/conf/meta-data-system.xml, doc/conf/meta-data-user.xml: Deleted. + * doc/conf/meta-data.xml: Unified version of user and system template. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/App.java: + Adjusted the test program. + +2011-08-18 Sascha L. Teichmann + + Fixed flys/issue260 + + * doc/conf/meta-data-user.xml: Uses master_artifacts view now. + +2011-08-18 Sascha L. Teichmann + + * doc/conf/datacage.sql: Added view master_artifacts to select + the master artifacts of the collections more easily. + To upgrade existing database: + + CREATE VIEW master_artifacts AS + SELECT a2.id AS id, + a2.gid AS gid, + a2.state AS state, + a2.creation AS creation, + ci2.collection_id AS collection_id + FROM collection_items ci2 + JOIN artifacts a2 + ON ci2.artifact_id = a2.id + JOIN (SELECT ci.collection_id AS c_id, + MIN(a.creation) AS oldest_a + FROM collection_items ci + JOIN artifacts a + ON ci.artifact_id = a.id + GROUP BY ci.collection_id) o + ON o.c_id = ci2.collection_id + WHERE a2.creation = o.oldest_a; + + TODO: Use the view in the templates. + +2011-08-18 Sascha L. Teichmann + + * doc/conf/meta-data-user.xml: Removed state filter because it was broken. + Simplified by joining two contexts. + +2011-08-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + Fix issues with lines of annotation when zoomed (wrong scale used). + +2011-08-18 Felix Wolfsteller + + Added legend for annotations to LongitudinalSectionDiagram. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Added a pseudo-dataseries/collection to employ existing infrastructure for + displaying localized label for Annotations (yet unthemed). + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: + Made label-string available for localization. + +2011-08-17 Felix Wolfsteller + + Moved StickyAxisAnnotation into new package de.intevation.flys.jfree . + + * src/main/java/de/intevation/flys/exports/StickyAxisAnnotation.java: + Deleted/moved to src/main/java/de/intevation/flys/jfree/ . + + * src/main/java/de/intevation/flys/jfree/StickyAxisAnnotation.java: + New/moved from src/main/java/de/intevation/flys/export/ , adjusted + package statement, made class public. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Added import statement for de.intevation.flys.jfree.StickyAxisAnnotation . + +2011-08-17 Felix Wolfsteller + + Extracted and renamed CustomAnnotation to StickyAxisAnnotation. Also removed + needless imports. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/StickyAxisAnnotation.java: + Extracted class implementation CustomAnnotation and renamed to + StickyAxisAnnotation. + +2011-08-17 Felix Wolfsteller + + Improved CustomAnnotations and rendering thereof, now including an + "axis mark" (little line at axis), also prepared possibility to put + annotations on Y-axis. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Improved CustomAnnotation to include marks on the axis and better spacing + from it. + +2011-08-17 Felix Wolfsteller + + Implemented proof-of-concept collision-detection when drawing + CustomAnnotations (text only). + + * src/main/java/de/intevation/flys/exports/ChartExportHelper.java: + Pass a fresh ChartRenderingInfo-Object to createBufferedImage, such that + information can be collected while rendering. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Exploit the fact that XYTextAnnotation already registers drawn shape in the + ChartRenderingInfo if it exists and either an URL or tooltip is set. + Before drawing, calculate own shape and compare against already registered + shapes. + +2011-08-16 Felix Wolfsteller + + Implemented (yet dummy) custom Annotation class. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Added implementation of yet dummy CustomAnnotation class. + +2011-08-16 Felix Wolfsteller + + Slightly improved rendering of annotations. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Slightly improved rendering of annotations. Still no valid collision + detection. Annotations are drawn every 2 km; first come first serve. + +2011-08-15 Sascha L. Teichmann + + Fix for flys/issue191 + + * src/main/java/de/intevation/flys/artifacts/model/WQ.java(longestIncreasingWRangeIndices): + Added a method to find the longest index range with increasing w values. + + * src/main/java/de/intevation/flys/exports/ATWriter.java: Export the longest + range of monotone increasing w values instead of the first one. + TODO: The first line of the export is still broken. + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: + Removed superfluous import. + +2011-08-12 Felix Wolfsteller + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java: + Resolved two TODOs: get Annotations of selected River, get "point" + Annotations only. + +2011-08-12 Felix Wolfsteller + + Added functionality to query range and point-annotations only to + AnnotationFactory. + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java + (getPointAnnotations, getAnnotationsBreadth): + New functions to query breadth and point-only annotations. + +2011-08-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java: + Added a development mode for recommendations. Enabled with + stetting system property 'flys.datacage.recommendations.development' to true. + When set the XML template are re-read if the timestamps of the + files have changed so you do not have to restart the server again and again. + + * doc/conf/meta-data-user.xml: Sort collections by creation time in descending order. + +2011-08-11 Felix Wolfsteller + + Rather picky cosmetics only. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java, + src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java, + src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java, + src/main/java/de/intevation/flys/artifacts/model/WQKms.java, + src/main/java/de/intevation/flys/artifacts/states/DefaultState.java, + src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + End comments on a full stop, separate from closing '*/' by whitespace, + adjusted javadoc comments. + +2011-08-11 Felix Wolfsteller + + Made Annotations visible in LongitudinalSection diagrams. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Register new Facet Type, let LongitudinalSectionGenerator include + Annotations in diagram (yet unfiltered and independent of river). + +2011-08-11 Felix Wolfsteller + + * doc/conf/conf.xml, + doc/conf/artifacts/annotation.xml, + doc/conf/meta-data-system.xml: + Added configuration for AnnotationArtifacts. + +2011-08-11 Felix Wolfsteller + + Added demo- implementation of a AnnotationArtifact and its Facet. + + * src/main/java/de/intevation/flys/artifacts/AnnotationArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/AnnotationFacet.java, + src/main/java/de/intevation/flys/artifacts/states/AnnotationRiverState.java: + New. Initial version of an AnnotationArtifact and its State and Facet. + +2011-08-10 Sascha L. Teichmann + + * doc/conf/datacage.sql: Extended schema for artifacts and collections + to have creation times, too. + + To update existing databases: + + ALTER TABLE artifacts ADD COLUMN creation TIMESTAMP NOT NULL DEFAULT current_timestamp; + ALTER TABLE collections ADD COLUMN creation TIMESTAMP NOT NULL DEFAULT current_timestamp; + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Store creation times for artifacts and collections, too. + + * src/main/resources/datacage-sql/org-h2-driver.properties, + src/main/resources/datacage-sql/org-postgresql-driver.properties: + Adjusted SQL statements. + +2011-08-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Make it compilable again (BackendListener interface changed). + +2011-08-10 Sascha L. Teichmann + + * doc/conf/meta-data-user.xml: Added grouping element around w/q of each + longitudinal section artifact. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/CompiledStatement.java, + src/main/java/de/intevation/flys/artifacts/datacage/templating/StackFrames.java: + Added some debugging capabilities. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/ResultData.java: + Added isEmpty() method. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java: + Now it is possible to nest into other elements in the + body. This is useful and needed for grouping and repeating results. + +2011-08-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java: + User connection was cached, system was not. Lead to incorrect results. + +2011-08-09 Sascha L. Teichmann + + * doc/conf/meta-data-user.xml: Added element + around old calculations. + +2011-08-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/QRangeTree.java: + Cosmetic: Replaced usage of legacy java.util.Stack with java.util.Deque. + +2011-08-04 Sascha L. Teichmann + + * doc/conf/meta-data-user.xml: Use 'CAST(x AS uuid)' instead of 'x::uuid' + to be more compatible. + +2011-08-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java: + If given an artifact place its identifier into parameters passed to template. + Fixed swapped user/system connections if using the user template. + + * doc/conf/meta-data-user.xml: Recommend w/q facet from old calculations + if an artifact was given that represents a longitudinal section + "Laengsschnitt". + + TODO I: The template uses PostgreSQL specific UUID casts. + TODO II: We need to find a way only to recommend the master artifacts. + +2011-08-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java: + Added a tag to place comments in the meta data templates. + comments are copied through. + + * doc/conf/meta-data-user.xml: Added a simple test. + +2011-08-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Be a bit more tolerant about empty strings for UUIDs of artifact and user. + +2011-08-03 Sascha L. Teichmann + + Bring user specific meta data service to life. + + * doc/conf/conf.xml: There are now two templates to configure: + The system template (only the data from the backend) and the + user template (the datcage db and the backend db), + + * doc/conf/meta-data-template.xml: Deleted. + * doc/conf/meta-data-user.xml: New. The user specific template. TODO: Write it! + * doc/conf/meta-data-system.xml: New. The system template. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/NoneUserSpecific.java: + Deleted. + * src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java: + New. The logic to fill the templates. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: + Adjusted to follow the new call signatures. + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Refactored. Removed the old code and only leave the new service. Following + XPaths are evaluated on the incomming document: + + "/art:meta/art:artifact-id/@value" The UUID of the artifact. Optional. + Used to fill the template enviroment. + "/art:meta/art:user-id/@value" The UUID of the user. Optional. + If given the user specific template is filled. + "/art:meta/art:outs/@value" The list of outs used to recommend for the + various outputs. + "/art:meta/art:parameters/@value" A list of key/value pairs to inject more + filters to the templating. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/App.java: + Change to follow the new recommendations semantics. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java: + Added symbolic constants to distinguish "user" and "system" db connections. + +2011-08-03 Felix Wolfsteller + + * doc/conf/conf.xml: + Cosmetics, let comments start with a capital and end on a full stop, + removed incorrect comment. + +2011-08-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Cosmetics, let comments start with a capital and end on a full stop. + +2011-08-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java(extractOutputNames): + Fixed potential NPE. + +2011-08-03 Sascha L. Teichmann + + Added support for more than one db connection in datacage templating. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/Builder.java: + Now you can pass a list of named db connections to the build process. + The purpose is to mix more then one database (e.g. the backend db and + the user specific one). + + To use this feature you can add an "connection" attribute + to with the name of the connection to use. + If no connection name is given the last used is used again. + Initially the first connection in the given list is used. + If the context is left the connection that was active before + will be active again in a stacking manner. + + When creating NamedConnection objects you can set a boolean flag + if the results coming from the connection should be cached. This + is useful e.g. for the user specific database which runs in-memory + so caching would introduce some superfluous overhead. + + * src/main/java/de/intevation/flys/artifacts/datacage/templating/CompiledStatement.java: + When executing the queries explicitly pass if caching should be used. + +2011-08-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Forgot to fetch dialect dependent SQL statement for deleting + artifacts by uuid. + +2011-08-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Set the name of the collections at initial scan, too. + +2011-08-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Fixed wrong SQL references. + +2011-08-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Fixed two NPEs. + +2011-08-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/DatacageBackendListener.java, + src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Forwarded kill collections and artifacts events to datacage. + + * src/main/resources/datacage-sql/org-h2-driver.properties, + src/main/resources/datacage-sql/org-postgresql-driver.properties: + Added statement to delete artifact by uuid. + +2011-08-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/DatacageBackendListener.java: + Made it compilable again. The signature of BackendListener has changed. + +2011-08-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Completed the backend listener stuff. + + TODO I: Added some cleanup for orphaned artifacts. + TODO II: Figure out a way to delete collections/artifacts + which are delete from backend without the + backend API. + + * src/main/resources/datacage-sql/org-h2-driver.properties, + src/main/resources/datacage-sql/org-postgresql-driver.properties: + Added needed statements. + +2011-08-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Update collection names on change. Remove artifacts from collections. + + * src/main/resources/datacage-sql/org-h2-driver.properties, + src/main/resources/datacage-sql/org-postgresql-driver.properties: + Added needed statements. + +2011-08-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/DatacageBackendListener.java: + Call datacage with the global context. This is needed to access the state engine. + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: Changed + signatures to take the global context, too. Create artifacts via backend listener + interface. + +2011-08-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/DatacageBackendListener.java: + Fixed recursion bug. + +2011-08-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/DatacageBackendListener.java: + Added debug output. + +2011-08-01 Sascha L. Teichmann + + * doc/conf/conf.xml: Added backend listener for datacage. + + * src/main/java/de/intevation/flys/artifacts/datacage/DatacageBackendListener.java: + New. Proxies backend listener calls to datacage. + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Implements backend listener. TODO: Update the datacage database + according the change calls. + +2011-08-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta, + src/main/java/de/intevation/flys/artifacts/datacage/templating: + Moved/renamed package to better fit the common semantics. + DataCage.java is now call NoneUserSpecific.java to reflect the + fact that it is the template for the user independent db + analysis. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java, + src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Ajusted imports and calls. + +2011-08-01 Sascha L. Teichmann + + * doc/conf/conf.xml: For documentation purposes added a out-commented + section with the default configuration of the datacage. + +2011-07-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Delete the artifacts at before initial scan, too. They are independent + from users. Fixed problem when writing state data content. + + * src/main/resources/datacage-sql/org-h2-driver.properties: Added + statement to delete the artifacts at initial scan, too. + + * src/main/resources/datacage-sql/org-postgresql-driver.properties: + New. PostgreSQL version of the statements. The database scheme + is the same as H2. Very useful for debugging. + +2011-07-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Added kludge for the types of artifact data. They seem to be null + in some circumstances. Needs to be debugged! + +2011-07-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/DBConfig.java: + Fixed default connection URL to use a namend in-mermory database. + +2011-07-31 Sascha L. Teichmann + + * doc/conf/datacage.sql: Fixed constraint. + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Added some debug output. + +2011-07-29 Sascha L. Teichmann + + * doc/conf/datacage.sql: Removed artifact_id from facet because there + is a link via out_id -> outs.id: artifact_id -> artifacts to + find the corresponding artifact. + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/resources/datacage-sql/org-h2-driver.properties: Store + facets of outs into datacage db at initial scan. + +2011-07-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/resources/datacage-sql/org-h2-driver.properties: + Store outs of artifacts into datacage db at initial scan. + TODO: store facets. + +2011-07-29 Sascha L. Teichmann + + * doc/conf/datacage.sql: Added 'type' column in artifacts data. + Maybe useful for filtering. + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/resources/datacage-sql/org-h2-driver.properties: + Store artifact data into db at initial scan. + TODO: store outs and facets. + +2011-07-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/resources/datacage-sql/org-h2-driver.properties: + Add artifacts into datacage db at initial scan. + TODO: Store data, outs and facets. + +2011-07-28 Sascha L. Teichmann + + * doc/conf/datacage.sql: Fixed spelling in sequence name. + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/resources/datacage-sql/org-h2-driver.properties: Simply add + collection item at initial scan if artifact was stored before. + TODO: Store new artifacts. + +2011-07-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/resources/datacage-sql/org-h2-driver.properties: Add + collections at initial scan. + +2011-07-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/resources/datacage-sql/org-h2-driver.properties: Add users + at initial scan. + +2011-07-28 Sascha L. Teichmann + + * doc/conf/datacage.sql: Using sequences for id generation now + to make schema more compatible. + +2011-07-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java, + src/main/resources/datacage-sql/org-h2-driver.properties: Clear database + before initial scan. + +2011-07-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/DBConnection.java: + Deleted. This stuff comes from the artifact database now. + + * src/main/java/de/intevation/flys/artifacts/datacage/DBConfig.java: + New. The db config of the datacage database. + + * src/main/resources/datacage-sql/org-h2-driver.properties: New. + The SQL statements needed for the datacage. + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + Make use of the db config. + +2011-07-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Datacage.java: + New. A artifact database lifetime listener to build the initial + index of the artifacts in database. + + * doc/conf/conf.xml: Added the datacage to the list of lifetime + listeners. + +2011-07-27 Sascha L. Teichmann + + * doc/conf/datacage.sql: Added an explicit table for the outs + of an artifact. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Make the current outs of an artifact accessible only with + the global context. + +2011-07-27 Sascha L. Teichmann + + * doc/conf/datacage.sql: Added ON DELETE CASCADE constraints. + Added state in facet. + +2011-07-26 Sascha L. Teichmann + + * doc/conf/datacage.sql: New. H2 Schema for the datacage database. + Uses special features like IDENTITY (autoincrement) typed columns. + + * src/main/java/de/intevation/flys/artifacts/datacage/DBConnection.java: + Pooled connection. + + * pom.xml: Added dependencies to H2 and Apache DBCP. + +2011-07-26 Sascha L. Teichmann + + * src/test/java/de/intevation/flys/artifacts/AppTest.java, + src/main/java/de/intevation/flys/artifacts/App.java: Removed. + This the stupid "Hello, World!" app initially created by the + maven archetype. It was never used. + +2011-07-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + Argh! Usage the DOM was not thread safe (discovered with ab). + +2011-07-25 Sascha L. Teichmann + + * doc/conf/meta-data-template.xml: '$recommended' lead to XPath + errors. Using "dc:contains($parameters, 'recommended')" helps. + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java, + src/main/java/de/intevation/flys/artifacts/services/meta/FunctionResolver.java: + Added some debugging. + + * src/main/java/de/intevation/flys/artifacts/services/meta/DataCage.java: + Added parameters as 'parameters' to parameters. Usefull to check + for containment of variables. + +2011-07-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Added 'if log.isDebugEnabled() {}'. + +2011-07-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Made Artifact UUID optional and accept extra parameters, too. This enables + the service to be used without an arttifact and test all filters. + + + + + + + + * src/main/java/de/intevation/flys/artifacts/services/meta/FunctionResolver.java: + 'contain' accept Maps and collection, too. + + * src/main/java/de/intevation/flys/artifacts/services/meta/DataCage.java: + Made artifact option (= null) in recommendations. + +2011-07-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java: + Moved connection specific into inner class. The enables the reuse of the + compiled statement. + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: The + SQL statements are now only compiled once at creation time of the builder. + Each connection now reuses them. + +2011-07-21 Sascha L. Teichmann + + * doc/conf/cache.xml: Added configuration for static datacage db access. + + * src/main/java/de/intevation/flys/artifacts/services/meta/App.java: Using + caches seems to need an explicit System.exit(). + + * src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java: + Added support for caching the SQL statements and there results. + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: Some + clean up. Reordered code for performance. Strip SQL statements more + aggressively. + + * src/main/java/de/intevation/flys/artifacts/services/meta/ResultData.java: + Made it Serializable. + + * src/main/java/de/intevation/flys/artifacts/cache/CacheFactory.java: + Introduced system property 'flys.artifacts.cache.config.file' to make + the caching configurable without pulling up the whole stack. + +2011-07-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Prepared the FLYSArtifactCollection to support the storage of already + loaded recommendations in its attribute document. + +2011-07-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Adjusted to use the DataCage recommendations. The incomming document + can pass the artifacts UUID by '/art:outs/@value' the outs as a + comma separated list in '/art:outs/@value' and optional a set of + filters comma separated in '/art:filters/@value'. + + If UUID and OUTS are not given the old service is used. This + should be removed as soon as the client uses the new service. + +2011-07-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java: + Allow '-' in variable names. + +2011-07-21 Ingo Weinzierl + + * doc/conf/meta-data-template.xml: Now, the river-id is really added to + the factory node of the wmsbackground layer. + +2011-07-21 Ingo Weinzierl + + * doc/conf/meta-data-template.xml: Added the river-id to the factory node + of the riveraxis and wmsbackground layer. + +2011-07-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java, + src/main/java/de/intevation/flys/artifacts/services/MainValuesService.java, + src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java, + src/main/java/de/intevation/flys/artifacts/services/RiverService.java: + Adjusted to implement changed Service interface. + +2011-07-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Refactored + the method that retrieves the Outputs for the Artifact. Now, we are able + to query the Outputs for the current state, and all outputs separately. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: The + recommendations provided by this monitor will take the Outputs of the + current state only into account. + +2011-07-21 Ingo Weinzierl + + * doc/conf/meta-data-template.xml: Added conditions for each output type. + Splitted the "floodmap" output into two parts: a recommended one and a + complete one. The recommended part will only build the document tree for + the recommended artifacts; the complete part will build the whole document + tree that is available for a floodmap. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: + This Hook now uses the DataCage to generate the recommended artifacts. + The output-defaults configurtion is needless now. + + * doc/conf/output-defaults.xml: Removed. The configuration of recommended + artifacts takes place in meta-data-template.xml. + + * src/main/java/de/intevation/flys/artifacts/services/meta/DataCage.java: + Bugfix: the DataCage didn't start working if its builder was NOT null, + but it shouldn't start if the builder IS null. + +2011-07-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + Now it is possible to directly pass a Node as a root to the builder. + The owning document if fetch by Node.getOwnerDocument(). This is + useful if you want to generate the recommendation directly into + an already existing document under a given node. + + * src/main/java/de/intevation/flys/artifacts/services/meta/DataCage.java: + Changed the signature of recommend() to accept a node where to + append the recommendations. + +2011-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + Added a macro mechanism: + + + '5' ist nicht in der Liste der Outs. + + + + + + Macros can be defined everywhere in the template + with 'macro'. There bodies can contain all valid elements + including other 'macro's and 'call-macro's. They are + called with their 'name' with 'call-macro'. The control flow + is continued inside the body of the called macro and + will continue right after the calling 'call-macro' when + the macro body is finished. + +2011-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + Added a new 'if' construct similiar to XSLT: + + + '5' ist nicht in der Liste der Outs. + + + The control flow is continued inside the 'if' if the 'test' attribute + as an XPath expression on an empty document evalutes to true. + Else the inside is skipped. There is no 'else'. Use 'choose'/'otherwise' + if you need this. + +2011-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/DataCage.java: + Added a recommend() method to generate recommendations for + a given artifact, outs and extra parameters. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added + method to extract all data at once. + +2011-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/FunctionResolver.java: + New. Custom XPath function provider. Provides + 'dc:contains(Object [] haystack, Object needle)' by now. Should be + useful to check containments in 'out' lists later. + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + Register the FunctionResolver to the evaluated XPaths. + + * src/main/java/de/intevation/flys/artifacts/services/meta/App.java: + Added code to parse + "param:a,b,c" to "param" -> new String [] { "a", "b", "c" } to + help testing the 'dc:contains' XPath function. + +2011-07-20 Ingo Weinzierl + + * doc/conf/conf.xml: Added wms configurations for Saar, Mosel and Elbe. + Each river supported by FLYS requires such a WMS configuration. A WMS + should contain layers for the river axis, buildings, kilometer labels + and maybe a background layer as well. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java: + Added key that is used to store a map of WMS URLs - for each river a + WMS URL. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Parse the river WMS from global configuration. + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: + Create WMSLayerFacets with URLs based on the river and the river wms + configuration stored in the FLYSContext. + + * src/main/java/de/intevation/flys/artifacts/WMSBackgroundArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java: + Adapted the initialize() signature and the method call of computeInit() + which requires a FLYSContext to retrieve the river WMS configurations. + + * src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java, + src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Added the context object parameter to the computeInit() method. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Call + initialize() with the context object - which is a FLYSContext or a + CallContext. + +2011-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/App.java: + Check if builder was created properly before using it. + + * src/main/java/de/intevation/flys/artifacts/services/meta/StackFrames.java: + Implements now variable provider for XPath expressions. + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + Added new choose/when/otherwise construct similiar to XSLT + + + + Es ist die Mosel. + + + Es ist die Saar. + + + Es ist weder Mosel noch Saar. + + + + A 'choose' block can contain a list of 'when's and an optional + 'otherwise'. For each 'when' the test attribute is evaluated + as an XPath expression on an empty document. The result of + the evaluation is taken as a boolean value. If its value is + true the control flow is continued inside the corresponding + 'when' and the other choose elements are not tested. + If the value is values the testing continues with the next + 'when'. If no 'test' expression is evaluated to true, the + control flow continues inside the 'otherwise'. If no 'otherwise' + is given nothing happens at all. + +2011-07-20 Ingo Weinzierl + + * doc/conf/conf.xml: Added a config section for floodmaps. Currently, the + background layer's url and layername is defined here. + + * src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java: + Read the background layer configuration from conf.xml. Those values are + used to create the WMSLayerFacet. + +2011-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java: + The background layer facet will no longer have an extent set. + +2011-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java, + src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java: + Set the extent of the created WMSLayerFacets and i18n its descriptions. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added I18N strings for the + background an river axis layer. + +2011-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: + This facet type has a method to set the extent of a WMS layer. The + extent is written to the facets XML node in toXML() as well. + +2011-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Adapted + the signature of setup() which requires a CallMeta parameter now. + + * src/main/java/de/intevation/flys/artifacts/WMSBackgroundArtifact.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java: Use + the CallMeta object retrieved in setup() to call initialize(). It is now + able to i18n things. + +2011-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/App.java: New. + Standalone app to debug the datacage template. To use in a maven environment: + + -Dmeta.data.template=PATH_TO_META_DATA-TEMPLATE.XML \ + -Dmeta.data.parameters=river:Mosel \ + -Dmeta.data.output=OUTPUT.XML \ + -Dflys.backend.user=DB_USER \ + -Dflys.backend.password=DB_PASSWORD \ + -Dflys.backend.url=DB_CONNECTION_URL \ + -Dexec.mainClass=de.intevation.flys.artifacts.services.meta.App + +2011-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/DataCage.java: + New. First step to factor out the "Datenkorb" logic into a service independent + singleton. + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Uses the "Datenkorb" singleton now. + +2011-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java: + Removed "index" property, because it is already existing in parent + class. + +2011-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Improved error handling. + +2011-07-19 Sascha L. Teichmann + + * src/main/resources/metadata/template.xml: Deleted. + + * doc/conf/meta-data-template.xml: New. Was template.xml + + * doc/conf/conf.xml: Made meta data template configurable. + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Load template from configuration not from resources. + +2011-07-19 Sascha L. Teichmann + + * src/main/resources/metadata/template.xml: s/[a-z]+-id/db-id/ + Make database ids identifiable with unique name "db-id". + +2011-07-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java: + Override the toXML() method. Subclasses can now write their own XML + representation. + + * src/main/java/de/intevation/flys/artifacts/model/ManagedDomFacet.java: + New. This ManagedFacet uses an Element (DOM) to store the information + about a facet. The intent of this facet type is to represent a facet + stored in an Collection attribute. Different facets can have different + attributes that we need to parse, but the only thing ManagedFacets need + to do, is to adjust the attributes "active" and "position". So, those + values are set directly on the Element, the other attributes aren't + touched. + + * src/main/java/de/intevation/flys/artifacts/model/ManagedFacetAdapter.java: + New. This facet is a wrapper for another facet. This subclass of a + ManagedFacet overrides the toXML() method. The XML representation is + defined by the inner facet that is stored as member variable. The + ManagedFacet specific attributes "artifact", "facet", "pos" and "active" + are added manually. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: Uses + the toXML() method to write a facet node into the attribute document. + + * src/main/java/de/intevation/flys/collections/AttributeParser.java: Uses + the ManagedDomFacet to save the information of a facet which is + contained in the attribute part of a Collection's DESCRIBE document. + + * src/main/java/de/intevation/flys/collections/OutputParser.java: Uses the + ManagedFacetAdapter to save a facet, because we want to keep the + specific facet to be able to write its specific XML representation into + the Collection's DESCRIBE document. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Adapted the XPath of facets stored in the attribute part of the + DESCRIBE. + +2011-07-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + method that returns the Outputs for the Artifact. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Adapeted the call of OutputParser. + + * src/main/java/de/intevation/flys/collections/OutputParser.java: + Simplified the code to read the Outputs of Artifacts. This parser will + now longer parse the DESCRIBE documents of the Artifacts, but query the + Outputs via FLYSArtifact.getOutputs() directly. + +2011-07-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java: + Adapted the function call of ProtocolUtils.appendOutputModes(). + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: + Override toXML() to add the URL and layernames to the XML representation + of this facet. + +2011-07-18 Ingo Weinzierl + + * doc/conf/artifacts/wmsbackground.xml, + doc/conf/artifacts/riveraxis.xml: New configurations for an Artifact + that is used as background layer in floodmaps, and an artifact that is + used as layer showing the river axis in a floodmap. + + * doc/conf/output-defaults.xml: New file to configure default artifacts + for specific output states. E.g. the floodmap state recommends a + background layer and a layer displaying the river axis. In suche case, + the floodmap state recommends two artifacts for the two layers. + + * doc/conf/conf.xml: Added new artifacts/artifact-factories and a Hook to + monitor artifacts (-> CollectionMonitor.java). + + * src/main/java/de/intevation/flys/artifacts/model/WMSLayerFacet.java: + New. This facet is used to represent a layer in a map. So, this facet + stores information about a WMS URL and the layer names provided by this + WMS. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + facet types for the wmsbackground and riveraxis. + + * src/main/java/de/intevation/flys/artifacts/states/WMSBackgroundState.java, + src/main/java/de/intevation/flys/artifacts/WMSBackgroundArtifact.java: + New. An artifact and its default state. The intent of these classes is + to generate WMSLayerFacets which represent background layers in maps. + + * src/main/java/de/intevation/flys/artifacts/states/RiverAxisState.java, + src/main/java/de/intevation/flys/artifacts/RiverAxisArtifact.java: New. + An artifact and its default state. The intent of these classes is to + generate WMSLayerFacets which represent layers that display a river + axis. + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Added the INIT ComputeType. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + case for the INIT ComputeType while computing data. + +2011-07-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Added a method computeInit() which is called to initialize data/facets + after an artifact has been created. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Repaired + broken XPath. + +2011-07-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: + Removed the code to generate new artifacts. Instead of creating new + artifacts automatically, we decided to suggest creating new artifacts + from specific types. Therefore, the DESCRIBE document of the artifacts + is extended with a node that contains recommended artifact types. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + FLYSArtifacts might be setup with the identifier of an other + FLYSArtifact. Subclasses are able to override a method called + initialize(Artifact, GlobalContext). This might be helpful to extract + required values or clone artifacts. + +2011-07-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Adapted the signature of createArtifactContext() - it returns an + instance of GlobalContext now. + +2011-07-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java: + Debugged the water fill algorithm. Added a lot of logging. + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + Added a text field to give a water level to fill in. + +2011-07-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Moved code + to create the output modes based on the given facets to FLYSArtifact. In + addition, FLYSArtifact got a new method that returns a specific input + value as string. + + * src/main/java/de/intevation/flys/artifacts/CollectionMonitor.java: New. + This hook monitors the "post-feed" and "post-advance". If the monitored + Artifact's state has configured recommended artifacts, this hook will + create new Artifacts. + + TODO: We have to add the UUIDs of the new Artifacts to the DESCRIBE + document of the artifact to let the client know, that there are new + recommended Artifacts. + + * src/main/java/de/intevation/flys/artifacts/StaticFLYSArtifact.java: New. + This Artifact is the base class for Artifacts, that represent static + data. E.g. this could be a decoration theme in a chart or a background + layer in the map. + + * src/main/java/de/intevation/flys/artifacts/states/OutputState.java: New. + This state might be used as base class for states, that doesn't require + any user input, but only provide static Facets added by a computeFeed() + operation. So, subclasses need to implement computeFeed() only. + +2011-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + New. Standalone Swing-App to test cross sections from database without the + hassles of our complete software stack. Runnable from a maven environment: + + $ mvn -e \ + -Dflys.backend.user=DB_USER \ + -Dflys.backend.password=DB_PASSWD \ + -Dflys.backend.url=DB_CONNECTION_URL \ + -Dexec.mainClass=de.intevation.flys.artifacts.charts.CrossSectionApp \ + exec:java + + You can set the river to be used with the system property 'river'. + Defaults to 'Mosel'. + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENFacet.java: + Removed superfluous imports. + +2011-07-13 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: The FloodMapState has a new Outputmode + called "floodmap" now. + + * src/main/java/de/intevation/flys/artifacts/model/WSPLGENFacet.java: New. + This facet is used to generate WSPLGEN results. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Added + the WSPLGENFacet. + + * src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java: + This state will now generate WSPLGENFacets. + +2011-07-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java: + Fixed corner case. + +2011-07-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/geom/Lines.java: New. + fillWater() generates a list of wet lines for a given profile and a + given water level. + +2011-07-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: The + Outputs created while generating the DESCRIBE document will now have the + 'type' member set. + + * src/main/java/de/intevation/flys/collections/OutputParser.java: Read the + 'type' member from DESCRIBE document. + +2011-07-06 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Removed a typo. + +2011-07-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/DataFacet.java: + DataFacet are now able to store the ID of the state which has created + this Facet. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Initialize DataFacets with the ID of this state. This is necessary to + renew the waterlevel data if it is no longer existing in the cache. + +2011-07-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/ReportFacet.java: A + report facet can now store the state's id and the artifact's hash value + when it has been created. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Initialize the ReportFacet and WaterlevelFacet with state id and hash + information. This has been necessary to retrieve reports and waterlevels + in states after this one - in states that we need to enter for floodmap + parameterization. + +2011-07-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelGroundDifferences.java: + Changed the desired UI provider. + +2011-07-05 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added the option to continue the + waterlevel parameterization with the intent to create flood maps. + + * src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + This state is no longer a final state. The user has the option to + continue with the parameterization for flood maps based on the current + waterlevel. Therefore, this states desires the "continue" UI provider. + Clients should recognice this to just step to the next state or display + a button that lets the user step to the next state manually. + + * src/main/java/de/intevation/flys/artifacts/states/FloodplainChoice.java, + src/main/java/de/intevation/flys/artifacts/states/FloodMapState.java, + src/main/java/de/intevation/flys/artifacts/states/ScenarioSelect.java, + src/main/java/de/intevation/flys/artifacts/states/DGMSelect.java, + src/main/java/de/intevation/flys/artifacts/states/ProfileDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelGroundDifferences.java: + New. These states are used to parameterize a further calculation type: + flood map. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Required strings for the + flood maps states. + +2011-07-04 Sascha L. Teichmann + + Fix(?) for flys/issue114 + + * src/main/java/de/intevation/flys/artifacts/model/WQ.java: + Make guessing a bit more robust. + +2011-07-03 Sascha L. Teichmann + + Added the math needed to calculate "W-Differenzen" in "Laengsschnitten". + Needs testing! + + * src/main/java/de/intevation/flys/artifacts/model/NamedObject.java: + Made it an interface to be usable in more than one inheritance chain. + + * src/main/java/de/intevation/flys/artifacts/model/NamedObjectImpl.java: + Implements the NamedObject interface and is the new base class of + WQ and WKmsImpl. + + * src/main/java/de/intevation/flys/artifacts/model/WKms.java: + New. Interface to associate kms with ws. + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: + Changed the base class to NamedObjectImpl. Renamed getKms(int) + to getKm(int) to make clear it return a single scalar value + and fullfil the WKms interface. + + * src/main/java/de/intevation/flys/artifacts/model/WKmsImpl.java: + New. Implements the WKms interface. Intended to be a lightweight + datastore for "zusaetzliche Laengsschnitte" and as results + of the WKmsOperations. + + * src/main/java/de/intevation/flys/artifacts/model/WQ.java: + Changed base class to NamedObjectImpl. + + * src/main/java/de/intevation/flys/artifacts/math/WKmsOperation.java: + New. Operations on WKms data. + Currently only the SUBTRACTION operation is implemented. This + one is needed to calculate the "W-Differenzen". The operation + is insensitive about the km directions of the datasets. Missing + values are interpolated linear. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Adjusted to satisfy the signature change of WQKMs. + +2011-07-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/StyledXYSeries.java: New. This + XYSeries stores the style information that should be used to render this + series. These information are stored as raw XML documents. A public + method can be used to apply those style information to a + XYLineAndShapeRenderer. + + Note: The only two attributes currently supported by StyledXYSeries + items are "linesize" and "linecolor". + + * doc/conf/themes.xml: Added some more basic themes for the four + calculation methods. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: This + generator now tries to apply themes for all series contained in the + chart. If a series is no instance of StyledXYSeries, the default + renderer is used. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Removed the code that had been introduced to adapt renderers statically. + Now, each of these concrete ChartGenerators instantiates StyledXYSeries + items to put the curves into the chart. Those items contain style + information now! + +2011-07-01 Ingo Weinzierl + + flys/issue135 (Diagramm: Trotz abgeschalteter Themen bleiben Beschriftungen bestehen) + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: The way + to store datasets has changed. Until this revision, the concrete + generators managed their own datasets. E.g. the + DischargeLongitudinalSectionGenerator had three datasets: w, q and + corrected w. Now, there are just two datasets, managed by this base + generator - one dataset for the first Y axis and one dataset for the + second Y axis. This makes it easier to remove axes, that have no data to + be displayed. All concrete chart generators have to add their XYSeries + using two methods: addFirstAxisSeries() and addSecondAxisSeries(). + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Those concrete chart generators no longer manage datasets themself but + they use the two methods described above, to plot the data to the first + or second Y axis. + +2011-07-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java: + Added the option to use a filter to reduce the number of items returned + by this service. + +2011-06-30 Ingo Weinzierl + + flys/issue159 (WINFO: Radiobutton - Ortsauswahl bei "W für ungleichwertigen Abflusslängsschnitt" entfernen) + + * doc/conf/artifacts/winfo.xml: Changed the kilometer range input for + calculation 4. This calculation type requires a kilometer range. So, + after choosing the calculation 4, the transition model leads to a state + that just allows the input of a kilometer range with no option to + enter locations. + + * src/main/java/de/intevation/flys/artifacts/states/ComputationRangeState.java: + New. A base state for the kilometer selection for calculations. The + target of this state is to provide facets for the duration curves. + + * src/main/java/de/intevation/flys/artifacts/states/DistanceSelect.java: + New. This state is used to enter a kilometer range. The difference to + the LocationDistanceSelect state is, that there is no option to enter + locations. + + * src/main/java/de/intevation/flys/artifacts/states/RangeState.java: + Improved this state to be the base state for calculation ranges. + + * src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java + src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: This + state no longer inherits from RangeState which now is used as base + state for kilometer ranges. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added new i18n strings for + the DistanceSelect state. + +2011-06-28 Sascha L. Teichmann + + * pom.xml: Downgraded Trove to 1.1-beta-5, because the new + later ones are removed from the maven repos. + + The functionality we need is in 1.1 so this downgrade should + cause no problems. + + Would be nice if we would support the maintainers of trove to + bring there new versions back into the main maven repos. + +2011-06-28 Ingo Weinzierl + + * pom.xml: Repaired the JBoss repository which place has changed. + +2011-06-28 Ingo Weinzierl + + Tagged RELEASE 2.4 + +2011-06-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/WstWriter.java: + Append the corrected W column (if existing) to the WST export. + +2011-06-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WQ.java: + Guessing increaing w is not based on direct neighbors any more. + The second to be compared with is choosen by random of + the values before the first one. This makes the guessing + more robust against 'plateaus' of equal w values. + +2011-06-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/ATWriter.java: Array + for constructing the spline was too large leading to non-increasing + values. + +2011-06-27 Sascha L. Teichmann + + Fix for flys/issue150 + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Invert the x axis if its guessed that water is increasing. + +2011-06-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WQ.java(guessWaterIncreasing): + Added a method to guess based on a given factor of the size (default 0.05) + if the water levels are increasing. Needed to determine in which direction + the water level curve should be orientated. Based on random to avoid + running over large dataset each time a diagram is generated. + +2011-06-27 Ingo Weinzierl + + flys/issue177 (WINFO: Abflusskurven am Pegel verursachen ein Hängen des Servers) + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Commented out code to generate time ranges for series names. There + seems to be a problem while loading the discharge tables of a gauge or + while determining the start and/or end time of such discharge tables. + +2011-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/**/*.java: Removed trailing whitespace. + +2011-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Removed dead code. + +2011-06-26 Sascha L. Teichmann + + Fix for flys/issue173 + + * src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Fixed the way the gauge was found for a given interval. + The old way does not work because it was just tested if + the station point was inside the segments which is not + necessarily true. The obvious solution to simply check + the overlapping intervals does not work either because + the gauge ranges touch each other and so more than + one gauge are returned in these cases. The River.maxOverlap() + is now used to find the gauge with the max overlapping + range. + +2011-06-26 Sascha L. Teichmann + + Fix for flys/issue147 + + * src/main/java/de/intevation/flys/artifacts/model/Calculation1.java: + Removed the 'kmUp' flag. It was an left over from former + WSP calculations (w/o ref km) leading to wrong results now. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Don't pass the kmUp flag to the calculation. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Added debug output to see the value of 'wq_free'. + +2011-06-26 Sascha L. Teichmann + + Fix for flys/issue86 + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + The reference gauge for calculations "am Pegel" was determined + wrong. + +2011-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Conversion w->q was broken. This should fix a number of issues + around "W am Pegel" calculations. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Issue an error report if a w->q conversion fails. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + The gauge to convert w->q with its discharge table was determined wrong. + +2011-06-24 Ingo Weinzierl + + flys/issue174 (Diagramm: Q-Linie wird bei initialem Laden des Diagramms + anders dargestellt als bei Ansicht auf gesamten Wertebereich) + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + The chart will now have upper margins again. + +2011-06-24 Ingo Weinzierl + + flys/issue172 (Diagramm: Ursprung der Diagramme bei Dauerzahlen) + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Charts of this type will have the lower X value set to "0". + +2011-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/ATWriter.java: + Results are now in cm. Made it more robust against corner cases. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Removed superfluous import. + +2011-06-23 Sascha L. Teichmann + + * doc/conf/artifacts/winfo.xml, doc/conf/conf.xml: + Added facet config for AT exports. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added 'at' facet type. + + * src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java: + Generate AT facets. + +2011-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/ATExporter.java: New. + Exporter for AT facets. Needs testing. + +2011-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/ATWriter.java: New. + Writer for AT files. New code because our data model differs + from Desktop-FLYS. Needs testing. + +2011-06-23 Ingo Weinzierl + + flys/issue157 (Diagramm: Ursprung berechnete Abflusskurve) + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Moved the method that adjusts the X-axis to include the "0" value from + ComputedDischargeCurveGenerator to DischargeCurveGenerator. Now, both + charts will include the "0" on the X-axis. + +2011-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WQDay.java: + Based on WQ now to make it exportable as AT. + +2011-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WQ.java: + New. Base class for WQKms. + + TODO 1: make it a base class for WQDay, too, + TODO 2: Generate instances of WQ instead of WQKms in "Abflusskurven" + calculations. This will save memory. + + AT exporter will get instances of this class as data model + + * src/main/java/de/intevation/flys/artifacts/model/NamedObject.java: + Add default constructor to ease inheritance. + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: + Based on WQ now. Removed code allready defined in base class. + +2011-06-23 Sascha L. Teichmann + + * doc/conf/artifacts/winfo.xml: Add TODOs for error reports + of "Abflusskurven am Pegel". Maybe we don't need them? + + * doc/conf/conf.xml: Configure report for each calculated output type. + +2011-06-22 Ingo Weinzierl + + flys/issue164 (Berechnung 4: Umgekehrtes Berechnungsintervall führt zur) + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Create the items with range information for W and Q which allows the + client to validate the user inserted values. + +2011-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Arguments in filling datastructure were flip. Now + the "Abflusskurve am Pegel" looks correct again. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Removed superfluous imports. + +2011-06-21 Sascha L. Teichmann + + Improved situtation on rendering "Abflusskurve am Pegel". Not + fully working, yet. + + * doc/conf/artifacts/winfo.xml: Generate facets for the location path, too. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: Misspelled + the facet which prevented the facets from being to the outputs. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: + Extended to store the hash and the state id of the producing artifact/state + else it results in NPEs because the data is calculated on later (wrong) states. + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + Store the state id and the hash in the facet, too. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Add two + method to do calculations for a state the artifact is currently not in + and fetching the current state id. + +2011-06-21 Sascha L. Teichmann + + * doc/conf/artifacts/winfo.xml: Generate facets for "Abflusskurven am Pegel" + Not working by now. :-/ + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: New facet type + for "Abflusskurven am Pegel" + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Do calculation + in the artifact not in the output generator. + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + Generate the new facets. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Fetch data from facet. + +2011-06-22 Ingo Weinzierl + + flys/issue161 (Diagramm: Q-Achse in W-Längsschnitten immer bei Q=0) + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + The Q axis (which is the second y axis) initially contains the 0 value. + After a zoom action has taken place, this behaviour is no longer + supported. + +2011-06-21 Sascha L. Teichmann + + Draw correction curve again. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java: + Use correction curve to map plot to axes. Not doing so prevented + the correction curve from being drawn! + Smaller code cleanups and simplifications. + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java, + src/main/java/de/intevation/flys/artifacts/model/WQCKms.java: + Added methods to directly access the components w, q and c + at a given index. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: + Attribute access via DOM instead of XPath. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Code simplification. + +2011-06-21 Ingo Weinzierl + + flys/issue157 (Diagramm: Ursprung berechnete Abflusskurve) + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Splitted + up zooming for x and y axes to be able to override specific axis + zoom behaviour. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + The lower bound of the x axis (which is the Q axis in such chart) is + always 0. + +2011-06-21 Ingo Weinzierl + + flys/issue90 (Diagramm: Trennung derDiagrammfläche und Achsenaufheben) + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Added a margin between chart data and chart axes. + +2011-06-21 Sascha L. Teichmann + + Fix for flys/issue158 + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java: + Checks for right class now. + +2011-06-21 Sascha L. Teichmann + + Fix for flys/issue154 + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java: + Checks for right class now. + +2011-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Only generate 'outs' if they have facets. + + * src/main/java/de/intevation/flys/exports/ChartExportHelper.java: + 'boolean ? true : false' <=> 'boolean' + +2011-06-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Added the time-to-live to the DESCRIBE document. + +2011-06-20 Sascha L. Teichmann + + * doc/conf/artifacts/winfo.xml: Configured states to generate report facets. + +2011-06-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/ReportFacet.java: + Return the report. + + * src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java, + src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: + Generate report facets if there are problems with the calculations. + TODO: Adjust winfo.xml to configure the facets. + +2011-06-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/ReportGenerator.java: + New. Generator for calculation reports. + + * doc/conf/conf.xml: Added ReportGenerator. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + Added type 'report'. + + * src/main/java/de/intevation/flys/artifacts/model/ReportFacet.java: + Specialized facet for serving reports. TODO: Added them to the + calculation states. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation.java: + Looped through CallMeta for i18n purposes. TODO: do i18n + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Removed superfluous import. + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: + Added some override annotations. + +2011-06-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/CalculationResult.java: + New. Used to transport the data and the error report. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation1.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation2.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation3.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation4.java, + src/main/java/de/intevation/flys/artifacts/model/DurationCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java, + src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java, + src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java: + Use the CalculationResult now. + +2011-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation1.java: + Allow an explicit reference km to enable calculation "am Pegel". + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + If a calculation "am Pegel" is done, take start km of the + calculation range and find the gauge in which range it is located. + Take the station of the gauge as the reference km. If no gauge + is found the calcualtion falls back to calculation "auf freier Strecke". + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Replaced another inefficient attribute extraction via XPath + with direct DOM access. + +2011-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java, + src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Removed dead code. + +2011-06-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DataFacet.java + src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java, + src/main/java/de/intevation/flys/artifacts/model/DurationCurveFacet.java, + src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java, + src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Only generate facets when needed. + + * src/main/java/de/intevation/flys/collections/OutputParser.java: + Removed more XPath for simply accessing attributes of an element. + + * doc/conf/cache.xml: 200 elements in memory for "computed.values" are enough, + LRU as eviction strategy is sufficent. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java, + src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Use + more 'standard' Java naming conventions. + +2011-06-17 Sascha L. Teichmann + + Merged in the facet-slt branch to bring in the 'facet' feature. + + * doc/conf/artifacts/winfo.xml: Fixed some facets. + + * doc/conf/cache.xml: Added a "computed.values" cache to store the + results of the WINFO calculations. + + * src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java: + Add support for index per facet to make them unique and identifiable. + + * src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java: + New. Inteface to be used to access the facet names of the configuration. + + * src/main/java/de/intevation/flys/artifacts/model/DataFacet.java: New. + A facet to be used to have raw access to the computed data of an artifact. + Useful to export things like CSV and WST. + + * src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java: New. + Specialized facet to access the water level data stored in WQKms arrays. + + * src/main/java/de/intevation/flys/artifacts/model/DurationCurveFacet.java: New. + Specialized facet to access the duration data stored in WQDay data structures. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Facets are + now generated dynamically from the current available ones stored with + the artifact. + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: Added + methods computeAdvance() and computeFeed() called if artifact is fed or + adance. This overwritten in subclasses to do the state depending calculations. + + * src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java, + src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/WaterlevelState.java: These + states overwrites the computeAdvance() and computeFeed() methods to do + the corresponding WINFO calculations. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Calls + computeAdvance() and computeFeed() if artifact is fed or advanced. Centralized + the caching mechanism. + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java, + src/main/java/de/intevation/flys/collections/AttributeParser.java, + src/main/java/de/intevation/flys/collections/OutputParser.java, + src/main/java/de/intevation/flys/collections/AttributeWriter.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Adjusted the code to cope with the indices of the facets. Used + DOM to access the attributes instead of XPath. Removed smaller bugs + concerning position generation. + + * src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java, + src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/OutGenerator.java: + Forwarded facet references. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Uses facets to fetch data and generate output now. + +2011-06-17 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added a new parameter "wq_free" that + determines the mode of calculation 1. If it is "false" (default), + the calculation should be bound to a gauge. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + method to retrieve the information about the "wq_free" parameter. + +2011-06-17 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added a facet for corrected W in + computation 4. + +2011-06-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java: + Got rid of namespace in result document. + +2011-06-14 Ingo Weinzierl + + flys/issue77 (Diagramm: Beschriftung der Kurven bei Dauerlinien) + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Give the curves in the chart names. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added titles for duration + chart curves. + +2011-06-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java: + Write top 'Oberkante' and bottom 'Unterkante' to out going XML + if they exist. + +2011-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Write the min/max W/Q ranges as art:range elements into the DESCRIBE. + +2011-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java: + This state that is used to retrieve locations will now write the + kilometer range of the selected river into the DESCRIBE document. + +2011-06-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation1.java: + New. Factored out version of "Wasserspiegellage" calculation. + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: + + Removed some dead code. + + * src/main/java/de/intevation/flys/artifacts/model/WQCKms.java: + Added Override annotation and used quick access method. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Looped through error reporting use by interpolate. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Used factored out version of calculation 1. Removed dead code. + +2011-06-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation2.java: + New. Factored out version of "Abflusskurve". + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Loop errors through w/q at km interpolation. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Use factored out version of calculation 2. + +2011-06-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation3.java: + New. Factored out version of "Dauerzahlen". + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Loop errors through for q->w interpolations. + + * src/main/java/de/intevation/flys/artifacts/model/WQDay.java: + Added constructor to directly create with calculated results. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation.java: + Added method to return the number of problems. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Use factored out version of calculation 3. + +2011-06-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java, + src/main/java/de/intevation/flys/artifacts/model/WQCKms.java, + src/main/java/de/intevation/flys/artifacts/model/WQDay.java: + Added methods to remove NaN values. + +2011-06-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation.java: + New. Base class for calculations. Used to collect problems occuring + during calculation. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Extends Calculation now. Looped through the problem reports to + base class. + + * src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java: + Looped through the problem reports. + +2011-06-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: + Append the min/max range and a transformation matrix for each axis. + + * src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: + Instantiate the InfoGeneratorHelper with a XYChartGenerator instance. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Changed the zoom operation. The zoom values defined in the chart request + document are no longer absolute values for a specific axis. Those values + represent percental values for the start and end point of x and y axes. + E.g. a chart has three axes with the following ranges: + - x axis : 0 - 10 + - y axis 1: 20 - 40 + - y axis 2: 40 - 90 + - zoom values for x: 0.1 - 0.9 (10% - 90%) + - zoom values for y: 0.2 - 0.8 (20% - 80%) + The produced chart will have the following ranges: + - x axis : 1 - 9 + - y axis 1: 24 - 36 + y axis 2: 50 - 80 + +2011-06-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Map datasets to axes correctly. + +2011-06-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Determine the gauges by their station positions. This hopfully + fixes the problem with wrong assigned gauges and invalid segments. + +2011-06-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Segment.java, + src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Added more debug output. + +2011-06-08 Ingo Weinzierl + + flys/issue103 PART 1 (WINFO: Wasserspiegellagenberechnung / Layout-Inkonsistenz) + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Selected values are formatted with the current locale. The static part + of the DESCRIBE document will now contain i18n formatted numbers. + +2011-06-08 Ingo Weinzierl + + flys/issue93 (WINFO: Benennung der Berechnungsart korrigieren) + + * src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties: Changed the name of + calculation 4. + +2011-06-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Made the range determination more robust against NaN values. + +2011-06-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + The second y axis is set to position "1". It was set to "2" before, but + in that case, there was no position "1". + +2011-06-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + s@m³/s@m\\u00b3/s@ + +2011-06-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: + Only generate an axis element if a axis really exists. + +2011-06-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java: + Simpified array swapping. + +2011-06-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Use java.util.List instead of java.util.Vector + + * src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java, + src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Removed superfluous imports. + +2011-06-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + createItem() is not abstract any longer to avoid code repetitionin sub classes. + + * src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java, + src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java, + src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java, + src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java, + src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + Removed duplicated code, inserted default constructors and Override annotations. + +2011-06-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: + Append axes range information to the info document. + +2011-06-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + If feed() fails do not store invalid values in database. + +2011-06-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: + Removed asymmetrical "- 1" from width calculation. + +2011-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + Fixed problem when more than one value per segment are given. + +2011-06-05 Sascha L. Teichmann + + Refactored version of "Berechnung 4" + + * src/main/java/de/intevation/flys/artifacts/model/Segment.java: + Added instance fields for a reference point (= location of gauge) + and backup of values (needed for naming). + + * src/main/java/de/intevation/flys/artifacts/model/WQCKms.java: + Added a constructor to be created from a WQKms. This is helpful + if a WQKms is replaced by a back jump correction. + + * src/main/java/de/intevation/flys/artifacts/model/Calculation4.java: + New. Outfactored version of "W bei ungleichmaessigen Abflusslaengsschnitt". + Much cleaner now and it should have a better handling of the corner + cases. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Removed the linear interpolation stuff. It is now in Linear. Removed + the LinearRemap interpolation method because it is not needed any + longer. Added a method to interpolate a given km with a given + function. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Removed the old calc 4 and used the new one. + + * src/main/java/de/intevation/flys/artifacts/math/LinearRemap.java: + Deleted. Not needed any longer. + + * src/main/java/de/intevation/flys/artifacts/math/Function.java: + New. Interface for a uni-variate real function. + + * src/main/java/de/intevation/flys/artifacts/math/Identity.java: + New. Implements Function with f(x) = x + + * src/main/java/de/intevation/flys/artifacts/math/Linear.java: + New. Implements Function with f(x) = m*x + b + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Factored some stuff out to DoubleUtil. Removed some dead code. + Does some rounding correct. + + * src/main/java/de/intevation/flys/utils/DoubleUtil.java: New. + Centralized utils surrounding common double operations. + + * src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: + Removed superfluous imports. + +2011-06-03 Ingo Weinzierl + + flys/issue90(Diagramm: Trennung der Diagrammfläche und Achsen aufheben) + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Determine the ranges of x and y axes. If no zoom ranges are given, we + will determine the min and max xy values in the dataset manually, + because JFreeCharts adds a margin to the left and right of the data + area automatically.. + +2011-06-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Moved + the chart creation into an own public method. This lets the + ChartInfoGenerator create charts without duplicating code. + + * src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: + Limited the possible class for generators to XYChartGenerator. This + enables the ChartInfoGenerator class to do the whole chart creation + stuff itself without outsourcing the code to concrete subclasses. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionInfoGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionInfoGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveInfoGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveInfoGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveInfoGenerator.java: + Removed the code to generate charts - this is done in ChartInfoGenerator + now. + +2011-06-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Added new + methods to extract the x and y ranges from request document. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Added a + method that zooms the chart to the specified x and y ranges. + +2011-06-02 Sascha L. Teichmann + + * doc/conf/conf.xml: Set collection ttl to 6 hours. + +2011-06-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/Segment.java: + New. Parse segments only once. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Expose new parser to artifacts. TODO: Use it. + +2011-06-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Changed interpolation methods to interpolate to an arbitrary position + in a given double result array as a preparation for segment independent + calculation. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Removed superfluous import. + + * src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java: + Fixed cause for crashing: Run back too far in some siutations. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Refactored range code a bit. Needs more work. + +2011-06-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: + Interchange the lower and upper x value of the chart if the x-axis is + inverted before the matrix values are computed. Now, the matrix is able + to work with charts that have an inverted x-axis. + +2011-06-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartInfoGenerator.java: New. A + chart info generator generates a document that contains meta information + for a specific chart. Concrete instances of this abstract class need to + instantiate concrete ChartGenerators and dispatch nearly all methods of + an OutGenerator (init(), doOut(), setMaster()) to this instance. The + generate() method is implemented in the ChartInfoGenerator itself. It + creates a chart with help of the ChartGenerator instance and builds a + document that contains meta information of this chart. + + * src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java: New. + This helper is used to create the chart info document. At the moment, + the only information that is included in this document is a + transformation matrix to transform image coordinates into chart + coordinates. + + NOTE: The transformation matrix creation needs some work to support + charts with inverted X axis. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionInfoGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionInfoGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveInfoGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveInfoGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveInfoGenerator.java: + Concrete instances of ChartInfoGenerator that create the chart info for + the currently supported chart types. + + * doc/conf/conf.xml: Registered new OutGenerators. + +2011-05-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Added support for the 'type' paramter of the collection's out() + operation. + +2011-05-31 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Use an explicit reference km for interpolation now. + +2011-05-30 Sascha L. Teichmann + + * doc/conf/cache.xml: Introduced cache to store the distance info per river. + This boosts performance in following ab setup from 3.61 to 39.91 requests/secs. + + $ ab -c 20 -n 1000 -p distances.xml http://127.0.0.1:8181/service/distanceinfo + + $ cat distances.xml + + Elbe + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java: Added + an iterator result to avoid construction expensive interim lists. + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java: Use + the cache if configured. + +2011-05-30 Sascha L. Teichmann + + flys/issue82 + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Only successful interpolations are named. + +2011-05-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java: + Make it work independent of river flow direction. + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Fixed bug in ordering segments + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Re-enabled + calculation of the back jump correction. Fixed more flow direction issues. + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Removed call of XMLDebug class which is not in the version control. + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Moved the code part that skips themes right after the part that sets the + master artifact for the OutGenerator. We need this master artifact to + display empty charts - master artifact is used to create titles and + axes. + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Deactivated themes are not put into the chart. + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/AttributeParser.java: + Repaired broken XPath expressions to find the output modes in an + attribute document of a collection. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: This + writer will now create a document that has a root node art:attribute. + Before these changes, the document's root node was art:outputs which is + part of the attribute document but not the right root node. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Adapted some XPath expressions and corrected the the process to create + attribute documents. + +2011-05-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/LinearRemap.java: + Made it work independent of from/to order. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Added method to extract the ranges correctly from data. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Use the correct ranges. Comment out backjump detection temporarily. + +2011-05-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Generate fields for w/q input depend on flow direction. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Moved km up question out of loop. +2011-05-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Take the flow direction into account. + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Prevent NPE. + + * src/main/java/de/intevation/flys/artifacts/states/RangeState.java: + Allow to be 'from' greater than 'to' in ranges. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Negate + step if 'from' is greater than 'to'. + +2011-05-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Round exploded values to a precision of 1e-6. + +2011-05-25 Sascha L. Teichmann + + Qs are now stored in ranges for each column. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory2.java: + Deleted. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java: + Was WstValueTableFactory2. + + * src/main/java/de/intevation/flys/artifacts/model/QRangeTree.java: Fixed + node linking bug. Removed dead code. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Q values are now stored in range trees by each column. The qs of the rows + are removed and the calculations are adjusted. Removed dead code. + +2011-05-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java: + Moved cache name to WstValueTableCacheKey. Do not cache null references. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableCacheKey.java: + Moved cache name into this class. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Store QRangeTree for each column of value table. TODO: Use them! + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory2.java: + Intended as a replacement for WstValueTableFactory, but is work in progress. + + * src/main/java/de/intevation/flys/artifacts/model/QRangeTree.java: Fixed + index errors and added methods to dump as graphviz graph. + +2011-05-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Improved the validation of WQ values. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Use the + correct input data object to determine the selected WQ mode (range or + single input). + +2011-05-24 Ingo Weinzierl + + ISSUE-40 (part I/II) + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Write default values (values already selected by the user before) of the + input data items into DESCRIBE. + +2011-05-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + Removed needless imports. + +2011-05-24 Ingo Weinzierl + + ISSUE-85 (part III/III) + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + Added a static function that returns the kilometer values (double[]) + from locations input (whitespace separated double values). + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Adapted + the getKms() method. It will now return a computed array of kilometers + if we had inserted a range, or it will return the inserted kilometers if + we had inserted locations. + +2011-05-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java: + Moved cache key to separate class. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableCacheKey.java: + New. The new cache key class. + +2011-05-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/QRangeTree.java: + Model to store the q values of a WST column efficiently. First + building block not to store the q values directly aside the + w values. + +2011-05-24 Ingo Weinzierl + + ISSUE-85 (part I/III) + + * doc/conf/artifacts/winfo.xml: Added two further field 'ld_mode' and + 'ld_locations' to the range/locations state to track the selected mode + and locations. + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + Added methods to validate the user inserted locations. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + method to determine of a range or locations have been inserted. + +2011-05-23 Ingo Weinzierl + + ISSUE-62 (part II/II) + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Dump the + artifacts state/data in DEBUG mode in describe(). + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/DefaultState.java, + src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java, + src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java, + src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + States will no longer store data. The only reason for states storing + StateData is to know about the necessary data for this state. If a State + needs to access the user input for a specific StateData object, it needs + to query the FLYSArtifact which stores the data. + +2011-05-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + method to dump the artifacts state(s)/data. + +2011-05-23 Sascha L. Teichmann + + flys/issue84 + + * src/main/java/de/intevation/flys/artifacts/model/WstFactory.java: + Forget to select wst kind. + +2011-05-20 Sascha L. Teichmann + + flys/issue81 + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + weights for kms were swapped. + +2011-05-20 Ingo Weinzierl + + Tagged RELEASE 2.3.1 + +2011-05-20 Ingo Weinzierl + + * Changes: Prepared changes for the upcoming release. + +2011-05-20 Hans Plum + + * NEWS: + Hint to Release 2.3.1. For further information look into module + flys-client/NEWS + +2011-05-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java (getExplodedValues): + Increment kms array size by one to take the end of range, too. + +2011-05-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java: + Sort by rows (should not be necessary). + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Use unsharp km lookup (epsilon = 0.0001). This fixes the problem + that some kms were not found. + +2011-05-19 Ingo Weinzierl + + flys/issue66 + + * src/main/resources/messages_en.properties: Fixed broken template. + +2011-05-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Set the name of the computed discharge curve objects. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + The curves of this chart will now have names that consist of the word + 'Discharge Curve', the river name and the kilometer that has been used + for the computation. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for the + computed discharge curves. + +2011-05-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Added convenience method isQ() to determine if we are + doing Q calculations. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Reintroduced titles for the "W for unausgeglichene Abfluesse". + +2011-05-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + The curves will now have names that consist of the gauge name and its + valid time range. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for the + discharge curves. + +2011-05-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Removed dead code. + +2011-05-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Use the correct method to generate kms. + + * src/main/java/de/intevation/flys/artifacts/math/LinearRemap.java: + Added some logging to test the map in debug mode. + +2011-05-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Made getExplodedValues static. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Use new logic to calculate "W fuer ungleichwertige Abfluesse". + Not working, yet. + + * ChangeLog: Fixed former entry. + +2011-05-18 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Registered the WST export for discharge + longitudinal sections. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Set the + names of the discharge longitudinal section computation results. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java: + The W/Q curves in the chart will now have names. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + The WstWriter is filled with column names in an own method. So, we are + able to override this process in subclasses. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java: + Adapted the column names for the WST export. + +2011-05-18 Sascha L. Teichmann + + Work on flys/issue69 + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Use new logic to calculate "Wasserstand/Wasserspiegellage". + Compared to desktop FLYS are the results are structurally right + but a bit off in the positions after the decimal points. + Maybe a result of the interpolation? Need to debug this. + +2011-05-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + W and Q curves will now have names based on the defined W or Q values + for the waterlevel computation. + +2011-05-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/NamedObject.java: + New. This object is used to give objects a name. + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: Inherit + from NamedObject now. Because we need to display names for those objects + in different places. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: The WQKms + objects returned by a waterlevel computation will now have names. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Insert the column names for the WSTs into the WstWriter. + + * src/main/java/de/intevation/flys/exports/WstWriter.java: The column + names are written into the head of the WSTs now. + +2011-05-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WstLine.java: New. This + class is used to store the W/Q values of a specific kilometer of a WST. + + * src/main/java/de/intevation/flys/exports/WstWriter.java: New. A writer + that creates WSTs. + + TODO: The header of the WSTs is not finished. The Q descriptions are + missing. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: + Enabled WST exports. + + * doc/conf/artifacts/winfo.xml: Registered the WST export for waterlevels. + +2011-05-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/utils/Formatter.java: New. This class + supports functions to retrieve formatters for specific types of data + used in FLYS. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java: + Removed the formatter declaration - the whole formatter stuff is done in + Formatter now. + +2011-05-17 Ingo Weinzierl + + ISSUE-72 + + * src/main/java/de/intevation/flys/artifacts/services/MainValuesService.java: + Repaired broken XPath expressions to extract start and end kilometer. + +2011-05-17 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Removed the Hibernate loading stuff. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTableFactory.java: + New. The Hibernate loading. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Use the WstValueTableFactory for loading now. + +2011-05-17 Ingo Weinzierl + + Tagged RELEASE 0.1 aka Version 2.3.0 + +2011-05-16 Hans Plum + + * NEWS: + New. Giving some user specific perspective to new functionality and + changes. This file references releases dates only; details can be find + in the client module at flys-client. + +2011-05-10 Sascha L. Teichmann + + First step to calculate "W fuer ungleichwertige Abfluesse" correctly. + flys/issue55 + + * src/main/java/de/intevation/flys/artifacts/math/LinearRemap.java: + New. Remaps "gleichwertige" Q values to the corresponding + "ungleichwertige" Q values depending on km. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Remap the Q values "ungleichwertig" depending on the + "gleichwertige" ones. + +2011-05-10 Sascha L. Teichmann + + First step to fix flys/issue69 + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + New code path to implement the calculation of "Wasserstand/Wasspiegellage" + correctly. TODO 1: Use new path in UI. TODO 2: Remove unused old code. + +2011-05-13 Ingo Weinzierl + + * Changes: Prepared Changes for the upcoming release 2.3 - see Changes + file to get to know about the changes of the version numbers. + +2011-05-13 Ingo Weinzierl + + ISSUE-37 + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java: This + state would be happy if there is a UI provider called "river_panel". + +2011-05-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Added new + methods that return the requested chart size as integer array [width, + height]. The requested size is read from the incomding request document. + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: The size + of a chart is no longer static. The requested size is fetched using + ChartGenerator.getSize(). + +2011-05-11 Ingo Weinzierl + + ISSUE-52 + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + The X-Axis of such a chart is inverted, if the head of the river is not + at kilometer 0. This type of charts always have the head of the river at + the left side. + +2011-05-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Make incoming XML symmetric to DistanceInfoService. + +2011-05-10 Ingo Weinzierl + + ISSUE-47 + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Adjusted temporarily the color of the W, Q and corrected W curves to + distinguish each other. + +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: + Adjusted the plot of xy charts - the gridlines are displayed now. + +2011-05-10 Ingo Weinzierl + + ISSUE-53 + + * src/main/java/de/intevation/flys/artifacts/resources/Resources.java: + Added a method that returns the preferred locale based on the available + locales of the server and the desired locales of the request (CallMeta). + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: Added a + method that creates a number formatter with minimum and maximum digits. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java, + src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java: + Formatted the number values of the CSV exports. + +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/RangeWithValues.java: + New. A data structure that enables us to save a data triple: a range + that consist of lower and upper double value and a set of values that + belong to this range. + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Implemented the validation of W/Q values. + +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: New + method to retrieve i18n messages based on keys. + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java, + src/main/java/de/intevation/flys/exports/WaterlevelExporter.java, + src/main/java/de/intevation/flys/exports/DurationCurveExporter.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java: + Added headers for CSV exports. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added new i18n strings for + CSV headers. + +2011-05-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Fetches river name from incoming XML document. If no river is given all + infos about all rivers are listed. + + * src/main/resources/metadata/template.xml: Templates honors the 'river' + parameter. + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + Extended to pass parameters to the templating. Added support for + type conversion. + + * src/main/java/de/intevation/flys/artifacts/services/meta/StackFrames.java: + Take parameters as an initial stack frame. + + * src/main/java/de/intevation/flys/artifacts/services/meta/TypeConverter.java: + New. Converts types off stacked variables. + +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Added a + method to add subtitles to charts. The implementation in this class does + not add any subtitle. Concrete subclasses may override this method to + add some. + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Add subtitles to charts. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n templates for + compound messages (chart subtitles). + +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/resources/Resources.java: + Added new methods to retrieve translated compound messages. + +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/OutGenerator.java: Added a + method to set the master artifact that should be used for some special + operations. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/AbstractExporter.java: + Implement the setMasterArtifact() method of the interface. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Call OutGenerator.setMasterArtifact(). + + NOTE: The determination of the master artifact needs to be implemented! + +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Removed + hard coded dev code that defined a WQ mode. + +2011-05-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + Stripped ugly extra whitespace from output introduced by + templating. + +2011-05-09 Sascha L. Teichmann + + * src/main/resources/metadata/template.xml: Added forgotten + columns of fixation WSTs. + +2011-05-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Added a + method to retrieve i18n strings. + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Enabled i18n support for chart title and axes labels. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for the + chart types above. + +2011-05-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/DischargeLongitudinalSectionExporter.java: + New. This OutGenerator exports the data of a discharge longitudinal + section computation. + + * doc/conf/conf.xml: Added the DischargeLongitudinalSectionExporter. + + * doc/conf/artifacts/winfo.xml: Added the exporter with CSV facet to the + discharge_longitudinal_section state. + +2011-05-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java: + Added code to make back jump correction work with both + potential flow directions. + +2011-05-06 Sascha L. Teichmann + + * src/main/resources/metadata/template.xml: + Added data cage configuration for 'Längsschnitt'. + +2011-05-06 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added the missing Q facet for discharge + longitudinal sections. + + * src/main/java/de/intevation/flys/artifacts/model/WQCKms.java: New. A + derived dataset to store W/Q values with corrected Ws for a kilometer + range. + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: Some new + methods and a new constructor to initialize this data object with a + predefined set of values. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: New + methods to retrieve the W/Q values for the 'discharge longitudinal + section' computation. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: New + methods to retrieve and compute data used for the 'discharge + longitudinal section' computation. + +2011-05-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: + Bugfix: just write the ranges of gauges into the DESCRIBE if the + 'wq_values' data item is required. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n messages used in + the DESCRIBE of the WQAdapted state. + +2011-05-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Changed the title of the y-axis (now 'W [NN+m]'). + +2011-05-05 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Improved the transition model to reach the + output state for creating 'discharge longitudinal section' charts. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added a + method that returns all gauges of the selected river based on a the + given kilometer range. + + * src/main/java/de/intevation/flys/artifacts/states/WQAdapted.java: New. + This state creates a set of elements for the DESCRIBE that consist of a + tuple of kilometer values. The number of elements depend on the number + of gauges intersected by the given kilometer range. + + * src/main/java/de/intevation/flys/artifacts/states/DischargeLongitudinalSection.java: + New. This state is the output state that is reached after the 'discharge + longitudinal section' computation has been chosen. + +2011-05-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Default + step width between two kilometers added - if no step width is given, + this default width is used. + +2011-05-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Fixed a potential NullPointerException if there is just a single + kilometer given to create a longitudinal section. + +2011-05-04 Sascha L. Teichmann + + * pom.xml: Added http://repository.jboss.org/maven2 repo + to fix flys/issue30 + +2011-05-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + To make diagram generation possible ws are now generated from qs + because they are many ws having different qs. + +2011-05-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java: + Fetch the WQ data from WINFO artifact and write those values into the + CSV export. + +2011-05-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Added + methods to compute and retrieve the data for discharge curves (computed). + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + Fetch the computed discharge curve data from WINFOArtifact and add the + values into the JFreeChart dataset. + +2011-05-04 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added new transitions and states to enable + the WINFO artifact for computing discharge curves. + + * doc/conf/conf.xml: Added OutGenerators that generate computed discharge + curves and exports for its data. + + * src/main/java/de/intevation/flys/artifacts/states/ComputedDischargeCurveState.java: + New. This state is reached if the user chose the computed discharge + curve. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveGenerator.java: + New. This is only a stub implementation at the moment. This + OutGenerator should create computed discharge curves later. It extends + the DischargeCurveGenerator which should do the same stuff for discharge + curves for gauges. + + * src/main/java/de/intevation/flys/exports/ComputedDischargeCurveExporter.java: + New. This is only a stub implementation at the moment. This OutGenerator + should create the exports of the discharge curve computation. + +2011-05-03 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added a new output mode for the duration + curve state (CSV export). + + * doc/conf/conf.xml: Added a new OutGenerator to export duration curve + computations. + + * src/main/java/de/intevation/flys/exports/AbstractExporter.java: New. + This abstract OutGenerator represents the base class for exporting + computed data. Currently, the CSV export is supported. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: Moved + the most code to export to CSV into the AbstractExporter. + + * src/main/java/de/intevation/flys/exports/DurationCurveExporter.java: + New. This exporter exports the computed data of a duration computation. + +2011-05-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Modified a wrong debug statement which would confuse the user. + +2011-05-03 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added a new output mode for the waterlevel + state (CSV export). + + * doc/conf/conf.xml: Added a new OutGenerator to export waterlevels. + + * src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: New. + This OutGenerator exports the data of a waterlevel computation. Note: + It is necessary to specify the desired facet (e.g. + 'waterlevel_export.csv'). + + * pom.xml: Added a dependency to OpenCSV. + +2011-05-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Introduced an "export" output target. If the target is "export", a + facet (read from the incoming xml document) is a necessary parameter + that determines which facets are written to the output. + +2011-05-03 Ingo Weinzierl + + * src/main/resources/messages_en.properties: Bugfix: replaced german + string (copy & paste mistake). + +2011-05-03 Ingo Weinzierl + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added new i18n strings for + for the location selection. + +2011-05-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + New. An OutGenerator for creating duration curves. + + * src/main/java/de/intevation/flys/artifacts/model/WQDay.java: New. A + model class to store necessary data for creating W and Q facets of a + duration curve. This model stores W, Q and Days. + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesFactory.java: + Added a function to retrieve tuples of (day, q) based on a given gauge - + these tuples are necessary for creating duration curves. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Added + methods to compute and retrieve the data necessary for creating duration + curves. + + * src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java: + Bugfix: improved the access to the location array (avoid + NullPointerException). + + * doc/conf/conf.xml: Registered the new OutGenerator for duration curves. + +2011-05-03 Sascha L. Teichmann + + * contrib/visualize-transitions.xsl: State quoting was done wrong. + +2011-05-02 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Enhanced the transition model to reach the + final state for creating duration curves. + + * src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java: + New. This state should be reached to just insert an array of locations. + + * src/main/java/de/intevation/flys/artifacts/states/DurationCurveState.java: + New. This state is reached if the duration curve calculation is + selected. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Adjusted + getDistance() so that it takes care on inserted locations - not just + inserted ranges. + +2011-05-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/cache/CacheFactory.java: + Flush/persist caches at program exists. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Commented out too eloquent debug output. + +2011-05-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Uses the methods of FLYSArtifact to retrieve the necessary information + rivername and selected distance. + +2011-05-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Added interpolateW method to take reference to result ws array + as an argument to avoid expensive array allocations in km iterating + loops. + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: + Added a constructor to create backing trove datastructure + with the right capacity. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Move allocation of result ws out of km loop. + +2011-05-02 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added two further data items in the WQ + selection state. Those items are necessary to store the information + about the selected mode (range/single selection) and the values of the + single selection. + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: If + there is no value for a data item, this item is not written into the + static DESCRIBE part. + + * src/main/java/de/intevation/flys/artifacts/states/RangeState.java, + src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + Renamed the method to validate upper and lower values. + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: This + state can now handle values inserted in the single selection. Therefore, + new validate methods has been added. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: The + methods getWs() and getWs() take care on the values inserted in the + single insert mode of the client which enables the user to insert single + W and Q. + +2011-05-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Repaired getQForW() by calculating indices on right dimension. + +2011-05-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: New + methods for retrieving selected W values (getWs()). + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: The + method for retrieving waterlevel data takes care on selected Ws, now. + The selected Ws are transformed using the DischargeTables.getQForW() + into Q values. + +2011-05-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Removed an unused parameter 'result' of getQForW(). + +2011-05-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Removed + the getDataset() method and replaced it with a addDataset() method. + On this way, concrete subclasses of this OutGenerator can have multiple + datasets (e.g. different datasets for W and Q). This abstract method is + called after the chart generation is finished. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Both classes implement the addDataset() method. The + LongitudinalSectionGenerator has already multiple datasets for W and Q. + Both are added to the chart - both have an own range axis. + +2011-05-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Use the cache for the wst value table if configured. + + * doc/conf/cache.xml: Choose a more precise name for the + wst value table cache. + +2011-04-29 Sascha L. Teichmann + + * pom.xml: Added dependency to Ehcache. Apache 2.0 license. + + * doc/conf/conf.xml: Added configuration of ehcache. + + * doc/conf/cache.xml: New. Cache configurations. + + * src/main/java/de/intevation/flys/artifacts/cache/CacheFactory.java: + New. Factory to access caches. + +2011-04-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Forgot to add. + + * src/main/java/de/intevation/flys/artifacts/services/meta/Builder.java: + New. Given a database connection and a XML template it generates + an output with meta data about the database. + + * src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java: + New. Holds prepared statements optimized to be run in the stack of + contextes. + + * src/main/java/de/intevation/flys/artifacts/services/meta/StackFrames.java: + New. Model to hold a hierarchical scope of variables. + + * src/main/java/de/intevation/flys/artifacts/services/meta/ResultData.java: + New. Stores data set fetched from a sql select to be iterated in + a context. + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java, + src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Removed superfluous imports. + +2011-04-29 Sascha L. Teichmann + + * doc/conf/conf.xml: Added meta data service. + + * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: + Stub for the meta data service. + + * src/main/resources/metadata/template.xml: Initial template for + the meta data service. + +2011-04-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Bugfix: Now, curves for Q values are drawn into a longitudinal section + chart as well. Therefore, it was necessary to change the datastructure + of the inner class ThemeList that stores all themes included in a chart + in an ordered list (stored in a java.util.Vector now). + +2011-04-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: New. An + abstract base class for ChartGenerators that create XY charts. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Sourced the generate() method out to the XYChartGenerator. + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + Implemented the methods to add W and Q facets to the chart. + +2011-04-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Improved + the calculation of the step with for ranges. + +2011-04-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: Added a + method that returns the number of elements stored in the data pool. + +2011-04-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: + Added a get() method which takes destination array as an + argument. + +2011-04-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: Changed the + data structure to store w, q and kms values from List to + TDoubleArrayList which stores native double values instead of big + Double values. + + * pom.xml: Added the GNU Trove dependency. + +2011-04-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/OutGenerator.java: Added the + name a the requested facet to doOut(). Concrete generators should just + create output for this facet now. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java, + src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java, + src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + Adapted the method signature of doOut(). + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Adapted the method call of OutGenerator.doOut(). + +2011-04-29 Ingo Weinzierl + + * doc/conf/themes.xml: Added mappings for the facets + longitudinal.section.w and longitudinal.section.q. + +2011-04-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Added some + methods to retrieve necessary information for computing the data of a + waterlevel. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Added + methods to compute and retrieve the data of a waterlevel computation. + +2011-04-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WQKms.java: New. This + model class represents a pool of data triples that consist of W, Q and + Kms information. This class might be used to compute data for creating + longitudinal section curves (which are based on those W, Q and Kms + values). + +2011-04-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Bugfix: Removed endless loop and a bug while iterating over Hibernate + results. + +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java: + New. An OutGenerator that creates longitudinal section curves. + + NOTE: This is just the stub - the out creation needs to be implemented! + + * doc/conf/conf.xml: Added the LongitudinalSectionGenerator. + +2011-04-28 Ingo Weinzierl + + * doc/conf/conf.xml: Bugfix: Added missing section. + +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WaterlevelState.java: New. + This state should be reached if the 'calc.surface.curve' calculation + method has been chosen. + + * doc/conf/artifacts/winfo.xml: Modified a transition and added the + WaterlevelState. This state is reached if the 'calc.surface.curve' + calculation method has been chosen. It currently has 1 output - a + longitudinal section that is not implemented yet! + +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/transitions/ValueCompareTransition.java: + New. This transition is valid if the a data object of the current + artifact equals/notequals a configured value in the transition model. + +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Bugfixes: + - Adapted the parameters of the isStateReachable() call - added the + artifact and the current state. + - Append the outputs of a current state if the state is filled with + valid data. + +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/transitions/DefaultTransition.java: + Added the missing init() method that has been introduced in the + interface some commits ealier. + + * src/main/java/de/intevation/flys/artifacts/transitions/TransitionFactory.java: + Call init() after a Transition has been created. + +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: + Bugfix: Introduced a node in the attribute document of a + Collection that contains further nodes - instead of having + multiple nodes at toplevel of the document. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Adapted the XPath to retrieve the outputs in the attribute document of a + Collection. + +2011-04-28 Sascha L. Teichmann + + * contrib/visualize-transitions.xsl: Added to create a + Graphviz digraph out of the config.xml. Usage: + + $ xsltproc --stringparam base-dir ../doc/conf/ \ + contrib/visualize-transitions.xsl \ + doc/conf/conf.xml > transitions.dot + + $ dot -Tsvg -o transitions.svg transitions.dot + +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + If no data has been inserted so far, an IllegalArgumentException is + thrown. + +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java:: + A lot of new methods to retrieve the theme of a facet - used while + creating the output of a facet/artifact. If a facet has no theme yet, it + is initialized. + +2011-04-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/AttributeParser.java, + src/main/java/de/intevation/flys/collections/OutputParser.java: Removed + useless imports. + +2011-04-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: New. An + abstract OutGenerator that might be used to create chart output. Some + basic things that are equal in all charts should be done here! + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + This OutGenerator no longer implements the OutGenerator directly, but it + extends the ChartGenerator now. + +2011-04-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Restructured the out() operation of a collection: Now, we collect a list + of artifacts/facets and use this for the OutGenerator. Its doOut() + method gets the attribute of an artifact - the position and the active + state is managed by the Collection itself. + +2011-04-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java: New. + a specialized facet that stores information about its position and its + state (active/inactive) in an output of a collection. + + * src/main/java/de/intevation/flys/collections/AttributeParser.java: New. + This parser takes the attributes (XML) of a collection and extracts the + contained outputs with its facets. The result is a Map. + + * src/main/java/de/intevation/flys/collections/OutputParser.java: New. + This parser is used to query the artifact's DESCRIBE and to extract the + supported outputs. The result is a Map. + + * src/main/java/de/intevation/flys/collections/AttributeWriter.java: New. + This writer merges the outputs contained in an attribute of a collection + with the outputs of a collection's artifacts. + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + The attributes of a collection are written into its DESCRIBE document + now. The OutputParser and AttributeParser are used to read the supported + attributes by the collection and its artifacts - the AttributeWriter is + used to merge both attributes and create a final attribute document. + +2011-04-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java, + src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + The facet-2-theme mappings are initialized at startup and stored in the + FLYSContext. + + * src/main/java/de/intevation/flys/themes/ThemeFactory.java: Added a + function that retrieves a theme from FLYSContext based on its name. + +2011-04-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Corrected a silly c&p mistake. + +2011-04-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/math/BackJumpCorrector.java: + + Implementation of the "Ruecksprungkorrektur" to be done in + "W fuer angepassten Abflusslaengschnitt". + + All tests show the expected results. In some corner cases the + algorithm described in the "Anwenderhandbuch" chapter 3.3.4.3 "Korrektur" + has some definition shortcomings: + + a - What should happend when you cannot find point 2 because + you cannot step back one quarter from point 3 because there + is no data there any more (river too short in this direction)? + The implemented algorithm raises point 3' only to an + according factor. E.g. If you can step back the whole quarter + distance the elevation is the full quarter. If you can + step back only the half of the quarter the elevation is + only an eighth. + + b - If the water heights between point 2 and 3 are constant then + the algorithm will produce a spline interpolation that + lowers those values. Is this intended? + + For real data the back jumps are expected to be more in the middle + of the distance ranges so the corner cases are maybe not so + important. + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java: + Removed superfluous import. + +2011-04-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/themes/ThemeFactory.java: Removed debug + code that has been commited by accident. + +2011-04-21 Ingo Weinzierl + + * doc/conf/themes.xml: New. A first small theme configuration. + + * doc/conf/conf.xml: Added a link to the theme configuration. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java: + Defined a key that is used to store a themes map in the FLYSContext. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + The theme configuration is read at startup and the themes are stores in + the FLYSContext. + +2011-04-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/themes/Theme.java, + src/main/java/de/intevation/flys/themes/DefaultTheme.java: + New. The interface and its default implementation that represents themes + used to style charts and maps. + + * src/main/java/de/intevation/flys/themes/ThemeField.java, + src/main/java/de/intevation/flys/themes/DefaultThemeField.java: + New. The interface and its default implementation that represents fields + in themes. A theme might be "Lines" and one of its field might be + "Color" or "Size". + + * src/main/java/de/intevation/flys/themes/ThemeFactory.java: A factory + that creates new themes based on a theme configuration. + +2011-04-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Implementation of "Abflusskurve/Abflusstafel" calculation. + + Added method interpolateWQ() which takes an km and results in a + tuple of two double arrays containing the w/q values interpolated + between the surrounding w/q values of the table. + w values are interpolated linear, q values with a cubic spline. + + Drawing w over q gives you the discharge table at the given km. + + !!! This code needs testing !!! + +2011-04-20 Sascha L. Teichmann + + * pom.xml: Added dependency to Apache Commons Math 2.2 (Apache License 2.0) + +2011-04-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Fix problem when sorting by q (copied w instead of q). + +2011-04-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Fixed broken HQL statement. + +2011-04-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + add a method interpolateW() which takes an array of + q values and returns an equal sized array of w values. + This is essentially the "Wasserstand/Wasserspiegellagen" calculation + of desktop FLYS. + + If you want to do a calculation with given w values you have + to convert the w values with DischargeTables.getQForW() first. + + !!! This code needs heavy testing !!! + +2011-04-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + We need a getQForW() method and not getWForQ() because when + doing a "Wasserstand/Wasserspiegellagen" calculation with given + w values these values need to be translated to q values with + the master discharge table. + +2011-04-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Sorting of q values was done wrong. + +2011-04-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java: + Ordered the list of annotations returned by this factory based on its + range. + +2011-04-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/MainValuesService.java: + New. This service returns an XML document that includes the main values + of a gauge based on a river name, a start and an end point. + + * doc/conf/conf.xml: Registered the MainValuesService. + +2011-04-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/MainValuesFactory.java: + A factory that provides methods to return MainValues. + +2011-04-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Added static method getWForQ() to interpolate a w value for + a given q value based on a given discharge table. + +2011-04-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Added convenience constructors/methods to ease the access to the master + discharge table of a gauge. + +2011-04-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Moved the query complexity into view 'wst_value_table' and + used this instead. + +2011-04-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java: + Fetches w/q value tables from the backend. TODO: Move this + to the backend and use a view. + +2011-04-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Changed + the error key that is thrown if no input data was found so that the key + is usable for GWT's i18n mechanism. + +2011-04-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java: + The inserted river is validated now (overrides validate() of + DefaultState). + +2011-04-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + The inserted calculation method is validated now (overrides validate() + of DefaultState). + +2011-04-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + The input data of feed() are validated using the DefaultStates + validate() method. + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + New method validate() that needs to be overidden by concrete subclasses. + It should return true, if the data of the State is fine, otherwise it + should raise an exception. + + NOTE: The exceptions are not translated in the server but in the client! + + * src/main/java/de/intevation/flys/artifacts/states/RangeState.java: New. + This abstract class exists to provide some methods for handling ranges. + Currently, there is a method that validates a given range based on + min/max values. + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Implemented input data validation for ranges. + + NOTE: The input validation of concrete values has not been implemented + yet! + +2011-04-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Removed debug code that has been commited by accident :-/ + +2011-04-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: The + getGauge() method returns the first gauge based on the given start and + end point of the river. + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + Fixed potential bugs: if no gauge could be determined, the default + values for W and Q are the minimum and maximum double values. + +2011-04-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: Fills + the DESCRIBE with default values for W and Q. + +2011-04-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/WstFactory.java: + New. Returns Wst object - based on a river. + +2011-04-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Now + provides some methods that return some basic objects inserted while + parameterization: River, Gauge and so on. + +2011-04-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java, + src/main/java/de/intevation/flys/artifacts/services/RiverService.java: + Bugfix: Repaired broken imports of the SessionHolder. + +2011-04-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/SessionHolder.java: + Moved this class to flys-backend. + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java, + src/main/java/de/intevation/flys/artifacts/model/GaugesFactory.java, + src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java, + src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java, + src/main/java/de/intevation/flys/artifacts/context/SessionCallContextListener.java: + Adapted imports of the SessionHolder. + +2011-04-14 Sascha L. Teichmann + + * trunk/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java, + trunk/src/main/java/de/intevation/flys/artifacts/services/RiverService.java: + Acquire/release sessions in services to avoid db connection leaks. + +2011-04-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Changed some method signatures - added a reference to the owner + Artifact. + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java, + src/main/java/de/intevation/flys/artifacts/states/WQSelect.java, + src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + Modified method signatures based on the changes in DefaultState. + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + Added default values to the dynamic part of DESCRIBE. + +2011-04-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java: + Added a function that returns a River object based on a given river + name. + +2011-04-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java, + src/main/java/de/intevation/flys/artifacts/model/GaugesFactory.java, + src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java, + src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java: + Static methods are using the SessionHolder, too. + +2011-04-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/context/SessionCallContextListener.java: + Added the setup() method that has been added to the interface + description in the last commits. + + * doc/conf/conf.xml: Registered the SessionCallContextListener as + CallContext.Listener. + +2011-04-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/SessionHolder.java: + Bugfix: Call correct method to retrieve an instance of + SessionFactoryProvider. + +2011-04-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/SessionHolder.java: + New. Contains thread local session holder for hibernate sessions. + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java: + Uses session from SessionHolder. + + * src/main/java/de/intevation/flys/artifacts/context/SessionCallContextListener.java: + Interacts with SessionHolder now. + + * src/main/java/de/intevation/flys/exports/ChartExportHelper.java: + Removed superfluous import. + +2011-04-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/context/SessionCallContextListener.java: + Implementation of a CallContext.Listener to open/close Hibernate + Sessions for each request. + +2011-04-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Some modifications related to the last commit - modification of the + describe() signature of a State. + +2011-04-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/GaugeSelect.java: + Removed. We do not need a state to select a gauge - the selection takes + place by choosing a start and an end point. + +2011-04-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java: + Bugfix: added missing label node to root node and a namespace to the + data node. + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + The name of the artifact 'winfo' is written into the DESCRIBE document + now. We need this to have a proper way to distinguish between different + artifacts in the UI. + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Bugfix: + States are filled with data before they describe themself. + +2011-04-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/AnnotationsFactory.java: + New. A factory that returns the annotations of a specific river. + + * src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java: + New. This service provides a document that contains information about + distances of a river. + + * doc/conf/conf.xml: Registered the DistanceInfoService. + +2011-04-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + This collection overrides the out() operation now. The incoming request + document is read and the related OutGenerator is used to create the + output. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Removed + the code to create discharge curves. It has moved to the + DischargeCurveGenerator which now does this work. + +2011-04-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/OutGenerator.java: The + generate() method throws an IOException now. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java: + New. This OutGenerator creates discharge curves. + +2011-04-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: Changed + the visibility of the getData() method. It's now public, because the + OutGenerator needs an artifact's data. + +2011-04-03 Sascha L. Teichmann + + * src/**/*.java: Removed trailing whitespace. + +2011-04-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Make project compilable again by + commenting out a not existing XMLDebug reference. + +2011-03-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Added code to parse the configured OutGenerators and to save them (in a + map) in the FLYSContext. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java: + Added a key that is used to save the OutGenerators Map in the context. + +2011-03-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/OutGenerator.java: + New. This interface is used to generator different types of output. + ArtifactCollections will make use of this interface to create a + collected output of all its artifacts. + +2011-03-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Removed the Backend from FLYSArtifactCollection - used ArtifactDatabase + operations instead. + + * TODO: Removed 'remove Backend reference' TODO. + +2011-03-30 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Enhanced the configuration of the + discharge curve output mode. This output now provides three facets - W, + Q and the curve itself. + +2011-03-30 Ingo Weinzierl + + Tagged RELEASE 0.1 + +2011-03-30 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Renamed an output mode in the WINFO + artifact configuration. + +2011-03-29 Ingo Weinzierl + + * src/main/resources/messages_de_DE.properties, + src/main/resources/messages_de.properties: Changed a german string. + +2011-03-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + Modified the available calculation modes and its order in the DESCRIBE + document. + + * src/main/resources/messages.properties, + src/main/resources/messages_de_DE.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Adapted the names of + calculation modes. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Added the hash code of an artifact to the artifact part of the + collection's DESCRIBE document. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Changed + the background color of discharge curves to white. + +2011-03-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Cache the scale, too. Otherwise two calls to getValues() with + different arguments will result in the same output. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Introduced a 'scale' parameter in the getValues() method. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Filled + the out() operation with code that draws a discharge table of one or + more gauges specified by the given range in entered in a previous state. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartExportHelper.java: + New. A helper class to exports charts. + + * pom.xml: Added dependencies to iText, Batik and JFreeChart. + +2011-03-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/importer/PegelGltParser.java: + Fixed swap of operands. + +2011-03-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/GaugesFactory.java: + New. Load gauges for a river and filter them for given + ranges. + +2011-03-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + Store data in a double [][] instead of interleaved double [] + to be compatible with org.jfree.data.xy.DefaultXYDataset. + +2011-03-25 Ingo Weinzierl + + * TODO: Removed 'i18n' and 'step-back' TODOs and added an issue to remove + the Backend reference from FLYSArtifactCollection. + +2011-03-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Added missing artifact namespace of an attribute in the DESCRIBE + document. + +2011-03-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + New. This ArtifactCollection overrides the DefaultArtifactCollection to + implement FLYS specific describe() and out() operations. + + * doc/conf/conf.xml: Use the FLYSArtifactCollection instead of the + DefaultArtifactCollection for this application. + +2011-03-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java: + New. Fetches values of discharge tables in form of packed + w/q double arrays for given gauges. + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java: + Removed needless import. + +2011-03-24 Ingo Weinzierl + + * src/main/resources/messages_de_DE.properties: Added a german resource + bundle to avoid exceptions in the flys artifacts. Sometimes, the + Resources class is not able to find a 'de_DE' bundle and throws an + exception. This is really strange, because it should use the 'de' bundle + in that case, but it doesn't. + +2011-03-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Added + some code to append the output modes of previous states to the DESCRIBE + document. + + TODO: Determine if the current state is already filled with data and + append its output modes as well! + +2011-03-22 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Enhanced the location_distance state with + an output mode 'discharge_table'. + +2011-03-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Write human readable strings as label attribute into the DESCRIBE + output. Those labels are used to be displayed in the GUI. + +2011-03-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + Added some further calculation types. + + * src/main/resources/messages.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for the + calculation types + +2011-03-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Implemented the step-back part of the advance() operation. + +2011-03-21 Ingo Weinzierl + + * src/main/resources/messages_de.properties: Fixed a german umlaut. + +2011-03-18 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Added new states for entering a + location/distance and w/q. + + * src/main/resources/messages.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: New string for the + location/distance and w/q input states. + +2011-03-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/WQSelect.java: + New. A state for the W/Q input of the WINFO parameterization. + +2011-03-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Append an attribute 'uiprovider' to the dynamic UI node. + + * src/main/java/de/intevation/flys/artifacts/states/LocationDistanceSelect.java: + New. A state for the location/distance selection of the WINFO + parameterization. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Added a new method getUIProvider() that might be overriden by concreted + subclasses that should be rendered with a specific UIProvider. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + The static UI part is created by the previous states now. This makes it + possible to group the data objects (which is necessary to group the + objects in the ui). + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Added a describeStatic() method that creates a node that contains the + data of that state. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/RiverService.java: + Removed TODO: the document contains the rivers provided by the backend + now. + +2011-03-17 Sascha L. Teichmann + + * pom.xml: Added dependency to flys backend. + + * src/main/java/de/intevation/flys/artifacts/model/River.java: + Removed. We are using the backend model now. + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java: + Fetches the rivers from the backend. + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java: + Import fixes. + +2011-03-15 Sascha L. Teichmann + + * doc/conf/conf.xml: Added section for database backend configuration. + +2011-03-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + Fixed build error coming from different import of XMLUtils. + +2011-03-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + Appended the missing label node that contains the human readable name of + the data item. + +2011-03-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java, + src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + I18N of strings for the DESCRIBE document. + + * src/main/resources/messages.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: I18N strings for the + calculcation mode state. + +2011-03-14 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Modified the winfo states. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Adapted + the artifact regarding the changes of the last commit. The states + describe() method creates the dynamic UI node - the artifact needs to + apply this node. + + * src/main/java/de/intevation/flys/artifacts/states/CalculationSelect.java: + New. The state for choosing the calculation mode. + + * src/main/resources/messages.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Added i18n strings for the + calculation mode state. + +2011-03-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/DefaultState.java: + New. This is the base state for the FLYS application. It provides a + method that creates the dynamic ui node for the DESCRIBE. + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java, + src/main/java/de/intevation/flys/artifacts/states/GaugeSelect.java: Both + classes extend the abstract base class DefaultState. + +2011-03-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/resources/Resources.java: + New. This class retrieves the i18n strings from a ResourceBundle. + + * src/main/resources/messages.properties, + src/main/resources/messages_en.properties, + src/main/resources/messages_de.properties: Resource files for german and + english translation. + +2011-03-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Appended + the data that have been inserted in former states into the static node + of the DESCRIBE. + +2011-03-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: The + operations feed() and advance() return the description of the artifact + using the describe() operation. This avoids additional server round trips + in the client - the clients gets to know about the new state of the + artifact immediately. + +2011-03-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Implemented a part (step forward) of the advance operation. + + * TODO: Implement Step-Back in advance operation. + +2011-03-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: + Implemented the abstract method getName(). It returns the constant + 'winfo' string. + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: + Implemented the feed action. The data of an incoming feed() operation is + stored in StateData objects that are saved in a map in the artifact. + + NOTE: There is no input validation and no i18n of error messages (see + TODO). + +2011-03-09 Ingo Weinzierl + + * TODO: This file contains some open points that need to be done. + +2011-03-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/FLYSArtifact.java: New. This + artifact serves as the default artifact for the FLYS application. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: This + artifact now inherits from FLYSArtifact. Furthermore, there is one big + change: we don't store the State objects itself in the artifact, but + just the identifier of those. This makes the artifact smaller and more + compatible agains previous versions of the software. + +2011-03-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/services/RiverService.java: + New. This service will retrieve a list of provided rivers. + + * doc/conf/conf.xml: Added a configuration for the RiverService. + +2011-03-07 Ingo Weinzierl + + * doc/conf/conf.xml: Added a section user-factory and collection-factory in + the factories part of the configuration. + +2011-03-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java: + Replaced the 'special' attribute from DESCRIBE with a 'uiprovider' + attribute. + +2011-02-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: The + RiverSelect state is called to create the UI part of the describe + document. + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java: + Implemented the dynamic UI part of describe(). The static part is not + inserted into the describe document at the moment. We need a reference to + the previous states for this. + +2011-02-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/model/RiverFactory.java, + src/main/java/de/intevation/flys/artifacts/model/River.java: New. A model + class that represents a river and its factory to create concrete river + instances. + NOTE: Currently, this is just a mockup. The factory just returns two + static rivers "Mosel" and "Saar" without a connection to a backend. + +2011-02-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/StateFactory.java: The + input data of a state is initialized with empty StateData objects after + the State has been created. + + * doc/conf/artifacts/winfo.xml: Renamed the input data nodes of the states + which now fits better to the class name of the implementation. + +2011-02-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: The + describe document returned by this artifact now contains the current state + and the reachable states. + +2011-02-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + The transitions are put into the TransitionEngine with the ID of the state + - not longer with the artifact name. On this way, we are able to fetch + just the transitions for a specific state, instead of all the transitions + of an artifact. + +2011-02-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Describe() + returns the artifact's uuid and hash value. The whole implementation of + describe() is still outstanding. + +2011-02-04 Ingo Weinzierl + + * doc/conf/artifacts/winfo.xml: Removed useless config stuff. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: Removed + useless methods, and improved the init process - the first state is set as + the current state for this artifact. + + * src/main/java/de/intevation/flys/artifacts/states/RiverSelect.java, + src/main/java/de/intevation/flys/artifacts/states/GaugeSelect.java: New. + The states are used in the first two steps of the WINFOArtifact. + Currently, they just implement stubs of the necessary methods setup() and + describe(). + +2011-02-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/State.java, + src/main/java/de/intevation/flys/artifacts/transitions/TransitionEngine.java, + src/main/java/de/intevation/flys/artifacts/transitions/Transition.java: + Removed. These classes are placed in the artifact-database now. + + * src/main/java/de/intevation/flys/artifacts/transitions/DefaultTransition.java, + src/main/java/de/intevation/flys/artifacts/transitions/TransitionFactory.java: + Adapted imports of Transition. + + * src/main/java/de/intevation/flys/artifacts/states/StateFactory.java: New. + This factory should be used to create concrete State objects. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java: Added + a constant key to store the StateEngine in the context. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + New method that initializes the states at application start. + +2011-02-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/artifacts/states/State.java: New. The + interface description of a state. + + * src/main/java/de/intevation/flys/artifacts/transitions/Transition.java, + src/main/java/de/intevation/flys/artifacts/transitions/DefaultTransition.java: + New. The interface description and a default implementation of a + transition. + + * src/main/java/de/intevation/flys/artifacts/transitions/TransitionEngine.java: + New. The TransitionEngine stores all transitions for each artifact and + should be used to determine, if an artifact can advance from one state to + another. + + * src/main/java/de/intevation/flys/artifacts/transitions/TransitionFactory.java: + New. Transitions should be created by using this class. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContext.java: New. + The Flys context. It currently defines keys to store important components + in the context. + + * src/main/java/de/intevation/flys/artifacts/context/FLYSContextFactory.java: + New. The context factory initializes the basic components of the + application. Currently, the TransitionEngine is created and all artifacts + with its transitions are read from the global configuration and stored in + the FLYSContext. + + * pom.xml: Added a dependency to the 'artifacts-common' package. + + * doc/conf/artifacts/winfo.xml: Corrected the classname of the + DefaultTransition. + + * doc/conf/conf.xml: Added FLYSContextFactory as context-factory. + +2011-02-02 Ingo Weinzierl + + * doc/conf/conf.xml: An initial configuration file for the FLYS artifact + server. + + * doc/conf/artifacts/winfo.xml: An initial transition configuration of an + WINFO artifact. + + * src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java: A stub of + an artifact for a WINFO parameterization. + + * pom.xml: Set the source code version to 1.5. + +2011-02-01 Sascha L. Teichmann + + * src/**, pom.xml: Added initial maven project. + * ChangeLog: new. diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/NEWS --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/NEWS Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +NEWS + +for enduser-specific information, c.f. the NEWS -file in the module flys-client + +2011-05-19 Release V 2.3.1 + * Bugfixing Release for WINFO + +2011-05-16 Release V 2.3.0 + * Enhanced functionality for WINFO, diagram and Data-Manager (Datenkorb) + +2011-03-27 Release V 2.2 + +This file starts with V. 2.2. Earlier versions are based on a Desktop-version until V 2.1.3. diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/README Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,89 @@ +From ChangeLog: + +2012-04-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/FixingsKMChartService.java: + New. Service to generate a chart of fixings for given river and km applied + some filters. + + Usage: + $ curl http://localhost:8181/service/fixings-km-chart \ + -d @fix-overview.xml > chart.png + + The input XML is nearly the same as for the overview service. + Besides the river, filters and range it accepts elements + for passing the river km, + for the extent of the output chart, + for type of result. Currently ignored. + + ATM only a static fixed sized PNG image is delivered. + +2012-02-27 Sascha L. Teichmann + + Added functions to be used for fitting in + the "Fixierungsanalyse" and "Extremwertermittlung". + + [...] + + * src/main/java/de/intevation/flys/artifacts/math/fitting/App.java: New. + Small test driver to check if the fitting is working. The points to + fit are read from stdin the function to fit is determined by the + system property 'function'. Example usage: + + $ mvn -e \ + -Dfunction=linear \ + -Dexec.mainClass=de.intevation.flys.artifacts.math.fitting.App exec:java < + + * src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java: + - Calculate the extent of the river by the extents of the fixings. + Reason: The river Elbe has only has fixings up to km 351. The other half + of the river is empty which results in a sparse looking overview. + - Add the name of the river as name attribute to resulting element. + + * contrib/fixoverview2html.xsl: New. Demo XSL transformation to turn + the output of the overview service directly into HTML. Used in the + client a variant of this script could be used for producing the content + of the assistance widget. Usage: + + $ curl http://localhost:8181/service/fixings-overview \ + -d @fix-overview.xml | \ + xsltproc contrib/fixoverview2html.xsl - \ + > fixings-overview.html + +2011-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/services/meta/App.java: New. + Standalone app to debug the datacage template. To use in a maven environment: + + -Dmeta.data.template=PATH_TO_META_DATA-TEMPLATE.XML \ + -Dmeta.data.parameters=river:Mosel \ + -Dmeta.data.output=OUTPUT.XML \ + -Dflys.backend.user=DB_USER \ + -Dflys.backend.password=DB_PASSWORD \ + -Dflys.backend.url=DB_CONNECTION_URL \ + -Dexec.mainClass=de.intevation.flys.artifacts.services.meta.App + +2011-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/charts/CrossSectionApp.java: + New. Standalone Swing-App to test cross sections from database without the + hassles of our complete software stack. Runnable from a maven environment: + + $ mvn -e \ + -Dflys.backend.user=DB_USER \ + -Dflys.backend.password=DB_PASSWD \ + -Dflys.backend.url=DB_CONNECTION_URL \ + -Dexec.mainClass=de.intevation.flys.artifacts.charts.CrossSectionApp \ + exec:java + + You can set the river to be used with the system property 'river'. + Defaults to 'Mosel'. + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/TODO --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/TODO Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,1 @@ +- Validation of the input values of an incoming feed() call diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/contrib/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/contrib/README Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,43 @@ +From ChangeLog: + +2012-07-08 Sascha L. Teichmann + + * contrib/themes2html.xsl: New. Transformation to get a better + overview of themes.xml. Usage: + + $ xsltproc --path doc/conf \ + contrib/themes2html.xsl \ + doc/conf/themes.xml \ + > themes.xhtml + + Use browser to view the resulting file. + +2012-06-23 Sascha L. Teichmann + + * contrib/add-i18n-numbers.py: New. Script to prefix + the values of property files with a small number to + make the keys identifiable even through the UI. + + Apply in the same manner as contrib/check-i18n-properties.py + +2012-04-11 Sascha L. Teichmann + + * contrib/check-i18n-properties.py: New. Script to check inconsistencies + of i18n properties files: Detects duplicates and keys not defined in other + properties files. Usage: + + $ find -name messages\*.properties | \ + xargs contrib/check-i18n-properties.py + +2011-04-28 Sascha L. Teichmann + + * contrib/visualize-transitions.xsl: Added to create a + Graphviz digraph out of the config.xml. Usage: + + $ xsltproc --stringparam base-dir ../doc/conf/ \ + contrib/visualize-transitions.xsl \ + doc/conf/conf.xml > transitions.dot + + $ dot -Tsvg -o transitions.svg transitions.dot + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/contrib/add-i18n-numbers.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/contrib/add-i18n-numbers.py Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,118 @@ +#!/usr/bin/env python + +""" Add unique numbers in front of properties values + to identfy the key without knowing the real key. +""" + +import sys +import re +import os + +BLACK_LISTED_KEYS = [ + re.compile(r".*\.file$") +] + +BLACK_LISTED_VALUES = [ + re.compile(r"^http.*$") +] + +NUMBERED = re.compile(r"^\s*([^\s]+)\s*=\s*\[([0-9a-zA-Z]+)\]\s*(.+)$") +UNUMBERED = re.compile(r"^\s*([^\s]+)\s*=\s*(.+)$") + +ALPHA = "0123456789" \ + "abcdefghijklmnopqrstuvwxyz" \ + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + +def decode_ibase62(s): + t, c = 0, 1 + for x in s[::-1]: + i = ALPHA.find(x) + t += i*c + c *= len(ALPHA) + return t + +def ibase62(i): + if i == 0: + return "0" + out = [] + if i < 0: + out.append("-") + i = -1 + while i > 0: + out.append(ALPHA[i % len(ALPHA)]) + i //= len(ALPHA) + out.reverse() + return ''.join(out) + +def is_blacklisted(key, value): + + for bl in BLACK_LISTED_KEYS: + if bl.match(key): + return True + + for bl in BLACK_LISTED_VALUES: + if bl.match(value): + return True + + return False + +def find_key(already_numbered, value): + for k, v in already_numbered.iteritems(): + if v == value: + return k + return None + +def decorated_content(infile, outfile, already_numbered): + + for line in infile: + line = line.strip() + m = NUMBERED.match(line) + if m: + key, num, value = m.groups() + decoded_num = decode_ibase62(num) + last = find_key(already_numbered, decoded_num) + if last is None: + already_numbered[key] = decoded_num + elif last != key: + print >> sys.stderr, "WARN: Number clash: " \ + "%s leeds to '%s' and '%s'" % (num, key, last) + print >> outfile, line + continue + + m = UNUMBERED.match(line) + if m: + key, value = m.groups(1) + if is_blacklisted(key, value): + print >> outfile, line + else: + num = already_numbered.setdefault(key, len(already_numbered)) + print >> outfile, "%s=[%s] %s" % (key, ibase62(num), m.group(2)) + continue + print >> outfile, line + +def tmp_fname(fname): + name = fname + ".tmp" + i = 0 + while os.path.exists(name): + name = "%s.tmp%d" % (fname, i) + i += 1 + return name + +def decorate_file(fname, already_numbered): + + tmp = tmp_fname(fname) + + with open(fname, "r") as infile: + with open(tmp, "w") as outfile: + decorated_content(infile, outfile, already_numbered) + + os.rename(tmp, fname) + +def main(): + already_numbered = {} + for fname in sys.argv[1:]: + print >> sys.stderr, "checking %s" % fname + decorate_file(fname, already_numbered) + +if __name__ == "__main__": + main() diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/contrib/check-i18n-properties.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/contrib/check-i18n-properties.py Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +import sys +import re + +SPLIT_RE = re.compile(r"^\s*([^=]+)=\s*(.*)\s*") + +def load_properties_file(filename): + props = {} + with open(filename, "r") as f: + while True: + line = f.readline() + if not line: break + m = SPLIT_RE.match(line) + if not m: continue + k = m.group(1).strip() + v = m.group(2).strip() + if k in props: + print >> sys.stderr, "'%s' found more than once in '%s'." % ( + k, filename) + else: + props[k] = v + return props + +def main(): + + props = [(arg, load_properties_file(arg)) for arg in sys.argv[1:]] + + l = len(props) + + for i in range(0, l): + a = props[i][1] + for j in range(i+1, l): + b = props[j][1] + for k in a.iterkeys(): + if k not in b: + print >> sys.stderr, "'%s' found in '%s' but not in '%s'." % ( + k, props[i][0], props[j][0]) + for k in b.iterkeys(): + if k not in a: + print >> sys.stderr, "'%s' found in '%s' but not in '%s'." % ( + k, props[j][0], props[i][0]) + +if __name__ == '__main__': + main() diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/contrib/extract-help.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/contrib/extract-help.xsl Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,19 @@ + + + + + + https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe + Fixierungsanalyse + + + = + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/contrib/fixoverview2html.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/contrib/fixoverview2html.xsl Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,397 @@ + + + + + + de3f3307-3429-4ff9-8f43-3fb2fcf21b27 + + + + de + + + + + + + + + 0,## + 0.## + + + + + + Ereignis + Event + + + + + + Legende + Caption + + + + + + Farbe + Color + + + + + + Bedeutung + Meaning + + + + + + um MNQ + around MNQ + + + + + + um MQ + around MQ + + + + + + um MHQ + around MHQ + + + + + + über HQ5 + above HQ5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + width: + + %;float:left + + +
+
+
+
+
+ + + + + +
+ + background: + + green + blue + magenta + red + black + + ;width: + + + + % + ;float:left + + + km + + - + + + / Q + / Q + / Q + / Q + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + overflow:hidden;background: + + #ada96e + silver + + ;width: + + + + % + ;float:left + + + + : km + + - + + + +
+
+ + + + + + + + + + + + + + + + + + +
 
+
+ + + + + Fixierungen: + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Q ∈ [0, (MNQ+MQ)/2)
 Q ∈ [(MNQ+MQ)/2, (MQ+MHQ)/2)
 Q ∈ [(MQ+MHQ)/2, HQ5)
 Q ∈ [HQ5, ∞)
+ + +
+ + + + + +
diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/contrib/flush_cache.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/contrib/flush_cache.sh Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ $# != 2 ]; then + echo "usage $0 " + echo " cachename is the name of the cache defined in conf/caches.xml" + echo " for example: $0 12123 datacage.db" + exit 1 +fi + +curl -d @- http://localhost:$1/service/cache-invalidation << EOF + + + + +EOF diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/contrib/inline-dc-attribute.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/contrib/inline-dc-attribute.xsl Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${ + {$ + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/contrib/themes2html.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/contrib/themes2html.xsl Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,170 @@ + + + + + + + +
  • ( themes)
  • +
    + + + + () + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • /
  • +
    + + +
    +

    [Groups] [] Theme '' (virtual)

    + + + + + + + Sub themes +
      + +
    +
    + + + + + + + + + + + +
    NameDisplayTypeDefaultHints
    +
    +
    +
    + + +
  • +
    + + +
    +

    Theme group ''

    +
    +

    Theme List

    +
      + +
    +
    +
    +

    Theme Definitions

    + +
    +
    +
    + + + + + + +
    +
    + +
    + + +
    +

    Mappings

    + + + + + + + + +
    FromToPatternCondition
    +
    +
    + + + + + FLYS3 - Themes + + +

    FLYS3 - Themes

    +
    +

    Theme groups ( groups)

    +
      + + +
    +
    +
    +

    Mappings ( mappings)

    +
    +
    +
    + + +
    + + + +
    + + + + + + + + + + +
    diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/contrib/visualize-transitions.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/contrib/visualize-transitions.xsl Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,139 @@ + + + + + + + + + . + + + digraph transition_model { + + } + + + + + + + + + + ${artifacts.config.dir} + + + + + + + + + + subgraph + { + label = "Artefakt: + + "; + + + } + + + + + + " + + " [ shape = "record" label=<<table border="0" cellborder="0" cellpadding="3"> + <tr><td align="center" colspan="2" bgcolor="black"><font color="white"> + + </font></td></tr> + + </table>>] + ; + + + + <tr><td align="right"> + + </td><td align="left"> + + </td></tr> + + + + " + + " -> " + + " + + ; + + + + [ label=" + + + + + + + + " ] + + + + + + + + + = + != + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifact-db.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifact-db.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,10 @@ + + + + SA + + + + jdbc:h2:${artifacts.config.dir}/../artifactsdb/artifacts + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/annotation.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/annotation.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/chart.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/chart.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/fixanalysis.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/fixanalysis.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/gaugedischarge.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/gaugedischarge.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/gaugedischargecurve.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/gaugedischargecurve.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/hyk.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/hyk.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/manualpoints.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/manualpoints.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + +         +         +         +         +         + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/map.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/map.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/minfo.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/minfo.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/qsector.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/qsector.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/sqrelation.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/sqrelation.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/staticwqkms.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/staticwqkms.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/waterlevel.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/waterlevel.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/winfo.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/winfo.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,719 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/artifacts/wmsbackground.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/artifacts/wmsbackground.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/backend-db.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/backend-db.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,9 @@ + + + + flys + flys + org.hibernate.dialect.PostgreSQLDialect + org.postgresql.Driver + jdbc:postgresql://localhost:5432/flys + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/cache.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/cache.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/conf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/conf.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,425 @@ + + + + + + + + +]> + + YOUR_SECRET + + org.dive4elements.river.artifacts.context.FLYSContextFactory + + org.dive4elements.artifactdatabase.DefaultArtifactCollectionFactory + + + + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + + + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + + org.dive4elements.artifactdatabase.DefaultArtifactFactory + org.dive4elements.artifactdatabase.DefaultArtifactFactory + + + org.dive4elements.artifactdatabase.DefaultUserFactory + + + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + org.dive4elements.artifactdatabase.DefaultServiceFactory + + + + + + org.dive4elements.river.artifacts.datacage.Datacage + org.dive4elements.river.wsplgen.SchedulerSetup + org.dive4elements.river.artifacts.map.RiverMapfileGeneratorStarter + + + + org.dive4elements.river.artifacts.datacage.DatacageBackendListener + + + org.dive4elements.river.artifacts.context.SessionCallContextListener + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.dive4elements.river.exports.DischargeCurveGenerator + org.dive4elements.river.exports.DischargeCurveInfoGenerator + org.dive4elements.river.exports.CrossSectionGenerator + org.dive4elements.river.exports.CrossSectionInfoGenerator + org.dive4elements.river.exports.ComputedDischargeCurveGenerator + org.dive4elements.river.exports.ComputedDischargeCurveInfoGenerator + org.dive4elements.river.exports.LongitudinalSectionGenerator + org.dive4elements.river.exports.LongitudinalSectionInfoGenerator + org.dive4elements.river.exports.DurationCurveGenerator + org.dive4elements.river.exports.DurationCurveInfoGenerator + org.dive4elements.river.exports.DischargeLongitudinalSectionGenerator + org.dive4elements.river.exports.DischargeLongitudinalSectionInfoGenerator + org.dive4elements.river.exports.WaterlevelExporter + org.dive4elements.river.exports.extreme.ExtremeWQCurveGenerator + org.dive4elements.river.exports.WaterlevelExporter + org.dive4elements.river.exports.extreme.ExtremeWQCurveInfoGenerator + org.dive4elements.river.exports.fixings.FixWQCurveGenerator + org.dive4elements.river.exports.fixings.FixWQCurveInfoGenerator + org.dive4elements.river.exports.DurationCurveExporter + org.dive4elements.river.exports.ComputedDischargeCurveExporter + org.dive4elements.river.exports.DischargeLongitudinalSectionExporter + org.dive4elements.river.exports.WDifferencesCurveGenerator + org.dive4elements.river.exports.WDifferencesCurveInfoGenerator + org.dive4elements.river.exports.WDifferencesExporter + org.dive4elements.river.exports.MapGenerator + org.dive4elements.river.exports.MapGenerator + org.dive4elements.river.exports.ReferenceCurveGenerator + org.dive4elements.river.exports.NormalizedReferenceCurveGenerator + org.dive4elements.river.exports.NormalizedReferenceCurveInfoGenerator + org.dive4elements.river.exports.ReferenceCurveInfoGenerator + org.dive4elements.river.exports.ReferenceCurveExporter + org.dive4elements.river.exports.HistoricalDischargeCurveGenerator + org.dive4elements.river.exports.HistoricalDischargeCurveInfoGenerator + org.dive4elements.river.exports.HistoricalDischargeWQCurveGenerator + org.dive4elements.river.exports.HistoricalDischargeWQCurveInfoGenerator + org.dive4elements.river.exports.HistoricalDischargeCurveExporter + org.dive4elements.river.exports.FlowVelocityGenerator + org.dive4elements.river.exports.FlowVelocityInfoGenerator + org.dive4elements.river.exports.FlowVelocityExporter + org.dive4elements.river.exports.MiddleBedHeightGenerator + org.dive4elements.river.exports.MiddleBedHeightInfoGenerator + org.dive4elements.river.exports.MiddleBedHeightExporter + org.dive4elements.river.exports.minfo.BedQualityGenerator + org.dive4elements.river.exports.minfo.BedQualityInfoGenerator + org.dive4elements.river.exports.minfo.BedQualityExporter + org.dive4elements.river.exports.minfo.BedDifferenceYearGenerator + org.dive4elements.river.exports.minfo.BedDiffYearInfoGenerator + org.dive4elements.river.exports.minfo.BedDifferenceEpochGenerator + org.dive4elements.river.exports.minfo.BedDiffEpochInfoGenerator + org.dive4elements.river.exports.minfo.BedDiffHeightYearGenerator + org.dive4elements.river.exports.minfo.BedDiffHeightYearInfoGenerator + org.dive4elements.river.exports.sq.SQRelationGeneratorA + org.dive4elements.river.exports.sq.SQRelationGeneratorB + org.dive4elements.river.exports.sq.SQRelationGeneratorC + org.dive4elements.river.exports.sq.SQRelationGeneratorD + org.dive4elements.river.exports.sq.SQRelationGeneratorE + org.dive4elements.river.exports.sq.SQRelationGeneratorF + org.dive4elements.river.exports.sq.SQRelationInfoGenerator + org.dive4elements.river.exports.sq.SQRelationInfoGenerator + org.dive4elements.river.exports.sq.SQRelationInfoGenerator + org.dive4elements.river.exports.sq.SQRelationInfoGenerator + org.dive4elements.river.exports.sq.SQRelationInfoGenerator + org.dive4elements.river.exports.sq.SQRelationInfoGenerator + org.dive4elements.river.exports.sq.SQRelationExporter + org.dive4elements.river.exports.sq.SQOverviewGenerator + org.dive4elements.river.exports.fixings.ParametersExporter + org.dive4elements.river.exports.fixings.DeltaWtExporter + org.dive4elements.river.exports.fixings.FixDeltaWtGenerator + org.dive4elements.river.exports.fixings.FixDeltaWtInfoGenerator + org.dive4elements.river.exports.fixings.FixLongitudinalSectionGenerator + org.dive4elements.river.exports.fixings.FixLongitudinalSectionInfoGenerator + org.dive4elements.river.exports.fixings.FixDerivedCurveGenerator + org.dive4elements.river.exports.fixings.FixDerivedCurveInfoGenerator + org.dive4elements.river.exports.WaterlevelExporter + org.dive4elements.river.exports.fixings.FixWQCurveGenerator + org.dive4elements.river.exports.fixings.FixWQCurveInfoGenerator + org.dive4elements.river.exports.minfo.SedimentLoadLSGenerator + org.dive4elements.river.exports.minfo.SedimentLoadLSInfoGenerator + + org.dive4elements.river.exports.ReportGenerator + org.dive4elements.river.exports.ReportGenerator + org.dive4elements.river.exports.ReportGenerator + org.dive4elements.river.exports.ReportGenerator + org.dive4elements.river.exports.ReportGenerator + org.dive4elements.river.exports.ReportGenerator + org.dive4elements.river.exports.ReportGenerator + org.dive4elements.river.exports.ReportGenerator + org.dive4elements.river.exports.ReportGenerator + org.dive4elements.river.exports.ReportGenerator + + org.dive4elements.river.exports.ATExporter + org.dive4elements.river.exports.ATExporter + org.dive4elements.river.exports.fixings.FixATExport + + + + + + + + &floodmap; + &rivermap; + + &rest-server; + + + + 60000 + + + + ${artifacts.config.dir}/cache.xml + + + + &artifact-db; + &datacage-db; + &backend-db; + &seddb-db; + + + + ${artifacts.config.dir}/themes.xml + + + + + + + + + + + + + + /path/to/rivers/ + + + + http://example.com + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/datacage-db.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/datacage-db.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,7 @@ + + + SA + + org.h2.Driver + jdbc:h2:${artifacts.config.dir}/../datacagedb/datacage + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/datacage.sql --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/datacage.sql Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,137 @@ +BEGIN; + +CREATE SEQUENCE USERS_ID_SEQ; + +CREATE TABLE users ( + id INT PRIMARY KEY NOT NULL, + gid UUID NOT NULL UNIQUE +); + +CREATE SEQUENCE COLLECTIONS_ID_SEQ; + +CREATE TABLE collections ( + id INT PRIMARY KEY NOT NULL, + gid UUID NOT NULL UNIQUE, + user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + name VARCHAR(256) NOT NULL, + creation TIMESTAMP NOT NULL +); + +CREATE SEQUENCE ARTIFACTS_ID_SEQ; + +CREATE TABLE artifacts ( + id INT PRIMARY KEY NOT NULL, + gid UUID NOT NULL UNIQUE, + state VARCHAR(256) NOT NULL, + creation TIMESTAMP NOT NULL +); + +CREATE SEQUENCE COLLECTION_ITEMS_ID_SEQ; + +CREATE TABLE collection_items ( + id INT PRIMARY KEY NOT NULL, + collection_id INT NOT NULL REFERENCES collections(id) ON DELETE CASCADE, + artifact_id INT NOT NULL REFERENCES artifacts(id) ON DELETE CASCADE +); + +CREATE SEQUENCE ARTIFACT_DATA_ID_SEQ; + +CREATE TABLE artifact_data ( + id INT PRIMARY KEY NOT NULL, + artifact_id INT NOT NULL REFERENCES artifacts(id) ON DELETE CASCADE, + kind VARCHAR(256) NOT NULL, + k VARCHAR(256) NOT NULL, + v VARCHAR(256), -- Maybe too short + UNIQUE (artifact_id, k) +); + +CREATE SEQUENCE OUTS_ID_SEQ; + +CREATE TABLE outs ( + id INT PRIMARY KEY NOT NULL, + artifact_id INT NOT NULL REFERENCES artifacts(id) ON DELETE CASCADE, + name VARCHAR(256) NOT NULL, + description VARCHAR(256), + out_type VARCHAR(256) +); + +CREATE SEQUENCE FACETS_ID_SEQ; + +CREATE TABLE facets ( + id INT PRIMARY KEY NOT NULL, + out_id INT NOT NULL REFERENCES outs(id) ON DELETE CASCADE, + name VARCHAR(256) NOT NULL, + num INT NOT NULL, + state VARCHAR(256) NOT NULL, + description VARCHAR(256), + UNIQUE (out_id, num, name) +); + +CREATE VIEW master_artifacts AS + SELECT a2.id AS id, + a2.gid AS gid, + a2.state AS state, + a2.creation AS creation, + ci2.collection_id AS collection_id + FROM collection_items ci2 + JOIN artifacts a2 + ON ci2.artifact_id = a2.id + JOIN (SELECT ci.collection_id AS c_id, + MIN(a.creation) AS oldest_a + FROM collection_items ci + JOIN artifacts a + ON ci.artifact_id = a.id + GROUP BY ci.collection_id) o + ON o.c_id = ci2.collection_id + WHERE a2.creation = o.oldest_a; + +CREATE VIEW master_artifacts_range AS + SELECT ma.id AS id, + ma.gid AS gid, + ma.state AS state, + ma.creation AS creation, + ma.collection_id AS collection_id, + mam.ld_mode AS ld_mode, + mal.ld_locations AS ld_locations, + maf.ld_from AS ld_from, + mat.ld_to AS ld_to + FROM master_artifacts ma + LEFT JOIN (SELECT ad.v AS ld_mode, + ad.artifact_id AS artifact_id + FROM artifact_data ad + WHERE ad.k = 'ld_mode') mam + ON mam.artifact_id = ma.id + LEFT JOIN (SELECT ad.v AS ld_locations, + ad.artifact_id AS artifact_id + FROM artifact_data ad + WHERE ad.k = 'ld_locations') mal + ON mal.artifact_id = ma.id + LEFT JOIN (SELECT ad.v AS ld_from, + ad.artifact_id AS artifact_id + FROM artifact_data ad + WHERE ad.k = 'ld_from') maf + ON maf.artifact_id = ma.id + LEFT JOIN (SELECT ad.v AS ld_to, + ad.artifact_id AS artifact_id + FROM artifact_data ad + WHERE ad.k = 'ld_to') mat + ON mat.artifact_id = ma.id; + +-- DROP VIEW master_artifacts; +-- DROP VIEW master_artifacts_range; +-- DROP SEQUENCE USERS_ID_SEQ; +-- DROP SEQUENCE COLLECTIONS_ID_SEQ; +-- DROP SEQUENCE ARTIFACTS_ID_SEQ; +-- DROP SEQUENCE COLLECTION_ITEMS_ID_SEQ; +-- DROP SEQUENCE ARTIFACT_DATA_ID_SEQ; +-- DROP SEQUENCE OUTS_ID_SEQ; +-- DROP SEQUENCE FACETS_ID_SEQ; +-- DROP TABLE facets; +-- DROP TABLE outs; +-- DROP TABLE artifact_data; +-- DROP TABLE collection_items; +-- DROP TABLE collections; +-- DROP TABLE artifacts; +-- DROP TABLE users; + +COMMIT; diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/floodmap.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/floodmap.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/computed-discharge.jasper Binary file artifacts/doc/conf/jasper/computed-discharge.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/computed-discharge_en.jasper Binary file artifacts/doc/conf/jasper/computed-discharge_en.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/duration.jasper Binary file artifacts/doc/conf/jasper/duration.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/duration_en.jasper Binary file artifacts/doc/conf/jasper/duration_en.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/historical-discharge.jasper Binary file artifacts/doc/conf/jasper/historical-discharge.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/historical-discharge_en.jasper Binary file artifacts/doc/conf/jasper/historical-discharge_en.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/reference.jasper Binary file artifacts/doc/conf/jasper/reference.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/reference_en.jasper Binary file artifacts/doc/conf/jasper/reference_en.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/reference_en_gauge.jasper Binary file artifacts/doc/conf/jasper/reference_en_gauge.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/reference_en_gauge_end.jasper Binary file artifacts/doc/conf/jasper/reference_en_gauge_end.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/reference_en_gauge_start_end.jasper Binary file artifacts/doc/conf/jasper/reference_en_gauge_start_end.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/reference_gauge.jasper Binary file artifacts/doc/conf/jasper/reference_gauge.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/reference_gauge_end.jasper Binary file artifacts/doc/conf/jasper/reference_gauge_end.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/reference_gauge_start_end.jasper Binary file artifacts/doc/conf/jasper/reference_gauge_start_end.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/waterlevel.jasper Binary file artifacts/doc/conf/jasper/waterlevel.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/waterlevel_en.jasper Binary file artifacts/doc/conf/jasper/waterlevel_en.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/wdifferences.jasper Binary file artifacts/doc/conf/jasper/wdifferences.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/jasper/wdifferences_en.jasper Binary file artifacts/doc/conf/jasper/wdifferences_en.jasper has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/barrier_lines_class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/barrier_lines_class.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,32 @@ +CLASS + NAME "Damm" + EXPRESSION ("[TYP]"="Damm") + STYLE + SIZE 5 + OUTLINECOLOR "#008000" + END +END +CLASS + NAME "Rohr 1" + EXPRESSION ("[TYP]"="Rohr 1") + STYLE + SIZE 5 + OUTLINECOLOR "#800080" + END +END +CLASS + NAME "Rohr 2" + EXPRESSION ("[TYP]"="Rohr 2") + STYLE + SIZE 5 + OUTLINECOLOR "#808080" + END +END +CLASS + NAME "Graben" + EXPRESSION ("[TYP]"="Graben") + STYLE + SIZE 5 + OUTLINECOLOR "#800000" + END +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/barrier_polygons_class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/barrier_polygons_class.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,7 @@ +CLASS + NAME "POLYGON_BARRIERS" + STYLE + SIZE 5 + OUTLINECOLOR "#FF8000" + END +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/db_layer.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/db_layer.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,58 @@ +LAYER + NAME "$LAYER.getName()" + TYPE $LAYER.getType() + + CONNECTIONTYPE $LAYER.getConnectionType() + CONNECTION "$LAYER.getConnection()" + + DATA "$LAYER.getData()" + FILTER "$LAYER.getFilter()" + EXTENT $LAYER.getExtent() + + STATUS ON + TEMPLATE map.html + TOLERANCE 10 + DUMP TRUE + #if( $LAYER.getGroup() ) + GROUP "$LAYER.getGroup()" + #end + + #if ( $LAYER.getLabelItem() ) + LABELITEM $LAYER.getLabelItem() + #end + + PROJECTION + "init=epsg:31467" + END + + METADATA + "wms_title" "$LAYER.getTitle()" + "gml_include_items" "all" + #if ( $LAYER.getGroupTitle() ) + "wms_group_title" "$LAYER.getGroupTitle()" + #end + END + + #if ( $LAYER.getStyle() ) + $LAYER.getStyle() + #else + CLASS + NAME "" + STYLE + SIZE 5 + OUTLINECOLOR "#000000" + END + #if ( $LAYER.getLabelItem() ) + LABEL + ANGLE auto + SIZE 10 + COLOR "#000000" + TYPE truetype + FONT LiberationSans-Italic + POSITION ur + OFFSET 2 2 + END + #end + END + #end +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/fontset.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/fontset.txt Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,2 @@ +FreeSans /usr/share/fonts/truetype/freefont/FreeSans.ttf +DefaultFont /usr/share/fonts/truetype/freefont/FreeSans.ttf diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/layer.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/layer.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,38 @@ +LAYER + NAME "$LAYER.getName()" + TYPE $LAYER.getType() + DATA "$LAYER.getDirectory()/$LAYER.getData()" + STATUS ON + TEMPLATE map.html + TOLERANCE 10 + DUMP TRUE + #if( $LAYER.getGroup() ) + GROUP "$LAYER.getGroup()" + #end + + METADATA + "wms_title" "$LAYER.getTitle()" + "gml_include_items" "all" + #if ( $LAYER.getGroupTitle() ) + "wms_group_title" "$LAYER.getGroupTitle()" + #end + END + + PROJECTION + "init=epsg:$LAYER.getSrid()" + END + + #if ( !$LAYER.getStyle() ) + #if ( $LAYER.getGroupTitle() ) + #if ( $LAYER.getType() == "POLYGON" ) + #include("barrier_polygons_class.vm") + #else + #include("barrier_lines_class.vm") + #end + #else + #include("wsplgen_class.vm") + #end + #else + $LAYER.getStyle() + #end +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/mapfile.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/mapfile.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,60 @@ +MAP + NAME "FLYS-Map" + STATUS ON + SIZE 600 400 + MAXSIZE 4000 + EXTENT 3233232.55407617 5303455.37850183 3421524.44644752 5585825.50888523 + UNITS DD + SHAPEPATH "$SHAPEFILEPATH" + FONTSET "$CONFIGDIR/mapserver/fontset.txt" + SYMBOLSET "$CONFIGDIR/mapserver/symbols.sym" + IMAGECOLOR 255 255 255 + PROJECTION + "init=epsg:31467" + END + + DEBUG 5 + CONFIG "MS_ERRORFILE" "/tmp/flys-user-wms.log" + + WEB + METADATA + "wms_title" "FLYS Web Map Service" + "wms_onlineresource" "$MAPSERVERURL" + "wms_accessconstraints" "none" + "wms_fees" "none" + "wms_addresstype" "postal" + "wms_address" "Any Street" + "wms_city" "Any City" + "wms_stateorprovince" "Any state" + "wms_postcode" "My Postalcode" + "wms_country" "Any Country" + "wms_contactperson" "Any Person" + "wms_contactorganization" "Any Orga" + "wms_contactelectronicmailaddress" "any-email@example.com" + "wms_contactvoicetelephone" "Any's telephone number" + "wms_srs" "EPSG:4326 EPSG:31466 EPSG:31467" + "wms_feature_info_mime_type" "text/html" + "ows_enable_request" "*" + END + END + + LEGEND + KEYSIZE 20 20 + STATUS ON + TRANSPARENT ON + + LABEL + COLOR 150 150 150 + OUTLINECOLOR 255 255 255 + TYPE truetype + FONT "FreeSans" + SIZE 12 + POSITION AUTO + END + END + + ## Don't change the following lines. + #foreach ($LAYER in $LAYERS) + include "$LAYER" + #end +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/river-mapfile.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/river-mapfile.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,60 @@ +MAP + NAME "Rivers" + STATUS ON + SIZE 600 400 + MAXSIZE 4000 + #EXTENT 3233232.55407617 5303455.37850183 3421524.44644752 5585825.50888523 + UNITS DD + SHAPEPATH "$SHAPEFILEPATH" + FONTSET "$CONFIGDIR/mapserver/fontset.txt" + SYMBOLSET "$CONFIGDIR/mapserver/symbols.sym" + IMAGECOLOR 255 255 255 + PROJECTION + "init=epsg:31467" + END + + DEBUG 3 + CONFIG "MS_ERRORFILE" "/tmp/flys-rivers-wms.log" + + WEB + METADATA + "wms_title" "FLYS Rivers Web Map Service" + #"wms_onlineresource" "http://localhost:7777/river-wms" # "$MAPSERVERURL" + "wms_accessconstraints" "none" + "wms_fees" "none" + "wms_addresstype" "postal" + "wms_address" "Any Street" + "wms_city" "Any City" + "wms_stateorprovince" "Any state" + "wms_postcode" "My Postalcode" + "wms_country" "Any Country" + "wms_contactperson" "Any Person" + "wms_contactorganization" "Any Orga" + "wms_contactelectronicmailaddress" "any-email@example.com" + "wms_contactvoicetelephone" "Any's telephone number" + "wms_srs" "EPSG:4326 EPSG:31466 EPSG:31467" + "wms_feature_info_mime_type" "text/html" + "ows_enable_request" "*" + END + END + + LEGEND + KEYSIZE 20 20 + STATUS ON + TRANSPARENT ON + + LABEL + COLOR 150 150 150 + OUTLINECOLOR 255 255 255 + TYPE truetype + FONT "FreeSans" + SIZE 12 + POSITION AUTO + END + END + + ## Don't change the following lines. + #foreach ($LAYER in $LAYERS) + include "$LAYER" + #end +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/riveraxis-layer.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/riveraxis-layer.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,55 @@ +LAYER + NAME "$LAYER.getName()" + TYPE $LAYER.getType() + + CONNECTIONTYPE $LAYER.getConnectionType() + CONNECTION "$LAYER.getConnection()" + + DATA "$LAYER.getData()" + FILTER "$LAYER.getFilter()" + EXTENT $LAYER.getExtent() + + STATUS ON + TEMPLATE map.html + TOLERANCE 10 + DUMP TRUE + #if( $LAYER.getGroup() ) + GROUP "$LAYER.getGroup()" + #end + + #if ( $LAYER.getLabelItem() ) + LABELITEM $LAYER.getLabelItem() + #end + + METADATA + "wms_title" "$LAYER.getTitle()" + "gml_include_items" "all" + #if ( $LAYER.getGroupTitle() ) + "wms_group_title" "$LAYER.getGroupTitle()" + #end + END + + #if ( $LAYER.getStyle() ) + $LAYER.getStyle() + #else + CLASS + NAME "$LAYER.getName()" + STYLE + SIZE 5 + OUTLINECOLOR "#000000" + END + #if ( $LAYER.getLabelItem() ) + LABEL + ANGLE auto + SIZE 10 + COLOR "#000000" + TYPE truetype + FONT LiberationSans-Italic + POSITION ur + OFFSET 2 2 + END + #end + + END + #end +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/shapefile_layer.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/shapefile_layer.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,38 @@ +LAYER + NAME "$LAYER.getName()" + TYPE $LAYER.getType() + DATA "$LAYER.getDirectory()/$LAYER.getData()" + STATUS ON + TEMPLATE map.html + TOLERANCE 10 + DUMP TRUE + #if( $LAYER.getGroup() ) + GROUP "$LAYER.getGroup()" + #end + + PROJECTION + "init=epsg:$LAYER.getSrid()" + END + + METADATA + "wms_title" "$LAYER.getTitle()" + "gml_include_items" "all" + #if ( $LAYER.getGroupTitle() ) + "wms_group_title" "$LAYER.getGroupTitle()" + #end + END + + #if ( !$LAYER.getStyle() ) + #if ( $LAYER.getGroupTitle() ) + #if ( $LAYER.getType() == "POLYGON" ) + #include("barrier_polygons_class.vm") + #else + #include("barrier_lines_class.vm") + #end + #else + #include("wsplgen_class.vm") + #end + #else + $LAYER.getStyle() + #end +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/symbols.sym --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/symbols.sym Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,22 @@ +SYMBOLSET +SYMBOL + NAME 'point' + TYPE ELLIPSE + POINTS + 1 1 + END + FILLED TRUE +END +SYMBOL + NAME "square" + TYPE VECTOR + POINTS + 0 0 + 0 1 + 1 1 + 1 0 + 0 0 + END + FILLED TRUE +END +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/wsplgen_class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/wsplgen_class.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,44 @@ +CLASS + NAME "0.0 <= DIFF < 1" + EXPRESSION ([DIFF] < 1) + STYLE + SIZE 5 + COLOR "#B2C9D7" + END +END + +CLASS + NAME "1.0 <= DIFF < 2" + EXPRESSION ([DIFF] >= 1 AND [DIFF] < 2) + STYLE + SIZE 5 + COLOR "#6F93AA" + END +END + +CLASS + NAME "2.0 <= DIFF < 3" + EXPRESSION ([DIFF] >= 2 AND [DIFF] < 3) + STYLE + SIZE 5 + COLOR "#426F8B" + END +END + +CLASS + NAME "3.0 <= DIFF < 4" + EXPRESSION ([DIFF] >= 3 AND [DIFF] < 4) + STYLE + SIZE 5 + COLOR "#214F6C" + END +END + +CLASS + NAME "Sonstiges" + EXPRESSION ([DIFF] >= 4) + STYLE + SIZE 5 + COLOR "#021B2A" + END +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/mapserver/wsplgen_layer.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/mapserver/wsplgen_layer.vm Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,40 @@ +LAYER + NAME "$LAYER.getName()" + TYPE $LAYER.getType() + DATA "$LAYER.getDirectory()/$LAYER.getData()" + STATUS ON + TEMPLATE map.html + TOLERANCE 10 + DUMP TRUE + #if( $LAYER.getGroup() ) + GROUP "$LAYER.getGroup()" + #end + + PROJECTION + "init=epsg:$LAYER.getSrid()" + END + + METADATA + "wms_title" "$LAYER.getTitle()" + "gml_include_items" "all" + "ows_enable_request" "GetFeatureInfo" + "wms_feature_info_mime_type" "gml" + #if ( $LAYER.getGroupTitle() ) + "wms_group_title" "$LAYER.getGroupTitle()" + #end + END + + #if ( !$LAYER.getStyle() ) + #if ( $LAYER.getGroupTitle() ) + #if ( $LAYER.getType() == "POLYGON" ) + #include("barrier_polygons_class.vm") + #else + #include("barrier_lines_class.vm") + #end + #else + #include("wsplgen_class.vm") + #end + #else + $LAYER.getStyle() + #end +END diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/meta-data.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/meta-data.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,3064 @@ + + + + + Statement to load data from wsts. + + + + SELECT wst_columns.id AS prot_column_id, + wst_columns.name AS prot_column_name, + wst_columns.position AS prot_rel_pos, + wst_columns.description AS info, + wst_ranges.a AS deffrom, + wst_ranges.b AS defto + FROM wst_columns, wst_ranges + WHERE wst_columns.wst_id = ${prot_id} + AND wst_ranges.wst_column_id = wst_columns.id + AND (${fromkm} BETWEEN wst_ranges.a AND wst_ranges.b + OR ${tokm} BETWEEN wst_ranges.a AND wst_ranges.b + OR wst_ranges.a BETWEEN ${fromkm} AND ${tokm} + OR wst_ranges.b BETWEEN ${fromkm} AND ${tokm}) + ORDER by wst_columns.position + + + + + Load user specific distance information from artifact. + + + + + + + SELECT COALESCE(ld_mode, '') AS ldm, + COALESCE(ld_locations, '') AS ldl, + COALESCE(ld_from, '') AS ldf, + COALESCE(ld_to, '') AS ldt + FROM master_artifacts_range + WHERE gid = CAST(${artifact-id} AS uuid) + + + + + + + + + + + + + + + + + + System part. Load data for the given river. + + + + + SELECT id AS river_id, name AS river_name FROM rivers + WHERE lower(name) LIKE lower(${river}) + + + + + Base-data macros (mostly data imported from wst-files). + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 0 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 0 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 1 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 1 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 1 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 2 AND river_id = ${river_id} + ORDER BY prot_description + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 2 AND river_id = ${river_id} + ORDER BY prot_description + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 2 AND river_id = ${river_id} + ORDER BY prot_description + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 3 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 4 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 4 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 4 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 5 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS prot_id, + description AS prot_description + FROM wsts WHERE kind = 5 AND river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS anno_id, + name AS anno_description + FROM annotation_types + + + + + + + + + + + + + + SELECT DISTINCT + cs.id AS prot_id, + cs.description AS prot_description + FROM cross_sections cs + JOIN cross_section_lines csl ON csl.cross_section_id = cs.id + WHERE cs.river_id = ${river_id} + AND csl.km BETWEEN ${fromkm} AND ${tokm} + + + + + + + + + + + + + + + SELECT DISTINCT + h.id AS hyk_id, + h.description AS hyk_description + FROM hyks h + JOIN hyk_entries he ON he.hyk_id = h.id + WHERE river_id = ${river_id} + AND he.km BETWEEN ${fromkm} AND ${tokm} + + + + + + + + + + + + + + SELECT id AS fvmid, + description AS fvmd + FROM flow_velocity_measurements WHERE river_id = ${river_id} + + + + + + SELECT id, description, station, datetime, v, w, q + FROM flow_velocity_measure_values + WHERE measurements_id = ${fvmid} + AND station BETWEEN ${fromkm} AND ${tokm} + + + + + + + + + + + + + + + + + SELECT id AS bedh_id, + year AS bedh_year, + description AS bedh_descr + FROM bed_height_single WHERE river_id = ${river_id} + + + + + + + + + + + + + SELECT id AS width_id + FROM morphologic_width + WHERE river_id = ${river_id} + + + + + SELECT min(station) AS from, + max(station) AS to + FROM morphologic_width_values + WHERE morphologic_width_id = ${width_id} + + + + + + + + + + + + + + + + + + + + + + + + + + River-Node + + + + + + + Recommendations (client shall load immediately). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Non - Recommendations. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MINFO bedheight middle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS gauge_id, + name AS gauge_name + FROM gauges WHERE river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS gauge_id, + name AS gauge_name + FROM gauges WHERE river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FIXME: Following two macros look identical to me. + + + + + + + + + + + + + + SELECT d.id AS dem_id, + r.a AS dem_lower, + r.b AS dem_upper, + d.name AS name, + t.start_time AS start_time, + t.stop_time AS stop_time, + 'Projektion: ' || d.projection || '$' || + 'Rasterweite: ' || d.resolution || 'm$' || + 'Format: ' || d.format || '$' || + 'Zeitraum: ' + AS info + FROM dem d + JOIN ranges r ON d.range_id = r.id + LEFT JOIN time_intervals t ON d.time_interval_id = t.id + WHERE d.river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT + name AS hws_name, + official AS hws_official, + kind_id AS hws_kind + FROM hws_lines + WHERE river_id = ${river_id} + + + + + + + + + + + + + SELECT DISTINCT + name AS hws_name, + official AS hws_official, + kind_id AS hws_kind + FROM hws_points + WHERE river_id = ${river_id} + + + + + + + + + + + + + SELECT DISTINCT 1 FROM river_axes_km WHERE river_id = ${river_id} + + + + + + + + + + Grab only the actual first + + SELECT DISTINCT + cs.kind_id AS kind_id, + ck.name AS kind_name + FROM cross_section_tracks cs + JOIN cross_section_track_kinds ck on cs.kind_id = ck.id + WHERE river_id = ${river_id} + AND kind_id=1 + + + + + + + + + Now the other tracks + + SELECT DISTINCT + cs.kind_id AS kind_id, + ck.name AS kind_name, + cs.name AS layer_name + FROM cross_section_tracks cs + JOIN cross_section_track_kinds ck on cs.kind_id = ck.id + WHERE river_id = ${river_id} + AND kind_id=0 + + + + + + + + + + + + + + + SELECT DISTINCT + ax.kind_id AS kind_id, + ak.name AS kind_name + FROM river_axes ax + JOIN axis_kinds ak on ax.kind_id = ak.id + WHERE river_id = ${river_id} + AND kind_id=1 + + + + + + + + + + SELECT DISTINCT + ak.name AS kind_name, + ax.kind_id AS kind_id, + ax.name AS layer_name + FROM river_axes ax + JOIN axis_kinds ak on ax.kind_id = ak.id + WHERE river_id = ${river_id} + AND kind_id <> 1 + + + + + + + + + + + + + + + SELECT DISTINCT + name + FROM hydr_boundaries + WHERE river_id = ${river_id} + AND kind = 2 + + + + + + + + SELECT DISTINCT + name + FROM hydr_boundaries_poly + WHERE river_id = ${river_id} + AND kind = 2 + + + + + + + + + + + SELECT DISTINCT + name + FROM hydr_boundaries + WHERE river_id = ${river_id} + AND kind = 1 + + What about all other line kinds? + + + + + + + + + + + + + + SELECT DISTINCT + b.sectie AS sectie_id, + sk.name AS sectie + FROM hydr_boundaries_poly b + JOIN sectie_kinds sk ON b.sectie = sk.id + WHERE b.river_id = ${river_id} + AND b.kind = 1 + + + + + + + + + + + + SELECT DISTINCT + b.sobek AS sobek_id, + sk.name AS sobek + FROM hydr_boundaries_poly b + JOIN sobek_kinds sk ON b.sobek = sk.id + WHERE b.river_id = ${river_id} + AND b.kind = 1 + + + + + + + + + + + + SELECT DISTINCT + b.name AS name + FROM hydr_boundaries_poly b + WHERE b.river_id = ${river_id} + AND b.kind = 1 + AND b.sobek IS NULL + AND b.sectie is NULL + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT + fp.kind_id AS kind_id, + flk.name AS kind_name + FROM floodplain fp + JOIN floodplain_kinds flk on fp.kind_id = flk.id + WHERE river_id = ${river_id} + AND kind_id=1 + + + + + + + + + + SELECT DISTINCT + flk.name AS kind_name, + fp.kind_id AS kind_id, + fp.name AS layer_name + FROM floodplain fp + JOIN floodplain_kinds flk on fp.kind_id = flk.id + WHERE river_id = ${river_id} + AND kind_id <> 1 + + + + + + + + + + + + + + + Call from a context where fed_name hws_kind hws_name and river_id is + availble + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT + fs.name AS fed_name, + fs.id AS fed_id + FROM hws_lines hws + JOIN fed_states fs ON hws.fed_state_id = fs.id + WHERE river_id = ${river_id} + AND hws.official=1 + + + + + SELECT DISTINCT + name AS hws_name, + kind_id AS hws_kind + FROM hws_lines + WHERE river_id = ${river_id} + AND official=1 + AND fed_state_id = ${fed_id} ORDER BY name + + + + + + + + + + SELECT distinct + name AS hws_name, + kind_id AS hws_kind + FROM hws_lines + WHERE river_id = ${river_id} + AND official=1 + AND fed_state_id IS NULL + ORDER BY name + + + + + + + + + + SELECT DISTINCT + fs.name AS fed_name, + fs.id AS fed_id + FROM hws_lines hws + JOIN fed_states fs ON hws.fed_state_id = fs.id + WHERE river_id = ${river_id} + AND hws.official=0 + + + + + SELECT DISTINCT + name AS hws_name, + kind_id AS hws_kind + FROM hws_lines + WHERE river_id = ${river_id} + AND official=0 + AND fed_state_id = ${fed_id} ORDER BY name + + + + + + + + + + SELECT distinct + name AS hws_name, + kind_id AS hws_kind + FROM hws_lines + WHERE river_id = ${river_id} + AND official=0 + AND fed_state_id IS NULL ORDER BY name + + + + + + + + + + + + Call from a context where fed_name hws_kind hws_name and river_id is + availble + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT + fs.name AS fed_name, + fs.id AS fed_id + FROM hws_points hws + JOIN fed_states fs ON hws.fed_state_id = fs.id + WHERE river_id = ${river_id} + AND hws.official=1 + + + + + SELECT DISTINCT + name AS hws_name, + kind_id AS hws_kind + FROM hws_points + WHERE river_id = ${river_id} + AND official=1 + AND fed_state_id = ${fed_id} ORDER BY name + + + + + + + + + + SELECT distinct + name AS hws_name, + kind_id AS hws_kind + FROM hws_points + WHERE river_id = ${river_id} + AND official=1 + AND fed_state_id IS NULL + ORDER BY name + + + + + + + + + + SELECT DISTINCT + fs.name AS fed_name, + fs.id AS fed_id + FROM hws_points hws + JOIN fed_states fs ON hws.fed_state_id = fs.id + WHERE river_id = ${river_id} + AND hws.official=0 + + + + + SELECT DISTINCT + name AS hws_name, + kind_id AS hws_kind + FROM hws_points + WHERE river_id = ${river_id} + AND official=0 + AND fed_state_id = ${fed_id} ORDER BY name + + + + + + + + + + SELECT distinct + name AS hws_name, + kind_id AS hws_kind + FROM hws_points + WHERE river_id = ${river_id} + AND official=0 + AND fed_state_id IS NULL ORDER BY name + + + + + + + + + + + + + SELECT DISTINCT + b.kind_id AS building_kind_id, + bk.name AS building_kind + FROM buildings b + JOIN building_kinds bk ON b.kind_id = bk.id + WHERE b.river_id = ${river_id} + AND b.kind_id <> 0 + + + + + + + + SELECT DISTINCT + b.name AS building_name, + bk.name AS building_kind, + b.kind_id AS building_kind_id + FROM buildings b + JOIN building_kinds bk ON b.kind_id = bk.id + WHERE river_id = ${river_id} + AND kind_id = 0 + + + + + + + + + + + + SELECT DISTINCT + j.kind_id AS jetty_kind_id, + jk.name AS jetty_kind + FROM jetties j + JOIN jetty_kinds jk ON j.kind_id = jk.id + WHERE river_id = ${river_id} + + + + + + + + + + + + + + + SELECT name AS name + FROM fixpoints WHERE river_id = ${river_id} GROUP BY name + + + + + + + + + + + + + + + + + + SELECT DISTINCT 1 from floodmaps where river_id = ${river_id} + + + + + + + SELECT DISTINCT 1 from floodmaps where river_id = ${river_id} + AND (kind = 112 OR kind = 111) + + + + + + SELECT DISTINCT name AS name + FROM floodmaps + WHERE river_id = ${river_id} AND kind = 111 + + + + + + + + + + + + SELECT DISTINCT name AS name + FROM floodmaps + WHERE river_id = ${river_id} AND kind = 112 + + + + + + + + + + + + + + + SELECT DISTINCT 1 from floodmaps where river_id = ${river_id} + AND (kind = 122 OR kind = 121) + + + + + + SELECT DISTINCT name AS name + FROM floodmaps + WHERE river_id = ${river_id} AND kind = 121 + + + + + + + + + + + + SELECT DISTINCT + name AS name + FROM floodmaps + WHERE river_id = ${river_id} AND kind = 122 + + + + + + + + + + + + + + + + SELECT DISTINCT + source AS source + FROM floodmaps + WHERE river_id = ${river_id} AND kind = 200 + + + + + + + + SELECT DISTINCT + name AS name + FROM floodmaps + WHERE river_id = ${river_id} AND kind = 200 AND source = + ${source} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT DISTINCT + coalesce(CAST (year AS VARCHAR(64)), 'Unbekanntes Jahr') as year + FROM flood_marks + WHERE river_id = ${river_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS bedh_id, + year AS bedh_year, + description AS bedh_descr + FROM bed_height_single WHERE river_id = ${river_id} + + + + + + + + + + + + + SELECT id AS bedh_id, + time_interval_id AS bedh_interval_id, + description AS bedh_descr + FROM bed_height_epoch WHERE river_id = ${river_id} + + + + + + + + + + + + + + + User specific part + ------------------ + + + + + + + + + Get the user and collection-id. + + SELECT u.id AS user_id, c.id AS collection_id, c.name AS collection_name + FROM collections c JOIN users u ON c.user_id = u.id + WHERE u.gid = CAST(${user-id} AS uuid) + ORDER BY c.creation DESC + + + + + SELECT m.id AS a_id, + m.state AS a_state, + m.gid AS a_gid, + m.creation AS a_creation, + COALESCE(ld_mode, '') AS ld_m, + COALESCE(ld_locations, '') AS ld_l, + COALESCE(ld_from, '') AS ld_f, + COALESCE(ld_to, '') AS ld_t + FROM master_artifacts_range m + WHERE m.collection_id = ${collection_id} AND m.gid <> CAST(${artifact-id} AS uuid) + AND EXISTS ( + SELECT id FROM artifact_data ad WHERE ad.artifact_id = m.id AND k = 'river' AND v = ${river}) + + + + + + + + + + + + + + + + + + SELECT m.id AS a_id, + m.state AS a_state, + m.gid AS a_gid, + m.creation AS a_creation, + ardg.v AS gaugy, + arv.v AS wqsingle + FROM master_artifacts m, + artifact_data ardg, + artifact_data arv + WHERE m.collection_id = ${collection_id} + AND m.gid = CAST(${artifact-id} AS uuid) + AND ardg.artifact_id = m.id + AND ardg.k = 'ld_gaugename' + AND arv.artifact_id = m.id + AND arv.k = 'wq_single' + AND EXISTS ( + SELECT id + FROM artifact_data ad + WHERE ad.artifact_id = m.id + AND k = 'river' + AND v = ${river}) + + + + + SELECT ol.wst_id AS wstid, ol.wst_column_pos AS wstcolpos, ol.name AS olname, ol.value AS oval + FROM official_q_values ol + WHERE ol.value = CAST(${wqsingle} AS NUMERIC(10,2)) AND ol.gauge_name = ${gaugy} + + + + + + + + + + + + + + + + + + SHOW W-DIFFERENCES + + + + + + + + + + SELECT a.gid AS aid, f.id AS fid, f.name AS facet_name, f.num AS facet_num, f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE f.name = 'w_differences' and f.out_id = o.id and o.artifact_id = ${a_id} and a.id = ${a_id} + + + + + + + + + + + + + + + + + + + SHOW REFERENCE CURVE + + + + + + + + + + SELECT a.gid AS aid, f.id AS fid, f.name AS facet_name, f.num AS facet_num, f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE f.name = 'reference_curve' and f.out_id = o.id and o.artifact_id = ${a_id} and a.id = ${a_id} + + + + + + + + + + + + + + + + + + + SHOW COMPUTED DISCHARGE CURVES + + + + + + + + + + SELECT a.gid AS aid, f.id AS fid, f.name AS facet_name, f.num AS facet_num, f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE f.name = 'computed_discharge_curve.q' and f.out_id = o.id and o.artifact_id = ${a_id} and a.id = ${a_id} + + + + + + + + + + + + + + + + + + + CROSS SECTION + + + + + + + + + + SELECT id AS out_id + FROM outs + WHERE artifact_id = ${a_id} AND name = 'cross_section' + + + + + SELECT name AS facet_name, num AS facet_num, description AS facet_description + FROM facets + WHERE out_id = ${out_id} + ORDER BY num ASC, name DESC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS out_id + FROM outs + WHERE artifact_id = ${a_id} AND name = 'longitudinal_section' + + + + + SELECT name AS facet_name, num AS facet_num, description AS facet_description + FROM facets + WHERE out_id = ${out_id} + ORDER BY num ASC, name DESC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS out_id + FROM outs + WHERE artifact_id = ${a_id} AND name = 'fix_longitudinal_section_curve' + + + + + + SELECT name AS facet_name, num AS facet_num, description AS facet_description + FROM facets + WHERE out_id = ${out_id} AND ( + name LIKE 'fix_deviation_ls%' OR + name LIKE 'fix_sector_average_ls%' OR + name LIKE 'fix_analysis_events_ls%' OR + name LIKE 'fix_reference_events_ls%' ) + ORDER BY num ASC, name DESC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS out_id + FROM outs + WHERE artifact_id = ${a_id} AND name = 'fix_deltawt_curve' + + + + + SELECT name AS facet_name, num AS facet_num, description AS facet_description + FROM facets + WHERE out_id = ${out_id} and ( + name LIKE 'fix_sector_average_dwt%' OR + name LIKE 'fix_deviation_dwt%' OR + name = 'fix_analysis_events_dwt' OR + name = 'fix_reference_events_dwt' OR + name = 'fix_analysis_periods_dwt' ) + ORDER BY num ASC, name DESC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS out_id + FROM outs + WHERE artifact_id = ${a_id} AND name = 'fix_deltawt_curve' + + + + + SELECT name AS facet_name, num AS facet_num, description AS facet_description + FROM facets + WHERE out_id = ${out_id} and ( + name LIKE 'fix_sector_average_dwt%' OR + name LIKE 'fix_deviation_dwt%') + ORDER BY num ASC, name DESC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS out_id + FROM outs + WHERE artifact_id = ${a_id} AND name = 'fix_derivate_curve' + + + + + SELECT name AS facet_name, num AS facet_num, description AS facet_description + FROM facets + WHERE out_id = ${out_id} and name = 'fix_derivate_curve' + ORDER BY num ASC, name DESC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS out_id + FROM outs + WHERE artifact_id = ${a_id} AND name = 'fix_wq_curve' + + + + + SELECT name AS facet_name, num AS facet_num, description AS facet_description + FROM facets + WHERE out_id = ${out_id} and ( + name LIKE 'fix_sector_average_wq%' OR + name = 'fix_wq_curve' OR + name LIKE 'fix_analysis_events_wq%' OR + name LIKE 'fix_reference_events_wq%' ) + ORDER BY num ASC, name DESC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE + (f.name = 'duration_curve.q' OR f.name = 'duration_curve.w') AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + WATERLEVELS - ONLY SHOW Ws + + + + + + + + + + + + SELECT id AS out_id + FROM outs + WHERE artifact_id = ${a_id} AND name = 'longitudinal_section' + + + + + SELECT name AS facet_name, num AS facet_num, description AS facet_description + FROM facets + WHERE out_id = ${out_id} and name = 'longitudinal_section.w' + ORDER BY num ASC, name DESC + + + + + + + + + + + + + + + + + + + + + + + SHOW FLOODMAPS + + + + + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE f.name = 'floodmap.wsplgen' AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + MINFO bedheight middle + + + + + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE ( + f.name = 'longitudinal_section.w' OR + f.name = 'heightmarks_points' + ) AND f.out_id = o.id AND o.artifact_id = ${a_id} AND a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS out_id + FROM outs + WHERE artifact_id = ${a_id} AND name = 'floodmap' + + + + + SELECT name AS facet_name, + num AS facet_num, + description AS facet_description + FROM facets + WHERE out_id = ${out_id} AND name = 'floodmap.usershape' + ORDER BY num ASC, name DESC + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS oid + FROM outs AS o + WHERE + o.artifact_id = ${a_id} AND + o.name='bed_longitudinal_section' + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE + (f.name = 'bed_longitudinal_section.bed_diameter_toplayer' + OR f.name = 'bed_longitudinal_section.bed_diameter_sublayer') AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS oid + FROM outs AS o + WHERE + o.artifact_id = ${a_id} AND + o.name='bed_longitudinal_section' + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE + f.name = 'bed_longitudinal_section.bedload_diameter' AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS oid + FROM outs AS o + WHERE + o.artifact_id = ${a_id} AND + o.name='bed_longitudinal_section' + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE + (f.name = 'bed_longitudinal_section.sediment_density_toplayer' OR + f.name = 'bed_longitudinal_section.sediment_density_sublayer') AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS oid + FROM outs AS o + WHERE + o.artifact_id = ${a_id} AND + o.name='bed_longitudinal_section' + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE + (f.name = 'bed_longitudinal_section.porosity_toplayer' OR + f.name = 'bed_longitudinal_section.porosity_sublayer') AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS oid + FROM outs AS o + WHERE + o.artifact_id = ${a_id} and o.name='flow_velocity' + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE + (f.name = 'flow_velocity.totalchannel' OR + f.name = 'flow_velocity.mainchannel' OR + f.name = 'flow_velocity.totalchannel.filtered' OR + f.name = 'flow_velocity.mainchannel.filtered') AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS oid + FROM outs AS o + WHERE + o.artifact_id = ${a_id} and o.name='sedimentload_ls' + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE f.name LIKE 'sedimentload%' AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS oid, + name AS o_name + FROM outs AS o + WHERE + o.artifact_id = ${a_id} AND + (o.name = 'bed_difference_year' OR + o.name = 'bed_differnece_epoch') + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE (f.name LIKE 'bedheight_difference.year%' OR + f.name LIKE 'bedheight_difference.epoch%') AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT ou.id AS oid + FROM outs AS ou, artifacts AS ar + WHERE + ar.state = 'state.fix.vollmer.compute' AND + ou.name = 'longitudinal_section' + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE f.name = 'longitudinal_section.w' AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id AS oid + FROM outs AS o + WHERE + o.artifact_id = ${a_id} AND + o.name = 'discharge_longitudinal_section' + + + + + + SELECT a.gid AS aid, + f.id AS fid, + f.name AS facet_name, + f.num AS facet_num, + f.description AS facet_description + FROM outs AS o, facets AS f, artifacts AS a + WHERE f.name = 'discharge_longitudinal_section.w' AND + f.out_id = o.id AND + o.artifact_id = ${a_id} AND + a.id = ${a_id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Include System specific part when 'load-system' is in parameters. + ----------------------------------------------------------------- + + + + + + + + Include System specific part only if no user ID is given. + --------------------------------------------------------- + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/rest-server.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/rest-server.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,6 @@ + + + + 8181 + localhost + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/rivermap.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/rivermap.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/seddb-db.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/seddb-db.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,12 @@ + + + + sedb + sedb + org.hibernate.dialect.PostgreSQLDialect + org.postgresql.Driver + jdbc:postgresql://localhost:5432/seddb + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + +]> + + &virtual-themes; + + + &longitudinal-section; + &cross-section; + &discharge; + &duration; + &fixings; + &floodmap; + &historical-discharge; + &reference; + &sq-relation; + &general; + + + &longitudinal-section_sec; + &cross-section_sec; + &discharge_sec; + &duration_sec; + &fixings_sec; + &floodmap_sec; + &historical-discharge_sec; + &reference_sec; + &sq-relation_sec; + &general_sec; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/cross-section.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/cross-section.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/discharge.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/discharge.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/duration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/duration.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/fixings.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/fixings.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/floodmap.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/floodmap.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/general.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/general.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/historical-discharge.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/historical-discharge.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/longitudinal-section.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/longitudinal-section.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,975 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/reference.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/reference.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/default/sq-relation.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/default/sq-relation.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/cross-section.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/cross-section.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/discharge.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/discharge.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/duration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/duration.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/fixings.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/fixings.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/floodmap.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/floodmap.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/general.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/general.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/historical-discharge.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/historical-discharge.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/longitudinal-section.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/longitudinal-section.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,945 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/reference.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/reference.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/second/sq-relation.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/second/sq-relation.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/conf/themes/virtual.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/themes/virtual.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 artifacts/doc/datacage-config-manual/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/datacage-config-manual/Makefile Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,3492 @@ +# Copyright 2004 Chris Monson (shiblon@gmail.com) +# Latest version available at http://www.bouncingchairs.net/oss +# +# This file is part of ``Chris Monson's Free Software''. +# +# ``Chris Monson's Free Software'' is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, Version 2. +# +# ``Chris Monson's Free Software'' is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with ``Chris Monson's Free Software''; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# It is also available on the web at http://www.gnu.org/copyleft/gpl.html +# +# Note that using this makefile to build your documents does NOT place them +# under the GPL unless you, the author, specifically do so. In other words, +# I, Chris Monson, the copyright holder and author of this makefile, +# consider it impossible to ``link'' to this makefile in any way covered by +# the GPL. +# +# TO OBTAIN INSTRUCTIONS FOR USING THIS FILE, RUN: +# make help +# +fileinfo := LaTeX Makefile +author := Chris Monson +version := 2.2.0-rc1 +# +# Note that the user-global version is imported *after* the source directory, +# so that you can use stuff like ?= to get proper override behavior. +.PHONY: Makefile GNUmakefile Makefile.ini $(HOME)/.latex-makefile/Makefile.ini +-include Makefile.ini +-include $(HOME)/.latex-makefile/Makefile.ini +# +# This can be pdflatex or latex - you can change this by adding the following line to your Makefile.ini: +# BUILD_STRATEGY := latex +BUILD_STRATEGY ?= pdflatex +# +# Sets LC_ALL=C, by default, so that the locale-aware tools, like sort, be +# # immune to changes to the locale in the user environment. +export LC_ALL ?= C +# +# +# If you specify sources here, all other files with the same suffix +# will be treated as if they were _include_ files. +#onlysources.tex ?= main.tex +#onlysources.tex.sh ?= +#onlysources.tex.pl ?= +#onlysources.tex.py ?= +#onlysources.rst ?= +#onlysources.fig ?= +#onlysources.gpi ?= +#onlysources.dot ?= +#onlysources.xvg ?= +#onlysources.svg ?= +#onlysources.eps.gz ?= +#onlysources.eps ?= +# +# If you list files here, they will be treated as _include_ files +#includes.tex ?= file1.tex file2.tex +#includes.tex.sh ?= +#includes.tex.pl ?= +#includes.tex.py ?= +#includes.rst ?= +#includes.fig ?= +#includes.gpi ?= +#includes.dot ?= +#includes.xvg ?= +#includes.svg ?= +#includes.eps.gz ?= +#includes.eps ?= +# +# If you list files or wildcards here, they will *not* be cleaned - default is +# to allow everything to be cleaned. +#neverclean ?= *.pdf +# +# Alternatively (recommended), you can add those lines to a Makefile.ini file +# and it will get picked up automatically without your having to edit this +# Makefile. +# +# KNOWN ISSUES: +# * The following occurs: +# file with: \usepackage{named}\bibliographystyle{named} +# Compile +# change to: \usepackage{apalike}\bibliographystyle{apalike} +# Compile again -- BARF! +# +# The workaround: make clean-nographics; make +# +# Note that we may not be able to fix this. LaTeX itself barfs +# on this, not the makefile. The very first invocation of LaTeX +# (when something like this has happened) reads the existing .aux +# file and discovers invalid commands like \citeauthoryear that +# are only valid in the package that was just removed. It then +# tries to parse them and explodes. It's not at all clear to me +# how to fix this. I tried removing the .aux files on the first +# run of LaTeX, but that necessarily requires more subsequent +# rebuilds on common edits. There does not appear to be a +# graceful solution to this issue. +# +# CHANGES: +# Chris Monson (2010-04-08): +# * Bumped version to 2.2.0-rc1 +# * Added back in the rst_style_file stuff that got broken when switching +# rst -> tex to use the script mechanism +# Chris Monson (2010-03-23): +# * Bumped version to 2.2.0-beta8 +# * Work on issue 76: bad backtick escape for some sed versions, failure +# to clear out the hold buffer when outputting MISSING comment. +# - Backed out 2>&1 to &> (doesn't work in sh) +# - Backed out using . to source variables +# Chris Monson (2010-03-22): +# * Bumped version to 2.2.0-beta7 +# * Issue 72: Fix latex/bibtex invocation order for annotated bib styles +# * Fixed informational output to reflect which LaTeX run we're on +# * Fixed graphic detection to include graphics that are already there in +# .d files +# * Tightened up the .d file output to only make .d depend on graphic +# *source* files. This means that building foo.d no longer +# builds all of the graphics files on which foo.tex depends. +# Had to use .SECONDEXPANSION trickery to make it work. +# * Changed get-graphics to only accept a stem. +# * Fixed build-once logic for scripted .tex to work better +# * Made get-inputs sed script more maintainable. +# * Moved Makefile.ini import up higher. +# * Changed bare stems to not recursively invoke make +# * Updated diff output to be more silent everywhere +# * Added a MISSING comment to the .d file if stuff isn't found - forces +# removal of .1st.make file, which often forces it to try again. +# * Fixed broken graphics-target function +# * Added sleep to .d file generation when stuff is missing - if it +# builds too fast, make doesn't realize it needs to be reloaded, +# and thus never discovers some deeper dependencies (especially +# evident when graphics are included from scripted include +# files). +# Chris Monson (2010-03-17): +# * Bumped version to 2.2.0-beta6 +# * Fixed bareword builds to actually work (requires static patterns) +# * Fixed colorization to work with new paragraph stuff +# Chris Monson (2010-03-17): +# * Bumped version to 2.2.0-beta5 +# * Fixed graphic detection to be much more focused - splits log file +# into paragraphs before doing pattern matching. +# * Fixed make foo to work properly (recursively calls make foo.pdf) +# * Fixed gpi -> pdf generation to not waste time building .eps *after* +# the pdf already exists. +# * Changed log copies to include MAKE_RESTARTS as part of the name. +# * Fixed missing include file detection (also makes use of the paragraph +# stuff) to detect missing scripted include files. +# Chris Monson (2010-03-16): +# * Bumped version to 2.2.0-beta4 +# * issue 70: .pdf not moved out of the way properly on first +# compilation, resulting in early error detection failure. +# * issue 74: fixed broken error on missing .aux files: the +# implementation was masking real errors. +# Chris Monson (2010-03-15): +# * Bumped version to 2.2.0-beta3 +# * issue 71: Made the tput dependency optional +# * issue 73: Made .tex targets not pull in .d files (building them from +# scripts should not require a .d) +# * issue 74: Output a much saner error when a .aux file is not produced +# (e.g., when you are typing "make" without arguments in a +# directory with included .tex files that are not named with +# ._include_.) +# Chris Monson (2010-03-11): +# * Bumped version to 2.2.0-beta2 +# * Fixed clean-graphics to get rid of intermediate .eps files that may +# be hanging around +# * Added an automatic setting to use eps terminals in pdflatex mode for +# gnuplot if it doesn't understand pdf. +# * issue 66: Removed grayscale generation via magic suffix. Grayscale +# generation is now only available via GRAY=1 +# * issue 68: Added explicit handling of LC_ALL for locale-aware tools +# like "sort" +# Chris Monson (2010-03-10): +# * Bumped version to 2.2.0-beta1 +# * Fixed success message to handle output message in different places +# * Added name of produced file to success message +# Chris Monson (2010-03-10): +# * Bumped version to 2.2.0-alpha3 +# * Added meaningful error message for wrong hyperref options +# * Added meaningful error message for incorrect graphics extensions +# Chris Monson (2010-03-09): +# * Bumped version to 2.2.0-alpha2 +# * Updated graphics handling (gnuplot and fig generate pdf natively) +# * Changed xmgrace to output monochrome natively +# Chris Monson (2010-03-09): +# * Bumped version to 2.2.0-alpha1 - major change! +# * Support pdflatex natively and by default (issue 6 - a long time coming) +# * Add ability to have a single $HOME/.latex-makefile/Makefile.ini for +# all invocations +# * Reworked graphic inclusion detection so that extensions need not be +# specified for either build strategy (e.g., +# \includegraphics{test1.eps} -> \includegrahpics{test1}) +# * Changed log format to include filenames and line numbers +# Chris Monson (2010-02-04): +# * Bumped version to 2.1.43 +# * All of the following are for issue 63 (thanks to mojoh81): +# * Added documentation about fixing Makefile.ini default target +# * Added perl and python script targets +# * Fixed run logic to allow included .tex files to be scripted (the +# run-again logic now detects missing .tex files, and the MV +# command has been switched out for a command that only invokes +# MV if the files exist) +# * Changed scripted generation to only run once per make invocation +# * Added dependency on expr +# Chris Monson (2010-01-19): +# * Bumped version to 2.1.42 +# * issue 62: Added .brf extension to cleanable files (backrefs) +# Chris Monson (2010-01-07): +# * Bumped version to 2.1.41 +# * issue 60: bad makeindex runs now error out on subsequent tries +# Chris Monson (2009-12-01): +# * Bumped version to 2.1.40 +# * issue 36: build all indices (for e.g., splitidx usage) +# * issue 59: clean up all generated files (including indices) +# Chris Monson (2009-11-23): +# * Bumped version to 2.1.39 +# * issue 57: change ps2pdf invocations to just use gs directly +# Chris Monson (2009-11-19): +# * Bumped version to 2.1.38 +# * issue 57: Added some limited support for Cygwin (spaces in filenames) +# Chris Monson (2009-11-15): +# * Bumped version to 2.1.37 +# * Removed svninfo, since this is now managed by mercurial +# * Fixed typo in changelist +# * Issue 52: added jpg->eps conversion (thanks to brubakee) +# * Issue 54: fix missing Overfull colorization due to lack of a blank +# line preceding the first error. +# * Issue 51: remove head.tmp and body.tmp in make clean invocation +# * Issue 56: maintain multiple versions of log files (for debugging) +# Chris Monson (2009-11-14): +# * Bumped version to 2.1.36 +# * Issues 53 and 49: added .brf, .mtc, and .maf to the cleanables +# Chris Monson (2009-11-05): +# * Bumped version to 2.1.35 +# * Added nomenclature support (see issue 48) +# Chris Monson (2009-10-29): +# * Bumped version to 2.1.34 +# * Fixed _out_ creation bug introduced in 2.1.33 (it was always created) +# * Fixed erroneous help output for $HOME in BINARY_TARGET_DIR +# * Changed contact email address - bring on the spam! +# Chris Monson (2009-10-21): +# * Bumped version to 2.1.33 +# * Fixed issue 46, adding support for dot2tex (thanks to fdemesmay) +# * Made all_files.* settable in Makefile.ini (using ?= instead of :=) +# * Fixed issue 47, thanks to fdemesmay: add binary copy directory, copy +# dvi, pdf, and ps if it exists +# Chris Monson (2009-09-25): +# * Bumped version to 2.1.32 +# * Fixed so that a changed lol file will cause a rebuild +# * Added .lol files to the cleanable list +# Chris Monson (2009-09-08): +# * Bumped version to 2.1.31 +# * Closed issue 43: evince doesn't notice pdf change w/out touch +# Chris Monson (2009-08-28): +# * Bumped version to 2.1.30 +# * Closed issue 39: Capture multi-line log warnings/errors to output +# Chris Monson (2009-08-26): +# * Bumped version to 2.1.29 +# * Closed issue 42: add svg support using inkscape +# Chris Monson (2009-08-17): +# * Bumped version to 2.1.28 +# * Patch from paul.biggar for issue 38: package warnings are overlooked +# Chris Monson (2009-08-07): +# * Bumped version to 2.1.27 +# * Included patch for issue 37 - removes pdf/ps files before copying, +# allowing some broken viewers to see changes properly. +# Chris Monson (2009-05-15): +# * Bumped version to 2.1.26 +# * Included patch for issue 9 from favonia - detects .fig changes for +# pstex files during regular compilation, so long as the pstex +# has been built at least once with make all-pstex. +# Chris Monson (2009-03-27): +# * Bumped version to 2.1.25 +# * Cleaned up a bunch of variable setting stuff - more stuff is now +# settable from Makefile.ini +# * Cleaned up documentation for various features, especially settable +# variables. +# * issue 28: support for png -> eps conversion (it even looks good!) +# * issue 29: support for "neverclean" files in Makefile.ini +# * issue 30: make ps2pdf14 the default - fall back when not there +# Chris Monson (2009-03-09): +# * Bumped version to 2.1.24 +# * issue 27: xmgrace support (thanks to rolandschulzhd) +# Chris Monson (2008-10-23): +# * Bumped version to 2.1.23 +# * issue 23: fixed _check_programs to not use bash string subs +# Chris Monson (2008-09-02): +# * Bumped version to 2.1.22 +# * Appled patch from Holger to add include +# sources and some documentation updates. +# * Updated backup_patterns to be a bit more aggressive (also thanks to +# Holger) +# Chris Monson (2008-08-30): +# * Bumped version to 2.1.21 +# * Added ability to specify onlysources.* variables to indicate the only +# files that should *not* be considered includes. Thanks to Holger +# for this patch. +# * Added an automatic include of Makefile.ini if it exists. Allows +# settings to be made outside of this makefile. +# Chris Monson (2008-05-21): +# * Bumped version to 2.1.20 +# * Added manual pstex compilation support (run make all-pstex first) +# * Removed all automatic pstex support. It was totally breaking +# everything and is very hard to incorporate into the makefile +# concept because it requires LaTeX to *fail* before it can +# determine that it needs the files. +# Chris Monson (2008-04-17): +# * Bumped version to 2.1.19 +# * Changed the pstex build hack to be on by default +# Chris Monson (2008-04-09): +# * Bumped version to 2.1.18 +# * issue 16: fixed pstex build problems, seems nondeterministic. Added +# gratuitious hack for testing: set PSTEX_BUILD_ALL_HACK=1. +# Chris Monson (2008-04-09): +# * Bumped version to 2.1.17 +# * issue 20: fixed accumulation of *.make files - wildcard was +# refusing to work on files that are very recently created. +# Chris Monson (2008-04-02): +# * Bumped version to 2.1.16 +# * issue 19: Removed the use of "type" to fix broken "echo" settings +# Chris Monson (2008-03-27): +# * Bumped version to 2.1.15 +# * issue 18: Favors binary echo over builtin, as binary understands -n +# * issue 16: Fixed handling of missing pstex_t files in the log +# * issue 9: Added .SECONDARY target for .pstex files +# Chris Monson (2008-03-21): +# * Bumped version to 2.1.14 +# * Fixed broken aux file flattening, which caused included bibs to be +# missed. +# Chris Monson (2008-03-20): +# * Bumped version to 2.1.13 +# * Changed error output colorization to show errors for missing files +# that are not graphics files. +# Chris Monson (2008-03-20): +# * Bumped version to 2.1.12 +# * Fixed a regression introduced in r28 that makes bibtex fail when +# there is no index file present +# Chris Monson (2008-03-03): +# * Bumped version to 2.1.11 +# * Fixed issue 11 (handle index files, reported by abachn) +# * Cleaned up some comments and help text +# Chris Monson (2008-01-24): +# * Bumped version to 2.1.10 +# * Fixed to work when 'sh' is a POSIX shell like 'dash' +# Chris Monson (2007-12-12): +# * Bumped version to 2.1.9 +# * Fixed documentation and dependency graph for pstex files +# Chris Monson (2007-12-12): +# * Bumped version to 2.1.8 +# * Added basic pstex_t support for fig files (Issue 9 by favonia) +# I still suggest that psfrag be used instead. +# Chris Monson (2007-10-16): +# * Bumped version to 2.1.7 +# * Removed todo item: allow other comment directives for rst conversion +# * Added ability to use global rst style file _rststyle_._include_.tex +# * Added help text to that effect +# Chris Monson (2007-05-20): +# * Bumped version to 2.1.6 +# * Changed default paper size for rst files +# * Added todo item: fix paper size for rst files +# * Added todo item: allow other comment directives for rst conversion +# Chris Monson (2007-04-02): +# * Bumped version to 2.1.5 +# * Addressed Issue 7, incorrect .gpi.d generation in subdirectories +# Chris Monson (2007-03-28): +# * Bumped version to 2.1.4 +# * Fixed syntax error in dot output +# Chris Monson (2007-03-01): +# * Bumped version to 2.1.3 +# * Added reST to the included documentation +# * Fixed graphics and script generation to be settable in the +# environment. +# Chris Monson (2007-02-23): +# * Bumped version to 2.1.2 +# * Added the ability to generate .tex files from .rst files +# Chris Monson (2006-10-17): +# * Bumped version to 2.1.1 +# * Fixed includes from subdirectories (sed-to-sed slash escape problem) +# Chris Monson (2006-10-05): +# * Bumped version to 2.1.0 (pretty serious new feature added) +# * New feature: bib files can now be anywhere on the BIBINPUTS path +# * New programs: kpsewhich (with tetex) and xargs (BSD) +# Chris Monson (2006-09-28): +# * Bumped version to 2.0.9 +# * Added ability to parse more than one bibliography +# Chris Monson (2006-06-01): +# * Bumped version to 2.0.8 +# * Added .vrb to the list of cleaned files +# Chris Monson (2006-04-26): +# * Bumped version to 2.0.7 +# * Fixed so that clean-nographics does not remove .gpi.d files +# * Removed jpg -> eps hack (not working properly -- just pre-convert) +# * Fixed so that postscript grayscale can be done with BSD sed +# Chris Monson (2006-04-25): +# * Bumped version to 2.0.6 +# * Fixed so that changed toc, lot, lof, or out causes a rebuild +# Chris Monson (2006-04-17): +# * Bumped version to 2.0.5 +# * Added jpg -> eps conversion target +# Chris Monson (2006-04-12): +# * Bumped version to 2.0.4 +# * Fixed BSD sed invocation to not use \| as a branch delimiter +# * Added a comment section on what is and is not allowed in BSD sed +# * Made paper size handling more robust while I was at it +# * Fixed postscript RGB grayscale to use a weighted average +# * Fixed postscript HSB grayscale to convert to RGB first +# * Fixed a problem with rebuilding .bbl files +# Chris Monson (2006-04-11): +# * Bumped version to 2.0.3 +# * Fixed some BSD sed problems: can't use \n in substitutions +# Chris Monson (2006-04-10): +# * Bumped version to 2.0.2 +# * Once again removed ability to create .tex files from scripts +# * \includeonly works again +# Chris Monson (2006-04-09): +# * Bumped version to 2.0.1 +# * Fixed grayscale postscript handling to be more robust +# * Added ability to generate ._gray_. files from eps and eps.gz +# * Added ability to clean ._gray_.eps files created from .eps files +# Chris Monson (2006-04-07): +# * Bumped version to 2.0.0 +# * Removed clunky ability to create included .tex files from scripts +# * Added note in the help about included tex scripting not working +# * Fixed the .eps generation to delete %.gpihead.make when finished +# * Abandoned designs to use shell variables to create sed scripts +# * Abandoned __default__.tex.sh idea: it causes recursion with %: . +# * Removed web page to-do. All items are now complete. +# * Added better grayscale conversion for dot figures (direct ps fixup). +# * Include files can now be scripted (at the expense of \includeonly). +# * Updated dependency graph to contain better node names. +# Chris Monson (2006-04-06): +# * Bumped version to 2.0b3 +# * Top level includes now fail if there is no rule to build them +# * A helpful message is printed when they do fail +# * Grayscale has been changed to be ._gray_, other phonies use _ now, too +# * Grayscale handling has been completed +# * Changed _include_stems target to _includes target. +# * Fixed _includes target to be useful by itself. +# * Removed the ability to specify clean and build targets at once +# * Verified that epsfig works fine with current code +# * Fixed included scripts so that they are added to the dep files +# * Fixed so that graphics includes don't happen if they aren't for gpi +# * Fixed dot output to allow grayscale. +# Chris Monson (2006-04-05): +# * Bumped version to 2.0b2 +# * Removed automatic -gray output. It needs fixing in a bad way. +# * Revamped dependency creation completely. +# * Fixed conditional inclusion to actually work (test.nobuild.d, test.d). +# * Fixed clean target to remove log targets +# * Added the 'monochrome' word for gray gpi output +# * Added a _check_gpi_files target that checks for common problems +# * Changed the _version target into the version target (no _) +# * Added better handling of grayscale files. Use the .gray.pdf target. +# * Fixed testing for rebuilds +# Chris Monson (2006-04-04): +# * Bumped version to 2.0b1 +# * Changed colorization of output +# * Made .auxbbl and .auxtex .make files secondary targets +# * Shortened and simplified the final latex invocation loop +# * Added version-specific output ($$i vs. $$$$i) in latex loop +# * Added a build message for the first .dvi run (Building .dvi (0)) +# * Removed some build messages that most people don't care about. +# * Simplified procedure for user-set colors -- simple text specification +# * Fixed diff output to...not output. +# * Fixed rerun bug -- detect not only when preceded with LaTeX Warning +# * Sped up gpi plotting +# * Added error handling and colorized output for gpi failure +# * Documented color changing stuff. +# * Now sort the flattened aux file to avoid false recompilation needs +# * Added clean-nographics target +# * Don't remove self.dvi file if self.aux is missing in the log +# * Clarified some code. Did some very minor adjusting. +# Chris Monson (2006-04-03): +# * Bumped version to 2.0a7 +# * Added .dvi and .ps files as secondary files. +# * Fixed handling of multiple run detection when includeonly is in use. +# * Added code to flatten .aux files. +# * Added more files as .SECONDARY prerequisites to avoid recompilation. +# * Fixed the inputs generation to be much simpler and to use pipes. +# * Added the dependency graph directly into the makefile. +# * Changed flatten-aux to remove \@writefile \relax \newlabel, etc. +# * Undid pipe changes with sed usage (BSD sed doesn't know -f-). +# * Added a _check_programs target that tells you what your system has. +# * Fixed an error in colorization that made unnecessary errors appear +# * Added view targets. +# * Updated help text. +# * Augmented cookies so that .aux can trigger .bbl and .dvi rebuilds +# * Added more informative error handling for dvips and ps2pdf +# Chris Monson (2006-04-02): +# * Bumped version to 2.0a6 +# * Added indirection to .bbl dependencies to avoid rebuilding .bbl files +# * Streamlined the diff invocation to eliminate an existence test +# * Removed special shell quote escape variables +# * Moved includes to a more prominent location +# * Fixed .inputs.make to not contain .aux files +# * Fixed embedding to use a file instead of always grepping. +# * Added *.make.temp to the list of cleanable files +# * Fixed Ruby. It should now be supported properly. +# * Now differentiate between all, default, and buildable files. +# * Fixed to bail out on serious errors. +# * Revised the handling of includable files. Still working on it. +# Chris Monson (2006-03-31): +# * Bumped version to 2.0a5 +# * Fixed a bug with LaTeX error detection (there can be spaces) +# * Added .bbl support, simplifying everything and making it more correct +# * Refactored some tests that muddy the code +# * Did a little cleanup of some shell loops that can safely be make loops +# * Added support for graphviz .dot files +# * Made _all_programs output easier to read +# * Added the ruby support that has long been advertised +# * Font embedding was screwed up for PostScript -- now implicit +# * Changed the generation of -gray.gpi files to a single command +# * Changed any make-generated file that is not included from .d to .make +# Chris Monson (2006-03-30): +# * Bumped version to 2.0a4 +# * Fixed a bug with very long graphics file names +# * Added a todo entry for epsfig support +# * Fixed a bug paper size bug: sometimes more than one entry appears +# * Fixed DVI build echoing to display the number instead of process ID +# * DVI files are now removed on first invocation if ANY file is missing +# * Added a simple grayscale approach: if a file ends with -gray.gpi, it +# is created from the corresponding .gpi file with a special +# comment ##GRAY in its header, which causes coloring to be +# turned off. +# * Fixed a bug in the handling of .tex.sh files. For some reason I had +# neglected to define file stems for scripted output. +# * Removed a trailing ; from the %.graphics dependencies +# * Added dvips embedding (I think it works, anyway) +# Chris Monson (2006-03-29): +# * Bumped version to 2.0a3 +# * Fixed error in make 3.79 with MAKEFILE_LIST usage +# * Added the presumed filename to the _version output +# * Added a vim macro for converting sed scripts to make commands +# * Added gpi dependency support (plotting external files and loading gpi) +# * Allow .gpi files to be ignored if called .include.gpi or .nobuild.gpi +# * Fixed sed invocations where \+ was used. BSD sed uses \{1,\}. +# Chris Monson (2006-03-28): +# * Bumped version to 2.0a2 +# * Added SHELL_DEBUG and VERBOSE options +# * Changed the default shell back to /bin/sh (unset, in other words) +# * Moved .PHONY declarations closer to their targets +# * Moved help text into its own define block to obtain better formatting +# * Removed need for double-entry when adding a new program invocation +# * Moved .SECONDARY declaration closer to its relevant occurrence +# * Commented things more heavily +# * Added help text about setting terminal and output in gnuplot +# * Created more fine-grained clean targets +# * Added a %.graphics target that generates all of %'s graphics +# * Killed backward-compatible graphics generation (e.g., eps.gpi=gpi.eps) +# * For now, we're just GPL 2, not 3. Maybe it will change later +# * Made the version and svninfo into variables +# Chris Monson (2006-03-27): +# * Bumped version to 2.0a1 +# * Huge, sweeping changes -- automatic dependencies + +# IMPORTANT! +# +# When adding to the following list, do not introduce any blank lines. The +# list is extracted for documentation using sed and is terminated by a blank +# line. +# +# EXTERNAL PROGRAMS: +# = ESSENTIAL PROGRAMS = +# == Basic Shell Utilities == +CAT ?= cat +CP ?= cp -f +DIFF ?= diff +ECHO ?= echo +EGREP ?= egrep +ENV ?= env +EXPR ?= expr +MV ?= mv -f +SED ?= sed +SORT ?= sort +TOUCH ?= touch +UNIQ ?= uniq +WHICH ?= which +XARGS ?= xargs +SLEEP ?= sleep +# == LaTeX (tetex-provided) == +BIBTEX ?= bibtex +DVIPS ?= dvips +LATEX ?= latex +PDFLATEX ?= pdflatex +EPSTOPDF ?= epstopdf +MAKEINDEX ?= makeindex +KPSEWHICH ?= kpsewhich +GS ?= gs +# = OPTIONAL PROGRAMS = +# == Makefile Color Output == +TPUT ?= tput +# == TeX Generation == +PERL ?= perl +PYTHON ?= python +RST2LATEX ?= rst2latex.py +# == EPS Generation == +CONVERT ?= convert # ImageMagick +DOT ?= dot # GraphViz +DOT2TEX ?= dot2tex # dot2tex - add options (not -o) as needed +FIG2DEV ?= fig2dev # XFig +GNUPLOT ?= gnuplot # GNUplot +INKSCAPE ?= inkscape # Inkscape (svg support) +XMGRACE ?= xmgrace # XMgrace +PNGTOPNM ?= pngtopnm # From NetPBM - step 1 for png -> eps +PPMTOPGM ?= ppmtopgm # From NetPBM - (gray) step 2 for png -> eps +PNMTOPS ?= pnmtops # From NetPBM - step 3 for png -> eps +GUNZIP ?= gunzip # GZipped EPS +# == Beamer Enlarged Output == +PSNUP ?= psnup +# == Viewing Stuff == +VIEW_POSTSCRIPT ?= gv +VIEW_PDF ?= xpdf +VIEW_GRAPHICS ?= display + +# Command options for embedding fonts and postscript->pdf conversion +PS_EMBED_OPTIONS ?= -dPDFSETTINGS=/printer -dEmbedAllFonts=true -dSubsetFonts=true -dMaxSubsetPct=100 +PS_COMPATIBILITY ?= 1.4 + +# Defaults for GPI +DEFAULT_GPI_EPS_FONTSIZE ?= 22 +DEFAULT_GPI_PDF_FONTSIZE ?= 12 + +# Style file for ReST +RST_STYLE_FILE ?= $(wildcard _rststyle_._include_.tex) + +# This ensures that even when echo is a shell builtin, we still use the binary +# (the builtin doesn't always understand -n) +FIXED_ECHO := $(if $(findstring -n,$(shell $(ECHO) -n)),$(shell which echo),$(ECHO)) +ECHO := $(if $(FIXED_ECHO),$(FIXED_ECHO),$(ECHO)) + +define determine-gnuplot-output-extension +$(if $(shell $(WHICH) $(GNUPLOT)), + $(if $(findstring unknown or ambiguous, $(shell $(GNUPLOT) -e "set terminal pdf" 2>&1)), + eps, pdf), + none) +endef + +GNUPLOT_OUTPUT_EXTENSION ?= $(strip $(call determine-gnuplot-output-extension)) + +# Directory into which we place "binaries" if it exists. +# Note that this can be changed on the commandline or in Makefile.ini: +# +# Command line: +# make BINARY_TARGET_DIR=$HOME/pdfs myfile.pdf +# +# Also, you can specify a relative directory (relative to the Makefile): +# make BINARY_TARGET_DIR=pdfs myfile.pdf +# +# Or, you can use Makefile.ini: +# +# BINARY_TARGET_DIR := $(HOME)/bin_out +# +BINARY_TARGET_DIR ?= _out_ + +RESTARTS := $(if $(MAKE_RESTARTS),$(MAKE_RESTARTS),0) +# SH NOTES +# +# On some systems, /bin/sh, which is the default shell, is not linked to +# /bin/bash. While bash is supposed to be sh-compatible when invoked as sh, it +# just isn't. This section details some of the things you have to stay away +# from to remain sh-compatible. +# +# * File pattern expansion does not work for {} +# * [ "$x" = "$y" ] has to be [ x"$x" x"$y" ] +# * &> for stderr redirection doesn't work, use 2>&1 instead +# +# BSD SED NOTES +# +# BSD SED is not very nice compared to GNU sed, but it is the most +# commonly-invoked sed on Macs (being based on BSD), so we have to cater to +# it or require people to install GNU sed. It seems like the GNU +# requirement isn't too bad since this makefile is really a GNU makefile, +# but apparently GNU sed is much less common than GNU make in general, so +# I'm supporting it here. +# +# Sad experience has taught me the following about BSD sed: +# +# * \+ is not understood to mean \{1,\} +# * \| is meaningless (does not branch) +# * \n cannot be used as a substitution character +# * ? does not mean \{0,1\}, but is literal +# * a\ works, but only reliably for a single line if subsequent lines +# have forward slashes in them (as is the case in postscript) +# +# For more info (on the Mac) you can consult +# +# man -M /usr/share/man re_format +# +# And look for the word "Obsolete" near the bottom. + +# +# EXTERNAL PROGRAM DOCUMENTATION SCRIPT +# + +# $(call output-all-programs,[]) +define output-all-programs + [ -f '$(this_file)' ] && \ + $(SED) \ + -e '/^[[:space:]]*#[[:space:]]*EXTERNAL PROGRAMS:/,/^$$/!d' \ + -e '/EXTERNAL PROGRAMS/d' \ + -e '/^$$/d' \ + -e '/^[[:space:]]*#/i\ '\ + -e 's/^[[:space:]]*#[[:space:]][^=]*//' \ + $(this_file) $(if $1,> '$1',) || \ + $(ECHO) "Cannot determine the name of this makefile." +endef + +# If they misspell gray, it should still work. +GRAY ?= $(call get-default,$(GREY),) + +# +# Utility Functions and Definitions +# + +# While not exactly a make function, this vim macro is useful. It takes a +# verbatim sed script and converts each line to something suitable in a command +# context. Just paste the script's contents into the editor, yank this into a +# register (starting at '0') and run the macro once for each line of the +# original script: +# +# 0i -e :s/\$/$$/eg :s/'/'"'"'/eg ^Ela'A' \:noh j + +# don't call this directly - it is here to avoid calling wildcard more than +# once in remove-files. +remove-files-helper = $(if $1,$(RM) $1,$(sh_true)) + +# $(call remove-files,file1 file2) +remove-files = $(call remove-files-helper,$(wildcard $1)) + +# Removes all cleanable files in the given list +# $(call clean-files,file1 file2 file3 ...) +# Works exactly like remove-files, but filters out files in $(neverclean) +clean-files = \ + $(call remove-files-helper,$(call cleanable-files,$(wildcard $1))) + +# Outputs all generated files to STDOUT, along with some others that are +# created by these (e.g., .idx files end up producing .ilg and .ind files). +# Discovered by reading *.fls OUTPUT lines and producing corresponding .ind +# filenames as needed. +# +# $(call get-generated-names,) +define get-generated-names +[ -f '$1' ] && \ +$(SED) \ + -e '/^OUTPUT /{' \ + -e ' s///' \ + -e ' p' \ + -e ' s/\.idx/\.ind/p' \ + -e ' s/\.ind/\.ilg/p' \ + -e '}' \ + -e 'd' \ + '$1' \ +| $(SORT) | $(UNIQ) +endef + +# This removes files without checking whether they are there or not. This +# sometimes has to be used when the file is created by a series of shell +# commands, but there ends up being a race condition: make doesn't know about +# the file generation as quickly as the system does, so $(wildcard ...) doesn't +# work right. Blech. +# $(call remove-temporary-files,filenames) +remove-temporary-files = $(if $1,$(RM) $1,:) + +# Create an identifier from a file name +# $(call cleanse-filename,filename) +cleanse-filename = $(subst .,_,$(subst /,__,$1)) + +# Escape dots +# $(call escape-dots,str) +escape-dots = $(subst .,\\.,$1) + +# Test that a file exists +# $(call test-exists,file) +test-exists = [ -e '$1' ] + +# $(call move-files,source,destination) +move-if-exists = $(call test-exists,$1) && $(MV) '$1' '$2' + +# Copy file1 to file2 only if file2 doesn't exist or they are different +# $(call copy-if-different,sfile,dfile) +copy-if-different = $(call test-different,$1,$2) && $(CP) '$1' '$2' +copy-if-exists = $(call test-exists,$1) && $(CP) '$1' '$2' +move-if-different = $(call test-different,$1,$2) && $(MV) '$1' '$2' +replace-if-different-and-remove = \ + $(call test-different,$1,$2) \ + && $(MV) '$1' '$2' \ + || $(call remove-files,'$1') + +# Note that $(DIFF) returns success when the files are the SAME.... +# $(call test-different,sfile,dfile) +test-different = ! $(DIFF) -q '$1' '$2' >/dev/null 2>&1 +test-exists-and-different = \ + $(call test-exists,$2) && $(call test-different,$1,$2) + +# Return value 1, or value 2 if value 1 is empty +# $(call get-default,,) +get-default = $(if $1,$1,$2) + +# Copy a file and log what's going on +# $(call copy-with-logging,,) +define copy-with-logging +if [ -d '$2/' ]; then \ + if $(CP) '$1' '$2/'; then \ + $(ECHO) "$(C_INFO)Copied '$1' to '$2/'$(C_RESET)"; \ + else \ + $(ECHO) "$(C_ERROR)Failed to copy '$1' to '$2/'$(C_RESET)"; \ + fi; \ +fi +endef + +# Gives a reassuring message about the failure to find include files +# $(call include-message,) +define include-message +$(strip \ +$(if $(filter-out $(wildcard $1),$1),\ + $(shell $(ECHO) \ + "$(C_INFO)NOTE: You may ignore warnings about the"\ + "following files:" >&2;\ + $(ECHO) >&2; \ + $(foreach s,$(filter-out $(wildcard $1),$1),$(ECHO) ' $s' >&2;)\ + $(ECHO) "$(C_RESET)" >&2) +)) +endef +# Characters that are hard to specify in certain places +space := $(empty) $(empty) +colon := \: +comma := , + +# Useful shell definitions +sh_true := : +sh_false := ! : + +# Clear out the standard interfering make suffixes +.SUFFIXES: + +# Turn off forceful rm (RM is usually mapped to rm -f) +ifdef SAFE_RM +RM := rm +endif + +# Turn command echoing back on with VERBOSE=1 +ifndef VERBOSE +QUIET := @ +endif + +# Turn on shell debugging with SHELL_DEBUG=1 +# (EVERYTHING is echoed, even $(shell ...) invocations) +ifdef SHELL_DEBUG +SHELL += -x +endif + +# Get the name of this makefile (always right in 3.80, often right in 3.79) +# This is only really used for documentation, so it isn't too serious. +ifdef MAKEFILE_LIST +this_file := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +else +this_file := $(wildcard GNUmakefile makefile Makefile) +endif + +# Terminal color definitions + +REAL_TPUT := $(if $(NO_COLOR),,$(shell $(WHICH) $(TPUT))) + +# $(call get-term-code,codeinfo) +# e.g., +# $(call get-term-code,setaf 0) +get-term-code = $(if $(REAL_TPUT),$(shell $(REAL_TPUT) $1),) + +black := $(call get-term-code,setaf 0) +red := $(call get-term-code,setaf 1) +green := $(call get-term-code,setaf 2) +yellow := $(call get-term-code,setaf 3) +blue := $(call get-term-code,setaf 4) +magenta := $(call get-term-code,setaf 5) +cyan := $(call get-term-code,setaf 6) +white := $(call get-term-code,setaf 7) +bold := $(call get-term-code,bold) +uline := $(call get-term-code,smul) +reset := $(call get-term-code,sgr0) + +# +# User-settable definitions +# +LATEX_COLOR_WARNING ?= magenta +LATEX_COLOR_ERROR ?= red +LATEX_COLOR_INFO ?= green +LATEX_COLOR_UNDERFULL ?= magenta +LATEX_COLOR_OVERFULL ?= red bold +LATEX_COLOR_PAGES ?= bold +LATEX_COLOR_BUILD ?= cyan +LATEX_COLOR_GRAPHIC ?= yellow +LATEX_COLOR_DEP ?= green +LATEX_COLOR_SUCCESS ?= green bold +LATEX_COLOR_FAILURE ?= red bold + +# Gets the real color from a simple textual definition like those above +# $(call get-color,ALL_CAPS_COLOR_NAME) +# e.g., $(call get-color,WARNING) +get-color = $(subst $(space),,$(foreach c,$(LATEX_COLOR_$1),$($c))) + +# +# STANDARD COLORS +# +C_WARNING := $(call get-color,WARNING) +C_ERROR := $(call get-color,ERROR) +C_INFO := $(call get-color,INFO) +C_UNDERFULL := $(call get-color,UNDERFULL) +C_OVERFULL := $(call get-color,OVERFULL) +C_PAGES := $(call get-color,PAGES) +C_BUILD := $(call get-color,BUILD) +C_GRAPHIC := $(call get-color,GRAPHIC) +C_DEP := $(call get-color,DEP) +C_SUCCESS := $(call get-color,SUCCESS) +C_FAILURE := $(call get-color,FAILURE) +C_RESET := $(reset) + +# +# PRE-BUILD TESTS +# + +# Check that clean targets are not combined with other targets (weird things +# happen, and it's not easy to fix them) +hascleangoals := $(if $(sort $(filter clean clean-%,$(MAKECMDGOALS))),1) +hasbuildgoals := $(if $(sort $(filter-out clean clean-%,$(MAKECMDGOALS))),1) +ifneq "$(hasbuildgoals)" "" +ifneq "$(hascleangoals)" "" +$(error $(C_ERROR)Clean and build targets specified together$(C_RESET))) +endif +endif + +# +# VARIABLE DECLARATIONS +# + +# Names of sed scripts that morph gnuplot files -- only the first found is used +GNUPLOT_SED := global-gpi.sed gnuplot.sed +GNUPLOT_GLOBAL := global._include_.gpi gnuplot.global + +ifneq "$(strip $(BUILD_STRATEGY))" "pdflatex" +default_graphic_extension ?= eps +latex_build_program ?= $(LATEX) +build_target_extension ?= dvi +hyperref_driver_pattern ?= hdvips +hyperref_driver_error ?= Using dvips: specify ps2pdf in the hyperref options. +else +default_graphic_extension ?= pdf +latex_build_program ?= $(PDFLATEX) +build_target_extension ?= pdf +hyperref_driver_pattern ?= hpdf.* +hyperref_driver_error ?= Using pdflatex: specify pdftex in the hyperref options (or leave it blank). +endif + +# Files of interest +all_files.tex ?= $(wildcard *.tex) +all_files.tex.sh ?= $(wildcard *.tex.sh) +all_files.tex.pl ?= $(wildcard *.tex.pl) +all_files.tex.py ?= $(wildcard *.tex.py) +all_files.rst ?= $(wildcard *.rst) +all_files.fig ?= $(wildcard *.fig) +all_files.gpi ?= $(wildcard *.gpi) +all_files.dot ?= $(wildcard *.dot) +all_files.xvg ?= $(wildcard *.xvg) +all_files.svg ?= $(wildcard *.svg) +all_files.png ?= $(wildcard *.png) +all_files.jpg ?= $(wildcard *.jpg) +all_files.eps.gz ?= $(wildcard *.eps.gz) +all_files.eps ?= $(wildcard *.eps) + +# Utility function for obtaining all files not specified in $(neverclean) +# $(call cleanable-files,file1 file2 file3 ...) +# Returns the list of files that is not in $(wildcard $(neverclean)) +cleanable-files = $(filter-out $(wildcard $(neverclean)), $1) + +# Utility function for getting all .$1 files that are to be ignored +# * files listed in $(includes.$1) +# * files not listed in $(onlysources.$1) if it is defined +ignore_files = \ + $(includes.$1) \ + $(if $(onlysources.$1),$(filter-out $(onlysources.$1), $(all_files.$1))) + +# Patterns to never be allowed as source targets +ignore_patterns := %._include_ + +# Patterns allowed as source targets but not included in 'all' builds +nodefault_patterns := %._nobuild_ $(ignore_patterns) + +# Utility function for getting targets suitable building +# $(call filter-buildable,suffix) +filter-buildable = \ + $(filter-out $(call ignore_files,$1) \ + $(addsuffix .$1,$(ignore_patterns)),$(all_files.$1)) + +# Utility function for getting targets suitable for 'all' builds +# $(call filter-default,suffix) +filter-default = \ + $(filter-out $(call ignore_files,$1) \ + $(addsuffix .$1,$(nodefault_patterns)),$(all_files.$1)) + +# Top level sources that can be built even when they are not by default +files.tex := $(call filter-buildable,tex) +files.tex.sh := $(call filter-buildable,tex.sh) +files.tex.pl := $(call filter-buildable,tex.pl) +files.tex.py := $(call filter-buildable,tex.py) +files.rst := $(call filter-buildable,rst) +files.gpi := $(call filter-buildable,gpi) +files.dot := $(call filter-buildable,dot) +files.fig := $(call filter-buildable,fig) +files.xvg := $(call filter-buildable,xvg) +files.svg := $(call filter-buildable,svg) +files.png := $(call filter-buildable,png) +files.jpg := $(call filter-buildable,jpg) +files.eps.gz := $(call filter-buildable,eps.gz) + +# Make all pstex targets secondary. The pstex_t target requires the pstex +# target, and nothing else really depends on it, so it often gets deleted. +# This avoids that by allowing *all* fig files to be pstex targets, which is +# perfectly valid and causes no problems even if they're going to become eps +# files in the end. +.SECONDARY: $(patsubst %.fig,%.pstex,$(files.fig)) + +# Top level sources that are built by default targets +default_files.tex := $(call filter-default,tex) +default_files.tex.sh := $(call filter-default,tex.sh) +default_files.tex.pl := $(call filter-default,tex.pl) +default_files.tex.py := $(call filter-default,tex.py) +default_files.rst := $(call filter-default,rst) +default_files.gpi := $(call filter-default,gpi) +default_files.dot := $(call filter-default,dot) +default_files.fig := $(call filter-default,fig) +default_files.xvg := $(call filter-default,xvg) +default_files.svg := $(call filter-default,svg) +default_files.png := $(call filter-default,png) +default_files.jpg := $(call filter-default,jpg) +default_files.eps.gz := $(call filter-default,eps.gz) + +# Utility function for creating larger lists of files +# $(call concat-files,suffixes,[prefix]) +concat-files = $(foreach s,$1,$($(if $2,$2_,)files.$s)) + +# Useful file groupings +all_files_source := $(call concat-files,tex,all) +all_files_scripts := $(call concat-files,tex.sh tex.pl tex.py rst,all) + +.PHONY: $(all_files_scripts) + +default_files_source := $(call concat-files,tex,default) +default_files_scripts := $(call concat-files,tex.sh tex.pl tex.py rst,default) + +files_source := $(call concat-files,tex) +files_scripts := $(call concat-files,tex.sh tex.pl tex.py rst) + +# Utility function for obtaining stems +# $(call get-stems,suffix,[prefix]) +get-stems = $(sort $($(if $2,$2_,)files.$1:%.$1=%)) + +# List of all stems (including ._include_ and ._nobuild_ file stems) +all_stems.tex := $(call get-stems,tex,all) +all_stems.tex.sh := $(call get-stems,tex.sh,all) +all_stems.tex.pl := $(call get-stems,tex.pl,all) +all_stems.tex.py := $(call get-stems,tex.py,all) +all_stems.rst := $(call get-stems,rst,all) +all_stems.fig := $(call get-stems,fig,all) +all_stems.gpi := $(call get-stems,gpi,all) +all_stems.dot := $(call get-stems,dot,all) +all_stems.xvg := $(call get-stems,xvg,all) +all_stems.svg := $(call get-stems,svg,all) +all_stems.png := $(call get-stems,png,all) +all_stems.jpg := $(call get-stems,jpg,all) +all_stems.eps.gz := $(call get-stems,eps.gz,all) +all_stems.eps := $(call get-stems,eps,all) + +# List of all default stems (all default PDF targets): +default_stems.tex := $(call get-stems,tex,default) +default_stems.tex.sh := $(call get-stems,tex.sh,default) +default_stems.tex.pl := $(call get-stems,tex.pl,default) +default_stems.tex.py := $(call get-stems,tex.py,default) +default_stems.rst := $(call get-stems,rst,default) +default_stems.fig := $(call get-stems,fig,default) +default_stems.gpi := $(call get-stems,gpi,default) +default_stems.dot := $(call get-stems,dot,default) +default_stems.xvg := $(call get-stems,xvg,default) +default_stems.svg := $(call get-stems,svg,default) +default_stems.png := $(call get-stems,png,default) +default_stems.jpg := $(call get-stems,jpg,default) +default_stems.eps.gz := $(call get-stems,eps.gz,default) + +# List of all stems (all possible bare PDF targets created here): +stems.tex := $(call get-stems,tex) +stems.tex.sh := $(call get-stems,tex.sh) +stems.tex.pl := $(call get-stems,tex.pl) +stems.tex.py := $(call get-stems,tex.py) +stems.rst := $(call get-stems,rst) +stems.fig := $(call get-stems,fig) +stems.gpi := $(call get-stems,gpi) +stems.dot := $(call get-stems,dot) +stems.xvg := $(call get-stems,xvg) +stems.svg := $(call get-stems,svg) +stems.png := $(call get-stems,png) +stems.jpg := $(call get-stems,jpg) +stems.eps.gz := $(call get-stems,eps.gz) + +# Utility function for creating larger lists of stems +# $(call concat-stems,suffixes,[prefix]) +concat-stems = $(sort $(foreach s,$1,$($(if $2,$2_,)stems.$s))) + +# The most likely to be source but not finished product go first +graphic_source_extensions := fig \ + gpi \ + xvg \ + svg \ + dot \ + eps.gz + +ifneq "$(strip $(BUILD_STRATEGY))" "pdflatex" +graphic_source_extensions += png jpg +graphic_target_extensions := eps ps +else +graphic_source_extensions += eps +graphic_target_extensions := pdf png jpg mps tif +endif + +all_stems_source := $(call concat-stems,tex,all) +all_stems_script := $(call concat-stems,tex.sh tex.pl tex.py rst,all) +all_stems_graphic := $(call concat-stems,$(graphic_source_extensions),all) +all_stems_ss := $(sort $(all_stems_source) $(all_stems_script)) +all_stems_sg := $(sort $(all_stems_script)) +all_stems_ssg := $(sort $(all_stems_ss)) + +default_stems_source := $(call concat-stems,tex,default) +default_stems_script := $(call concat-stems,tex.sh tex.pl tex.py rst,default) +default_stems_ss := $(sort $(default_stems_source) $(default_stems_script)) +default_stems_sg := $(sort $(default_stems_script)) +default_stems_ssg := $(sort $(default_stems_ss)) + +stems_source := $(call concat-stems,tex) +stems_script := $(call concat-stems,tex.sh tex.pl tex.py rst) +stems_graphic := $(call concat-stems,$(graphic_source_extensions)) +stems_gg := $(sort $(stems_graphic)) +stems_ss := $(sort $(stems_source) $(stems_script)) +stems_sg := $(sort $(stems_script)) +stems_ssg := $(sort $(stems_ss)) + +# Calculate names that can generate the need for an include file. We can't +# really do this with patterns because it's too easy to screw up, so we create +# an exhaustive list. +allowed_source_suffixes := \ + pdf \ + ps \ + dvi \ + ind \ + nls \ + bbl \ + aux \ + aux.make \ + d \ + auxbbl.make \ + _graphics \ + _show +allowed_source_patterns := $(addprefix %.,$(allowed_source_suffixes)) + +allowed_graphic_suffixes := \ + pdf \ + eps \ + gpihead.make \ + gpi.d +allowed_graphic_patterns := $(addprefix %.,$(allowed_graphic_suffixes)) + +# All targets allowed to build documents +allowed_source_targets := \ + $(foreach suff,$(allowed_source_suffixes),\ + $(addsuffix .$(suff),$(stems_ssg))) + +# All targets allowed to build graphics +allowed_graphic_targets := \ + $(foreach suff,$(allowed_graphic_suffixes),\ + $(addsuffix .$(suff),$(stems_gg))) + +# All targets that build multiple documents (like 'all') +allowed_batch_source_targets := \ + all \ + all-pdf \ + all-ps \ + all-dvi \ + all-bbl \ + all-ind \ + all-gls \ + all-nls \ + show + +# All targets that build multiple graphics (independent of document) +allowed_batch_graphic_targets := \ + all-graphics \ + all-pstex \ + all-dot2tex \ + show-graphics + +# Now we figure out which stuff is available as a make target for THIS RUN. +real_goals := $(call get-default,$(filter-out _includes,$(MAKECMDGOALS)),\ + all) + +specified_source_targets := $(strip \ + $(filter $(allowed_source_targets) $(stems_ssg),$(real_goals)) \ + ) + +specified_batch_source_targets := $(strip \ + $(filter $(allowed_batch_source_targets),$(real_goals)) \ + ) + +specified_graphic_targets := $(strip \ + $(filter $(allowed_graphic_targets),$(real_goals)) \ + ) + +specified_batch_graphic_targets := $(strip \ + $(filter $(allowed_batch_graphic_targets),$(real_goals)) \ + ) + +specified_gpi_targets := $(patsubst %.gpi,%.$(default_graphic_extension),\ + $(filter $(patsubst %.$(default_graphic_extension),%.gpi,$(specified_graphic_targets)),\ + $(all_files.gpi)) \ + ) + +# Determine which .d files need including from the information gained above. +# This is done by first checking whether a batch target exists. If it does, +# then all *default* stems are used to create possible includes (nobuild need +# not apply for batch status). If no batch targets exist, then the individual +# targets are considered and appropriate includes are taken from them. +source_stems_to_include := \ + $(sort\ + $(if $(specified_batch_source_targets),\ + $(default_stems_ss),\ + $(foreach t,$(specified_source_targets),\ + $(foreach p,$(allowed_source_patterns),\ + $(patsubst $p,%,$(filter $p $(stems_ssg),$t)) \ + )) \ + )) + +# Determine which .gpi.d files are needed using the above information. We +# first check whether a batch target is specified, then check individual +# graphics that may have been specified. +graphic_stems_to_include := \ + $(sort\ + $(if $(specified_batch_graphic_targets),\ + $(default_stems.gpi),\ + $(foreach t,$(specified_gpi_targets),\ + $(foreach p,$(allowed_graphic_patterns),\ + $(patsubst $p,%,$(filter $p,$t)) \ + )) \ + )) + +# All dependencies for the 'all' targets +all_pdf_targets := $(addsuffix .pdf,$(stems_ssg)) +all_ps_targets := $(addsuffix .ps,$(stems_ssg)) +all_dvi_targets := $(addsuffix .dvi,$(stems_ssg)) +all_tex_targets := $(addsuffix .tex,$(stems_sg)) +all_d_targets := $(addsuffix .d,$(stems_ssg)) +all_graphics_targets := $(addsuffix .$(default_graphic_extension),$(stems_gg)) +intermediate_graphics_targets := $(if $(filter pdf,$(default_graphic_extension)),$(addsuffix .eps,$(stems_gg)),) +all_pstex_targets := $(addsuffix .pstex_t,$(stems.fig)) +all_dot2tex_targets := $(addsuffix .dot_t,$(stems.dot)) + +all_known_graphics := $(sort $(all_graphics_targets) $(wildcard *.$(default_graphic_extension))) + +default_pdf_targets := $(addsuffix .pdf,$(default_stems_ss)) +ifneq "$(strip $(BUILD_STRATEGY))" "pdflatex" +default_ps_targets := $(addsuffix .ps,$(default_stems_ss)) +default_dvi_targets := $(addsuffix .dvi,$(default_stems_ss)) +pre_pdf_extensions := dvi ps +endif + +# Extensions generated by LaTeX invocation that can be removed when complete +rm_ext := \ + log *.log aux $(pre_pdf_extensions) pdf blg bbl out nav snm toc lof lot lol pfg \ + fls vrb idx ind ilg glg glo gls lox nls nlo nlg brf mtc maf brf +backup_patterns := *~ *.bak *.backup body.tmp head.tmp + +graph_stem := _graph + +# All LaTeX-generated files that can be safely removed + +rm_tex := \ + $(foreach e,$(rm_ext),$(addsuffix .$e,$(all_stems_source))) \ + $(foreach e,$(rm_ext) tex,$(addsuffix .$e,$(all_stems_sg))) \ + $(addsuffix .log,$(all_ps_targets) $(all_pdf_targets)) \ + $(addsuffix .*.log,$(stems_graphic)) + +# These are the files that will affect .gpi transformation for all .gpi files. +# +# Use only the first one found. Backward compatible values are at the end. +# Note that we use foreach, even though wildcard also returns a list, to ensure +# that the order in the uppercase variables is preserved. Directory listings +# provide no such guarantee, so we avoid relying on them. +gpi_sed := $(strip \ + $(firstword $(foreach f,$(GNUPLOT_SED),$(wildcard $f)))) +gpi_global := $(strip \ + $(firstword $(foreach f,$(GNUPLOT_GLOBAL),$(wildcard $f)))) + +# +# Functions used in generating output +# + +# Outputs all source dependencies to stdout. The first argument is the file to +# be parsed, the second is a list of files that will show up as dependencies in +# the new .d file created here. +# +# NOTE: BSD sed does not understand \|, so we have to do something more +# clunky to extract suitable extensions. +# +# Also, we do a little bit of funny rewriting up front (TARGETS=) to make sure +# that we can properly backslash-escape spaces in file names (e.g, on Cygwin +# for tex distributions that have "Program Files" in their name). +# +# $(call get-inputs,,) +define get-inputs +$(SED) \ +-e '/^INPUT/!d' \ +-e 's!^INPUT \(\./\)\{0,1\}!!' \ +-e 's/[[:space:]]/\\ /g' \ +-e 's/\(.*\)\.aux$$/\1.tex/' \ +-e '/\.tex$$/b addtargets' \ +-e '/\.cls$$/b addtargets' \ +-e '/\.sty$$/b addtargets' \ +-e '/\.pstex_t$$/b addtargets' \ +-e '/\.dot_t$$/b addtargets' \ +-e 'd' \ +-e ':addtargets' \ +-e 's/^/$2: /' \ +$1 | $(SORT) | $(UNIQ) +endef + +# $(call get-missing-inputs,,) +define get-missing-inputs +$(SED) \ +-e '$$ b para' \ +-e '/^$$/b para' \ +-e 'H' \ +-e 'd' \ +-e ':para' \ +-e 'x' \ +-e '/^$$/d' \ +-e 's/^\n*//' \ +-e '/^! LaTeX Error: File /{' \ +-e ' s/^/::DOUBLE_PARAGRAPH::/' \ +-e ' h' \ +-e ' d' \ +-e '}' \ +-e 's/^::DOUBLE_PARAGRAPH:://' \ +-e '/Default extension: /!d' \ +-e 's/[[:space:]]\{1,\}/ /g' \ +-e 's/\n\{1,\}/ /g' \ +-e 's/^.*File `//' \ +-e 's/'"'"' not found\..*//' \ +-e '/\.tex/!s/$$/.tex/' \ +-e 's/[[:space:]]/\\ /g' \ +-e 'h' \ +-e 's/.*/# MISSING input "&" - (presence of comment affects build)/' \ +-e 'p' \ +-e 's/.*//' \ +-e 'x' \ +-e 's/^/$2: /' \ +$1 | $(SORT) | $(UNIQ) +endef + +# Get source file for specified graphics stem. +# +# $(call graphics-source,) +define graphics-source +$(strip $(firstword \ + $(wildcard \ + $(addprefix $1.,\ + $(graphic_source_extensions))) \ + $1 \ +)) +endef + +# Get the target file for the specified graphics file/stem +# +# $(call graphics-target,) +define graphics-target +$(strip $(if $(filter $(addprefix %.,$(graphic_target_extensions)),$1), $1, + $(firstword $(patsubst $(addprefix %.,$(graphic_source_extensions) $(graphic_target_extensions)), %, $1).$(default_graphic_extension) $1.$(default_graphic_extension)))) +endef + +# Outputs all of the graphical dependencies to stdout. The first argument is +# the stem of the source file being built, the second is a list of suffixes +# that will show up as dependencies in the generated .d file. +# +# Note that we try to escape spaces in filenames where possible. We have to do +# it with three backslashes so that as the name percolates through the makefile +# it eventually ends up with the proper escaping when the build rule is found. +# Ugly, but it appears to work. Note that graphicx doesn't allow filenames +# with spaces, so this could in many ways be moot unless you're using something +# like grffile. +# +# For pdflatex, we really need the missing file to be specified without an +# extension, otherwise compilation barfs on the first missing file. Truly +# annoying, but there you have it. +# +# It turns out that the graphics errors, although they have lines with empty +# space, are only made of two paragraphs. So, we just use some sed magic to +# get everything into paragraphs, detect when it's a paragraph that interests +# us, and double it up. Then we get the filename only if we're missing +# extensions (a sign that it's graphicx complaining). +# +# $(call get-graphics,) +#.log,$(addprefix $*.,d $(build_target_extension) _graphics) +define get-graphics +$(SED) \ +-e '$$ b para' \ +-e '/^$$/b para' \ +-e 'H' \ +-e 'd' \ +-e ':para' \ +-e 'x' \ +-e '/^$$/d' \ +-e 's/^\n*//' \ +-e '/^! LaTeX Error: File `/{' \ +-e ' s/^/::DOUBLE_PARAGRAPH::/' \ +-e ' h' \ +-e ' d' \ +-e '}' \ +-e 's/^::DOUBLE_PARAGRAPH:://' \ +-e '/could not locate the file with any of these extensions:/{' \ +-e ' s/\n\{1,\}/ /g' \ +-e ' s/[[:space:]]\{1,\}/ /g' \ +-e ' s/^.*File `//' \ +-e ' s/'"'"' not found\..*//' \ +-e ' h' \ +-e ' s/.*/# MISSING stem "&" - (presence of comment affects build)/' \ +-e ' p' \ +-e ' g' \ +-e ' b addtargets' \ +-e '}' \ +-e '/.*File: \(.*\) Graphic file (type [^)]*).*/{' \ +-e ' s//\1/' \ +-e ' b addtargets' \ +-e '}' \ +-e 'd' \ +-e ':addtargets' \ +-e 's/[[:space:]]/\\\\\\&/g' \ +-e 'h' \ +-e 's/.*/-include &.gpi.d/' \ +-e 'p' \ +-e 'g' \ +-e 's/.*/$(addprefix $1,.d): $$$$(call graphics-source,&)/' \ +-e 'p' \ +-e 's/.*//' \ +-e 'x' \ +-e 's/.*/$(addprefix $1.,$(build_target_extension) _graphics): $$$$(call graphics-target,&)/' \ +-e 'p' \ +-e 'd' \ +$*.log +endef + +# Checks for build failure due to pstex inclusion, and gives instructions. +# +# $(call die-on-pstexs,) +define die-on-pstexs +if $(EGREP) -q '^! LaTeX Error: File .*\.pstex.* not found' $1; then \ + $(ECHO) "$(C_ERROR)Missing pstex_t file(s)$(C_RESET)"; \ + $(ECHO) "$(C_ERROR)Please run$(C_RESET)"; \ + $(ECHO) "$(C_ERROR) make all-pstex$(C_RESET)"; \ + $(ECHO) "$(C_ERROR)before proceeding.$(C_RESET)"; \ + exit 1; \ +fi +endef + +# Checks for build failure due to dot2tex, and gives instructions. +# +# $(call die-on-dot2tex,) +define die-on-dot2tex +if $(EGREP) -q ' LaTeX Error: File .*\.dot_t.* not found' $1; then \ + $(ECHO) "$(C_ERROR)Missing dot_t file(s)$(C_RESET)"; \ + $(ECHO) "$(C_ERROR)Please run$(C_RESET)"; \ + $(ECHO) "$(C_ERROR) make all-dot2tex$(C_RESET)"; \ + $(ECHO) "$(C_ERROR)before proceeding.$(C_RESET)"; \ + exit 1; \ +fi +endef + +# Checks for the existence of a .aux file, and dies with an error message if it +# isn't there. Note that we pass the file stem in, not the full filename, +# e.g., to check for foo.aux, we call it thus: $(call die-on-no-aux,foo) +# +# $(call die-on-no-aux,) +define die-on-no-aux +if [ ! -e '$1.aux' ]; then \ + $(call colorize-latex-errors,$1.log); \ + exit 1; \ +fi +endef + +# Outputs all index files to stdout. Arg 1 is the source file stem, arg 2 is +# the list of targets for the discovered dependency. +# +# $(call get-log-index,,) +define get-log-index +$(SED) \ +-e 's/^No file \(.*\.ind\)\.$$/TARGETS=\1/' \ +-e 's/^No file \(.*\.[gn]ls\)\.$$/TARGETS=\1/' \ +-e 's/[[:space:]]/\\&/g' \ +-e '/^TARGETS=/{' \ +-e ' h' \ +-e ' s/^TARGETS=/$2: /p' \ +-e ' g' \ +-e ' s/^TARGETS=\(.*\)/\1: $1.tex/p' \ +-e '}' \ +-e 'd' \ +'$1.log' | $(SORT) | $(UNIQ) +endef + + +# Outputs all bibliography files to stdout. Arg 1 is the source stem, arg 2 is +# a list of targets for each dependency found. +# +# The script kills all lines that do not contain bibdata. Remaining lines have +# the \bibdata macro and delimiters removed to create a dependency list. A +# trailing comma is added, then all adjacent commas are collapsed into a single +# comma. Then commas are replaced with the string .bib[space], and the +# trailing space is killed off. Finally, all filename spaces are escaped. +# This produces a list of space-delimited .bib filenames, which is what the +# make dep file expects to see. +# +# Note that we give kpsewhich a bogus argument so that a failure of sed to +# produce output will not cause an error. +# +# $(call get-bibs,,) +define get-bibs +$(SED) \ +-e '/^\\bibdata/!d' \ +-e 's/\\bibdata{\([^}]*\)}/\1,/' \ +-e 's/,\{2,\}/,/g' \ +-e 's/[[:space:]]/\\&/g' \ +-e 's/,/.bib /g' \ +-e 's/ \{1,\}$$//' \ +$1 | $(XARGS) $(KPSEWHICH) '#######' | \ +$(SED) \ +-e 's/^/$2: /' | \ +\$(SORT) | $(UNIQ) +endef + +# Makes a an aux file that only has stuff relevant to the target in it +# $(call make-auxtarget-file,,) +define make-auxtarget-file +$(SED) \ +-e '/^\\newlabel/!d' \ +$1 > $2 +endef + +# Makes an aux file that only has stuff relevant to the bbl in it +# $(call make-auxbbl-file,,) +define make-auxbbl-file +$(SED) \ +-e '/^\\newlabel/d' \ +$1 > $2 +endef + +# Makes a .gpi.d file from a .gpi file +# $(call make-gpi-d,<.gpi>,<.gpi.d>) +define make-gpi-d +$(ECHO) '# vim: ft=make' > $2; \ +$(ECHO) 'ifndef INCLUDED_$(call cleanse-filename,$2)' >> $2; \ +$(ECHO) 'INCLUDED_$(call cleanse-filename,$2) := 1' >> $2; \ +$(call get-gpi-deps,$1,$(addprefix $(2:%.gpi.d=%).,$(GNUPLOT_OUTPUT_EXTENSION) gpi.d)) >> $2; \ +$(ECHO) 'endif' >> $2; +endef + +# Parse .gpi files for data and loaded dependencies, output to stdout +# +# The sed script here tries to be clever about obtaining valid +# filenames from the gpi file. It assumes that the plot command starts its own +# line, which is not too difficult a constraint to satisfy. +# +# This command script also generates 'include' directives for every 'load' +# command in the .gpi file. The load command must appear on a line by itself +# and the file it loads must have the suffix .gpi. If you don't want it to be +# compiled when running make graphics, then give it a suffix of ._include_.gpi. +# +# $(call get-gpi-deps,,) +define get-gpi-deps +$(SED) \ +-e '/^[[:space:]]*s\{0,1\}plot/,/[^\\]$$/{' \ +-e ' H' \ +-e ' /[^\\]$$/{' \ +-e ' s/.*//' \ +-e ' x' \ +-e ' s/\\\{0,1\}\n//g' \ +-e ' s/^[[:space:]]*s\{0,1\}plot[[:space:]]*\(\[[^]]*\][[:space:]]*\)*/,/' \ +-e ' s/[[:space:]]*\(['\''"][^'\''"]*['\''"]\)\{0,1\}[^,]*/\1/g' \ +-e ' s/,['\''"]-\{0,1\}['\''"]//g' \ +-e ' s/[,'\''"]\{1,\}/ /g' \ +-e ' s!.*!$2: &!' \ +-e ' p' \ +-e ' }' \ +-e ' d' \ +-e '}' \ +-e 's/^[[:space:]]*load[[:space:]]*['\''"]\([^'\''"]*\.gpi\)['\''"].*$$/-include \1.d/p' \ +-e 'd' \ +$1 +endef + +# Colorizes real, honest-to-goodness LaTeX errors that can't be overcome with +# recompilation. +# +# Note that we only ignore file not found errors for things that we know how to +# build, like graphics files. +# +# $(call colorize-latex-errors,) +define colorize-latex-errors +$(SED) \ +-e '$$ b para' \ +-e '/^$$/b para' \ +-e 'H' \ +-e 'd' \ +-e ':para' \ +-e 'x' \ +-e '/^$$/d' \ +-e 's/^\n*//' \ +-e '/^! LaTeX Error: File /{' \ +-e ' s/^/::DOUBLE_PARAGRAPH::/' \ +-e ' h' \ +-e ' d' \ +-e '}' \ +-e 's/^::DOUBLE_PARAGRAPH:://' \ +-e '/could not locate the file with any of these extensions:/d' \ +-e '/Missing .begin.document/{' \ +-e ' h' \ +-e ' s/.*/Are you trying to build an include file?/' \ +-e ' x' \ +-e ' G' \ +-e '}' \ +-e '/ LaTeX Error: Cannot determine size/d' \ +-e 's/.* LaTeX Error .*/$(C_ERROR)&$(C_RESET)/p' \ +-e 's/Error: pdflatex (file .*/$(C_ERROR)& - try specifying it without an extension$(C_RESET)/p' \ +-e '/.*\*hyperref using.*driver \(.*\)\*.*/{' \ +-e ' s//\1/' \ +-e ' /^$(hyperref_driver_pattern)$$/!{' \ +-e ' s/.*//' \ +-e ' p' \ +-e ' s/.*/$(C_ERROR)--- Using incorrect driver for hyperref! ---$(C_RESET)/' \ +-e ' p' \ +-e ' s/.*/$(C_ERROR)$(hyperref_driver_error)$(C_RESET)/' \ +-e ' p' \ +-e ' }' \ +-e ' d' \ +-e '}' \ +-e '/ LaTeX Error: Unknown graphics extension/{' \ +-e ' s/^/ /' \ +-e ' h' \ +-e ' s/.*/--- Graphics extension error:/' \ +-e ' G' \ +-e ' h' \ +-e ' s/.*/--- If you specified the extension explicitly in your .tex file, try removing it./' \ +-e ' H' \ +-e ' g' \ +-e ' s/.*/$(C_ERROR)&$(C_RESET)/' \ +-e ' p' \ +-e ' s/.*//' \ +-e ' h' \ +-e ' b' \ +-e '}' \ +-e 's/.*\(\n\{0,\}! .*\)/$(C_ERROR)\1$(C_RESET)/p' \ +-e 'd' \ +$1 +endef + +# Colorize Makeindex errors +define colorize-makeindex-errors +$(SED) \ +-e '/^!! /{' \ +-e ' N' \ +-e ' s/^.*$$/$(C_ERROR)&$(C_RESET)/' \ +-e ' p' \ +-e '}' \ +-e 'd' \ +$1 +endef + +# Colorize epstopdf errors +# +# $(call colorize-epstopdf-errors,) +define colorize-epstopdf-errors +$(SED) \ +-e '/^Error:/,/^Execution stack:/{' \ +-e ' /^Execution stack:/d' \ +-e ' s/.*/$(C_ERROR)&$(C_RESET)/' \ +-e ' p' \ +-e '}' \ +-e 'd' \ +$1 +endef + +# Colorize GNUplot errors +# +# $(call colorize-gnuplot-errors,) +define colorize-gnuplot-errors +$(SED) \ +-e '/, line [0-9]*:/!{' \ +-e ' H' \ +-e ' x' \ +-e ' s/.*\n\(.*\n.*\)$$/\1/' \ +-e ' x' \ +-e '}' \ +-e '/, line [0-9]*:/{' \ +-e ' H' \ +-e ' /unknown.*terminal type/{' \ +-e ' s/.*/--- Try changing the GNUPLOT_OUTPUT_EXTENSION variable to 'eps'./' \ +-e ' H' \ +-e ' }' \ +-e ' /gpihead/{' \ +-e ' s/.*/--- This could be a Makefile bug - contact the maintainer./' \ +-e ' H' \ +-e ' }' \ +-e ' g' \ +-e ' s/.*/$(C_ERROR)&$(C_RESET)/' \ +-e ' p' \ +-e '}' \ +-e '/^gnuplot>/,/^$$/{' \ +-e ' s/^gnuplot.*/$(C_ERROR)&/' \ +-e ' s/^$$/$(C_RESET)/' \ +-e ' p' \ +-e '}' \ +-e 'd' \ +$1 +endef + +# Colorize GraphViz errors +# +# $(call colorize-dot-errors,) +define colorize-dot-errors +$(SED) \ +-e '/^Error:/,/context:/s/.*/$(C_ERROR)&$(C_RESET)/p' \ +-e 's/^Warning:.*/$(C_WARNING)&$(C_RESET)/p' \ +-e 'd' \ +'$1' +endef + +# Get all important .aux files from the top-level .aux file and merges them all +# into a single file, which it outputs to stdout. +# +# $(call flatten-aux,,) +define flatten-aux +$(SED) \ +-e '/\\@input{\(.*\)}/{' \ +-e 's//\1/' \ +-e 's![.:]!\\&!g' \ +-e 'h' \ +-e 's!.*!\\:\\\\@input{&}:{!' \ +-e 'p' \ +-e 'x' \ +-e 's/\\././g' \ +-e 's/.*/r &/p' \ +-e 's/.*/d/p' \ +-e 's/.*/}/p' \ +-e 'd' \ +-e '}' \ +-e 'd' \ +'$1' > "$1.$$$$.sed.make"; \ +$(SED) -f "$1.$$$$.sed.make" '$1' > "$1.$$$$.make"; \ +$(SED) \ +-e '/^\\relax/d' \ +-e '/^\\bibcite/d' \ +-e 's/^\(\\newlabel{[^}]\{1,\}}\).*/\1/' \ +"$1.$$$$.make" | $(SORT) > '$2'; \ +$(call remove-temporary-files,$1.$$$$.make $1.$$$$.sed.make) +endef + +# Generate pdf from postscript +# +# Note that we don't just call ps2pdf, since there are so many versions of that +# script on various systems. Instead, we call the postscript interpreter +# directly. +# +# $(call ps2pdf,infile,outfile,[embed fonts]) +define ps2pdf + $(GS) \ + -dSAFER -dCompatibilityLevel=$(PS_COMPATIBILITY) \ + $(if $3,$(PS_EMBED_OPTIONS)) \ + -q -dNOPAUSE -dBATCH \ + -sDEVICE=pdfwrite -sstdout=%stderr \ + '-sOutputFile=$2' \ + -dSAFER -dCompatibilityLevel=$(PS_COMPATIBILITY) \ + $(if $3,$(PS_EMBED_OPTIONS)) \ + -c .setpdfwrite \ + -f '$1' +endef + +# Colorize LaTeX output. +# This uses a neat trick from the Sed & Awk Book from O'Reilly: +# 1) If a line has a single ending paren, delete it to make a blank line (so +# that we catch the first error, which is not always preceded by a blank +# line). +# 2) Ensure that the last line of the file gets appended to the hold buffer, +# and blank it out to trigger end-of-paragraph logic below. +# 3) When encountering a blank line (LaTeX output helpfully breaks output on +# newlines) +# a) swap the hold buffer (containing the paragraph) into the pattern buffer (putting a blank line into the hold buffer), +# b) remove the newline at the beginning (don't ask), +# c) apply any colorizing substitutions necessary to ensure happiness. +# d) get the newline out of the hold buffer and append it +# e) profit! (print) +# 4) Anything not colorized is deleted, unless in verbose mode. +color_tex := \ + $(SED) \ + -e '$${' \ + -e ' /^$$/!{' \ + -e ' H' \ + -e ' s/.*//' \ + -e ' }' \ + -e '}' \ + -e '/^$$/!{' \ + -e ' H' \ + -e ' d' \ + -e '}' \ + -e '/^$$/{' \ + -e ' x' \ + -e ' s/^\n//' \ + -e ' /Output written on /{' \ + -e ' s/.*Output written on \([^(]*\) (\([^)]\{1,\}\)).*/Success! Wrote \2 to \1/' \ + -e ' s/[[:digit:]]\{1,\}/$(C_PAGES)&$(C_RESET)/g' \ + -e ' s/Success!/$(C_SUCCESS)&$(C_RESET)/g' \ + -e ' s/to \(.*\)$$/to $(C_SUCCESS)\1$(C_RESET)/' \ + -e ' b end' \ + -e ' }' \ + -e ' / *LaTeX Error:.*/{' \ + -e ' s/.*\( *LaTeX Error:.*\)/$(C_ERROR)\1$(C_RESET)/' \ + -e ' b end' \ + -e ' }' \ + -e ' /.*Warning:.*/{' \ + -e ' s//$(C_WARNING)&$(C_RESET)/' \ + -e ' b end' \ + -e ' }' \ + -e ' /Underfull.*/{' \ + -e ' s/.*\(Underfull.*\)/$(C_UNDERFULL)\1$(C_RESET)/' \ + -e ' b end' \ + -e ' }' \ + -e ' /Overfull.*/{' \ + -e ' s/.*\(Overfull.*\)/$(C_OVERFULL)\1$(C_RESET)/' \ + -e ' b end' \ + -e ' }' \ + $(if $(VERBOSE),,-e ' d') \ + -e ' :end' \ + -e ' G' \ + -e '}' \ + +# Colorize BibTeX output. +color_bib := \ + $(SED) \ + -e 's/^Warning--.*/$(C_WARNING)&$(C_RESET)/' -e 't' \ + -e '/---/,/^.[^:]/{' \ + -e ' H' \ + -e ' /^.[^:]/{' \ + -e ' x' \ + -e ' s/\n\(.*\)/$(C_ERROR)\1$(C_RESET)/' \ + -e ' p' \ + -e ' s/.*//' \ + -e ' h' \ + -e ' d' \ + -e ' }' \ + -e ' d' \ + -e '}' \ + -e '/(.*error.*)/s//$(C_ERROR)&$(C_RESET)/' \ + $(if $(VERBOSE),,-e 'd') + + +# Make beamer output big enough to print on a full page. Landscape doesn't +# seem to work correctly. +enlarge_beamer = $(PSNUP) -l -1 -W128mm -H96mm -pletter + +# $(call test-run-again,) +test-run-again = $(EGREP) -q '^(.*Rerun .*|No file $1\.[^.]+\.)$$' $1.log + +# This tests whether the build target commands should be run at all, from +# viewing the log file. +# $(call test-log-for-need-to-run,) +define test-log-for-need-to-run +$(SED) \ +-e '/^No file $(call escape-dots,$1)\.aux\./d' \ +$1.log \ +| $(EGREP) -q '^(.*Rerun .*|No file $1\.[^.]+\.|No file .+\.tex\.|LaTeX Warning: File.*)$$' +endef + +# LaTeX invocations +# +# $(call latex,,[]) +run-latex = $(latex_build_program) --interaction=batchmode $(if $2,$2,) $1 > /dev/null + +# $(call latex-color-log,) +latex-color-log = $(color_tex) $1.log + +# $(call run-makeindex,,,,) +define run-makeindex +success=1; \ +if ! $(MAKEINDEX) -q $1 -t $3 -o $2 $4 > /dev/null || $(EGREP) -q '^!!' $3; then \ + $(call colorize-makeindex-errors,$3); \ + $(RM) -f '$2'; \ + success=0; \ +fi; \ +[ "$$success" = "1" ] && $(sh_true) || $(sh_false); +endef + +# This runs the given script to generate output, and it uses MAKE_RESTARTS to +# ensure that it never runs it more than once for a particular root make +# invocation. +# +# $(call run-script,,,) +define run-script +[ ! -e '$2.cookie' ] && $(ECHO) "restarts=$(RESTARTS)" > $2.cookie && $(ECHO) "level=$(MAKELEVEL)" >> $2.cookie; \ +restarts=`$(SED) -n -e 's/^restarts=//p' $2.cookie`; \ +level=`$(SED) -n -e 's/^level=//p' $2.cookie`; \ +if $(EXPR) $(MAKELEVEL) '<=' $$level '&' $(RESTARTS) '<=' $$restarts >/dev/null; then \ + $(call echo-build,$2,$3,$(RESTARTS)-$(MAKELEVEL)); \ + $1 '$2' '$3'; \ + $(ECHO) "restarts=$(RESTARTS)" > '$2.cookie'; \ + $(ECHO) "level=$(MAKELEVEL)" >> '$2.cookie'; \ +fi +endef + +# BibTeX invocations +# +# $(call run-bibtex,) +run-bibtex = $(BIBTEX) $1 | $(color_bib) + + +# $(call convert-eps-to-pdf,,,[gray]) +# Note that we don't use the --filter flag because it has trouble with bounding boxes that way. +define convert-eps-to-pdf +$(if $3,$(CAT) '$1' | $(call kill-ps-color) > '$1.cookie',$(CP) '$1' '$1.cookie'); \ +$(EPSTOPDF) '$1.cookie' --outfile='$2' > $1.log; \ +$(call colorize-epstopdf-errors,$1.log); +endef + +# $(call convert-gpi,,,[gray]) +# +define convert-gpi +$(ECHO) 'set terminal $(if $(filter %.pdf,$2),pdf enhanced,postscript enhanced eps)' \ +$(if $(filter %.pdf,$2),fsize ,)$(call get-default,$(strip \ +$(firstword \ + $(shell \ + $(SED) \ + -e 's/^\#\#FONTSIZE=\([[:digit:]]\{1,\}\)/\1/p' \ + -e 'd' \ + $1 $(strip $(gpi_global)) \ + ) \ +) \ +),$(if $(filter %.pdf,$2),$(DEFAULT_GPI_PDF_FONTSIZE),$(DEFAULT_GPI_EPS_FONTSIZE))) \ +$(strip $(if $3,monochrome,$(if \ +$(shell $(EGREP) '^\#\#[[:space:]]*GRAY[[:space:]]*$$' $< $(gpi_global)),\ +,color))) > $1head.make; \ +$(ECHO) 'set output "$2"' >> $1head.make; \ +$(if $(gpi_global),$(CAT) $(gpi_global) >> $1head.make;,) \ +fnames='$1head.make $1';\ +$(if $(gpi_sed),\ + $(SED) -f '$(gpi_sed)' $$fnames > $1.temp.make; \ + fnames=$1.temp.make;,\ +) \ +success=1; \ +if ! $(GNUPLOT) $$fnames 2>$1.log; then \ + $(call colorize-gnuplot-errors,$1.log); \ + success=0; \ +fi; \ +$(if $(gpi_sed),$(call remove-temporary-files,$1.temp.make);,) \ +$(call remove-temporary-files,$1head.make); \ +[ "$$success" = "1" ] && $(sh_true) || $(sh_false); +endef + +# Creation of .eps files from .png files +# +# The intermediate step of PNM (using NetPBM) produces much nicer output than +# ImageMagick's "convert" binary. I couldn't get the right combination of +# flags to make it look nice, anyway. +# +# To handle gray scale conversion, we pipe things through ppmtopgm in the +# middle. +# +# $(call convert-png,,) +define convert-png +$(PNGTOPNM) "$1" \ + $(if $3,| $(PPMTOPGM),) \ + | $(PNMTOPS) -noturn \ + > "$2" +endef + +# Creation of .eps files from .jpg files +# +# Thanks to brubakee for this solution. +# +# Uses Postscript level 2 to avoid file size bloat +# $(call convert-jpg,,) +define convert-jpg +$(CONVERT) $(if $3,-type Grayscale,) '$1' eps2:'$2' +endef + +# Creation of .eps files from .fig files +# $(call convert-fig,,,[gray]) +convert-fig = $(FIG2DEV) -L $(if $(filter %.pdf,$2),pdf,eps) $(if $3,-N,) $1 $2 + +# Creation of .pstex files from .fig files +# $(call convert-fig-pstex,,) +convert-fig-pstex = $(FIG2DEV) -L pstex $1 $2 > /dev/null 2>&1 + +# Creation of .pstex_t files from .fig files +# $(call convert-fig-pstex-t,,,) +convert-fig-pstex-t = $(FIG2DEV) -L pstex_t -p $3 $1 $2 > /dev/null 2>&1 + +# Creation of .dot_t files from .dot files +# #(call convert-dot-tex,,) +convert-dot-tex = $(DOT2TEX) '$1' > '$2' + +# Converts svg files into .eps files +# +# $(call convert-svg,,,[gray]) +convert-svg = $(INKSCAPE) --export-eps='$2' '$1' + +# Converts xvg files into .eps files +# +# $(call convert-xvg,,,[gray]) +convert-xvg = $(XMGRACE) '$1' -printfile - -hardcopy -hdevice $(if $3,-mono,) EPS > '$2' + +# Converts .eps.gz files into .eps files +# +# $(call convert-epsgz,,,[gray]) +convert-epsgz = $(GUNZIP) -c '$1' $(if $3,| $(call kill-ps-color)) > '$2' + +# Converts .eps files into .eps files (usually a no-op, but can make grayscale) +# +# $(call convert-eps,,,[gray]) +convert-eps = $(if $3,$(call kill-ps-color) $1 > $2) + +# The name of the file containing special postscript commands for grayscale +gray_eps_file := gray.eps.make + +# Changes sethsbcolor and setrgbcolor calls in postscript to always produce +# grayscale. In general, this is accomplished by writing new versions of those +# functions into the user dictionary space, which is looked up before the +# global or system dictionaries (userdict is one of the permanent dictionaries +# in postscript and is not read-only like systemdict). +# +# For setrgbcolor, the weighted average of the triple is computed and the +# triple is replaced with three copies of that average before the original +# procedure is called: .299R + .587G + .114B +# +# For sethsbcolor, the color is first converted to RGB, then to grayscale by +# the new setrgbcolor operator as described above. Why is this done? +# Because simply using the value component will tend to make pure colors +# white, a very undesirable thing. Pure blue should not translate to white, +# but to some level of gray. Conversion to RGB does the right thing. It's +# messy, but it works. +# +# From +# http://en.wikipedia.org/wiki/HSV_color_space#Transformation_from_HSV_to_RGB, +# HSB = HSV (Value = Brightness), and the formula used to convert to RGB is +# as follows: +# +# Hi = int(floor(6 * H)) mod 6 +# f = 6 * H - Hi +# p = V(1-S) +# q = V(1-fS) +# t = V(1-(1-f)S) +# if Hi = 0: R G B <-- V t p +# if Hi = 1: R G B <-- q V p +# if Hi = 2: R G B <-- p V t +# if Hi = 3: R G B <-- p q V +# if Hi = 4: R G B <-- t p V +# if Hi = 5: R G B <-- V p q +# +# The messy stack-based implementation is below +# $(call create-gray-eps-file,filename) +define create-gray-eps-file +$(ECHO) -n -e '\ +/OLDRGB /setrgbcolor load def\n\ +/setrgbcolor {\n\ + .114 mul exch\n\ + .587 mul add exch\n\ + .299 mul add\n\ + dup dup\n\ + OLDRGB\n\ +} bind def\n\ +/OLDHSB /sethsbcolor load def\n\ +/sethsbcolor {\n\ + 2 index % H V S H\n\ + 6 mul floor cvi 6 mod % Hi V S H\n\ + 3 index % H Hi V S H\n\ + 6 mul % 6H Hi V S H\n\ + 1 index % Hi 6H Hi V S H\n\ + sub % f Hi V S H\n\ + 2 index 1 % 1 V f Hi V S H\n\ + 4 index % S 1 V f Hi V S H\n\ + sub mul % p f Hi V S H\n\ + 3 index 1 % 1 V p f Hi V S H\n\ + 6 index % S 1 V p f Hi V S H\n\ + 4 index % f S 1 V p f Hi V S H\n\ + mul sub mul % q p f Hi V S H\n\ + 4 index 1 1 % 1 1 V q p f Hi V S H\n\ + 5 index % f 1 1 V q p f Hi V S H\n\ + sub % (1-f) 1 V q p f Hi V S H\n\ + 8 index % S (1-f) 1 V q p f Hi V S H\n\ + mul sub mul % t q p f Hi V S H\n\ + 4 -1 roll pop % t q p Hi V S H\n\ + 7 -2 roll pop pop % t q p Hi V\n\ + 5 -2 roll % Hi V t q p\n\ + dup 0 eq\n\ + {1 index 3 index 6 index}\n\ + {\n\ + dup 1 eq\n\ + {3 index 2 index 6 index}\n\ + {\n\ + dup 2 eq\n\ + {4 index 2 index 4 index}\n\ + {\n\ + dup 3 eq\n\ + {4 index 4 index 3 index}\n\ + {\n\ + dup 4 eq\n\ + {2 index 5 index 3 index}\n\ + {\n\ + dup 5 eq\n\ + {1 index 5 index 5 index}\n\ + {0 0 0}\n\ + ifelse\n\ + }\n\ + ifelse\n\ + }\n\ + ifelse\n\ + }\n\ + ifelse\n\ + }\n\ + ifelse\n\ + }\n\ + ifelse % B G R Hi V t q p\n\ + setrgbcolor\n\ + 5 {pop} repeat\n\ +} bind def\n'\ +> $1 +endef + +# This actually inserts the color-killing code into a postscript file +# $(call kill-ps-color) +define kill-ps-color +$(SED) -e '/%%EndComments/r $(gray_eps_file)' +endef + +# Converts graphviz .dot files into .eps files +# Grayscale is not directly supported by dot, so we pipe it through fig2dev in +# that case. +# $(call convert-dot,,,,[gray]) +define convert-dot +$(DOT) -Tps '$1' 2>'$3' $(if $4,| $(call kill-ps-color)) > $2; \ +$(call colorize-dot-errors,$3) +endef + +# Convert DVI to Postscript +# $(call make-ps,,,,[]) +make-ps = \ + $(DVIPS) -o '$2' $(if $(filter-out BEAMER,$4),-t$(firstword $4),) '$1' \ + $(if $(filter BEAMER,$4),| $(enlarge_beamer)) > $3 2>&1 + +# Convert Postscript to PDF +# $(call make-pdf,,,,) +make-pdf = \ + $(call ps2pdf,$1,$2,$(filter 1,$(shell $(CAT) '$4'))) > '$3' 2>&1 + +# Display information about what is being done +# $(call echo-build,,,[]) +echo-build = $(ECHO) "$(C_BUILD)= $1 --> $2$(if $3, ($3),) =$(C_RESET)" +echo-graphic = $(ECHO) "$(C_GRAPHIC)= $1 --> $2 =$(C_RESET)" +echo-dep = $(ECHO) "$(C_DEP)= $1 --> $2 =$(C_RESET)" + +# Display a list of something +# $(call echo-list,) +echo-list = for x in $1; do $(ECHO) "$$x"; done + +# +# DEFAULT TARGET +# + +.PHONY: all +all: $(default_pdf_targets) ; + +.PHONY: all-pdf +all-pdf: $(default_pdf_targets) ; + +ifneq "$(strip $(BUILD_STRATEGY))" "pdflatex" +.PHONY: all-ps +all-ps: $(default_ps_targets) ; + +.PHONY: all-dvi +all-dvi: $(default_dvi_targets) ; +endif + +# +# VIEWING TARGET +# +.PHONY: show +show: all + $(QUIET)for x in $(default_pdf_targets); do \ + [ -e "$$x" ] && $(VIEW_PDF) $$x & \ + done + +# +# INCLUDES +# +source_includes := $(addsuffix .d,$(source_stems_to_include)) +graphic_includes := $(addsuffix .gpi.d,$(graphic_stems_to_include)) + +# Include only the dependencies used +ifneq "" "$(source_includes)" +include $(source_includes)$(call include-message,$(source_includes)) +endif +ifneq "" "$(graphic_includes)" +include $(graphic_includes)$(call include-message,$(graphic_includes)) +endif + +# +# MAIN TARGETS +# + +# Note that we don't just say %: %.pdf here - this can tend to mess up our +# includes, which detect what kind of file we are asking for. For example, +# asking to build foo.pdf is much different than asking to build foo when +# foo.gpi exists, because we look through all of the goals for *.pdf that +# matches *.gpi, then use that to determine which include files we need to +# build. +# +# Thus, we invoke make recursively with better arugments instead, restarting +# all of the appropriate machinery. +.PHONY: $(default_stems_ss) +$(default_stems_ss): %: %.pdf ; + +# This builds and displays the wanted file. +.PHONY: $(addsuffix ._show,$(stems_ssg)) +%._show: %.pdf + $(QUIET)$(VIEW_PDF) $< & + +ifneq "$(strip $(BUILD_STRATEGY))" "pdflatex" +.SECONDARY: $(all_pdf_targets) +%.pdf: %.ps %.embed.make + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call make-pdf,$<,$@.temp,$@.log,$*.embed.make); \ + if [ x"$$?" = x"0" ]; then \ + $(if $(VERBOSE),$(CAT) $@.log,:); \ + $(RM) -f '$@'; \ + $(MV) '$@.temp' '$@'; \ + $(TOUCH) '$@'; \ + $(call copy-with-logging,$@,$(BINARY_TARGET_DIR)); \ + else \ + $(CAT) $@.log; \ + $(call remove-temporary-files,'$@.temp'); \ + $(sh_false); \ + fi + +.SECONDARY: $(all_ps_targets) +%.ps: %.dvi %.paper.make + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call make-ps,$<,$@.temp,$@.log,\ + $(firstword $(shell $(CAT) $*.paper.make))); \ + if [ x"$$?" = x"0" ]; then \ + $(if $(VERBOSE),$(CAT) $@.log,:); \ + $(RM) -f '$@'; \ + $(MV) '$@.temp' '$@'; \ + $(TOUCH) '$@'; \ + $(call copy-with-logging,$@,$(BINARY_TARGET_DIR)); \ + else \ + $(CAT) $@.log; \ + $(call remove-temporary-files,'$@.temp'); \ + $(sh_false); \ + fi +endif + +# Build the final target (dvi or pdf) file. This is a very tricky rule because +# of the way that latex runs multiple times, needs graphics after the first run +# (or maybe already has them), and relies on bibliographies or indices that may +# not exist. +# +# Check the log for fatal errors. If they exist, colorize and bail. +# +# Create the .auxtarget.cookie file. (Needed for next time if not present) +# +# If any of the following are true, we must rebuild at least one time: +# +# * the .bbl was recently rebuilt +# +# check a cookie, then delete it +# +# * any of several output files was created or changed: +# +# check $*.run.cookie, then delete it +# +# * the .aux file changed in a way that necessitates attention +# +# Note that if the .auxtarget.make file doesn't exist, this means +# that we are doing a clean build, so it doesn't figure into the +# test for running again. +# +# compare against .auxtarget.make +# +# move if different, remove if not +# +# * the .log file has errors or warnings requiring at least one more run +# +# We use a loop over a single item to simplify the process of breaking +# out when we find one of the conditions to be true. +# +# If we do NOT need to run latex here, then we move the $@.1st.make file +# over to $@ because the target file has already been built by the first +# dependency run and is valid. +# +# If we do, we delete that cookie file and do the normal multiple-runs +# routine. +# +ifneq "$(strip $(BUILD_STRATEGY))" "pdflatex" +.SECONDARY: $(all_dvi_targets) +endif +%.$(build_target_extension): %.bbl %.aux %.$(build_target_extension).1st.make + $(QUIET)\ + fatal=`$(call colorize-latex-errors,$*.log)`; \ + if [ x"$$fatal" != x"" ]; then \ + $(ECHO) "$$fatal"; \ + exit 1; \ + fi; \ + $(call make-auxtarget-file,$*.aux.make,$*.auxtarget.cookie); \ + run=0; \ + for i in 1; do \ + if $(call test-exists,$*.bbl.cookie); then \ + run=1; \ + break; \ + fi; \ + if $(call test-exists,$*.run.cookie); then \ + run=1; \ + break; \ + fi; \ + if $(call \ + test-exists-and-different,$*.auxtarget.cookie,$*.auxtarget.make);\ + then \ + run=1; \ + break; \ + fi; \ + if $(call test-log-for-need-to-run,$*); then \ + run=1; \ + break; \ + fi; \ + done; \ + $(call remove-temporary-files,$*.bbl.cookie $*.run.cookie); \ + $(MV) $*.auxtarget.cookie $*.auxtarget.make; \ + if [ x"$$run" = x"1" ]; then \ + $(call remove-files,$@.1st.make); \ + for i in 2 3 4 5; do \ + $(if $(findstring 3.79,$(MAKE_VERSION)),\ + $(call echo-build,$*.tex,$@,$(RESTARTS)-$$$$i),\ + $(call echo-build,$*.tex,$@,$(RESTARTS)-$$i)\ + ); \ + $(call run-latex,$*); \ + $(CP) '$*.log' '$*.'$(RESTARTS)-$$i'.log'; \ + $(call test-run-again,$*) || break; \ + done; \ + else \ + $(MV) '$@.1st.make' '$@'; \ + fi; \ + $(call copy-with-logging,$@,$(BINARY_TARGET_DIR)); \ + $(call latex-color-log,$*) + +# Build the .bbl file. When dependencies are included, this will (or will +# not!) depend on something.bib, which we detect, acting accordingly. The +# dependency creation also produces the %.auxbbl.make file. BibTeX is a bit +# finicky about what you call the actual files, but we can rest assured that if +# a .auxbbl.make file exists, then the .aux file does, as well. The +# .auxbbl.make file is a cookie indicating whether the .bbl needs to be +# rewritten. It only changes if the .aux file changes in ways relevant to .bbl +# creation. +# +# Note that we do NOT touch the .bbl file if there is no need to +# create/recreate it. We would like to leave existing files alone if they +# don't need to be changed, thus possibly avoiding a rebuild trigger. +%.bbl: %.auxbbl.make + $(QUIET)\ + $(if $(filter %.bib,$^),\ + $(call echo-build,$(filter %.bib,$?) $*.aux,$@); \ + $(call run-bibtex,$*); \ + $(TOUCH) $@.cookie; \ + ) \ + if $(EGREP) -q 'bibstyle.(apacann|chcagoa|[^}]*annot)' '$*.aux'; then \ + $(call echo-build,** annotated extra latex **,output ignored,$(RESTARTS)-1); \ + $(call run-latex,$*); \ + $(CP) '$*.log' '$*.$(RESTARTS)-annotated.log'; \ + $(if $(filter %.bib,$^),\ + $(call echo-build,** annotated extra bibtex ** $(filter %.bib,$?) $*.aux,$@); \ + $(call run-bibtex,$*); \ + $(TOUCH) $@.cookie; \ + ) \ + $(call echo-build,** annotated extra latex **,output ignored,$(RESTARTS)-2); \ + $(call run-latex,$*); \ + fi + +# Create the index file - note that we do *not* depend on %.tex here, since +# that unnecessarily restricts the kinds of indices that we can build to those +# with exactly the same stem as the source file. Things like splitidx create +# idx files with other names. +# +# Therefore, we add the .tex dependency in the sourcestem.d file in the call to +# get index file dependencies from the logs. +%.ind: %.idx + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call run-makeindex,$<,$@,$*.ilg) + +# Create the glossary file +%.gls: %.glo %.tex + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call run-makeindex,$<,$@,$*.glg,-s nomencl.ist) + +# Create the nomenclature file +%.nls: %.nlo %.tex + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call run-makeindex,$<,$@,$*.nlg,-s nomencl.ist) + +# SCRIPTED LaTeX TARGETS +# +# Keep the generated .tex files around for debugging if needed. +.SECONDARY: $(all_tex_targets) + +%.tex:: %.tex.sh + $(QUIET)$(call run-script,$(SHELL),$<,$@) + +%.tex:: %.tex.py + $(QUIET)$(call run-script,$(PYTHON),$<,$@) + +%.tex:: %.tex.pl + $(QUIET)$(call run-script,$(PERL),$<,$@) + +%.tex:: %.rst $(RST_STYLE_FILE) + $(QUIET)\ + $(call run-script,$(RST2LATEX)\ + --documentoptions=letterpaper\ + $(if $(RST_STYLE_FILE),--stylesheet=$(RST_STYLE_FILE),),$<,$@) + +# +# GRAPHICS TARGETS +# +.PHONY: all-graphics +all-graphics: $(all_graphics_targets); + +ifneq "$(strip $(BUILD_STRATEGY))" "pdflatex" +.PHONY: all-pstex +all-pstex: $(all_pstex_targets); +endif + +.PHONY: all-dot2tex +all-dot2tex: $(all_dot2tex_targets); + +.PHONY: show-graphics +show-graphics: all-graphics + $(VIEW_GRAPHICS) $(all_known_graphics) + +$(gray_eps_file): + $(QUIET)$(call echo-build,$^,$@) + $(QUIET)$(call create-gray-eps-file,$@) + +ifeq "$(strip $(BUILD_STRATEGY))" "pdflatex" +%.pdf: %.eps $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-eps-to-pdf,$<,$@,$(GRAY)) + +ifeq "$(strip $(GNUPLOT_OUTPUT_EXTENSION))" "pdf" +%.pdf: %.gpi %.gpi.d $(gpi_sed) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-gpi,$<,$@,$(GRAY)) +endif + +%.pdf: %.fig + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-fig,$<,$@,$(GRAY)) + +endif + +%.eps: %.gpi %.gpi.d $(gpi_sed) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-gpi,$<,$@,$(GRAY)) + +%.eps: %.fig + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-fig,$<,$@,$(GRAY)) + +%.eps: %.dot $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-dot,$<,$@,$<.log,$(GRAY)) + +%.eps: %.xvg $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-xvg,$<,$@,$(GRAY)) + +%.eps: %.svg $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-svg,$<,$@,$(GRAY)) + +%.eps: %.jpg $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-jpg,$<,$@,$(GRAY)) + +%.eps: %.png $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-png,$<,$@,$(GRAY)) + +%.eps: %.eps.gz $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-epsgz,$<,$@,$(GRAY)) + +%.pstex: %.fig + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-fig-pstex,$<,$@,$(GRAY)) + +%.pstex_t: %.fig %.pstex + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-fig-pstex-t,$<,$@,$*.pstex,$(GRAY)) + +%.dot_t: %.dot + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-dot-tex,$<,$@) + +# +# DEPENDENCY-RELATED TARGETS. +# + +# Generate all of the information needed to get dependencies +# As a side effect, this creates a .dvi or .pdf file (depending on the build +# strategy). We need to be sure to remove it if there are errors. Errors can +# take several forms and all of them are found within the log file: +# * There was a LaTeX error +# * A needed file was not found +# * Cross references need adjustment +# +# Behavior: +# This rule is responsible for generating the following: +# %.aux +# %.d +# %.aux.make +# %.(pdf|dvi).1st.make (the .pdf or .dvi output file, moved) +# +# Steps: +# +# Run latex +# Move .pdf or .dvi somewhere else (make no judgements about success) +# Flatten the .aux file into another file +# Add source dependencies +# Add graphic dependencies +# Add bib dependencies +# +# Create cookies for various suffixes that may represent files that +# need to be read by LaTeX in order for it to function properly. +# +# Note that if some of the dependencies are discovered because they turn +# up missing in the log file, we really need the .d file to be reloaded. +# Adding a sleep command helps with this. Otherwise make is extremely +# nondeterministic, sometimes working, sometimes not. +# +# Usually we can force this by simply removing the generated pdf file and +# not creating a .1st.make file.. +# +%.$(build_target_extension).1st.make %.d %.aux %.aux.make %.fls: %.tex + $(QUIET)$(call echo-build,$<,$*.d $*.$(build_target_extension).1st.make,$(RESTARTS)-1) + $(QUIET)\ + $(call run-latex,$<,--recorder) || $(sh_true); \ + $(CP) '$*.log' '$*.$(RESTARTS)-1.log'; \ + $(call die-on-dot2tex,$*.log); \ + $(call die-on-no-aux,$*); \ + $(call flatten-aux,$*.aux,$*.aux.make); \ + $(ECHO) "# vim: ft=make" > $*.d; \ + $(ECHO) ".PHONY: $*._graphics" >> $*.d; \ + $(call get-inputs,$*.fls,$(addprefix $*.,aux aux.make d $(build_target_extension))) >> $*.d; \ + $(call get-missing-inputs,$*.log,$(addprefix $*.,aux aux.make d $(build_target_extension))) >> $*.d; \ + $(ECHO) ".SECONDEXPANSION:" >> $*.d; \ + $(call get-graphics,$*) >> $*.d; \ + $(call get-log-index,$*,$(addprefix $*.,d aux aux.make)) >> $*.d; \ + $(call get-bibs,$*.aux.make,$(addprefix $*.,bbl aux aux.make)) >> $*.d; \ + $(EGREP) -q "# MISSING" $*.d && $(SLEEP) 1 && $(RM) $*.pdf; \ + $(call move-if-exists,$*.$(build_target_extension),$*.$(build_target_extension).1st.make); \ + for s in toc out lot lof lol nav; do \ + if [ -e "$*.$$s" ]; then \ + if ! $(DIFF) -q $*.$$s $*.$$s.make >/dev/null 2>&1; then \ + $(TOUCH) $*.run.cookie; \ + fi; \ + $(CP) $*.$$s $*.$$s.make; \ + fi; \ + done + +# This is a cookie that is updated if the flattened aux file has changed in a +# way that affects the bibliography generation. +.SECONDARY: $(addsuffix .auxbbl.make,$(stems_ssg)) +%.auxbbl.make: %.aux.make + $(QUIET)\ + $(call make-auxbbl-file,$<,$@.temp); \ + $(call replace-if-different-and-remove,$@.temp,$@) + +# Build a dependency file for .gpi files. These often plot data files that +# also reside in the directory, so if a data file changes, it's nice to know +# about it. This also handles loaded .gpi files, whose filename should have +# _include_. in it. +%.gpi.d: %.gpi + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call make-gpi-d,$<,$@) + +# Store the paper size for this document -- note that if beamer is used we set +# it to the special BEAMER paper size. We only do this, however, if the +# special comment exists, in which case we enlarge the output with psnup. +# +# The paper size is extracted from a documentclass attribute. +%.paper.make: %.tex + $(QUIET)$(SED) \ + -e '/\\documentclass/,/}/{' \ + -e ' s/%.*//' \ + -e ' H' \ + -e ' /}/{' \ + -e ' s/.*//' \ + -e ' x' \ + -e ' /\\documentclass/!d' \ + -e ' s/[\n[:space:]]*//g' \ + -e ' s/\([,{[]\)\([[:alnum:]]\{1,\}\)paper\([],}]\)/\1%-\2-%\3/g' \ + -e ' s/\([,{[]\)\(landscape\)\([],}]\)/\1%-\2-%\3/g' \ + -e ' s/^[^%]*%-//' \ + -e ' s/-%[^%]*$$//' \ + -e ' s/-%[^%]%-/ /g' \ + -e ' p' \ + -e ' }' \ + -e ' d' \ + -e '}' \ + -e 'd' \ + $< > $@; \ + $(EGREP) -q '^[^%]*\\documentclass[^{]*{beamer}' $< && \ + (\ + $(EGREP) -q '^%%[[:space:]]*BEAMER[[:space:]]*LARGE$$' $< && \ + $(ECHO) "BEAMER" > $@ || \ + : > $@ \ + ) || $(sh_true) + +# Store embedding instructions for this document using a special comment +%.embed.make: %.tex + $(QUIET)$(EGREP) '^%%[[:space:]]*NO[[:space:]]*EMBED[[:space:]]*$$' $< \ + && $(ECHO) '' > $@ \ + || $(ECHO) '1' > $@; + +# +# HELPFUL PHONY TARGETS +# + +.PHONY: _all_programs +_all_programs: + $(QUIET)$(ECHO) "== All External Programs Used ==" + $(QUIET)$(call output-all-programs) + +.PHONY: _check_programs +_check_programs: + $(QUIET)$(ECHO) "== Checking Makefile Dependencies =="; $(ECHO) + $(QUIET) \ + $(ECHO) hi; \ + allprogs=`\ + ($(call output-all-programs)) | \ + $(SED) \ + -e 's/^[[:space:]]*//' \ + -e '/^#/d' \ + -e 's/[[:space:]]*#.*//' \ + -e '/^=/s/[[:space:]]/_/g' \ + -e '/^[[:space:]]*$$/d' \ + -e 's/^[^=].*=[[:space:]]*\([^[:space:]]\{1,\}\).*$$/\\1/' \ + `; \ + spaces=' '; \ + for p in $${allprogs}; do \ + case $$p in \ + =*) $(ECHO); $(ECHO) "$$p";; \ + *) \ + $(ECHO) -n "$$p:$$spaces" | $(SED) -e 's/^\(.\{0,20\}\).*$$/\1/'; \ + loc=`$(WHICH) $$p`; \ + if [ x"$$?" = x"0" ]; then \ + $(ECHO) "$(C_SUCCESS)Found:$(C_RESET) $$loc"; \ + else \ + $(ECHO) "$(C_FAILURE)Not Found$(C_RESET)"; \ + fi; \ + ;; \ + esac; \ + done + +.PHONY: _check_gpi_files +_check_gpi_files: + $(QUIET)$(ECHO) "== Checking all .gpi files for common errors =="; \ + $(ECHO); \ + for f in $(files.gpi); do \ + result=`$(EGREP) '^([^#]*set terminal |set output )' $$f`; \ + $(ECHO) -n "$$f: "; \ + if [ x"$$result" = x"" ]; then \ + $(ECHO) "$(C_SUCCESS)Okay$(C_RESET)"; \ + else \ + $(ECHO) "$(C_FAILURE)Warning: Problematic commands:$(C_RESET)";\ + $(ECHO) "$(C_ERROR)$$result$(C_RESET)"; \ + fi; \ + done; \ + $(ECHO) + +.PHONY: _all_stems +_all_stems: + $(QUIET)$(ECHO) "== All Stems ==" + $(QUIET)$(call echo-list,$(sort $(default_stems_ss))) + +.PHONY: _includes +_includes: + $(QUIET)$(ECHO) "== Include Stems ==" + $(QUIET)$(ECHO) "=== Sources ===" + $(QUIET)$(call echo-list,$(sort $(source_includes))) + $(QUIET)$(ECHO) "=== Graphics ===" + $(QUIET)$(call echo-list,$(sort $(graphic_includes))) + +.PHONY: _all_sources +_all_sources: + $(QUIET)$(ECHO) "== All Sources ==" + $(QUIET)$(call echo-list,$(sort $(all_files.tex))) + +.PHONY: _dependency_graph +_dependency_graph: + $(QUIET)$(ECHO) "/* LaTeX Dependency Graph */" + $(QUIET)$(call output-dependency-graph) + +.PHONY: _show_dependency_graph +_show_dependency_graph: + $(QUIET)$(call output-dependency-graph,$(graph_stem).dot) + $(QUIET)$(DOT) -Tps -o $(graph_stem).eps $(graph_stem).dot + $(QUIET)$(VIEW_POSTSCRIPT) $(graph_stem).eps + $(QUIET)$(call remove-temporary-files,$(graph_stem).*) + +.PHONY: _sources +_sources: + $(QUIET)$(ECHO) "== Sources ==" + $(QUIET)$(call echo-list,$(sort $(files.tex))) + +.PHONY: _scripts +_scripts: + $(QUIET)$(ECHO) "== Scripts ==" + $(QUIET)$(call echo-list,$(sort $(files_scripts))) + +.PHONY: _graphic_outputs +_graphic_outputs: + $(QUIET)$(ECHO) "== Graphic Outputs ==" + $(QUIET)$(call echo-list,$(sort $(all_graphics_targets))) + +.PHONY: _env +_env: +ifdef .VARIABLES + $(QUIET)$(ECHO) "== MAKE VARIABLES ==" + $(QUIET)$(call echo-list,$(foreach var,$(sort $(.VARIABLES)),'$(var)')) +endif + $(QUIET)$(ECHO) "== ENVIRONMENT ==" + $(QUIET)$(ENV) + +# +# CLEAN TARGETS +# +# clean-generated is somewhat unique - it relies on the .fls file being +# properly built so that it can determine which of the files was generated, and +# which was not. Expect it to silently fail if the .fls file is missing. +# +# This is used to, e.g., clean up index files that are generated by the LaTeX. +.PHONY: clean-generated +clean-generated: + $(QUIET)$(call clean-files,$(foreach e,$(addsuffix .fls,$(all_stems_source)),\ + $(shell $(call get-generated-names,$e)))) + +.PHONY: clean-deps +clean-deps: + $(QUIET)$(call clean-files,$(all_d_targets) *.make *.make.temp *.cookie) + +.PHONY: clean-tex +clean-tex: clean-deps + $(QUIET)$(call clean-files,$(rm_tex)) + +.PHONY: clean-graphics +# TODO: This *always* deletes pstex files, even if they were not generated by +# anything.... In other words, if you create a pstex and pstex_t pair by hand +# an drop them in here without the generating fig file, they will be deleted +# and you won't get them back. It's a hack put in here because I'm not sure we +# even want to keep pstex functionality, so my motivation is not terribly high +# for doing it right. +clean-graphics: + $(QUIET)$(call clean-files,$(all_graphics_targets) $(intermediate_graphics_targets) *.gpi.d *.pstex *.pstex_t *.dot_t) + +.PHONY: clean-backups +clean-backups: + $(QUIET)$(call clean-files,$(backup_patterns) *.temp) + +.PHONY: clean-auxiliary +clean-auxiliary: + $(QUIET)$(call clean-files,$(graph_stem).*) + +.PHONY: clean-nographics +clean-nographics: clean-tex clean-deps clean-backups clean-auxiliary ; + +.PHONY: clean +clean: clean-generated clean-tex clean-graphics clean-deps clean-backups clean-auxiliary + +# +# HELP TARGETS +# + +.PHONY: help +help: + $(help_text) + +.PHONY: version +version: + $(QUIET)\ + $(ECHO) "$(fileinfo) Version $(version)"; \ + $(ECHO) "by $(author)"; \ + +# +# HELP TEXT +# + +define help_text +# $(fileinfo) Version $(version) +# +# by $(author) +# +# Generates a number of possible output files from a LaTeX document and its +# various dependencies. Handles .bib files, \include and \input, and .eps +# graphics. All dependencies are handled automatically by running LaTeX over +# the source. +# +# USAGE: +# +# make [GRAY=1] [VERBOSE=1] [SHELL_DEBUG=1] +# +# STANDARD OPTIONS: +# GRAY: +# Setting this variable forces all recompiled graphics to be grayscale. +# It is useful when creating a document for printing. The default is +# to allow colors. Note that it only changes graphics that need to be +# rebuilt! It is usually a good idea to do a 'make clean' first. +# +# VERBOSE: +# This turns off all @ prefixes for commands invoked by make. Thus, +# you get to see all of the gory details of what is going on. +# +# SHELL_DEBUG: +# This enables the -x option for sh, meaning that everything it does is +# echoed to stderr. This is particularly useful for debugging +# what is going on in $$(shell ...) invocations. One of my favorite +# debugging tricks is to do this: +# +# make -d SHELL_DEBUG=1 VERBOSE=1 2>&1 | less +# +# STANDARD AUXILIARY FILES: +# +# Makefile.ini +# +# This file can contain variable declarations that override various +# aspects of the makefile. For example, one might specify +# +# neverclean := *.pdf *.ps +# onlysources.tex := main.tex +# LATEX_COLOR_WARNING := 'bold red uline' +# +# And this would override the neverclean setting to ensure that pdf +# and ps files always remain behind, set the makefile to treat all +# .tex files that are not "main.tex" as includes (and therefore not +# default targets). It also changes the LaTeX warning output to be +# red, bold, and underlined. +# +# There are numerous variables in this file that can be overridden in +# this way. Search for '?=' to find them all. +# +# Also, you can put arbitrary targets into it if, for example, you +# want your source built from something else, e.g.: +# +# generated.tex: generating_script.weird_lang depA depB +# ./generating_script.weird_lang > $$@ +# +# Note that if you are not careful, you can override the default +# target (what happens when you type "make" without arguments), so if +# you do use Makefile.ini, you probably want to start it with +# something like the following line: +# +# default: all +# +# Since the first target in any makefile is automatically the default, +# and the makefile already has a sensible "all" target, this will do +# what you want. +# +# The Makefile.ini is imported before *anything else* is done, so go +# wild with your ideas for changes to this makefile in there. It +# makes it easy to test them before submitting patches. +# +# STANDARD ENVIRONMENT VARIABLES: +# +# LATEX_COLOR_WARNING '$(LATEX_COLOR_WARNING)' +# LATEX_COLOR_ERROR '$(LATEX_COLOR_ERROR)' +# LATEX_COLOR_UNDERFULL '$(LATEX_COLOR_UNDERFULL)' +# LATEX_COLOR_OVERFULL '$(LATEX_COLOR_OVERFULL)' +# LATEX_COLOR_PAGES '$(LATEX_COLOR_PAGES)' +# LATEX_COLOR_BUILD '$(LATEX_COLOR_BUILD)' +# LATEX_COLOR_GRAPHIC '$(LATEX_COLOR_GRAPHIC)' +# LATEX_COLOR_DEP '$(LATEX_COLOR_DEP)' +# LATEX_COLOR_SUCCESS '$(LATEX_COLOR_SUCCESS)' +# LATEX_COLOR_FAILURE '$(LATEX_COLOR_FAILURE)' +# +# These may be redefined in your environment to be any of the following: +# +# black +# red +# green +# yellow +# blue +# magenta +# cyan +# white +# +# Bold or underline may be used, as well, either alone or in combination +# with colors: +# +# bold +# uline +# +# Order is not important. You may want, for example, to specify: +# +# export LATEX_COLOR_SUCCESS='bold blue uline' +# +# in your .bashrc file. I don't know why, but you may want to. +# +# STANDARD TARGETS: +# +# all: +# Make all possible documents in this directory. The documents are +# determined by scanning for .tex and .tex.sh (described in more detail +# later) and omitting any file that ends in ._include_.tex or +# ._nobuild_.tex. The output is a set of .pdf files. +# +# If you wish to omit files without naming them with the special +# underscore names, set the following near the top of the Makefile, +# or (this is recommended) within a Makefile.ini in the same directory: +# +# includes.tex := file1.tex file2.tex +# +# This will cause the files listed to be considered as include files. +# +# If you have only few source files, you can set +# +# onlysources.tex := main.tex +# +# This will cause only the source files listed to be considered in +# dependency detection. All other .tex files will be considered as +# include files. Note that these options work for *any* source type, +# so you could do something similar with includes.gpi, for example. +# Note that this works for *any valid source* target. All of the +# onlysources.* variables are commented out in the shipping version of +# this file, so it does the right thing when they simply don't exist. +# The comments are purely documentation. If you know, for example, that +# file.mycoolformat is supported by this Makefile, but don't see the +# "onlysources.mycoolformat" declared in the comments, that doesn't mean +# you can't use it. Go ahead and set "onlysources.mycoolformat" and it +# should do the right thing. +# +# show: +# Builds and displays all documents in this directory. It uses the +# environment-overridable value of VIEW_PDF (currently $(VIEW_PDF)) to +# do its work. +# +# all-graphics: +# Make all of the graphics in this directory. +# +# all-pstex (only for BUILD_STRATEGY=latex): +# Build all fig files into pstex and pstex_t files. Gray DOES NOT WORK. +# +# all-gray-pstex (only for BUILD_STRATEGY=latex): +# Build all fig files into grayscale pstex and pstex_t files. +# +# all-dot2tex: +# Build all dot files into tex files. +# +# show-graphics: +# Builds and displays all graphics in this directory. Uses the +# environment-overridable value of VIEW_GRAPHICS (currently +# $(VIEW_GRAPHICS)) to do its work. +# +# clean: +# Remove ALL generated files, leaving only source intact. +# This will *always* skip files mentioned in the "neverclean" variable, +# either in this file or specified in Makefile.ini: +# +# neverclean := *.pdf *.ps +# +# The neverclean variable works on all "clean" targets below, as well. +# +# clean-graphics: +# Remove all generated graphics files. +# +# clean-backups: +# Remove all backup files: $(backup_patterns) +# (XFig and other editors have a nasty habit of leaving them around) +# Also removes Makefile-generated .temp files +# +# clean-tex: +# Remove all files generated from LaTeX invocations except dependency +# information. Leaves graphics alone. +# +# clean-deps: +# Removes all auto-generated dependency information. +# +# clean-auxiliary: +# Removes extra files created by various targets (like the dependency +# graph output). +# +# clean-nographics: +# Cleans everything *except* the graphics files. +# +# help: +# This help text. +# +# version: +# Version information about this LaTeX makefile. +# +# DEBUG TARGETS: +# +# _all_programs: +# A list of the programs used by this makefile. +# +# _check_programs: +# Checks your system for the needed software and reports what it finds. +# +# _check_gpi_files: +# Checks the .gpi files in the current directory for common errors, such +# as specification of the terminal or output file inside of the gpi file +# itself. +# +# _dependency_graph: +# Outputs a .dot file to stdout that represents a graph of LaTeX +# dependencies. To see it, use the _show_dependency_graph target or +# direct the output to a file, run dot on it, and view the output, e.g.: +# +# make _dependency_graph > graph.dot +# dot -T ps -o graph.eps graph.dot +# gv graph.eps +# +# _show_dependency_graph: +# Makes viewing the graph simple: extracts, builds and displays the +# dependency graph given in the _dependency_graph target using the value +# of the environment-overridable VIEW_POSTSCRIPT variable (currently set +# to $(VIEW_POSTSCRIPT)). The postscript viewer is used because it +# makes it easier to zoom in on the graph, a critical ability for +# something so dense and mysterious. +# +# _all_sources: +# List all .tex files in this directory. +# +# _sources: +# Print out a list of all compilable sources in this directory. This is +# useful for determining what make thinks it will be using as the +# primary source for 'make all'. +# +# _scripts: +# Print out a list of scripts that make knows can be used to generate +# .tex files (described later). +# +# _all_stems: +# Print a list of stems. These represent bare targets that can be +# executed. Listing as a bare target will produce .pdf. +# +# _includes: +# A list of .d files that would be included in this run if _includes +# weren't specified. This target may be used alone or in conjunction +# with other targets. +# +# _graphic_outputs: +# A list of all generated .eps files +# +# _env: +# A list of environment variables and their values. If supported by +# your version of make, also a list of variables known to make. +# +# FILE TARGETS: +# +# %, %.pdf: +# Build a PDF file from the corresponding %.tex file. +# +# If BUILD_STRATEGY=pdflatex, then this builds the pdf directly. +# Otherwise, it uses this old-school but effective approach: +# +# latex -> dvips -> ps2pdf +# +# The BUILD_STRATEGY can be overridden in Makefile.ini in the same +# directory. The default is pdflatex. +# +# Reasons for using latex -> dvips include the "psfrag" package, and the +# generation of postscript instead of PDF. Arguments for using pdflatex +# include "new and shiny" and "better supported." I can't argue with +# either of those, and supporting them both didn't turn out to be that +# difficult, so there you have it. Choices. +# +# %._show: +# A phony target that builds the pdf file and then displays it using the +# environment-overridable value of VIEW_PDF ($(VIEW_PDF)). +# +# %._graphics: +# A phony target that generates all graphics on which %.pdf (or %.dvi) +# depends. +# +# %.ps (only for BUILD_STRATEGY=latex): +# Build a Postscript file from the corresponding %.tex file. +# This is done using dvips. Paper size is automatically +# extracted from the declaration +# +# \documentclass[paper] +# +# or it is the system default. +# +# If using beamer (an excellent presentation class), the paper +# size is ignored. More on this later. +# +# %.dvi (only for BUILD_STRATEGY=latex): +# Build the DVI file from the corresponding %.tex file. +# +# %.ind: +# Build the index for this %.tex file. +# +# %.gls: +# Build the nomenclature glossary for this %.tex file. +# +# %.nls: +# Build the (newer) nomenclature file for this %.tex file. +# +# %.eps: +# Build an eps file from one of the following file types: +# +# .dot : graphviz +# .gpi : gnuplot +# .fig : xfig +# .xvg : xmgrace +# .svg : scalable vector graphics (goes through inkscape) +# .png : png (goes through NetPBM) +# .jpg : jpeg (goes through ImageMagick) +# .eps.gz : gzipped eps +# +# The behavior of this makefile with each type is described in +# its own section below. +# +# %.pstex{,_t} (only for BUILD_STRATEGY=latex): +# Build a .pstex_t file from a .fig file. +# +# FEATURES: +# +# Optional Binary Directory: +# If you create the _out_ directory in the same place as the makefile, +# it will automatically be used as a dumping ground for .pdf (or .dvi, +# .ps, and .pdf) output files. +# +# Alternatively, you can set the BINARY_TARGET_DIR variable, either as a +# make argument or in Makefile.ini, to point to your directory of +# choice. Note that no pathname wildcard expansion is done in the +# makefile, so make sure that the path is complete before going in +# there. E.g., if you want to specify something in your home directory, +# use $$HOME/ instead of ~/ so that the shell expands it before it gets +# to the makefile. +# +# External Program Dependencies: +# Every external program used by the makefile is represented by an +# ALLCAPS variable at the top of this file. This should allow you to +# make judgments about whether your system supports the use of this +# makefile. The list is available in the ALL_PROGRAMS variable and, +# provided that you are using GNU make 3.80 or later (or you haven't +# renamed this file to something weird like "mylatexmakefile" and like +# invoking it with make -f) can be viewed using +# +# make _all_programs +# +# Additionally, the availability of these programs can be checked +# automatically for you by running +# +# make _check_programs +# +# The programs are categorized according to how important they are and +# what function they perform to help you decide which ones you really +# need. +# +# Colorized Output: +# The output of commands is colorized to highlight things that are often +# important to developers. This includes {underfull,overfull} +# {h,v}boxes, general LaTeX Errors, each stage of document building, and +# the number of pages in the final document. The colors are obtained +# using 'tput', so colorization should work pretty well on any terminal. +# +# The colors can be customized very simply by setting any of the +# LATEX_COLOR_ variables in your environment (see above). +# +# Predecessors to TeX Files: +# Given a target , if no .tex file exists but a +# corresponding script or predecessor file exists, then appropriate +# action will be taken to generate the tex file. +# +# Currently supported script or predecessor languages are: +# +# sh: %.tex.sh +# perl: %.tex.pl +# python: %.tex.py +# +# Calls the script using the appropriate interpreter, assuming that +# its output is a .tex file. +# +# The script is called thus: +# +# - - - - - - - - - - - - - - - - - - -
    - - diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/WEB-INF/config.yaml --- a/flys-client/src/main/webapp/WEB-INF/config.yaml Thu Apr 25 15:06:21 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,295 +0,0 @@ -#=========================================================================== -# allowed DPIs -#=========================================================================== -dpis: [254, 190, 127, 72, 56] - -#=========================================================================== -# allowed Formats -#=========================================================================== -formats: ['*'] - -#=========================================================================== -# the allowed scales -#=========================================================================== -scales: - - 500 - - 750 - - 1000 - - 1250 - - 1500 - - 1750 - - 2000 - - 2250 - - 2500 - - 2750 - - 3000 - - 3250 - - 3500 - - 3750 - - 4000 - - 4250 - - 4500 - - 4750 - - 5000 - - 5500 - - 6000 - - 6500 - - 7000 - - 7500 - - 8000 - - 8500 - - 9000 - - 9500 - - 10000 - - 12500 - - 15000 - - 17500 - - 20000 - - 22500 - - 25000 - - 30000 - - 35000 - - 40000 - - 45000 - - 50000 - - 75000 - - 100000 - - 200000 - - 500000 - - 1000000 - - 2000000 - - 4000000 - -outputFilename: 'flys-${date}.pdf' - -#=========================================================================== -# the list of allowed hosts -#=========================================================================== -hosts: - - !localMatch - dummy: true - - !dnsMatch - host: wsvmapserv.ilmenau.baw.de - port: 80 - - !dnsMatch - host: www.pegelonline.wsv.de - port: 80 - - !dnsMatch - host: gdz.bkg.bund.de - port: 80 - - !dnsMatch - host: ims3.bkg.bund.de - port: 80 - - !dnsMatch - host: tile.openstreetmap.org - port: 80 - - !dnsMatch - host: wsvmapserv.wsv.bund.de - port: 80 - - !dnsMatch - host: geo4.service24.rlp.de - port: 80 - # Catch all - #- !dnsMatch - # host: #regex that catches host plus path - # port: 80 - - !dnsMatch - host: osm.intevation.de - port: 80 - - !dnsMatch - host: osm.wheregroup.com - port: 80 - - !dnsMatch - host: geoportal.bafg.de - port: 80 - - !dnsMatch - host: wsvmapserv.wsv.bvbs.bund.de - port: 80 - -# We need a font with unicode support the defaults only -# have latin1 -fonts: - - /usr/share/fonts/truetype/freefont/FreeSans.ttf - -layouts: - #=========================================================================== - A4 landscape: - #=========================================================================== - metaData: - title: '${mapTitle}' - author: 'Flusshydrologische Software' - subject: 'Kartendruck' - keywords: 'map,print' - creator: 'd4e-river' - - #------------------------------------------------------------------------- - mainPage: - # 842 * 595 - pageSize: A4 - landscape: true - marginLeft: 20 - marginRight: 20 - marginTop: 20 - marginBottom: 20 - items: - - !map - absoluteX: 20 - align: left - absoluteY: 575 - width: 587 - height: 555 - spacingAfter: 0 - # The north arrow - - !columns - absoluteX: 627 - absoluteY: 65 - width: 32 - items: - - !image - maxWidth: 20 - maxHeight: 40 - url: '${configDir}/../images/north.png' - # The scale text - - !columns - absoluteX: 615 - absoluteY: 30 - width: 45 - items: - - !text - fontSize: 8 - text: '1:${scale}' - align: center - fontEncoding: Identity-H - font: FreeSans - backgroundColor: #FFFFFF - #Flys and BFG Logo - - !columns - absoluteX: 760 - absoluteY: 70 - width: 50 - items: - - !image - maxWidth: 50 - maxHeight: 50 - url: '${configDir}/../images/FLYS_Logo.png' - - !columns - absoluteX: 665 - absoluteY: 70 - width: 75 - items: - - !image - maxWidth: 75 - maxHeight: 50 - url: '${configDir}/../${logo}' - # Scalebar - - !columns - absoluteX: 460 - absoluteY: 40 - width: 150 - items: - - !scalebar - type: bar - maxSize: 150 - barSize: 5 - barBgColor: white - fontSize: 8 - backgroundColor: #FFFFFF - # The legend - - !columns - absoluteX: 612 - absoluteY: 390 - width: 200 - items: - - !legends - maxHeight: 310 - maxWidth: 0 - maxIconHeight: 0 - inline: true - classIndentation: 10 - layerSpace: 0 - classSpace: 5 - layerFontSize: 0 - classFontSize: 10 - fontEncoding: Identity-H - classFont: FreeSans - layerFont: FreeSans - defaultScale: 0.5 - config: - borderWidthLeft: 1 - borderWidthRight: 1 - borderWidthTop: 1 - borderWidthBottom: 1 - # The stamp background - - !columns - absoluteX: 557 - absoluteY: 575 - width: 260 - items: - - !image - maxWidth: 260 - maxHeight: 184 - url: '${configDir}/../images/white.png' - - # Title of the map - - !columns - absoluteX: 562 - absoluteY: 575 - width: 250 - condition: mapTitle - items: - - !text - text: '${mapTitle}' - - # The Stamp - - !columns - absoluteX: 562 - absoluteY: 555 - width: 250 - # config: - # borderWidthLeft: 5 - # borderWidthRight: 5 - # borderWidthTop: 5 - # borderWidthBottom: 5 - #padding: 10 - #backgroundColor: #FFFFFF - #borderColor: #FFFFFF - items: - - !attributes - source: data - spacingAfter: 0 - columnDefs: - info: - columnWeight: 7 - header: !text - text: info - fontSize: 0 - cell: !columns - config: - cells: - - borderWidth: 1 - padding: 5 - items: - - !text - text: '${info}' - fontSize: 10 - fontEncoding: Identity-H - font: FreeSans - fontSize: 10 - backgroundColor: #FFFFFF - value: - columnWeight: 15 - header: !text - text: value - fontSize: 0 - cell: !columns - config: - cells: - - borderWidth: 1 - padding: 5 - items: - - !text - text: '${value}' - fontEncoding: Identity-H - font: FreeSans - fontSize: 10 - backgroundColor: #FFFFFF diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/WEB-INF/features.xml --- a/flys-client/src/main/webapp/WEB-INF/features.xml Thu Apr 25 15:06:21 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ - - - - module:winfo - module:minfo - module:new_map - module:new_chart - module:fixanalysis - river:Saar - river:Saar (Wiltinger Bogen) - river:Rhein - river:Mosel - river:Elbe - river:Donau (Regensburg Nordarm) - river:Donau (Schleusenkanäle) - river:Donau - river:Fulda (Winter) - river:Fulda (Sommer) - river:Havel - river:Lahn - river:Main - river:Main (Wehrarm Volkach) - river:Main (Wehrarm Limbach) - river:Neckar - river:Neckar (über Wehrarme) - river:Oder - river:Saale - river:Saale-Thüringen - river:Werra (Winter) - river:Werra (Sommer) - river:Weser - - - module:winfo - module:minfo - module:new_map - module:new_chart - module:fixanalysis - river:Rhein - river:Mosel - - - module:winfo - module:minfo - module:new_map - module:new_chart - module:fixanalysis - river:Saar - river:Mosel - - - module:winfo - module:minfo - module:new_map - module:new_chart - module:fixanalysis - river:Saar - river:Mosel - river:Elbe - - - module:winfo - module:minfo - river:Elbe - - - - - - diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/WEB-INF/log4j.properties --- a/flys-client/src/main/webapp/WEB-INF/log4j.properties Thu Apr 25 15:06:21 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -log4j.rootLogger=DEBUG, FLYS - -########## INTERNAL PACKAGES -log4j.category.de.intevation.flys.client.server=DEBUG - - -########## EXTERNAL PACKAGES -log4j.category.org.apache.http=ERROR -log4j.category.de.intevation.artifacts.httpclient=WARN - -########## APPENDER SETTINGS -log4j.appender.FLYS.layout=org.apache.log4j.PatternLayout -log4j.appender.FLYS.layout.ConversionPattern=%d [%t] %-5p %c - %m%n - -log4j.appender.FLYS=org.apache.log4j.RollingFileAppender -log4j.appender.FLYS.File=/tmp/flys-client.log -log4j.appender.FLYS.MaxFileSize=5000KB -log4j.appender.FLYS.MaxBackupIndex=3 diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl --- a/flys-client/src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl Thu Apr 25 15:06:21 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,424 +0,0 @@ - - - - - - de3f3307-3429-4ff9-8f43-3fb2fcf21b27 - - - - de - - - - - - - - - 0,## - 0.## - - - - - - Pegel - Gauge - - - - - - Ereignis - Event - - - - - - Legende - Caption - - - - - - Farbe - Color - - - - - - Bedeutung - Meaning - - - - - - um MNQ - around MNQ - - - - - - um MQ - around MQ - - - - - - um MHQ - around MHQ - - - - - - über HQ5 - above HQ5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - width: - - %;float:left - - -
    -
    -
    -
    -
    - - - - - -
    - - background: - - green - blue - magenta - red - black - - ;width: - - - - % - ;float:left - - - km - - - - - - / Q - / Q - / Q - / Q - - - - : - - - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - overflow:hidden;background: - - #ada96e - silver - - ;width: - - - - % - ;float:left - - - - - - - - - - - - - - - - - - - - - - - - - - - : km - - - - - - -
    -
    - - - - - - - - - - - - - - - - - - -
     
    -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     Q ∈ [0, (MNQ+MQ)/2)
     Q ∈ [(MNQ+MQ)/2, (MQ+MHQ)/2)
     Q ∈ [(MQ+MHQ)/2, HQ5)
     Q ∈ [HQ5, ∞)
    -
    - - - - - -
    diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/WEB-INF/web.xml --- a/flys-client/src/main/webapp/WEB-INF/web.xml Thu Apr 25 15:06:21 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,595 +0,0 @@ - - - - - - - server-url - http://localhost:8181 - - - - - redirect-url - FLYS.html - - - - authentication - GGInA - - - - features-file - /WEB-INF/features.xml - - - - log4j-properties - /WEB-INF/log4j.properties - - - - org.dive4elements.river.client.server.BaseServletContextListener - - - - - - user - org.dive4elements.river.client.server.UserServiceImpl - - - - user - /flys/user - - - - artifact - org.dive4elements.river.client.server.ArtifactServiceImpl - - - - artifact - /flys/artifact - - - - getartifact - org.dive4elements.river.client.server.GetArtifactServiceImpl - - - - getartifact - /flys/getartifact - - - - cross-section-km - org.dive4elements.river.client.server.CrossSectionKMServiceImpl - - - - cross-section-km - /flys/cross-section-km - - - - create-collection - org.dive4elements.river.client.server.CreateCollectionServiceImpl - - - - create-collection - /flys/create-collection - - - - rivers - org.dive4elements.river.client.server.RiverServiceImpl - - - - rivers - /flys/rivers - - - - riverinfo - org.dive4elements.river.client.server.RiverInfoServiceImpl - - - - riverinfo - /flys/riverinfo - - - - forward - org.dive4elements.river.client.server.StepForwardServiceImpl - - - - forward - /flys/forward - - - - feed - org.dive4elements.river.client.server.FeedServiceImpl - - - - feed - /flys/feed - - - - fixings-overview - org.dive4elements.river.client.server.FixingsOverviewServiceImpl - - - - fixings-overview - /flys/fixings-overview - - - - advance - org.dive4elements.river.client.server.AdvanceServiceImpl - - - - advance - /flys/advance - - - - add-artifact - org.dive4elements.river.client.server.AddArtifactServiceImpl - - - - add-artifact - /flys/add-artifact - - - - load-artifact - org.dive4elements.river.client.server.LoadArtifactServiceImpl - - - - load-artifact - /flys/load-artifact - - - - describe-collection - org.dive4elements.river.client.server.DescribeCollectionServiceImpl - - - - describe-collection - /flys/describe-collection - - - - user-collections - org.dive4elements.river.client.server.UserCollectionsServiceImpl - - - - user-collections - /flys/user-collections - - - - distanceinfo - org.dive4elements.river.client.server.DistanceInfoServiceImpl - - - - distanceinfo - /flys/distanceinfo - - - - dischargeinfo - org.dive4elements.river.client.server.DischargeInfoServiceImpl - - - - dischargeinfo - /flys/dischargeinfo - - - - DischargeInfoXML - org.dive4elements.river.client.server.DischargeInfoXML - - - - DischargeInfoXML - /flys/dischargeinfoxml - - - - meta-data - org.dive4elements.river.client.server.MetaDataServiceImpl - - - - meta-data - /flys/meta-data - - - - mainvalues - org.dive4elements.river.client.server.WQInfoServiceImpl - - - - mainvalues - /flys/mainvalues - - - - gaugeinfo - org.dive4elements.river.client.server.GaugeInfoServiceImpl - - - - gaugeinfo - /flys/gaugeinfo - - - - csv - org.dive4elements.river.client.server.CSVExportServiceImpl - - - - csv - /flys/csv - - - - ChartOutputService - org.dive4elements.river.client.server.ChartOutputServiceImpl - - - - ChartOutputService - /flys/chart - - - - DischargeTablesOverviewService - org.dive4elements.river.client.server.DischargeTablesServiceImpl - - - - DischargeTablesOverviewService - /flys/dischargetablesoverview - - - - - MapOutputService - org.dive4elements.river.client.server.MapOutputServiceImpl - - - - MapOutputService - /flys/map - - - - mapfish.print - org.mapfish.print.servlet.MapPrinterServlet - - config - WEB-INF/config.yaml - - - - - mapfish.print - /flys/mapfish-print/* - - - - - MapPrintService - org.dive4elements.river.client.server.MapPrintServiceImpl - - config - WEB-INF/config.yaml - - - print-url - http://localhost:8888/flys/mapfish-print - - - - - MapPrintService - /flys/map-print - - - - - FixingsKMChartService - org.dive4elements.river.client.server.FixingsKMChartServiceImpl - - - - FixingsKMChartService - /flys/fixings-km-chart - - - - DistanceInfoXML - org.dive4elements.river.client.server.DistanceInfoXML - - - - DistanceInfoXML - /flys/distanceinfoxml - - - - ExportService - org.dive4elements.river.client.server.ExportServiceImpl - - - - ExportService - /flys/export - - - - CollectionAttributeService - org.dive4elements.river.client.server.CollectionAttributeServiceImpl - - - - CollectionAttributeService - /flys/collection-attribute - - - - CollectionItemAttributeService - org.dive4elements.river.client.server.CollectionItemAttributeServiceImpl - - - - CollectionItemAttributeService - /flys/collection-item-attribute - - - - ChartInfoService - org.dive4elements.river.client.server.ChartInfoServiceImpl - - - - ChartInfoService - /flys/chart-info - - - - ReportService - org.dive4elements.river.client.server.ReportServiceImpl - - - - ReportService - /flys/report - - - - SetCollectionNameService - org.dive4elements.river.client.server.SetCollectionNameServiceImpl - - - - SetCollectionNameService - /flys/set-collectionname - - - - SetCollectionTTLService - org.dive4elements.river.client.server.SetCollectionTTLServiceImpl - - - - SetCollectionTTLService - /flys/set-collectionttl - - - - DeleteCollectionService - org.dive4elements.river.client.server.DeleteCollectionServiceImpl - - - - DeleteCollectionService - /flys/delete-collection - - - - MapInfoService - org.dive4elements.river.client.server.MapInfoServiceImpl - - - - MapInfoService - /flys/map-info - - - - getfeatureinfo - org.dive4elements.river.client.server.GFIServiceImpl - - - - getfeatureinfo - /flys/getfeatureinfo - - - - getcapabilities - org.dive4elements.river.client.server.GCServiceImpl - - - - getcapabilities - /flys/getcapabilities - - - - DescribeArtifactService - org.dive4elements.river.client.server.DescribeArtifactServiceImpl - - - - DescribeArtifactService - /flys/describe - - - - remove-artifact - org.dive4elements.river.client.server.RemoveArtifactServiceImpl - - - - remove-artifact - /flys/remove-artifact - - - - GetWMSUrls - org.dive4elements.river.client.server.MapUrlServiceImpl - - - - GetWMSUrls - /flys/map-urls - - - - FileUpload - org.dive4elements.river.client.server.FileUploadServiceImpl - - - - FileUpload - /flys/fileupload - - - - themelisting - org.dive4elements.river.client.server.ThemeListingServiceImpl - - - - themelisting - /flys/themelisting - - - - SQKMChart - org.dive4elements.river.client.server.SQKMChartServiceImpl - - - - SQKMChart - /flys/sq-km-chart - - - - BedKMChart - org.dive4elements.river.client.server.BedKMChartServiceImpl - - - - BedKMChart - /flys/bed-km-chart - - - - BedloadKMChart - org.dive4elements.river.client.server.BedloadKMChartServiceImpl - - - - BedloadKMChart - /flys/bedload-km-chart - - - - SedimentLoadInfo - org.dive4elements.river.client.server.SedimentLoadInfoServiceImpl - - - - SedimentLoadInfo - /flys/sedimentloadinfo - - - - login - org.dive4elements.river.client.server.LoginServlet - - - - login - /flys/login - - - - modules - org.dive4elements.river.client.server.ModuleServiceImpl - - - - modules - /flys/modules - - - - GGInAFilter - org.dive4elements.river.client.server.filter.GGInAFilter - - deactivate - false - - - - - GGInAFilter - /* - - - - NoCacheFilter - org.dive4elements.river.client.server.filter.NoCacheFilter - - - - NoCacheFilter - /* - - - - - - FLYS.html - - - diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/WEB-INF/wms-services.xml --- a/flys-client/src/main/webapp/WEB-INF/wms-services.xml Thu Apr 25 15:06:21 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/FLYS_Karte.png Binary file flys-client/src/main/webapp/images/FLYS_Karte.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/FLYS_Logo.png Binary file flys-client/src/main/webapp/images/FLYS_Logo.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/add_map.png Binary file flys-client/src/main/webapp/images/add_map.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/add_map_Selected.png Binary file flys-client/src/main/webapp/images/add_map_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/adjustElevation.png Binary file flys-client/src/main/webapp/images/adjustElevation.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/back.png Binary file flys-client/src/main/webapp/images/back.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/back_de.png Binary file flys-client/src/main/webapp/images/back_de.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/back_en.png Binary file flys-client/src/main/webapp/images/back_en.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/bfg_logo.gif Binary file flys-client/src/main/webapp/images/bfg_logo.gif has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/bfg_logo_small.png Binary file flys-client/src/main/webapp/images/bfg_logo_small.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/cancelCalculation.png Binary file flys-client/src/main/webapp/images/cancelCalculation.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/dam.png Binary file flys-client/src/main/webapp/images/dam.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/digitize.png Binary file flys-client/src/main/webapp/images/digitize.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/digitize_Selected.png Binary file flys-client/src/main/webapp/images/digitize_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/ditch.png Binary file flys-client/src/main/webapp/images/ditch.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/downloadPDF.png Binary file flys-client/src/main/webapp/images/downloadPDF.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/downloadPNG.png Binary file flys-client/src/main/webapp/images/downloadPNG.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/downloadSVG.png Binary file flys-client/src/main/webapp/images/downloadSVG.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/flys_logo.gif Binary file flys-client/src/main/webapp/images/flys_logo.gif has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/format-indent-less.png Binary file flys-client/src/main/webapp/images/format-indent-less.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/go-bottom.png Binary file flys-client/src/main/webapp/images/go-bottom.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/go-down.png Binary file flys-client/src/main/webapp/images/go-down.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/go-first.png Binary file flys-client/src/main/webapp/images/go-first.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/go-up.png Binary file flys-client/src/main/webapp/images/go-up.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/hand.png Binary file flys-client/src/main/webapp/images/hand.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/hand_Selected.png Binary file flys-client/src/main/webapp/images/hand_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/info.png Binary file flys-client/src/main/webapp/images/info.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/info_Selected.png Binary file flys-client/src/main/webapp/images/info_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-1px.png Binary file flys-client/src/main/webapp/images/linestyle-1px.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-2px.png Binary file flys-client/src/main/webapp/images/linestyle-2px.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-3px.png Binary file flys-client/src/main/webapp/images/linestyle-3px.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-4px.png Binary file flys-client/src/main/webapp/images/linestyle-4px.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-5px.png Binary file flys-client/src/main/webapp/images/linestyle-5px.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-6px.png Binary file flys-client/src/main/webapp/images/linestyle-6px.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-7px.png Binary file flys-client/src/main/webapp/images/linestyle-7px.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-8px.png Binary file flys-client/src/main/webapp/images/linestyle-8px.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-dash-10-5.png Binary file flys-client/src/main/webapp/images/linestyle-dash-10-5.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-dash-10.png Binary file flys-client/src/main/webapp/images/linestyle-dash-10.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-dash-20-10.png Binary file flys-client/src/main/webapp/images/linestyle-dash-20-10.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-dash-20-5-15-5.png Binary file flys-client/src/main/webapp/images/linestyle-dash-20-5-15-5.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/linestyle-dash-30-10.png Binary file flys-client/src/main/webapp/images/linestyle-dash-30-10.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/list-add.png Binary file flys-client/src/main/webapp/images/list-add.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/loading.gif Binary file flys-client/src/main/webapp/images/loading.gif has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/logo-bfg.gif Binary file flys-client/src/main/webapp/images/logo-bfg.gif has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/logo-intevation.png Binary file flys-client/src/main/webapp/images/logo-intevation.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_100.png Binary file flys-client/src/main/webapp/images/mag_100.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_100_Selected.png Binary file flys-client/src/main/webapp/images/mag_100_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_glass.png Binary file flys-client/src/main/webapp/images/mag_glass.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_zoom_back.png Binary file flys-client/src/main/webapp/images/mag_zoom_back.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_zoom_back_Selected.png Binary file flys-client/src/main/webapp/images/mag_zoom_back_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_zoom_box.png Binary file flys-client/src/main/webapp/images/mag_zoom_box.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_zoom_box_Selected.png Binary file flys-client/src/main/webapp/images/mag_zoom_box_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_zoom_minus.png Binary file flys-client/src/main/webapp/images/mag_zoom_minus.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_zoom_minus_Selected.png Binary file flys-client/src/main/webapp/images/mag_zoom_minus_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_zoom_plus.png Binary file flys-client/src/main/webapp/images/mag_zoom_plus.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/mag_zoom_plus_Selected.png Binary file flys-client/src/main/webapp/images/mag_zoom_plus_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/marker_green.png Binary file flys-client/src/main/webapp/images/marker_green.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/marker_red.png Binary file flys-client/src/main/webapp/images/marker_red.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/measure_line.png Binary file flys-client/src/main/webapp/images/measure_line.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/measure_line_Selected.png Binary file flys-client/src/main/webapp/images/measure_line_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/measure_plane.png Binary file flys-client/src/main/webapp/images/measure_plane.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/measure_plane_Selected.png Binary file flys-client/src/main/webapp/images/measure_plane_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/next.png Binary file flys-client/src/main/webapp/images/next.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/next_de.png Binary file flys-client/src/main/webapp/images/next_de.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/next_en.png Binary file flys-client/src/main/webapp/images/next_en.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/north.png Binary file flys-client/src/main/webapp/images/north.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/pan.png Binary file flys-client/src/main/webapp/images/pan.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/pan_Selected.png Binary file flys-client/src/main/webapp/images/pan_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/pdf_export.png Binary file flys-client/src/main/webapp/images/pdf_export.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/pdf_export_Selected.png Binary file flys-client/src/main/webapp/images/pdf_export_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/pipe1.png Binary file flys-client/src/main/webapp/images/pipe1.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/pipe2.png Binary file flys-client/src/main/webapp/images/pipe2.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/png_export.png Binary file flys-client/src/main/webapp/images/png_export.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/png_export_Selected.png Binary file flys-client/src/main/webapp/images/png_export_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/print_map_settings.png Binary file flys-client/src/main/webapp/images/print_map_settings.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/properties.gif Binary file flys-client/src/main/webapp/images/properties.gif has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/properties.png Binary file flys-client/src/main/webapp/images/properties.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/properties_Selected.png Binary file flys-client/src/main/webapp/images/properties_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/removeFeature.png Binary file flys-client/src/main/webapp/images/removeFeature.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/ring_dike.png Binary file flys-client/src/main/webapp/images/ring_dike.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/save.gif Binary file flys-client/src/main/webapp/images/save.gif has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/save.png Binary file flys-client/src/main/webapp/images/save.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/save_Selected.png Binary file flys-client/src/main/webapp/images/save_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/save_at.png Binary file flys-client/src/main/webapp/images/save_at.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/save_csv.png Binary file flys-client/src/main/webapp/images/save_csv.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/save_wst.png Binary file flys-client/src/main/webapp/images/save_wst.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/selectFeature.png Binary file flys-client/src/main/webapp/images/selectFeature.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/selectFeature_Selected.png Binary file flys-client/src/main/webapp/images/selectFeature_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/star_gold.png Binary file flys-client/src/main/webapp/images/star_gold.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/star_silver.png Binary file flys-client/src/main/webapp/images/star_silver.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/svg_export.png Binary file flys-client/src/main/webapp/images/svg_export.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/svg_export_Selected.png Binary file flys-client/src/main/webapp/images/svg_export_Selected.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/images/white.png Binary file flys-client/src/main/webapp/images/white.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/main/webapp/login.jsp --- a/flys-client/src/main/webapp/login.jsp Thu Apr 25 15:06:21 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ - - - - FLYS - Login - - - - -
    " id="authentication"> -

    FLYS Anmeldung

    - <% String error = request.getParameter("error"); %> - <% if (error != null) { %> -
    -

    Authentifizierung fehlgeschlagen

    -
    - <%= error %> -
    -
    - <% } %> -
    Bitte geben Sie eine Benutzerkennung und ein Passwort ein.
    - - - - - - - - - -
    - -
    - - diff -r d9901a08d0a6 -r 5aa05a7a34b7 flys-client/src/test/java/org/dive4elements/river/client/FLYSJUnit.gwt.xml --- a/flys-client/src/test/java/org/dive4elements/river/client/FLYSJUnit.gwt.xml Thu Apr 25 15:06:21 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/CHANGES --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/CHANGES Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,266 @@ +2011-09-19 RELEASE 2.5 + + NEW: + + * Added new widgets: + - DistancePanel: allows users to enter a km range. + - ContinuePanel: offers a 'next' button only for states which do not require input data. + - BooleanPanel: allows users to answer for yes/no questions. + - TextProvider: allows users to enter text strings. + - AutoIntegerPanel: allows users to enter integer values or the value 'auto'. + - WaterlevelGroundPanel: allows users to enter three integer values for "from", "to", and "diff" used for floodmaps. + - DatacagePanel: displays a datacage widget, that allows users to select items from datacage. + - MapPanel: displays a Gwt-OpenLayers based map and a MapToolbar. + - DatacageWidget: reads XML documents from MetaDataService and displays the result as tree. + - DigitizePanel: allows users to digitize spatial geometries using a map based on Gwt-OpenLayers. + - DatacageTwinPanel: allows users to select items from two parallel datacage widgets. + + * Added RPC services to: + - create new Artifacts based on a model Artifact (ArtifactService). + - read XML documents from MetaDataService (MetaDataService). + - read map information (as srid, extent) from MapInfoService (MapInfoService). + - feed an Artifact only (without forwarding into a new state) (FeedService). + - fetch the description of an Artifact only (DescribeArtifactService). + - create new Artifacts based on Recommendation objects and add them to + current Collection (LoadArtifactService). + + * The DatacageWindow in charts now allows adding new themes to charts. + + * Introduced a Recommendation mechanism in the CollectionView that loads Artifacts to the + current Collection based on the recommendations in the Artifact description of the master + Artifact. + + * Extract background state/messages of master Artifacts. Lock CollectionView window if + master Artifacts have started background threads that have not finished yet and display + status messages in the lock screen. + + * Added support to clone existing projects in the project list. + + * Introduced copy&paste support in calculation result tables. + + * Added new OutputTab MapOutputTab. This tab initializes map based on Gwt-OpenLayers. + The layers added to the map depend on the facets of the output. + + * Added a CrossSectionChartThemePanel. This ThemePanel offers a spinner right besides the + theme name to modify the current km. + + * Added a MapToolbar that offers controls for working with a map based on Gwt-OpenLayers. + + * UI improvements: + - Stepping back/forward in parameterization no longer redraws the whole CollectionView. + - set the title of CollectionView windows when the name of a collection is modified in the project list. + - introduced "find-as-you-type" search in most input tables. + + * Distinguish between 'chart' and 'map' output modes to create ChartOutputTabs or MapOutputTabs. + + * Bumped GWT up to 2.3.0. + + + FIXES: + + * flys/issue159 (WINFO: Radiobutton - Ortsauswahl bei "W für ungleichwertigen Abflusslängsschnitt" entfernen) + + * flys/issue166 (Projektname in die Fensterleiste übernehmen) + + * flys/issue181 (Erstes Thema in der Themenliste wählt sich automatisch wieder an) + + * flys/issue185 (IE8 + Chromium: Kein Zoomen von Diagrammen möglich) + + * flys/issue194 (Wasserspiegellagen: Hauptwerte Q/D Spaltenbezeichnung "Kenzeichnender Abfluss") + + * flys/issue195 (Wasserspiegellagen: Q/D-Panel Spaltenbezeichnung "W/Q/D" -> "Q/D") + + * flys/issue199 (Berechnete Abflusskurve / Dauerzahlen: Freies Textfeld akzeptiert mehr als einen Ort.) + + * flys/issue203 (W-INFO: Wasserspiegellagenberechnung / Auswahlunterstützung Abfluss) + + * flys/issue234 (W-INFO: Projektverwaltung) + + * flys/issue239 (W-INFO: Wasserspiegellagenberechnung / Auswahlunterstützung Ort bzw. Strecke) + + * flys/issue240 (W-INFO: Projektverwaltung / Einstellung dauerhaft) + + * flys/issue259 (Daten aus Datenkorb in Diagramm einladen) + + * flys/issue266 (Projektverwaltung: Duplizieren von Projekten) + + * flys/issue282 (Karte: Abstand interpolierte Profile - Default wert) + + * flys/issue285 (Projektverwaltung: Suche auf den Titeln) + + * flys/issue286 (Karte: Tooltips für die Werkzeugleiste) + + * flys/issue289 (Karte: Messen von Strecken und Flächen in falscher Dimension) + + * flys/issue299 (Karte: Einige Farben vereinheitlichen) + + * flys/issue293 (Karte: Farbliche Anpassung der digitalisierten Objekte) + + * flys/issue305 (Suche: Löschen der Eingabe nach einem Wechseln des Tabs Strecke -> Ort) + + * flys/issue309 (Querprofil: Manuelle Eingabe funktioniert nicht nach Return (nur nach Tab)) + + * flys/issue311 (Querprofil: i18n) + + * flys/issue313 ("AssertionError" beim Wechsel von Deutsch zu Englisch in der Projektliste) + + + +2011-06-27 RELEASE 2.4 + + NEW: + + * Introduced: + - a theme panel on the left of the chart. It allows to change + the state and order of the themes in the chart. + - a panel that displays the current mouse position in chart + coordinates. + - a Zoombox-Control that allows zooming in charts via zoombox. + - a control to zoom out for 10%. + - a control to zoom to the max extent of the chart. + - a control to pan charts. + - a panel that displays reports generated by calculations. + - a client side validation of user input. + + * Improved the project list. The user can now rename projects and set + favorite projects that will never be deleted. + + * Improved the chart output service to support zoom values. + + * Added new services to: + - set the Collection's attribute to a new value + - set the name of a project + - set the time-to-live of a project + - delete a project + - retrieve meta information of the current chart + This service returns a ChartInfo object that stores information about + the axes ranges, data ranges and a transformation matrix to transform + image coordinates into chart coordinates + - fetch calculation reports + + * flys/issue40 Input fields will show former selected values. + + FIXES: + + * flys/issue21 Projects cannot be opened twice but if a projects is + already open, it is brought to foreground. + + * flys/issue22 Introduced a polling for user projects. Dead projects are + automatically removed. + + * flys/issue43 I18N adjustments. + + * flys/issue85 Location/Distance panel now distinguishes between these + two modes. Two (or more) locations will no longer end up in a distance. + + * flys/issue88 I18N adjustments in the location/distance panel. + + * flys/issue91 The WQ panel's initial mode is Q. + + * flys/issue103 Append units in WQ panel. + + * flys/issue104 The selected WQ mode is displayed in the static panel + now. + + * flys/issue117 DoubleArrayPanel and DoubleRangePanel will no longer + return duplicate values. + + * flys/issue118 The WQ panel has three modes now: W at gauge, Q at + gauge and Q free. + + * flys/issue122 The values in the table displaying W values are no + longer selectable. + + * flys/issue132 The initial location/distance mode is now distance. + + * flys/issue139 Fixed NPE while initialising user values in the adapted + WQ panel. + + * flys/issue140 Splitted the table - displaying W, Q and D values - up + in two tables for W (no longer selectable) and for QD. + + * flys/issue156 The report panel is not displayed as tab besides the + chart tabs. + + * flys/issue165 Limit the length of new project names to 50 characters. + + * flys/issue170 Fixed broken initial chart info. + + + +2011-05-19 RELEASE 2.3.1 + + NEW: + + * Enabled the UI to display more export modes that a single one. + + * Added tooltips for export buttons. + + + FIXES: + + * flys/issue23 (Doppel-Click auf Eintrag in der Projektliste sollte ein Projekt öffnen) + + * flys/issue35 The project window is maximizable with a 'maximize' button. + + * flys/issue38 (WINFO: Vorbelegung der Berechnungsart auf "Wasserstand/Wasserspiegellagen") + + * flys/issue39 (WINFO: Auswahl einer Strecke in bei Eingabeunterstützung liefert nicht die richtigen Werte) + + * flys/issue43 (i18n: Einige Verbesserungen) + + * flys/issue44 (WINFO: Unterstützungstabellen werden in fester Fensterbreite angezeigt) + + * flys/issue45 (WINFO: Ladedialog bei Laden der Daten in Unterstützungstabellen anzeigen) + + * flys/issue48 (Diagramm: Bereiche für Themensteuerung und Werkzeugleiste vorgeben.) + + * flys/issue56: (Knopf zum Exportieren der Berechnungsergebnissen nach CSV in GUI einbauen) + + + +2011-05-13 RELEASE 2.3 + + NEW: + + * Initial GWT/Ajax based Web-Client for the REST based artifact system: + - Renderer for states specific for WINFO artifact + - Panels for W/Q selection + - Panels for Range selection + - Chart panels for chart output creation + - Export panels that provides download links for exporting computation + data + - Project list displays former projects that might be opened by + double click + - Datacage (dt. 'Datenkorb') UI that displays loadable data for charts + + * RPC-services enable data exchange between client and server + + * Connection settings are configured in config.xml + + * I18N is splitted into two parts and support English and German: + - GUI elements are translated using the GWT i18n mechanism + - Information/data served by the artifact system is translated by the + artifact server + + + LIMITATIONS: + + * Language switch drops the current session + + * Charts served by the artifact system are rendered as PNG only + + * Theme control for charts is not implemented yet. + + * Data served by the datacage can't be added to projects/charts + + + !!! + + The version number of this release depends on an existing desktop variant of + this software that is in version 2.1. + + !!! + + +2011-03-30 RELEASE 0.1 diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/ChangeLog-before-20121018 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/ChangeLog-before-20121018 Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,12397 @@ +2012-10-16 Björn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java, + src/main/java/de/intevation/flys/client/client/ui/GaugeDischargeCurvePanel.java: + Add a new panel to show settings of a gauge discharge curve. + +2012-10-16 Björn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/GaugeTree.java: + Avoid another possible NullPointerException in GaugeTree + +2012-10-16 Björn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/GaugeTree.java: + Avoid possible NullPointerException in openOnLocation method. + +2012-10-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Do not crash when input helper is used in non-Fixation settings. + +2012-10-15 Björn Ricks + + * src/main/java/de/intevation/flys/client/client/FLYS.java: + Add a CloseClickHandler if a gauge discharge curve is created. + Also add an entry in the project list in this case. + Fix for part a) and c) in issue #918 + +2012-10-15 Björn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Make updateUserCollections public. It must be called by FLYS to update the + project list if a new gauge discharge curve collection is created. + +2012-10-15 Björn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java, + src/main/java/de/intevation/flys/client/client/ui/GaugeTree.java: + Open gauge and river info links in a new browser window + Fix for issue #918 + +2012-10-15 Christian Lins + + * flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + flys-client/src/main/java/de/intevation/flys/client/client/event/StepBackEvent.java, + flys-client/src/main/java/de/intevation/flys/client/client/event/StepForwardEvent.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/AutoIntegerPanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/BooleanPanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/ContinuePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DatacagePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DemDatacagePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DistanceOnlyPanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DoubleInputPanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/GaugeTimeRangePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/IntegerRangePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/LinkSelection.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/LocationPanel.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/MultiPeriodPanel.java: + Squash warnings and TODOs. + +2012-10-14 Christian Lins + + * flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + flys-client/src/main/java/de/intevation/flys/client/client/ui/WspDatacagePanel.java: + Improve warning when user does not select a waterlevel calculation (#914). + +2012-10-14 Christian Lins + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/GaugeTree.java: + Fix for NPE that can occur when comparing Double with double. + +2012-10-14 Christian Lins + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java: + Fix for NPE in FLYSWorkspace.bringUp() (#933). + +2012-10-14 Christian Lins + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + More fixes for #897: missing resource exceptions when handling other exceptions. + +2012-10-12 Felix Wolfsteller + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Register new UI provider for Q input per segment. + +2012-10-12 Felix Wolfsteller + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/QSegmentedInputPanel.java: + New, initial GUI for Q input per segment. + +2012-10-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/GaugeTimeRangePanel.java: + Parse modified date of discharge curves (adapted date format) and + display date as human readable string instead of milli seconds since + 1970. + + * src/main/java/de/intevation/flys/client/client/ui/range/DischargeInfoDataSource.java: + Set field type from 'INTEGER' to 'TEXT' for start and end date. Is there + no type for LONG?? + +2012-10-09 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/LinkSelection.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java: + Show river map only once. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapPanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Cosmetics. + +2012-10-08 Christian Lins + + * ../.hgignore: + Add OpenLayers to ignore file. + + * src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Handle error conditions more robust (#912 #897). + +2012-10-08 Felix Wolfsteller + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Handle percent_input ui for extreme value state. + +2012-10-08 Felix Wolfsteller + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/DoubleInputPanel.java: + Documentation, vimline. + +2012-10-08 Felix Wolfsteller + + * flys-client/src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java: + Documentation. + +2012-10-04 Felix Wolfsteller + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/MousePositionPanel.java: + Cosmetics, removed unused member, simplified getTransformer. + +2012-10-04 Felix Wolfsteller + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Documentation. + +2012-10-02 Felix Wolfsteller + + * flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties: + i18n for annotations. + +2012-10-01 Christian Lins + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/Toolbar.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Setting Toolbar Overflow behaviour to HIDDEN to avoid nasty scrollbars + using the Internet Explorer (#761). + +2012-10-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrix.java: + Doc. + + +2012-10-01 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java: + Add missing import of FLYSConstants + +2012-10-01 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + Add correct debug output for GaugeDischargeCurveArtifact + +2012-10-01 Felix Wolfsteller + + Fix issue898 (crash when no param selected). + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java + (validate): implemented. + + * flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties: + i18n for error message. + +2012-09-30 Christian Lins + + * flys-client/src/main/java/de/intevation/flys/client/client/FLYS.java: + Make exception handler more robust regarding unexpected exceptions (#897). + +2012-09-29 Christian Lins + + * flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java, + flys-client/src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java + flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/PointRecord.java: + ManualPointsEditor supports Date x axis values. + +2012-09-29 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java, + src/main/java/de/intevation/flys/client/server/ArtifactHelper.java, + src/main/java/de/intevation/flys/client/shared/model/GaugeDischargeCurveArtifact.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java, + src/main/java/de/intevation/flys/client/client/ui/GaugeTree.java: + Allow to create a discharge curve from a gauge info. + Currently the dicharge curve will not be displayed. + +2012-09-29 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java, + src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java: + Add river name to the GaugeInfo + +2012-09-27 Felix Wolfsteller + + Work on issue724 (i18n in minfo). + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties: + Translate data export. + +2012-09-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/services/ModuleServiceAsync.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Cosmetics, docs. + +2012-09-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/UserServiceImpl.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Donate own error message when no users were found. + +2012-09-27 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java, + src/main/java/de/intevation/flys/client/shared/model/DoubleProperty.java, + src/main/java/de/intevation/flys/client/shared/model/PropertySetting.java, + src/main/java/de/intevation/flys/client/shared/model/PropertyGroup.java: + Add "Date" support for Manual Points editor (not finished yet). + + * src/main/java/de/intevation/flys/client/shared/model/MapMode.java: + Add comment. + +2012-09-27 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/MapMode.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterMatrix.java: + Removed trailing whitespace. + +2012-09-27 Bj�rn Ricks + + * src/main/webapp/WEB-INF/web.xml: + Add servlet mapping for the GaugeOverviewInfoService + +2012-09-26 Ingo Weinzierl + + flys/issue897 (MissingResourceException: Cannot find constant '500 The call failed on the server; see server log for details') + + * src/main/java/de/intevation/flys/client/shared/model/MapMode.java: + Readded default constructor. + +2012-09-25 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java: + Default from and to dates are now shown with english locale, too (#854). + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Cosmetics. + +2012-09-25 Felix Wolfsteller + + Improved fix for issue860 (minfo parameterization in helper pane). + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java + (createWidget, createCheckBox): Renamed. + Use smartgwt stuff to profit from scrollbars (yay!). + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java: + Place ParameterMatrix in helper pane if too long. + +2012-09-25 Felix Wolfsteller + + Attempt at issue860 (minfo parameterization in helper pane). + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java: + Place ParameterMatrix in helper pane if too long. + +2012-09-24 Christian Lins + + * src/main/java/de/intevation/flys/client/client/widgets/KMSpinner.java: + Issue #853: + - Height is now normal again + - "Junk" chars are now removed on change + +2012-09-24 Bj�rn Ricks + + issue846 (GGInA: Auth mechanism ignores URL prefix) + + * src/main/java/de/intevation/flys/client/server/LoginServlet.java, + src/main/java/de/intevation/flys/client/server/GGInAFilter.java, + src/main/webapp/login.jsp: + Consider the Context Path variable when using urls in the GGInAFilter. + +2012-09-24 Felix Wolfsteller + + issue871 (parameterization of flowvelocity loo�s a tiny bit messy). + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java: + Show horizontal line between entries. + +2012-09-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/RemoteServiceServlet.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerOptionsData.java: + Cosmetics, docs. + +2012-09-24 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java: + Finally store passed kmup value in member variable. + +2012-09-24 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultRiverInfo.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/RiverInfo.java, + src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java, + src/main/java/de/intevation/flys/client/client/ui/GaugeTree.java: + Use i18n to calculate the info urls for the gauge overview instead of + fechting the urls from the artifact service. + +2012-09-22 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixFunctionSelect.java: + Show full function instead of internal name (#873). + +2012-09-21 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for bedheight difference calculation. + +2012-09-21 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/GaugeTree.java: + Open fold for historicalq reference. + +2012-09-21 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java: + Add the official gauge number to the GaugeInfo class. + +2012-09-21 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/GaugeTree.java, + src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Refactor GaugeTree into its own java file. Due to the folding logic in the + GaugeTree the code became quite lage. Therefore it is better preserved in + its own file. + +2012-09-21 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Additional refactoring to avoid code duplication and fixing reading double + value from locations DataItem object. Also add another code path for + location_distance winfo state. + +2012-09-21 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Refactor to avoid code duplication + +2012-09-21 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Add html links to the additional gauge and river info pages. + +2012-09-21 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultRiverInfo.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/RiverInfo.java, + src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java: + Extend GaugeInfo and RiverInfo to store also the http url for additional + info. + +2012-09-21 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Open and close gauge tree folds that correspond to the selected WINFO + calculation. + +2012-09-21 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + Fix NullPointerException on not available list + +2012-09-20 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixMultiPeriodPanel.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + i18n for FixMultiPeriodPanel (#872). + +2012-09-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Prevent AIOOB exception. + +2012-09-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Removed superfluous import. + +2012-09-19 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + i18n (#858) + +2012-09-19 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java, + src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Use the wstunit from the river as unit for the Pegelnullpunkt. + +2012-09-19 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Don't display the GaugePanel if no river is selected. + +2012-09-19 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/shared/model/DefaultArtifactDescription.java: + Fix NullPointerException when going back in WINFO artifact to the river + selection. + +2012-09-19 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Add locale aware formatting of the gauge values. + Don't reload the gauges if the river doesn't change. + Correctly handle kmup of the river. + +2012-09-19 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Improve handling of the GaugePanel and don't delete members of the + GaugePanel. + +2012-09-19 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java: + Add station information to the gauges. + +2012-09-19 Bj�rn Ricks + + * src/main/webapp/FLYS.css, + src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Get a working GaugeInfo solution with scrolling adjustments if gauge info + elements are folded in an out. + +2012-09-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Removed trailing whitespace. + +2012-09-17 Ingo Weinzierl + + Tagged RELEASE 2.9.1 + +2012-09-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added missing i18n strings for minfo state description. + +2012-09-16 Christian Lins + + * src/main/java/de/intevation/flys/client/client/widgets/KMSpinnerChangeListener.java (NEW), + src/main/java/de/intevation/flys/client/client/widgets/KMSpinner.java (NEW), + src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Refactored some KMSpinner code. KMSpinner has now a human-readable size (#853). + +2012-09-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/DefaultRiverInfo.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java, + src/main/java/de/intevation/flys/client/client/services/GaugeOverviewInfoService.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Removed trailing whitespace and superfluous imports. + +2012-09-14 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java: + Add first draft for the gauge overview info ui + +2012-09-14 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/services/GaugeOverviewInfoService.java, + src/main/java/de/intevation/flys/client/client/services/GaugeOverviewInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/shared/model/GaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/RiverInfo.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultGaugeInfo.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultRiverInfo.java, + src/main/java/de/intevation/flys/client/server/GaugeOverviewInfoServiceImpl.java: + Implement a service to handle the gauge info + +2012-09-13 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/range/LocationsTable.java: + Adding "from" and "to" in table columns with the green/red marker icons (#808). + +2012-09-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties: + Translated german strings. + +2012-09-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added 'main_channel' and 'total_channel' strings. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java: + Use the correct label for the UI. + +2012-09-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added strings for bed quality chart and export. + +2012-09-13 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Scrolling long Project lists is now more robust (#757), although + the search box is now part of the scrolling pane. + +2012-09-13 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Adding string for error_no_modules_found (#855). + +2012-09-13 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Cosmetics. + +2012-09-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/minfo/BedCampaignChart.java, + src/main/java/de/intevation/flys/client/client/ui/minfo/BedloadCampaignChart.java: + New. Container for overview charts. + + * src/main/java/de/intevation/flys/client/server/BedKMChartServiceImpl.java, + src/main/java/de/intevation/flys/client/server/BedloadKMChartServiceImpl.java: + New. Services for overview charts. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrix.java: + Show i18n strings in column titles. + + * src/main/java/de/intevation/flys/client/client/ui/minfo/BedMultiPeriodPanel.java: + New. UI provider that allows multiple period input and displays the overview + charts. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Added new ui provider. + + * src/main/webapp/WEB-INF/web.xml: + Added new services. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2012-09-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/StringOptionsData.java: + Fixed constructor. + +2012-09-11 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Fix for line label text in Delta W(t) chart (#837). + +2012-09-10 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Minimal fix for 'Transparency' combobox appearence (#840). + +2012-09-10 Sascha L. Teichmann + + * pom.xml: Java 1.5 -> 1.6 + +2012-09-09 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Rename attribute 'alpha' to 'transparency' which now represents the + transparency percentage instead raw rgba alpha value. StyledEditorWindow + can now handle this transparency attribute. + +2012-09-09 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Add 'error_update_collection_attribute' string (#843). + +2012-09-09 Christian Lins + + * src/main/java/de/intevation/flys/client/server/UserServiceImpl.java: + Remove blank line. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: + Catch MissingResourceException on unexpected server exceptions (#843). + +2012-09-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/auth/plain/Authenticator.java: + Reverted functional change from clins last commit. + + * src/main/java/de/intevation/flys/client/server/LoginServlet.java, + src/main/java/de/intevation/flys/client/server/auth/AuthenticationFactory.java, + src/main/java/de/intevation/flys/client/server/auth/UserClient.java: + Removed trailing whitespace. + +2012-09-08 Christian Lins + + * src/main/java/de/intevation/flys/client/server/RemoteServiceServlet.java, + src/main/java/de/intevation/flys/client/server/LoginServlet.java, + src/main/java/de/intevation/flys/client/server/auth/plain/Authenticator.java, + src/main/java/de/intevation/flys/client/server/auth/AuthenticationFactory.java, + src/main/java/de/intevation/flys/client/server/auth/UserClient.java, + src/main/java/de/intevation/flys/client/client/FLYS.java: + Cosmetics, add robustness checks etc. + +2012-09-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/UserServiceImpl.java, + src/main/java/de/intevation/flys/client/server/auth/UserClient.java: + Be more defensive about fetchimg users from session. + +2012-09-07 Felix Wolfsteller + + Improved panning in TimeseriesCharts (issue715). + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java + (computeZoom): Prevent confusion of scoped 'zoom' variable. + (divide): Cast to double, we do not want long precision divisions. + +2012-09-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/shared/model/ChartInfo.java, + src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/FLYSView.java, + src/main/java/de/intevation/flys/client/client/ui/chart/MousePositionPanel.java, + src/main/java/de/intevation/flys/client/client/ui/OutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java, + src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + Cosmetics, docs. + +2012-09-04 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/UserServiceImpl.java: + Refactor getCurrentUser to return the logged in user and not the first + user from the artifact database. + +2012-09-04 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/RemoteServiceServlet.java, + src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/RemoteServiceServlet.java, + src/main/java/de/intevation/flys/client/server/ModuleServiceImpl.java: + Move RemoteServiceServlet to server package. + +2012-09-07 Ingo Weinzierl + + Tagged module as '2.9'. + +2012-09-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/RadioPanel.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Removed trailing whitespace. + +2012-09-04 Felix Wolfsteller + + Fix for issue63. + + * src/main/java/de/intevation/flys/client/client/ui/LinkSelection.java: + Place map image in helper section. + +2012-09-04 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/plain/Authenticator.java: + Add some debug which file will be used for local user authentification + +2012-09-04 Bj�rn Ricks + + * src/main/webapp/WEB-INF/features.xml: + Add features for flys_wsa_schweinfurt role + +2012-09-04 Raimund Renkert + + Issue 808. + + * src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java: + Added new row for single selection and set field titles. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Show the single selection row on init. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Updated i18n strings. + +2012-09-04 Raimund Renkert + + Issue 664. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Made old value an i18n formatted string. + +2012-09-04 Christian Lins + + * src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ModuleServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/RemoteServiceServlet.java: + Add missing imports and fix package declaration. + +2012-09-04 Raimund Renkert + + Issue 791. + + * src/main/java/de/intevation/flys/client/client/ui/MultipleLocationPanel.java: + Do not allow the same values in reference and target location. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2012-09-04 Felix Wolfsteller + + Partial fix for issue820. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Change i18n (middle height -> middle depth). + +2012-09-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Do not show labels in logo selection combobox. + +2012-09-03 Felix Wolfsteller + + + Show logos in selectbox in chart properties such that user gets a + visual idea of what she selects. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Show icons in select box that displays the chosen logo. + + * src/main/webapp/images/logo-intevation.png, + src/main/webapp/images/logo-bfg.gif: + Two exemplary logos (copies in flys-artifacts). + +2012-09-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/ModuleServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/RadioPanel.java, + src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java, + src/main/java/de/intevation/flys/client/client/ui/minfo/CheckboxPanel.java, + src/main/java/de/intevation/flys/client/client/ui/minfo/BedHeightsDatacagePanel.java: + Removed superfluous imports. + +2012-09-01 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Overflow for Toolbars is now HIDDEN to avoid nasty scrollbars (#761). + +2012-09-01 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Change button title in DatacagePairWidget (#746). + +2012-08-31 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + ThemePanels are now resizable (fix for #750). + +2012-08-31 Felix Wolfsteller + + Maybe sqashing issue531, calling projectlists superclasses constructor. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Call super() constructor. + +2012-08-31 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Set the default value of the RadioGroupItem if a module is selected. + +2012-08-31 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/ModuleServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/ModuleService.java: + Load the list of modules from the flys artifact server. Also respect the + selected attribute of a module. + +2012-08-31 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/shared/model/DefaultModule.java, + src/main/java/de/intevation/flys/client/client/services/ModuleService.java: + Add isSelected method to Module classes. + +2012-08-31 Raimund Renkert + + MINFO: Added new UI provider for bed quality calculation. + + * src/main/java/de/intevation/flys/client/client/ui/minfo/CheckboxPanel.java: + New. UI provider for a list of checkboxes. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Added new UI provider. + +2012-08-31 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Use river data in all states not only winfo. + +2012-08-31 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ExportPanel.java: + Hide the W/Q AT export button in fix analysis parameter tab. + +2012-08-31 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/UserClient.java: + User xml namespace for XPath attribute query. + +2012-08-31 Bj�rn Ricks + + * src/main/webapp/WEB-INF/web.xml: + Add servlet settings for ModuleService + +2012-08-30 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java: + New projects are now initially maximized to prevent IE-layout issue (#755). + +2012-08-30 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfoWindow.java: + Workaround for #775 (manually set window size to 500x500 pixels) + + * src/main/java/de/intevation/flys/client/client/ui/WspDatacagePanel.java: + Prevent NPE + +2012-08-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + i18n for logo placement. + +2012-08-29 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Load modules from the ModuleService instead of using hardcoded strings. + +2012-08-29 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/ModuleServiceImpl.java: + Hardcode German translations for module names until real translations are + available. + +2012-08-29 Bj�rn Ricks + + * src/main/webapp/WEB-INF/features.xml: + Add roles and features for GGinA + +2012-08-29 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/services/ModuleServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ModuleService.java, + src/main/java/de/intevation/flys/client/server/ModuleServiceImpl.java: + Added service to list available modules for a user. + +2012-08-29 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/shared/model/DefaultModule.java, + src/main/java/de/intevation/flys/client/shared/model/Module.java: + Added class representation of a module artifact. + +2012-08-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Special chart properties should trigger different ui (logo placement box). + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for split logo-placement properties in charts. + +2012-08-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Special chart properties should trigger different ui (logo placement box). + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for logo-placements in charts. + +2012-08-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Special chart properties should trigger different ui (logo select box). + +2012-08-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added first i18n strings for logo-inclusion in charts. + +2012-08-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java, + src/main/java/de/intevation/flys/client/shared/model/StringProperty.java, + src/main/java/de/intevation/flys/client/shared/model/OutputSettings.java, + src/main/java/de/intevation/flys/client/shared/model/FacetRecord.java: + Cosmetics. + +2012-08-28 Raimund Renkert + + MINFO: Added UI for minfo differences calculation. + + * src/main/java/de/intevation/flys/client/client/ui/minfo, + src/main/java/de/intevation/flys/client/client/ui/minfo/BedHeightsDatacagePanel.java, + src/main/java/de/intevation/flys/client/client/ui/RadioPanel.java: + New. UI provider for states in minfo differences calculation. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Added new UI provider. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2012-08-24 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/UserClient.java: + Use new find-user REST interface to check if a user already exists in the + database or a new user must be created. + +2012-08-24 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/UserClient.java: + Send account data to REST interface. + +2012-08-24 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/UserClient.java: + Don't use XPath Query to get attribute of a XML Node + +2012-08-24 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/DefaultUser.java, + src/main/java/de/intevation/flys/client/server/auth/was/Response.java, + src/main/java/de/intevation/flys/client/server/auth/was/User.java, + src/main/java/de/intevation/flys/client/server/auth/User.java: + Add account information to client user classes. Use the WAS/GGInA + assertion NameIdentifier element for the account name. For text + authentication user username also as account name. + +2012-08-24 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/LoginServlet.java: + Add debug output if a database user will be created. + +2012-08-23 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/UserServiceImpl.java: + Avoid using XPath queries for getting attributes of a node. + +2012-08-22 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Delete empty project after closing the CollectionView (#785). + +2012-08-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/ExportServiceImpl.java: + Removed superfluous import. Removed some inner whitespace. + Made debug output conditional. + +2012-08-17 Raimund Renkert + + Added AT file export to FixAnalysis W/Q. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + New image link for AT export in W/Q tab. + + * src/main/java/de/intevation/flys/client/client/ui/chart/NaviChartOutputTab.java: + Update link url on km change. + + * src/main/java/de/intevation/flys/client/server/ExportServiceImpl.java: + Add the km to the request document. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for tooltip. + +2012-08-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/ProxyServlet.java: + Shortend lines to 80 chars. Made debug outout conditional. + Use block copy instead of tight byte wise loop. + +2012-08-16 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/ProxyServlet.java: + Implement a ProxyServlet to be able to restrict the access to the + mapserver too. All queries to the provided map services should go throught + this new ProxyServlet. Currently the ProxyServlet can only handle HTTP GET + requests. + +2012-08-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java: + Replaced another attribute fetching XPath with a simple DOM + getAttributeNS() call. + +2012-08-15 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java: + Avoid NullPointerException if user authetication is deactivated. If user + Authentication is deactivated all rivers are returned. + +2012-08-15 Raimund Renkert + + Issue 752. Location input label. + + * src/main/java/de/intevation/flys/client/client/ui/MultipleLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Added getter for label string. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties: + Added i18n string for single location label. + +2012-08-15 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java: + Only return rivers that the user is allowed to see. Evaluate the allowed + features of the current logged in user and hide rivers which aren't + mentioned in the features list. + +2012-08-15 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/client/services/RemoteServiceServlet.java: + Implement an extended GWT RemoteServiceServlet to be able to get the + current logged in user easily. + +2012-08-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/auth/DefaultUser.java, + src/main/java/de/intevation/flys/client/server/features/XMLFileFeatures.java: + Removed superfluous imports. + +2012-08-08 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/was/Response.java: + Add debug log of a successfull authentification inclusive the + corresponding features of the authenticated user. + +2012-08-08 Bj�rn Ricks + + * src/main/webapp/WEB-INF/features.xml: + Add example features for GGinA/WAS role flys_bfg. + +2012-08-08 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/features/XMLFileFeatures.java: + Don't use a xml namespace to get the "name" attribute of a role. + +2012-08-08 Bj�rn Ricks + * src/main/java/de/intevation/flys/client/server/auth/was/Authenticator.java, + src/main/java/de/intevation/flys/client/server/auth/was/Response.java, + src/main/java/de/intevation/flys/client/server/auth/was/User.java: + Implement Features handling for WAS authentication. + +2012-08-08 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/LoginServlet.java, + src/main/java/de/intevation/flys/client/server/auth/plain/Authenticator.java, + src/main/java/de/intevation/flys/client/server/auth/DefaultUser.java, + src/main/java/de/intevation/flys/client/server/auth/was/Authenticator.java, + src/main/java/de/intevation/flys/client/server/auth/Authenticator.java, + src/main/java/de/intevation/flys/client/server/auth/User.java, + src/main/java/de/intevation/flys/client/server/GGInAFilter.java: + Refactor Authentication to allow to pass the Freatures to the user class. + +2012-08-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/features/XMLFileFeatures.java: + Used HashMap instead of Hashtable. Limit to 80 chars per line. + +2012-08-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java: + Removed trailing whitespace. + +2012-08-08 Bj�rn Ricks + * src/main/java/de/intevation/flys/client/server/features/XMLFileFeatures.java: + Always close FileInputStream, improve for loops and avoid XPath for + getting a xml attribute. + +2012-08-08 Bj�rn Ricks + * src/main/java/de/intevation/flys/client/server/CapabilitiesParser.java, + src/main/java/de/intevation/flys/client/server/BaseServlet.java, + src/main/webapp/WEB-INF/web.xml: + Remove the obsolete BaseServlet. Initializing of logging is now handled by + the BaseServletContextListener class which is loaded before any Servlet. + +2012-08-08 Bj�rn Ricks + * src/main/java/de/intevation/flys/client/server/features/FeatureServletContextListener.java, + src/main/java/de/intevation/flys/client/server/BaseServletContextListener.java, + src/main/webapp/WEB-INF/web.xml: + Rename and move FeatureServletContextListener. + +2012-08-08 Bj�rn Ricks + * src/main/java/de/intevation/flys/client/server/features/FeatureServletContextListener.java, + src/main/webapp/WEB-INF/web.xml: + Implement a ServletContextListener to initialize the Fearures from a xml + file. With the context parameter "features-file" in src/main/webapp/WEB-INF/web.xml + a xml file to load features from can be specified. + The FeatureServletContextListener class also initializes the logging now + because it is loaded before the BaseServlet. + +2012-08-08 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/features/XMLFileFeatures.java, + src/main/java/de/intevation/flys/client/server/features/FeaturesNamespaceContext.java, + src/main/java/de/intevation/flys/client/server/features/Features.java, + src/main/webapp/WEB-INF/features.xml: + Implementation of a feature representation. The XMLFileFeatures class can + be used to load a feature xml file (src/main/webapp/WEB-INF/features.xml) + and create a map of roles to a list of features. + +2012-08-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java: + Cosmetics, reordered code. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Show tooltip for rows in datacage widget. + +2012-08-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java: + Documentation added, use static map instead of population in + constructor. + +2012-07-30 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixQSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Removed superfluous imports. + +2012-07-27 Ingo Weinzierl + + Tagged module as '2.8.1'. + +2012-07-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/ChartMode.java: Let + 'fix_vollmer_wq_curve" Output also use the NaviChartOutputTab. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added titles for the 'fix_vollmer_wq_curve' Output tab. + +2012-07-26 Christian Lins + + * src/main/java/de/intevation/flys/client/server/StyleHelper.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Merge point/line label styles. Add new style options for point/line + label background. + +2012-07-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/shared/model/DefaultArtifactDescription.java: + Accept differing state data names of FixationArtifacts. + +2012-07-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/shared/model/Artifact.java, + src/main/java/de/intevation/flys/client/shared/model/FixAnalysisArtifact.java, + src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Cosmetics. + +2012-07-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Respect factory of cloned artifact when cloning. + +2012-07-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/UserCollectionsServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java, + src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixMultiPeriodPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixQSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java, + src/main/java/de/intevation/flys/client/client/ui/PeriodPanel.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/WMSLayersTree.java, + src/main/java/de/intevation/flys/client/client/ui/DoubleInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/MultiPeriodPanel.java: + Removed some superfluous casts. + +2012-07-21 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Catch the case that a previous gauge is before the start of the + events. This led to a broken layout. + +2012-07-21 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Bring in sync with transformation in flys-client. + +2012-07-21 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Bring in sync with transformation in flys-client. Current weakness: + Only english and german locales are supported. + + * src/main/java/de/intevation/flys/client/server/FixingsOverviewServiceImpl.java: + Depending on client given locale call transformation with + locale "de" or "en". + +2012-07-20 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: Merged + changes from transformation in flys-artifacts: Render names + to the gauges into the headline. Full names and spread are + displayed as tooltips. + +2012-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/OverviewOutputTab.java: + Removed the export buttons for SVG and PDF; those exports aren't + implemented on server side yet. + +2012-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/sq/SQCampaignChart.java: + New subclass of VLayout that displays a chart with field campaigns. The + code is copied from SQMultiPeriodPanel. + + * src/main/java/de/intevation/flys/client/client/ui/sq/SQMultiPeriodPanel.java: + Moved the code to display the field campaign charts into SQCampaignChart + class. + + * src/main/java/de/intevation/flys/client/client/ui/sq/SQPeriodPanel.java: + New UIProvider that allows the input of a time period; the helper panel + displays a chart with field campaigns. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Registered SQPeriodPanel as new UIProvider. + +2012-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Added a new UI provider that supports input of a time period (without + any helper panel). + +2012-07-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Removed superfluous import. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Removed trailing whitespace. + +2012-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Made getChartOutputTab() protected. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Moved creation of a ChartToolbar and a ChartThemePanel from constructor to + own methods which enables subclasses to override those. + + * src/main/java/de/intevation/flys/client/client/ui/chart/OverviewOutputTab.java: + Override createThemePanel() and createChartToolbar() of parent class. Both + methods return instances of minimalistic implementations of a + ChartThemePanel and ChartToolbar. In addition, the overview chart is + fetched as single image. + +2012-07-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DoubleInputPanel.java: + Read default value from Data item; set textfield to this value of a + default value is existing. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/FixAnalysisArtifact.java, + src/main/java/de/intevation/flys/client/shared/model/DoubleProperty.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/NaviChartOutputTab.java: + Use more idiomatic Java when parsing doubles and ints. + +2012-07-19 Sascha L. Teichmann + + * ChangeLog: Removed remains from former conflict. + +2012-07-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixFunctionSelect.java + src/main/java/de/intevation/flys/client/client/ui/chart/NaviChartOutputTab.java: + Removed superfluous imports. + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Removed trailing whitespace. + +2012-07-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Register (to-be-implemented) fix.qselect_panel UIProvider. + +2012-07-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Prepare for bandwidthcolor, and preset bandwidth with previously + entered values. + +2012-07-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/WspDatacagePanel.java: + Cosmetics. + +2012-07-19 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/NaviChartOutputTab.java: + Input fields for chart navigation now use the correct i18n number formats. + +2012-07-18 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Generate only legend entries for existing discharge sectors. + +2012-07-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java: + Replaced discharge sectors with more human readable labels. + +2012-07-18 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Added legend at bottom of overview table. + +2012-07-18 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixFunctionSelect.java: + New. UI provider for function selection in fix analysis. This UI provider + shows the overview and chart in the helper panel. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Use the new UI provider in function select state. + +2012-07-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Populate double type theme attributes with already set values. + +2012-07-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Code compres Code compression. + +2012-07-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Improve validation. + +2012-07-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ManualWSPEditor.java: + Cosmetic compression. + +2012-07-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Added public methods to lock and unlock the CollectionView. Locking the + view means, a semi transparent layer prevents the user to use the + control elements in the CollectionView. In addition to the semi + transparent layer, a progress image is displayed. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Lock the CollectionView when StepBack and StepForward events are fired. + Unlock the screen on success or failure. + +2012-07-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Handle upcoming "double" theme attribute type. + +2012-07-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/utils/DoubleValidator.java, + src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Cosmetics. + +2012-07-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/auth/DefaultUser.java, + src/main/java/de/intevation/flys/client/client/ui/chart/OverviewOutputTab.java: + Removed trailing whitespace. + +2012-07-17 Felix Wolfsteller + + * main/java/de/intevation/flys/client/client/FLYSConstants.java, + main/java/de/intevation/flys/client/client/FLYSConstants.properties, + main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for bandwidth. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Include bandwidth field. + +2012-07-17 Christian Lins + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Correct height of ChartToolbar to 35 pixels. + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfoWindow.java: + Make use of generics and cosmetics. + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapPanel.java: + ThemePanel toggle stuff. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Increase default size as the toolbar has grown as well. + + * pom.xml: + Add commons-codec dependency. + +2012-07-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AdvanceServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Cosmetics, docs. + +2012-07-16 Ingo Weinzierl + + * Tagged module as '2.8'. + +2012-07-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java, + src/main/java/de/intevation/flys/client/server/auth/Authentication.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java, + src/main/java/de/intevation/flys/client/shared/model/FacetRecord.java, + src/main/java/de/intevation/flys/client/shared/model/Theme.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultData.java: + Removed same package imports. + +2012-07-13 Felix Wolfsteller + + * main/java/de/intevation/flys/client/client/FLYSConstants.java, + main/java/de/intevation/flys/client/client/FLYSConstants.properties, + main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for officiallines. + +2012-07-13 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/web.xml: Separate two context params correctly. + + * src/main/java/de/intevation/flys/client/server/auth/was/ServiceException.java, + src/main/java/de/intevation/flys/client/server/auth/AuthenticationException.java: + Removed imports. + + * src/main/java/de/intevation/flys/client/server/auth/plain/Authenticator.java, + src/main/java/de/intevation/flys/client/server/auth/AuthenticationFactory.java: + Added debug output. + +2012-07-13 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/LoginServlet.java, + src/main/java/de/intevation/flys/client/server/auth/UserClient.java: + Add UserClient class to handle REST communication for user related + interfaces. If a logged in user is not known add him to the database + via the REST protocol. + +2012-07-13 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/MainMenu.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Add "Manage Themes" button to ChartToolbar and MapToolbar to toggle themes window. + + * pom.xml: + Remove gwt-dev from dependencies as it contains an ancient Apache Commons Codec version + and add a recent version of it as separate dependency. + This fixes the nasty eclipse compile errors with Base64 class etc. + +2012-07-13 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/OverviewOutputTab.java: + Switched row count and column count. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/auth/DefaultUser.java, + src/main/java/de/intevation/flys/client/server/auth/was/Response.java: + Removed superfluous imports. + +2012-07-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/auth/plain/Authenticator.java, + src/main/java/de/intevation/flys/client/server/auth/DefaultUser.java: + Cosmetics. + +2012-07-13 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/User.java: + Add javadoc for the user class. + +2012-07-13 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/User.java, + src/main/java/de/intevation/flys/client/server/auth/plain/Authenticator.java + src/main/java/de/intevation/flys/client/server/auth/DefaultUser.java + src/main/java/de/intevation/flys/client/server/auth/was/Response.java + src/main/java/de/intevation/flys/client/server/auth/was/User.java: + Implement getting a list of roles from a logged in user. + +2012-07-13 Raimund Renkert + + * main/java/de/intevation/flys/client/server/CollectionHelper.java: + Added new output mode 'overview' and added type to chart mode. + + * main/java/de/intevation/flys/client/shared/model/ChartMode.java: + Added type to constructor. + + * main/java/de/intevation/flys/client/shared/model/OverviewMode.java: + New. Output mode for chart overviews. + + * main/java/de/intevation/flys/client/client/ui/chart/OverviewOutputTab.java: + New. Output tab for chart overviews. + + * main/java/de/intevation/flys/client/client/FLYSConstants.java, + main/java/de/intevation/flys/client/client/FLYSConstants.properties, + main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2012-07-13 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/was/Request.java: + Removed System.out.println debug statement for the request uri. + +2012-07-13 Bj�rn Ricks + + * src/main/webapp/WEB-INF/web.xml: + Removed trailing whitespace. + +2012-07-13 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/GGInAFilter.java: + Implement re-authentication if the user (ticket) has expired. + Every "ticket" in GGInA has an end date. Therefore send a new + authentication request if the current date is after the end date. + +2012-07-13 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/LoginServlet.java, + src/main/webapp/WEB-INF/web.xml: + Use servlet context to specify the authentication method. + Using the servlet context allows to set the method globally and + not only for one servlet. + +2012-07-13 Bj�rn Ricks + + * src/main/webapp/FLYS.css: + Add styles for the authentication error at the login page. + +2012-07-13 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/LoginServlet.java: + Also log an authentication failure. Several reasons could exist + why an authentication will fail. Mostly because the user did provide + wrong credentials but also because the GGInA protocol has changed + unexpectedly. Therefore also log the error. + +2012-07-13 Bj�rn Ricks + + * src/main/webapp/login.jsp, + src/main/java/de/intevation/flys/client/server/LoginServlet.java: + Display exception details to the user if an authentication fails. + +2012-07-13 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/Authentication.java, + src/main/java/de/intevation/flys/client/server/auth/was/Response.java: + Extend Authentication getUser method to throw an AuthenticationException. + Also the Response constructor now throws an IOException. + +2012-07-13 Bj�rn Ricks + + * src/main/java/de/intevation/fly/client/server/auth/was/User.java: + Derive User class from new + de.intevation.fly.client.server.auth.DefaultUser class and implement + hasExpired method via SAML Assertion. + +2012-07-12 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/web.xml: Set artifact server port back to 8181 + +2012-07-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/GGInAFilter.java: + Cast session user to abstract type not WAS specific. + +2012-07-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Removed superfluous import. + +2012-07-12 Ingo Weinzierl + + flys/issue698 (FLYS-Client: Release-Version verschluckt Clicks auf Stepback) + + * src/main/java/de/intevation/flys/client/shared/model/FixFilter.java: + New. The code of this class was moved from FixationPanel to FixFilter. + + * src/main/java/de/intevation/flys/client/shared/model/FixAnalysisArtifact.java: + Adapted the reference to FixFilter which had been an inner class of + FixationPanel before. + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Moved the FixFilter code to an own top level class in the 'shared' part. + +2012-07-11 Christian Lins + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Add showpointlabel stlye attribute. + +2012-07-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/auth/plain/Authenticator.java: + Authenticates against simple text file. Specified by env variable FLYS_USER_FILE + or system property flys.user.file . + File format: One user per line, '#' at line start means comment. + \t\t + + * src/main/java/de/intevation/flys/client/server/auth/DefaultUser.java: + Simple user implementation. + + * src/main/java/de/intevation/flys/client/server/auth/AuthenticationFactory.java: + Check for 'plain' as authentication method. + + * src/main/java/de/intevation/flys/client/server/auth/User.java: + Expires return boolean instead of Boolean, now. + + * src/main/java/de/intevation/flys/client/server/auth/was/User.java: + Adjusted + + * src/main/java/de/intevation/flys/client/server/auth/was/Response.java: + Added override annotation. + + * src/main/java/de/intevation/flys/client/server/auth/Authenticator.java: + Removed same package imports. + +2012-07-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Removed trailing whitespace. + +2012-07-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/GGInAFilter.java, + src/main/java/de/intevation/flys/client/client/ui/sq/SQMultiPeriodPanel.java: + Removed superfluous imports. + +2012-07-11 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/auth/Authentication.java, + src/main/java/de/intevation/flys/client/server/auth/AuthenticationFactory.java, + src/main/java/de/intevation/flys/client/server/auth/was/Namespaces.java, + src/main/java/de/intevation/flys/client/server/auth/was/ServiceException.java, + src/main/java/de/intevation/flys/client/server/auth/was/Signature.java, + src/main/java/de/intevation/flys/client/server/auth/was/Assertion.java, + src/main/java/de/intevation/flys/client/server/auth/was/Request.java, + src/main/java/de/intevation/flys/client/server/auth/was/Authenticator.java, + src/main/java/de/intevation/flys/client/server/auth/was/Response.java, + src/main/java/de/intevation/flys/client/server/auth/was/User.java, + src/main/java/de/intevation/flys/client/server/auth/Authenticator.java, + src/main/java/de/intevation/flys/client/server/auth/AuthenticationException.java, + src/main/java/de/intevation/flys/client/server/auth/User.java, + src/main/webapp/WEB-INF/web.xml: + Move authentication related classes to de.intevation.fly.client.server.auth + package. Abstract the authentication classes to allow other authentications + beside WAS/GGInA. + +2012-07-11 Bj�rn Ricks + * src/main/java/de/intevation/flys/client/server/GGInAFilter.java: + Check filter config in web.xml for String false to deactivate the + GGInAFilter instead of "1". + +2012-07-11 Christian Lins + + Eclipse specific project files removed from SVN. + + * src/main/java/de/intevation/flys/client/server/FileUploadServiceImpl.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Fix exceptions on unknown style attributes. + Introduce alpha transparency attribut for areas. + + +2012-07-11 Raimund Renkert + + * src/main/java/de/intevation/flys/client/server/SQKMChartServiceImpl.java: + New. Service to request the sq relation helper chart. + + * src/main/java/de/intevation/flys/client/client/ui/sq/SQMultiPeriodPanel.java: + New. Multi period input panel with overview chart in helper panel. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Use the new panel in sq relation period input. + + * src/main/webapp/WEB-INF/web.xml: + Added new service to config. + +2012-07-11 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/GGInAFilter.java: + Redirect a user to the login page if he isn't authenticated. + +2012-07-11 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/LoginServlet.java, + src/main/webapp/login.jsp, + src/main/webapp/FLYS.css, + src/main/webapp/WEB-INF/web.xml: + Implement a login page to be able to authenticate a user. + +2012-07-11 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/GGInATrustStrategy.java: + Add a TrustStrategy to be able to accept all SSL certificates. + +2012-07-11 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/was/User.java: + Add a first implementation of a WAS user class. + +2012-07-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/was/Response.java: + Directly use Base64InputStream filter stream instead of reading into + memory first. + +2012-07-10 Bj�rn Ricks + + * pom.xml: Add dependencies for jdom 1.1.3, Apache commons-io 2.2 + and Apache httpcomponents 4.2. All are dependencies are used in + the new WAS classes. + +2012-07-10 Bj�rn Ricks + + * src/main/java/de/intevation/flys/client/server/was/Assertion.java + src/main/java/de/intevation/flys/client/server/was/Request.java, + src/main/java/de/intevation/flys/client/server/was/Response.java, + src/main/java/de/intevation/flys/client/server/was/ServiceException.java, + src/main/java/de/intevation/flys/client/server/was/Signature.java, + src/main/java/de/intevation/flys/client/server/was/Namespaces.java: + Implement class representation of a Web Authentication Service (WAS) + request and response. If the authentication is successful the WAS + responses with a base64 encoded Security Assertion Markup Language (SAML) + v1.0 message. + +2012-07-08 Sascha L. Teichmann + + * pom.xml: Bumped GWT from 2.3 up to 2.4 which is the current stable. + +2012-07-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java: + Minor Cosmetics. + +2012-07-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java, + src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Cosmetics, whitespaces and doc. + +2012-07-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ManualWSPEditor.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Removed superfluous imports. + +2012-07-08 Felix Wolfsteller + + Fix issue706. + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Allow only one value to be entered by clicking. + +2012-07-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ManualWSPEditor.java, + src/main/java/de/intevation/flys/client/client/utils/DoubleValidator.java: + Removed trailing whitespace. + +2012-07-06 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added method to deselect active controls. Currently only zoom control is + deselected. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Changed type of tool bar to 'ChartToolbar'. + + * src/main/java/de/intevation/flys/client/client/ui/chart/NaviChartOutputTab.java: + Deselect controls on navigate and return chart in 'getChartPanel'. + +2012-07-03 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/NaviChartOutputTab.java: + Add km to chart info request parameters to get valid chart infos. + +2012-07-03 Felix Wolfsteller + + Fix issue457. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Store and consider direction (up, down) when using the km spinner. + +2012-07-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for export of adjusted coefficients. + +2012-07-02 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/ExportPanel.java: + Make getting tooltip string more robust when trying to resolve + missing I18N strings. + +2012-06-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Show area menu also for newer manual wsp line facet. + +2012-06-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualWSPEditor.java: + Improved validation. + + * src/main/java/de/intevation/flys/client/client/utils/DoubleValidator.java + (isDouble): New, shortcut. + +2012-06-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualWSPEditor.java: + Added basic validation + +2012-06-28 Felix Wolfsteller + + Improved manual line editor. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Fix i18n key for buttons tooltip. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Fix translation. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualWSPEditor.java: + Label the input fields, nicen dialog dimensions. + +2012-06-28 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Use different i18n key for button. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + new i18n strings used for the manual WSP editor button. + +2012-06-27 Felix Wolfsteller + + Added basic GUI to register manual lines in cross section. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Add Button to register Manual WSPs. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualWSPEditor.java: + New. Basic manual WSP Editor. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + new i18n strings used for the manual WSP editor. + +2012-06-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Minor refactoring. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Removed some stupid programming. Make the chart km more useful. + +2012-06-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Do not throw layout away if only the km chart needs reloading. + Fix floating point vs. integer rounding issues. + +2012-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/FixingsOverviewServiceImpl.java: + Removed trailing whitespace. + +2012-06-21 Sascha L. Teichmann + + * pom.xml: Bumped SmartGWT to version 3.0 + This solves the date issues in fixings analysis for me. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java: + Usability: Limit the number of displayed old items to 5. Use label "..." as + a placeholder there are more. + +2012-06-21 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/NaviChartOutputTab.java: + Changed handler for km navigation input from changed to keypress listening + to 'Enter'-key. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Create + "columns": { "cids": "1 2 3" } + instead of + "or": ["column": { "cid": 1 }, "column": { "cid": 2 }, "column": { "cid": 3 }] + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/FixingsOverviewServiceImpl.java: + Added more debug ouput about the transmitted documents. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/FixingsOverviewServiceImpl.java: + Removed some XPath misuse. + +2012-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Removed example comment about JSON filter. + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java: + Set discharge sectors 0 and 3 as default in UI. + +2012-06-21 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Forgot header cell when rendering checkboxes. + Some small layout adjustments. + +2012-06-20 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Extent of overview is determined by min/max km of sectors. + +2012-06-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/ThemeListingServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/chart/NaviChartOutputTab.java: + Removed superfluous imports. + +2012-06-20 Felix Wolfsteller + + Fix issue665, issue459, issue667 (zoom different in export). + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Fake a zoom-event when a zoom-value changing action was taken. + +2012-06-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/StyleHelper.java: Added + missing class from last commit. + +2012-06-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/StyleHelper.java: New + helper class which currently implements a function getStyle() that returns + a Style object from XML Element. + + * src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ThemeListingServiceImpl.java: + Sources getStyle() out to StyleHelper. + + * src/main/java/de/intevation/flys/client/shared/model/StyleSetting.java: + Added new boolean property 'hidden' and improved constructor. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Added attribute 'pointcolor' to whitelist and display only attributes that + are not 'hidden'. + +2012-06-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + new i18n strings used in the theme editor for point colors. + +2012-06-15 Raimund Renkert + + Added navigation to fix analysis charts. + + * src/main/java/de/intevation/flys/client/client/ui/chart/NaviChartOutputTab.java: + New. Chart output tab with km navigation. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Added member variables and getter/setter for km navigation values. + + * src/main/java/de/intevation/flys/client/shared/model/ChartMode.java: + Create NaviChartOutputTabs for chart tabs in fix analysis. + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ChartServiceHelper.java: + Added the current km as parameter in requests. + + * src/main/java/de/intevation/flys/client/shared/model/FixAnalysisArtifact.java: + Create the filter by getting the attributes via artifact description. + +2012-06-15 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/**/*.java: Removed trailing whitespace. + +2012-06-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/config.xml, + src/main/webapp/WEB-INF/web.xml, + pom.xml: Reverted accidently commited personal changes (ports). + +2012-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + chart and export titles for sq relation calculation in MINFO. + +2012-06-14 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java: + Add all events to the list of selected events. + +2012-06-14 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Changed helper chart size to avoid overlapping in maximized project window. + +2012-06-14 Raimund Renkert + + * main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Render checked checkboxes in html event overview. + +2012-06-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/FixAnalysisArtifact.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java, + src/main/java/de/intevation/flys/client/client/ui/PeriodPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DoubleInputPanel.java: + Removed superfluous imports. + +2012-06-11 Raimund Renkert + + Added UI for S-Q-relation parameters. + + * src/main/java/de/intevation/flys/client/client/ui/MultipleLocationPanel.java: + Use different filter strings for annotations. + + * src/main/java/de/intevation/flys/client/client/ui/PeriodPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DoubleInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/MultiPeriodPanel.java: + New. UIProvider for S-Q-relation parameters. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Added new states for S-Q-relation. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2012-06-07 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Fix doc. + +2012-06-07 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Removed duplicated i18n methods. + +2012-06-07 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2012-06-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n stubs that let us continue working with the GUI. + +2012-06-05 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/GGInAFilter.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixMultiPeriodPanel.java: + Removed superfluous imports. + +2012-06-05 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java: + Fixed creation of initial date string. + +2012-06-04 Felix Wolfsteller + + * src/main/webapp/WEB-INF/web.xml: Register Servlet Filter. + +2012-06-04 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/BaseServlet.java: + Cosmetics, doc. + +2012-06-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/GGinAFilter.java: + New. Stub for upcoming authentication and authorization servlet + filter. + +2012-06-01 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java: + Fixed descriptions of Q sectors. + +2012-06-01 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java: + Changed numbers in gauge sector selection state to strings. + +2012-06-01 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java: + Set initial values for start and end date. + +2012-06-01 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/FixAnalysisArtifact.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixMultiPeriodPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java: + Removed some debug outputs. + +2012-06-01 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/FixAnalysisArtifact.java: + Added filter to artifact. The artifact extracts old state data to create the + filter. + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Implemented filter object. + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixMultiPeriodPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixQSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java: + Removed getter and setter for filter object. Moved filter to fix artifact. + +2012-05-30 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixMultiPeriodPanel.java: + New. UI provider for multiple date range input. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Use the new ui provider for fix analysis parameter input. + +2012-05-29 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + +2012-05-28 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings used by Delta W/t export of the fixing analysis. + +2012-05-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added more i18n strings used in the floodmap datacage. + +2012-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Corrected image path to add_wms.png. + +2012-05-27 Ingo Weinzierl + + * Tagged module as '2.7'. + +2012-05-24 Raimund Renkert + + Issue 671. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added tooltips to toolbar buttons. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for tooltips. + +2012-05-24 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Resized the km spinner for cross section themes. + +2012-05-24 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Set the facet and index of the available styles to the values of the + current one. + +2012-05-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Cosmetics. + +2012-05-23 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/FixAnalysisArtifact.java: + New. Concrete artifact for fixing analysis. + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + Create a fixanalysis artifact if the project is a fixing analysis. + +2012-05-23 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/services/ThemeListingService.java, + src/main/java/de/intevation/flys/client/client/services/ThemeListingServiceAsync.java, + src/main/java/de/intevation/flys/client/server/ThemeListingServiceImpl.java: + New. Service to request themes filtered by name. Response is a list of + theme groups each containing the filtered theme. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Added a style chooser. The user can now choose predefined styles. + + * src/main/webapp/WEB-INF/web.xml: + Added new service. + +2012-05-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterMatrix.java: + Removed superfluous imports. + +2012-05-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java: + Make the names of state parameters configurable by constructor. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Create specialized FixPeriodPanels when using "fix.period_ref_panel" or + "fix.period_ana_panel" provider types. + +2012-05-21 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixQSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Added new method 'success', called on successful requested fixings + overview document. + Implemented 'createOld' to display old values. + Changed data field 'name' to 'description'. + +2012-05-21 Raimund Renkert + + * src/main/java/de/intevation/flys/client/server/FixingsOverviewServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/FixingsOverviewInfo.java: + Changed data field 'name' to 'description'. + +2012-05-21 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/Data.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerOptionsData.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultData.java, + src/main/java/de/intevation/flys/client/shared/model/DoubleArrayData.java, + src/main/java/de/intevation/flys/client/shared/model/DoubleRangeData.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerRangeData.java, + src/main/java/de/intevation/flys/client/shared/model/StringOptionsData.java, + src/main/java/de/intevation/flys/client/shared/model/LongRangeData.java: + Added getter that returns the value as string. + + * src/main/java/de/intevation/flys/client/shared/model/IntegerArrayData.java: + Refactored data type. Now stores data items of type IntDataItem + instead of int[]. + + * src/main/java/de/intevation/flys/client/shared/model/IntDataItem.java: + New. Data type for int array data. + + * src/main/java/de/intevation/flys/client/server/FeedServiceImpl.java, + src/main/java/de/intevation/flys/client/server/StepForwardServiceImpl.java: + Use new getter in data. + + * src/main/java/de/intevation/flys/client/server/DataFactory.java: + Create int array data using int data items. + +2012-05-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added csv export and chart title for MINFO bed height calculation. + +2012-05-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/StringOptionsData.java: + Added. This class was missing in the last commit. + + +2012-05-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/StringOptionsData.java: + New Data implementation that should be used for user input with string + options. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java, + src/main/java/de/intevation/flys/client/server/DataFactory.java: Create + new StringOptionsData if the data type equals "options". + + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java. + src/main/java/de/intevation/flys/client/client/ui/ParameterMatrix.java: + Enabled this panel to handle StringOptionsData. + +2012-05-16 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Render the Q class to the title of the sectors of the events. + +2012-05-16 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Make the description of the event the title of the date column cells. + +2012-05-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + i18n strings for flow velocity output. + +2012-05-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DataFactory.java: Extract + the 'label' attribute of a element and set this label as + description of new Data instances. If no 'label' attribute is + provided, the 'name' attribute (which is required) is used as + description. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java: + Implemented the createOld() method to display the user specified values. + +2012-05-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + titles for flow velocity export. + +2012-05-15 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Changed filter data types. + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java: + Add data to filterobject. + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java: + Changed data type for this state. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Added preprocessing state. + +2012-05-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java: + Implemented getData() which now returns the selected values from + ParameterMatrix as colon separated string. + +2012-05-14 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Fix fixation analysis factory from fix to fixanalysis. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for fixanalysis. + +2012-05-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrix.java: + New class that builds a matrix of checkboxes in the following form: + + | Column A | Column B | ... | Column N + Value A | [ ] | [ ] | ... | [ ] + Value B | [ ] | [ ] | ... | [ ] + ... + Value C | [ ] | [ ] | ... | [ ] + + + * src/main/java/de/intevation/flys/client/client/ui/ParameterMatrixPanel.java: New + UIProvider that uses ParameterMatrix for user input. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Create a new IntegerOptionsData instance if uiprovider is + 'parameter-matrix' and the input type is 'intoptions'. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Return an instance of ParamterMatrixPanel if the uiprovider 'parameter- + matrix' is required. + +2012-05-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/MINFOArtifact.java: + New Artifact that is used for the MINFO module. + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + Create new MINFO Artifacts if the Artifact's name is "minfo". + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + Use ArtifactDescription.getRiver() to retrieve the name of the selected + river. + +2012-05-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java: + Call MapFish print via Apache Commons Http Client to re-establish + LGPL conformance. + + * src/main/webapp/WEB-INF/web.xml: Configured the MapFish Print servlet + again. You need to adjust the init parameter 'print-url' of the + servlet MapPrintService to point to the MapFish Print servlet. + + * pom.xml: Added dependency to Apache Commons Http Client 3.1 + +2012-05-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for computed discharge curves in datacage. + +2012-05-11 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java: + Added scrollable chart to helperpanel and added filter object class. + + * src/main/java/de/intevation/flys/client/client/ui/fixation/FixLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixQSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java: + Added getter and setter for filter object. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2012-05-11 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Fix german middleheight i18n string. + +2012-05-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java: + Fixed problem with selecting the wrong map scale for printing. + + * src/main/webapp/WEB-INF/config.yaml: Added scales 1:2500, 1:5000, 1:10000 + and 1:15000 for "close-ups". + +2012-05-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Further input checking in kmspinner. + +2012-05-09 Felix Wolfsteller + + issue652: Empty spinner leads to exception. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Employ ValueFormatter and ValueParser to respect locale and stabilize. + +2012-05-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for showmiddleheight theme property strings. + +2012-05-09 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/config.yaml: Simplified config. Still ugly. + +2012-05-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java: + Generate legen via getlegendgraphic of the layers. Does not + look too pretty right now. + + * src/main/webapp/WEB-INF/config.yaml: Added legend block. We need + to learn how the layout really work to make it look pretty. + +2012-05-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Added zoom listener a adjust the print link bbox. Link bbox parameters + are generated correctly but the service does not respect them. Needs + debugging. + +2012-05-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java: + Accept the case that no bbox is given. Fall back to max extent in this case. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Generate a valid URL for the print service. + A nasty internal bug in gwtopenmaps bounds (type cast problem) prevents + fetching bbox when map in new. Cope with this case. + TODO: Add listeners to follow the current extent. + + * src/main/webapp/WEB-INF/config.yaml: Allowed another host to fetch + remote images from. + +2012-05-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Added link to print map. TODO: Figure out how create link. + +2012-05-07 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java: + Extract layer order and visibility from the describe document of + the collection. TODO: Generate legend by inserting icon urls to + GETLEGENDGRAPHIC of the layers. + +2012-05-07 Raimund Renkert + + First implementation for fixing analysis parameter. + + * src/main/java/de/intevation/flys/client/server/FixingsOverviewServiceImpl.java: + Updated services implementation. The service now returns an info + object containing the fixing overview data and html representation. + + * src/main/java/de/intevation/flys/client/shared/model/FixingsOverviewInfo.java: + New. Info object containing overview data and html representation. + + * src/main/java/de/intevation/flys/client/client/services/FixingsOverviewServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/FixingsOverviewService.java: + Updated interfaces. + + * src/main/java/de/intevation/flys/client/client/ui/fixation, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixGaugeSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixQSelectPanel.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixEventSelect.java, + src/main/java/de/intevation/flys/client/client/ui/fixation/FixPeriodPanel.java: + New. Panels for fixing analysis parameter. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Added new UI-Provider to factory. + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: + Modified the stylesheet to take a parameter containing a callback. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2012-05-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java: + Dynamically generate spec from artifact. TODO: Interfere with collection. + + * src/main/webapp/WEB-INF/config.yaml: Simplified a bit. + +2012-05-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MapHelper.java: + Added logger.isDebugEnable() as a condition for serializing + XML to the log. + + * src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java: + Evaluate 'uuid', 'minx', 'maxx', 'miny', 'maxy' and 'maptype' + from GET parameters. + +2012-05-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java: + New. Call the MapPrint of MapFish Print directly. This removes the + need of stupid passing around a complex JSON document to another servlet. + The generation of the PDF is done nearly the same way the ShellMapPrinter + works without the shell overhead. + + * src/main/webapp/WEB-INF/web.xml: Register new servlet and remove old + MapFish Print one. + + * src/main/webapp/WEB-INF/config.yaml: Fix some image refs. + +2012-05-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for linelabel theme property strings. + +2012-05-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Parse 'helpText' field in DESCRIBE document. + + * src/main/java/de/intevation/flys/client/shared/model/DataList.java: + Added an attribute 'helpText' to store an URL reference to an online help + page. + + * src/main/java/de/intevation/flys/client/client/ui/UIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + Defined and implemented a method to create a Canvas with a link to an + online help page. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Create the link to an online help page for each current parameter and + put it in front of the input panel. + + * src/main/java/de/intevation/flys/client/client/ui/ImgLink.java: Added an + attribute 'newTab' that could be used to open the link in a new tab + (HTML target='_blank'). + +2012-05-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Define order for linelabel theme properties. + +2012-05-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for linelabel theme property strings. + +2012-04-26 Sascha L. Teichmann + + * pom.xml: Added dependency to MapFish Print (http://www.mapfish.org/doc/print/) + License GPLv3. (This is okay, because we only use it via out-of-process calls). + + * src/main/webapp/WEB-INF/web.xml: Added servlet and servlet mapping. + + * src/main/webapp/WEB-INF/config.yaml: New. Just copied from MapFish config examples. + TODO: Adjust for out use case. + +2012-04-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added 'showlinelabel' i18n strings. + +2012-04-25 Raimund Renkert + + Issue 657. + + * src/main/java/de/intevation/flys/client/server/FileUploadServiceImpl.java: + New. Service to upload a base64 encoded file embedded in xml structure. + + * src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java: + Added upload form to the UI. + + * src/main/webapp/WEB-INF/web.xml: + Registered new servlet and added mapping. + + * pom.xml: + Added dependency apache commons fileupload. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2012-04-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/FixingsKMChartServiceImpl.java: + Use the XSL transform to render the overview. + + * src/main/java/de/intevation/flys/client/server/FixingsOverviewServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/FixingsOverviewServiceAsync.java: + Adjusted signature to pass locale, too. + + * src/main/java/de/intevation/flys/client/client/services/FixingsOverviewService.java: + Simplification. + + * src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl: New. Generates the + HTML table overview. + +2012-04-20 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/web.xml: Fixed incorrect servlet mapping. + +2012-04-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Fix imports. + +2012-04-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/FixingsOverviewServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/FixingsOverviewServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/FixingsOverviewService.java: + New. Stub for overview service to be called from JS side to generate the fixings + overview. + + * src/main/webapp/WEB-INF/web.xml: Registered new overview service. + +2012-04-19 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/FixingsKMChartServiceImpl.java: + New. Bridge fixings km chart requests from web to artefact server. The filters + have to be JSON encoded and passed in the the 'filter' parameter. + + src/main/webapp/WEB-INF/web.xml: Registered the new proxy servlet. + +2012-04-18 Felix Wolfsteller + + Improve km-Spinner behaviour, allow text input (alpha). + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java + (KmSpinner): Replaced Label by somewhat working TextItem. + +2012-04-18 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfoWindow.java: + Adjusted the layout. + +2012-04-18 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MapUrlServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ManualDatePointsEditor.java, + src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/MousePositionPanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java, + src/main/java/de/intevation/flys/client/client/ui/GaugeTimeRangePanel.java, + src/main/java/de/intevation/flys/client/client/ui/ImgLink.java: + Removed superflous imports. Some commented out because they are referenced + by a big commented out block. + +2012-04-18 Felix Wolfsteller + + Improve km-Spinner behaviour but regressing on input-possibility (no + direct text input possible). + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java + (KmSpinner): New inner class. + (createGrid): Use new inner class as experiment (old code commented). + +2012-04-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java + (closest): Fix bug that prevented that always the closest km was fetched. + +2012-04-18 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Open the ManualDatePointsEditor from context menu. + +2012-04-18 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Open the ManualDatePointsEditor from context menu. + +2012-04-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Cosmetics. + +2012-04-17 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Cosmetics. + +2012-04-17 Felix Wolfsteller + + Fix flys/issue462. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualDatePointsEditor.java: + (createUI): Avoid NPE when trying to format a NULL value). + +2012-04-17 Raimund Renkert + + Issue 494. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualDatePointsEditor.java: + New. Editor to create manual points from date and y value. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Use ManualDatePointsEditor to create new points. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for error message. + +2012-04-13 Raimund Renkert + + Issue 424. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Show folder icon for folder nodes with no children. + +2012-04-12 Raimund Renkert + + Issue 502. + + * src/main/java/de/intevation/flys/client/client/ui/chart/MousePositionPanel.java: + Dynamically create a label for each y axis in the chart. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Added getter for transformer count. + Update chart info on output parameter changed. + + * src/main/java/de/intevation/flys/client/shared/model/ChartInfo.java: + Added getter for transformer count. + +2012-04-11 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added missing i18n strings and removed duplicates. + +2012-04-11 Raimund Renkert + + Issue 492. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Added axis validation. Same values in fields 'from' and 'to' in axis + scale are not allowed. + +2012-04-11 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Fixed range input for 'W free'. + +2012-04-05 Raimund Renkert + + Issue 499. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Added panels for 'W free' input. Added validation for 'W free' input + values. + +2012-04-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + titles for WSPLGEN layer depths. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Improved the layout of the window; convert HTML string into a RGB color + if the type of a theme field is 'color'. + +2012-04-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Modified references to images. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/map/MeasureControl.java: + Explicitly disabled mouse over effects. + + * src/main/webapp/images/arrow_up.png, + src/main/webapp/images/hand.png, + src/main/webapp/images/mag_zoom_plus.png, + src/main/webapp/images/mag_zoom_back.png, + src/main/webapp/images/mag_zoom_box_Selected.png, + src/main/webapp/images/mag_100_Selected.png, + src/main/webapp/images/png_export_Selected.png, + src/main/webapp/images/svg_export.png, + src/main/webapp/images/arrow_first.png, + src/main/webapp/images/properties_Selected.png, + src/main/webapp/images/measure_line.png, + src/main/webapp/images/measure_plane.png, + src/main/webapp/images/mag_zoom_plus_Selected.png, + src/main/webapp/images/png_export.png, + src/main/webapp/images/info.png, + src/main/webapp/images/mag_glass.png, + src/main/webapp/images/save.png, + src/main/webapp/images/save_Selected.png, + src/main/webapp/images/pdf_export.png, + src/main/webapp/images/arrow_last.png, + src/main/webapp/images/mag_zoom_box.png, + src/main/webapp/images/arrow_down.png, + src/main/webapp/images/pdf_export_Selected.png, + src/main/webapp/images/mag_zoom_minus.png, + src/main/webapp/images/properties.png, + src/main/webapp/images/add_map_Selected.png, + src/main/webapp/images/mag_zoom_back_Selected.png, + src/main/webapp/images/info_Selected.png, + src/main/webapp/images/svg_export_Selected.png, + src/main/webapp/images/mag_100.png, + src/main/webapp/images/measure_line_Selected.png, + src/main/webapp/images/add_map.png, + src/main/webapp/images/measure_plane_Selected.png, + src/main/webapp/images/mag_zoom_minus_Selected.png: New icons. + + * src/main/webapp/images/addWMS.png, + src/main/webapp/images/theme_top.png, + src/main/webapp/images/zoom-in_Selected.png, + src/main/webapp/images/theme_up.png, + src/main/webapp/images/getFeatureInfo.png, + src/main/webapp/images/getFeatureInfo_Selected.png, + src/main/webapp/images/measureLine_Selected.png, + src/main/webapp/images/measurePolygon_Selected.png, + src/main/webapp/images/zoom-1.png, + src/main/webapp/images/zoom-back.png, + src/main/webapp/images/theme_bottom.png, + src/main/webapp/images/zoom-in.png, + src/main/webapp/images/zoom-out.png, + src/main/webapp/images/measureLine.png, + src/main/webapp/images/measurePolygon.png, + src/main/webapp/images/theme_down.png: Removed old icons (replaced by + new icons). + +2012-04-02 Ingo Weinzierl + + flys/issue556 (�SK: neues Projekt, wenn zuvor INFO-Button verwendet wurde) + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfoWindow.java: + Made window modal and display a modal mask. + +2012-03-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Take care on Nullpointers; the info button is not available in the + helper panel. + +2012-03-20 Raimund Renkert + + Issue 506. + + * src/main/java/de/intevation/flys/client/client/ui/GaugeTimeRangePanel.java: + The Panel now accepts dates and has a date chooser. + + * src/main/java/de/intevation/flys/client/shared/model/LongRangeData.java: + New. Datatype for long values. Used to store dates in ms. + + * src/main/java/de/intevation/flys/client/server/DataFactory.java: + Added method to create LongRangeData objects. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for error message. + +2012-03-20 Ingo Weinzierl + + flys/issue544 (Historische ATs: Eingabeunterst�tzung W/Q) + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactDescription.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultArtifactDescription.java: + Added new method for fetching specific data values and a method for + fetching the reference gauge number. + + * src/main/java/de/intevation/flys/client/client/ui/WQSimpleArrayPanel.java: + Added the WQ tables to the helper panel. + + +2012-03-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/GaugeInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/GaugeInfoService.java, + src/main/java/de/intevation/flys/client/client/services/GaugeInfoServiceAsync.java: + New service to fetch information of gauges for a specific river. + + * src/main/webapp/WEB-INF/web.xml: Registered the gauge info service. + +2012-03-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/GaugeImpl.java, + src/main/java/de/intevation/flys/client/shared/model/Gauge.java: New + model classes for gauges. + +2012-03-20 Felix Wolfsteller + + Last step for fix flys/issue618. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Do not enable spinner if theme is disabled. + +2012-03-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Make synchron navigation a per-theme option, not a global one. + +2012-03-20 Felix Wolfsteller + + Fix flys/issue462, hinted to by Raimund Renkert. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Changed location of reference selectbox to top, resolved i18n todos. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added and modified i18n strings. + +2012-03-20 Felix Wolfsteller + + Fix flys/issue462, hinted to by Raimund Renkert. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java + (createUI): Do not try to parse NULL values. + +2012-03-20 Ingo Weinzierl + + * flys/issue204 (W-INFO: Wasserspiegellagenberechnung / Layout Auswahlunterst�tzung Q/W/D) + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added and modified i18n strings. + + * src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java, + src/main/java/de/intevation/flys/client/client/ui/wq/WTable.java: + Renamed value columns. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Renamed tab titles for W/Q/D tables. + +2012-03-19 Ingo Weinzierl + + * src/main/webapp/WEB-INF/wms-services.xml: More WMS services configured. + +2012-03-16 Raimund Renkert + + Issue 493. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Create an empty element for the symbol property. + +2012-03-16 Ingo Weinzierl + + * Tagged module as 'pre2.7-2012-03-16'. + +2012-03-15 Raimund Renkert + + Issue 630. + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Added input helper panel to wq selection. + +2012-03-14 Raimund Renkert + + Issue 508. + + * src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java: + Added service to load a list of WMS services and show this list in a + combobox. + + * src/main/java/de/intevation/flys/client/server/MapUrlServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/MapUrlService.java, + src/main/java/de/intevation/flys/client/client/services/MapUrlServiceAsync.java: + New. Service to load a list of WMS services. + + * src/main/webapp/WEB-INF/wms-services.xml: + New. Config file containing the list of WMS services. + + * src/main/webapp/WEB-INF/web.xml: + Added new service. + +2012-03-13 Raimund Renkert + + Issue 514. + + * src/main/java/de/intevation/flys/client/client/ui/LocationPicker.java: + Remove filter if selection changes from description to range. + +2012-03-13 Raimund Renkert + + Issue 616. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Only append the synchron navigation item to context menu if the theme + is a cross section. + +2012-03-08 Raimund Renkert + + Issue 563. + + * src/main/java/de/intevation/flys/client/client/ui/Toolbar.java: + Set overflow to 'auto'. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added resize handler to increase or decrease the height if a scrollbar + is visible. + +2012-03-08 Raimund Renkert + + Issue 553. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapPositionPanel.java: + Cut the last 3 digits. + +2012-03-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings used in the floodmaps section of the datacage. + +2012-03-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Deactivate GetFeatureInfo tool when activating Measure tool and reverse. + +2012-03-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/GFIServiceImpl.java: + Suppress adding superflous colons during GetFeatureInfo URL creation. + Now, GetFeatureInfo requests with one layer only are queryable. + +2012-03-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Deactivate GetFeatureInfo button if another toggle button is pressed. + +2012-03-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Removed the last column (at the right border) of the project list which + has been a placeholder for a scrollbar. + +2012-03-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Removed the last column (at the right border) of those theme panels. + +2012-03-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added I18N string for 'dems' (digital elevation models). + +2012-03-02 Felix Wolfsteller + + Partial Fix flys/issue624 (removing cross section does not remove it + from select box). + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java + (removeThemes): Extracted to be able to override. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java + (removeThemes): Overridden to also remove theme from select box. + This has side effects though (TODO). + +2012-03-02 Felix Wolfsteller + + Fix flys/issue621 (areas against deleted themes.) + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Do not include deleted themes in menu. + +2012-03-01 Ingo Weinzierl + + flys/issue557 (�SK: Fl�chenmessung --> Tooltip falsch) + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Fixed wrong i18n string used for tooltip. + +2012-03-01 Ingo Weinzierl + + flys/issue558 (�SK: Farb�nderung in Karte / keine �nderung in der Themenliste) + + * src/main/java/de/intevation/flys/client/shared/MapUtils.java: Append the + current time millis at the end of the GetLegendGraphic URL to trick the + caching mechanisms. + +2012-03-01 Ingo Weinzierl + + flys/issue555 (�SK: Info-Button) + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfo.java: + Close old GetFeatureInfoWindows before creating new ones. + +2012-03-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/ThemeList.java: New + method getActiveThemes() that returns the active themes only. + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfo.java: + Query GetFeatureInfo for active layers only! + +2012-03-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Removed the Collection's UUID from title. + +2012-03-01 Raimund Renkert + + Issue 572. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Catch the header double click event and do nothing, do not allow field + reorder and resized style row. + +2012-03-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added message for datacage window. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Display better message for an empty datacage. + +2012-03-01 Raimund Renkert + + Fixed Issue 498. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Do not return 'null' if no settings are available. Returning 'null' + discards theme attributes! + +2012-03-01 Felix Wolfsteller + + Fix flys/issue613 (points too big to play perfectly with other legend + items). + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Restrict point size. Add intermediate levels instead. + +2012-02-17 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Renamed state data fields: wq_mode -> wq_isq + wq_free -> wq_isfree + wq_selection -> wq_isrange + Removed some logs. + +2012-02-17 Ingo Weinzierl + + flys/issue459 (Diagramm-Export hat nicht die gleiche Axenskalierung wie + Diagramm-Ansicht) + + * src/main/java/de/intevation/flys/client/client/ui/ImgLink.java: Added a + method setSource() that allows to reset the url of the export. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Implements ZoomHandler to update the export url of PNG, PDF and SVG + download links. This is necessary to take the current zoom information + into account. + +2012-02-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Removed the server URL provided by Config. The URL is no longer + required since it is configured in web.xml. + +2012-02-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java: + Print debug messages for zoom values. + +2012-02-16 Raimund Renkert + + Refactored the wq input data fields. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Refactored the wq input data fields. The data fields wq_mode, wq_free + and wq_selection are now of type 'boolean'. + +2012-02-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Modified german translation of qps in floodmap's datacage panel. + +2012-02-14 Sascha L. Teichmann + + Another partial fix/workaround for flys/issue499. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + _DIRTY_ hack to be able to enter values for "W am Pegel". + The validator should check against min W / max W of the gauge + where the start km is in. + We currently assume hard coded that the have to be between + 0 and 100000. + +2012-02-13 Sascha L. Teichmann + + Another partial fix/workaround for flys/issue499. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + _DIRTY_ hack to be able to enter values for "W auf freier Strecke". + We need to get the interpolated min/max Ws at the start km to do + proper validation. + We currently assume hard coded that the have to be between + 0 and 100000. + +2012-02-13 Sascha L. Teichmann + + Client side fix for flys/issue499. There is an server issue, too. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Send W/Q mode WQ_FREE if calculating "W auf freier Strecke." + +2012-02-09 Felix Wolfsteller + + Fix flys/issue481 (i18n: Datenkorb). + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added translations some datacage entities. + +2012-02-09 Raimund Renkert + + Reactivated the Enterprise Blue theme. + + * src/main/java/de/intevation/flys/client/FLYS.gwt.xml: + Inherit the Enterprise Blue Theme. + + * src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/map/ElevationWindow.java, + src/main/java/de/intevation/flys/client/client/ui/Toolbar.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageButton.java: + CloseClientEvent was renamed to CloseClickEvent. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Adjusted icon path. + + * pom.xml: + Added dependency for smartgwt-2.5-patch containing changes for Enterprise + Blue Theme. + +2012-02-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/MultipleLocationPanel.java: + Cosmetics, renamed local 'values' variables to avoid confusion with + values field from superclass. + + * src/main/java/de/intevation/flys/client/client/ui/LocationPanel.java: + Cosmetics. + +2012-02-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/MultipleLocationPanel.java: + Allow selection of more than one location via clicks to the + locationpicker. + + * src/main/java/de/intevation/flys/client/client/ui/LocationPanel.java: + Initialize values in constructor. + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Minor cosmetics. + +2012-02-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/shared/DoubleUtils.java: + (fill,copyOf): Pendant to java.util.Arrays, which misbehaves with + GWT. + +2012-02-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/LocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/MultipleLocationPanel.java: + Minor refactoring, cosmetics and documentation. + Also use translated data item name as label instead of fixed + "location" string. + +2012-02-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added translations for reference curve state data. + +2012-02-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Cosmetics. + +2012-02-08 Felix Wolfsteller + + New UIProvider to enter multiple locations (so far only via keyboard). + + * src/main/java/de/intevation/flys/client/client/ui/MultipleLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/LocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Refactored. New UIProvider does allow and provide multiple values, + which are whitespace separated in data item. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Serve the new UIProvider if somebody orders it. + +2012-02-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + missing translation for "waterlevels" used in the datacage window. + +2012-02-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/NumberAxis.java, + src/main/java/de/intevation/flys/client/shared/model/DateAxis.java: + Removed obsolete includes. + +2012-02-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/ReportServiceImpl.java: + Prefix error message for a certain km with 'KM'. + +2012-02-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + missing translation for "columns" used in the datacage window. + +2012-02-08 Ingo Weinzierl + + flys/issue482 (i18n: UPPER ERROS bei Historischen Abflusskurven) + + * src/main/java/de/intevation/flys/client/client/ui/RangePanel.java: + Defined new abstract methods to determine the max lower and upper + values. Implemented the validate() method which now shows i18n error + messages. + + * src/main/java/de/intevation/flys/client/client/ui/IntegerRangePanel.java: + Implemented the methods to determine the max lower and upper values. + +2012-02-08 Felix Wolfsteller + + Partial fix flys/issue471. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Treat as manual points every theme that ends as manualpoints. + +2012-02-07 Raimund Renkert + + Issue 473. Manual point input is now localized. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Added formatter and parser for 'X' and 'Y' values and return 'false' in + 'isDialogValid' if the grid contains any errors. + +2012-02-07 Ingo Weinzierl + + * src/main/webapp/WEB-INF/web.xml: Reverted port 8182 to 8181 which is the + default port of artifact-server. + +2012-02-06 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/GaugeTimeRangePanel.java: + New. Shows the integer input fields and a helper table containing discharge + informations. + + * src/main/java/de/intevation/flys/client/client/ui/range/DischargeInfoDataSource.java: + New. Data source container for discharge infos. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Create a GaugeTimeRangePanel. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for table header. + +2012-02-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + I18N for Reference Curve export. + +2012-02-06 Raimund Renkert + + Added service to request discharge infos at a specific gauge. + + * src/main/java/de/intevation/flys/client/client/services/DischargeInfoService.java, + src/main/java/de/intevation/flys/client/client/services/DischargeInfoServiceAsync.java: + New. Interfaces for new service. + + * src/main/java/de/intevation/flys/client/server/DischargeInfoServiceImpl.java: + New. Service implementation. + + * src/main/java/de/intevation/flys/client/server/DischargeInfoXML.java: + New. Service to request the discharge infos and provide the data via servlet + to a data source object. + + * src/main/java/de/intevation/flys/client/shared/model/DischargeInfoObject.java, + src/main/java/de/intevation/flys/client/shared/model/DischargeInfoObjectImpl.java: + New. Interface and implementation for objects containing discharge infos. + + * src/main/webapp/WEB-INF/web.xml: + Added entries for discharge info servlets and servlet mappings. + +2012-02-06 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + I18N for "Reduzierte Bezugslinie". + +2012-02-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/Transform2D.java: A + Transform2D object now knows about the type of x and y axis and implements + a method format() that returns an 2dim string array with formatted values + for x and y axis. + + * src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java: + Read x and y axis type for transformation matrix and create new + Transform2D instances with these information. This allows the Transform2D + object to format date values as well. + + * src/main/java/de/intevation/flys/client/client/ui/chart/MousePositionPanel.java: + Don't format x and y values itself - let Transform2D do this. + +2012-02-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Axis.java: Axis is an + interface now. The code moved to NumberAxis which should be the default + Axis. + + * src/main/java/de/intevation/flys/client/shared/model/NumberAxis.java: New. + This axis stores the parameter min, max, from and to as double values. + + * src/main/java/de/intevation/flys/client/shared/model/DateAxis.java: New. + This axis stores the parameter min, max, from and to as long values. These + values represent the miliseconds until January 1, 1970. + + * src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java: + Create new DateAxis instances if the axis type is set to "date". In this + case, the parameters from, to, min and max are parsed as Long values. The + default is to create new instances of NumberAxis and to parse those values + as Double. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/shared/model/ZoomObj.java: Save + the zoom values as Number. + +2012-02-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + i18n string for the export button of historical discharge curves. + +2012-02-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DataFactory.java: Read + double values inserted for doublearray data types. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Create new instances of DoubleArrayData if the data type is "doublearray". + + * src/main/java/de/intevation/flys/client/shared/model/DoubleArrayData.java: + Do no longer subclass DefaultData but implement the whole stuff we need + for a Data class. + + * src/main/java/de/intevation/flys/client/shared/model/IntegerArrayData.java: + Added a method getValues() that returns the raw int values as array. + + * src/main/java/de/intevation/flys/client/client/ui/WQSimpleArrayPanel.java: + Display the W/Q input values in createOld(). + +2012-02-03 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java, + src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java, + src/main/java/de/intevation/flys/client/client/ui/LocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Removed superfluous imports. + +2012-02-03 Felix Wolfsteller + + Improvements in relation to reference curves. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Parse min/max values. + + * src/main/java/de/intevation/flys/client/shared/model/DoubleRangeData.java: + New. + + * src/main/java/de/intevation/flys/client/client/ui/LocationPanel.java: + Refactored to use data item name as given (take first). + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Exploit former refacorisation. + +2012-02-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Added TODO and create defaultdata for unknown typed dynamic data. + +2012-02-03 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java + (createDataArray): Helper. + + * src/main/java/de/intevation/flys/client/client/ui/LocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Extracted new LocationPanel class to ease code-reuse. + +2012-02-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/LocationPicker.java: + Amateurly extracted Input-Helper-related code to ease code re-use. + +2012-02-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Removed obsolete import. + +2012-02-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java, + src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Removed obsolete imports. + +2012-02-02 Raimund Renkert + + Issue 466: CSV export for chart themes. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added button for CSV download. + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java: + Added 'csv' as export format. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added path for csv export icon. + +2012-02-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/DataFactory.java, + src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + Cosmetics. + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Cosmetics, removed MESSAGES, use super.MSG instead, comments, minor + refactoring. + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Cosmetics. + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n title for 'reference curve' output. + +2012-02-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n title for 'historical discharge curve' output. + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Changed wording. + +2012-02-01 Ingo Weinzierl + + flys/issue469 (I18N der Zahlen Parameterisierung (z.B. Orte)) + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Display the I18N location string in createOld(). + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + javadoc. + +2012-02-01 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Avoid NPEs when a theme is null (which should not happen anyways). + +2012-01-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/IntegerRangeData.java: + Create a label "min - max" for the DataItem returned by getItems(). + +2012-01-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQSimpleArrayPanel.java: + Finished implementation of createOld(); + +2012-01-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DoubleArrayData.java, + src/main/java/de/intevation/flys/client/shared/model/StringData.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerData.java: + New. Subclasses of DefaultData. They are currently used to distinguish + them during UI creation. + + * src/main/java/de/intevation/flys/client/shared/model/IntegerOptionsData.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerArrayData.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerRangeData.java: + Added a static TYPE field. + + * src/main/java/de/intevation/flys/client/server/DataFactory.java: Added + further methods to create concrete Data instances for specific data types. + +2012-01-31 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Fix strange "javascript-npes" which occurred when clicking and + pressing enter too fast. + +2012-01-31 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Added documentation, minor cleanup. + Added KeyPressHandler to km-spinnerItem, lose focus on + Enter-KeyPress. + +2012-01-31 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Refactored und introduces a temproray regression: Update only when + losing the focus (not on click or enter- press). + +2012-01-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DataFactory.java: New. + This class should be used to create new Data instances. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Use DataFactory to create new Data instances for the old Data objects + contained in the static ui part of the Artifact's DESCRIBE document. + +2012-01-30 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Adjusted table height to fill the window. + +2012-01-30 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Get the axes name from collection settings and use them as header. + +2012-01-30 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Use outputmodes name to handle manual points on a per-chart basis. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Pass outputmode name to ManualPointEditor. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/OutputTab.java: + Add accessor to outputmode. + +2012-01-30 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Show count of hits in filtered input helper tables. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string. + +2012-01-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/RangeData.java: + Added getDefaultLower() and getDefaultUpper() methods. + + * src/main/java/de/intevation/flys/client/shared/model/IntegerRangeData.java: + Added a new constructor that takes default values for min and max and + implemented the getDefaultLower() and getDefaultUpper() methods. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Read default values for min and max data items from DESCRIBE document. + + * src/main/java/de/intevation/flys/client/client/ui/RangePanel.java: + Initialize the min and max field with default values provided by + RangeData's getDefaultLower() and getDefaultUpper() methods. + +2012-01-30 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Added basic validation of entered values at a higher level. Removed + TODOs, cosmetics. + +2012-01-30 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Set activity field to 'active' by default. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Added dummy handling for new boolean 'active' flag of each point. + Refactoring. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added translations for manual points related words. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Added basic validation and improved editing function to manual point + editor. Minor refac. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Made previously entered values edit- and removable, added TODOs. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Docu-waitforit-mentation. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added translations for manual points related words. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Added context menu to open point editor from themepanel. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added accidentally ommitted german translation, use key when + building ui. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Invested 2 seconds after losing 3. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Refactored to not hold own reference to Collection, always use Views + one instead. + +2012-01-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQSimpleArrayPanel.java: + Implemented the first part of createOld(). TODO: display selected data. + +2012-01-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/RangeData.java: New + interface for ranges that declares two methods getUpper() and getLower(). + + * src/main/java/de/intevation/flys/client/shared/model/IntegerRangeData.java: + Subclasses RangeData. + + * src/main/java/de/intevation/flys/client/client/ui/RangePanel.java: + Implemented the createOld() method. + + * src/main/java/de/intevation/flys/client/client/ui/IntegerRangePanel.java: + Cast objects returned by IntegerRangeData's getLower() and getUpper() + method to Integer. The signature of both methods have changed slightly. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added i18n for points-button. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Transfer name of points. + Resolved various i18n TODOs. + Minor layout improvement. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added translations for manual points related words. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Pass updated collection to ManualPointsEditor, like this freshly + added points are visible when opening the editor next time. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Cosmetics, docs. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Fire RedrawRequest when finished adding points. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Register RedrawRequestHandler with ManualPointsEditor. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Cosmetics, removed obsolete imports. + +2012-01-27 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + Cosmetics. + +2012-01-26 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for PDF export button. + +2012-01-26 Felix Wolfsteller + + Added basic UI to enter 'manual points'. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ManualPointsEditor.java: + New. UI to enter and modify manual points. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Modified constructor to avoid passing unused parameters, instantiate + ManualPointsEditor on users command. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Reflect change in ChartToolbars constructor. + (getView): New. + +2012-01-26 Felix Wolfsteller + + In preparation of 'manual points' feature, opened Collection + interface. + + * src/main/java/de/intevation/flys/client/shared/model/Collection.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java: + (getItem): Pick CollectionItem by identifier. + +2012-01-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/shared/model/Recommendation.java: + Fix typo, doc. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java, + src/main/java/de/intevation/flys/client/client/ui/PropertyEditor.java: + Cosmetics. + +2012-01-25 Raimund Renkert + + Issue 265. + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Added method to activate/deactivate scale line. The method removes the + control on deactivation and adds the control on activation. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Implements TabSelectedHandler now. If the tab is selected, the scale line + and measure control are deactivated. Scale line is activated if the tab is + selected. + +2012-01-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Fix typo, more stub for add points ui. + +2012-01-25 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + (adjustImageButton): Extracted/Refactored. Laid minimal groundstep + for adding points ui. + +2012-01-24 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Suppress onCollectionChange event if an artifact is added to the collection + to avoid loading maps twice. The event is triggered by the + describeCollection call. + +2012-01-24 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Added filter implementation for input helper tables. + +2012-01-24 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Added filter criterion and clear filter on tab selection changed and + input mode changed. + +2012-01-24 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Apply the filter input on the tables. + + * src/main/java/de/intevation/flys/client/client/ui/RangeTableFilter.java: + Added validator to the input fields. Validates data on key up event. + + * src/main/java/de/intevation/flys/client/client/event/RangeFilterEvent.java: + Use Float as data type instead of String. + + * src/main/java/de/intevation/flys/client/client/utils/DoubleValidator.java: + Return false if the FormItem is null. + +2012-01-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Added UI for the simple case of the "Bezugslinienverfahren" ("W auf freier Strecke"). + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties: + Adjusted i18n. + +2012-01-23 Raimund Renkert + + Added UI parts and event for filtering distances and locations. + + * src/main/java/de/intevation/flys/client/client/ui/RangeTableFilter.java: + New. Creates textitems for user input. + + * src/main/java/de/intevation/flys/client/client/event/RangeFilterEvent.java: + New. The range filter events contains the 'from' and 'to' value. + + * src/main/java/de/intevation/flys/client/client/event/FilterHandler.java: + Added new filter criteria changed method. + + * src/main/java/de/intevation/flys/client/client/ui/TableFilter.java: + Set the textitem width to a fix value. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Added UI parts to Panels. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Empty implementation for range filter event. The project list has no + ranges to filter. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for new filter. + +2012-01-20 Raimund Renkert + + Add cross sections loaded from datacage to the master artifacts list. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Overrides updateGrid() to update the list of master artifacts, too. + +2012-01-20 Felix Wolfsteller + + Fix flys/issue458 (typo). + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Fix typo in key for translation. + +2012-01-20 Raimund Renkert + + Set the empty facet to invisible. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Hide empty facets in theme list. + +2012-01-20 Raimund Renkert + + Added new artifact to be able to open existing 'new chart' projects. + + * src/main/java/de/intevation/flys/client/shared/model/ChartArtifact.java: + New. Artifact for 'new chart' module. + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + Create a ChartArtifact if the artifact name equals 'new_chart'. + +2012-01-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQSimpleArrayPanel.java, + src/main/java/de/intevation/flys/client/client/ui/RangePanel.java: Removed + useless imports. + +2012-01-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQSimpleArrayPanel.java: + New. This widget allows choosing between W/Q mode and inserting values as + array. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added labels for historical WQ selection used in WQSimpleArrayPanel. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Create new instances of WQSimpleArrayPanel if ui provider is set to + 'wq_simple_array'. + +2012-01-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/IntegerOptionsData.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerArrayData.java: + New Data types for better handling of options (radio buttons) and integer + arrays. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Create new instances of IntegerOptionsData if the type is 'intoptions' and + new instances of IntegerArrayData if type is 'intarray'. + +2012-01-19 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Read river from artifact description in state.chart.river to be able + to load the list of locations. + +2012-01-19 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Set the collection if all recommended artifacts are loaded or the + collection has no recommended artifacts. + +2012-01-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/IntegerRangeData.java: + Modified getItems(): it will now return a single DataItem which value + consists of the min and max value seperated by a ';'. + + * src/main/java/de/intevation/flys/client/client/ui/TimerangePanel.java: + Removed, because there is no time relevant code here. All code has moved + to IntegerRangePanel. + + * src/main/java/de/intevation/flys/client/client/ui/IntegerRangePanel.java: + Added new methods getLowerAsInt() and getUpperAsInt() and setMaxLower() + and setMaxUpper() from TimerangePanel. Furthermore, the still missing + getData() method has been implemented. It returns a single + IntegerRangeData object. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Create new instances of IntegerRangePanel if the ui provider is set to + 'intrange'. + + * src/main/java/de/intevation/flys/client/client/ui/RangePanel.java: The + range panel stores the data name now and has new methods that return the + lower and upper value. + +2012-01-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/RangePanel.java: New. + This panel allows inserting two values (min and max) for ranges. It is + abstract, so concrete subclasses are required. + + * src/main/java/de/intevation/flys/client/client/ui/IntegerRangePanel.java: + New. A subclass of RangePanel that allows inserting an integer range. + + * src/main/java/de/intevation/flys/client/client/ui/TimerangePanel.java: + New. A subclass of IntegerRangePanel that requires an IntegerRangeData + object to set the min and max values for the range. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Create new instances of TimerangePanel if the ui provider is set to + 'timerange'. + +2012-01-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/IntegerRangeData.java: + New. This Data instance is used to save data objects with an integer + range. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Create new instances of IntegerRangeData if the data type is 'intrange'. + +2012-01-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + Repaired MapArtifact creation: create new instances of this type if the + name of the Artifact (provided in the DESCRIBE document) equals + 'new_map'. The internal name of the MapArtifact has changed in the last + commits. + +2012-01-13 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Renamed new chart module. + +2012-01-13 Felix Wolfsteller + + Implemented synchronous navigationi of cross section profiles.. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added translation for synchronous navigation. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Allow switching of manyfeed/synchronous navigation via context menu. + +2012-01-13 Felix Wolfsteller + + Added feedMany() function to FeedService to feed multiple artifacts + at once. + + * src/main/java/de/intevation/flys/client/client/services/FeedService.java, + src/main/java/de/intevation/flys/client/client/services/FeedServiceAsync.java, + src/main/java/de/intevation/flys/client/server/FeedServiceImpl.java: + (feedMany): New. Still issue single feeds per artifact but with only + one async callback. + +2012-01-13 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java: + Doc added. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Cosmetics, doc. + +2012-01-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/MapArtifact.java, + src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Changed the visible i18n strings for module 'new map.' + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for module 'new map'. + +2012-01-12 Raimund Renkert + + Issue451. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Load and add all recommendations together in one async request using + the LoadArtifactService. This is a better way to avoid loading + multiple map tabs and reduces the amount of async requests. + +2012-01-12 Felix Wolfsteller + + Partial flys/issue441 (Fl�che �ber HSQ (zweite Achse) verkehrt). + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Adjust data content to what is expected on server side (to allow + unique identification of facets). + +2012-01-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/MapArtifact.java: + New. Map artifact for module 'new map'. The artifact allows to open an + existing map project. + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + Create a new map artifact if the artifact name is 'map'. + +2012-01-12 Raimund Renkert + + Issue451. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Added recommendations queue. The queue avoids loading more than one + map output tab. + +2012-01-11 Felix Wolfsteller + + Partial flys/issue439 (Streckenfavoriten lassen sich nicht �ber den + Datenkorb hinzuladen) + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added "annotation" translation. + +2012-01-11 Raimund Renkert + + * src/main/java/de/intevation/flys/client/server/MapOutputServiceImpl.java: + Find the output mode in collection to request the correct map. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for error message. + +2012-01-11 Raimund Renkert + + Issue 435. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Changed request redraw event parameter from 'RESET' to 'DEFAULT'. + +2012-01-11 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Fixed initial boolean value setting. + +2012-01-11 Raimund Renkert + + Improved validation and property handling. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Changed the way of validating and setting values. + + * src/main/java/de/intevation/flys/client/client/utils/Validator.java, + src/main/java/de/intevation/flys/client/client/utils/DoubleValidator.java, + src/main/java/de/intevation/flys/client/client/utils/IntegerValidator.java: + Changed the validator to an interface and removed the ChangedHandler + implementation. The concrete validators implement the new interface. + + * src/main/java/de/intevation/flys/client/shared/model/PropertySetting.java, + src/main/java/de/intevation/flys/client/shared/model/BooleanProperty.java, + src/main/java/de/intevation/flys/client/shared/model/DoubleProperty.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerProperty.java, + src/main/java/de/intevation/flys/client/shared/model/StringProperty.java: + The concrete property classes return the appropriate value type for + better handling. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Set the values via toString() to describe document. + +2012-01-09 Raimund Renkert + + Issue 358. + + * src/main/java/de/intevation/flys/client/client/utils/DoubleValidator.java: + Added method to convert double values to a protocoll conform string. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Convert double values to i18n conform strings. + +2012-01-09 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Fixed initial values of boolean properties. + +2012-01-09 Raimund Renkert + + Implemented the validators more object oriented. + + * src/main/java/de/intevation/flys/client/client/utils/Validator.java: + Removed the concrete validate methods. + + * src/main/java/de/intevation/flys/client/client/utils/DoubleValidator.java, + src/main/java/de/intevation/flys/client/client/utils/IntegerValidator.java: + New. Implemented concrete validators. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Use the new validators to validate the input values. + +2012-01-09 Raimund Renkert + + Issue 433. Allways load original chart settings when opening the dialog. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Clone the settings object and set the original values while initializing + the dialog. + + * src/main/java/de/intevation/flys/client/shared/model/Property.java, + src/main/java/de/intevation/flys/client/shared/model/PropertySetting.java, + src/main/java/de/intevation/flys/client/shared/model/PropertyGroup.java, + src/main/java/de/intevation/flys/client/shared/model/BooleanProperty.java, + src/main/java/de/intevation/flys/client/shared/model/DoubleProperty.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerProperty.java, + src/main/java/de/intevation/flys/client/shared/model/StringProperty.java, + src/main/java/de/intevation/flys/client/shared/model/OutputSettings.java: + Made the properties and settings classes cloneable. + + * src/main/java/de/intevation/flys/client/shared/model/Collection.java: + Added a method of DefaultCollection to the interface. + +2012-01-09 Raimund Renkert + + Issue 358. Validate dialog on accept. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Validate all forms before updating the chart. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for error message. + +2012-01-09 Raimund Renkert + + Issue 358. Axis range fix. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Changed 'from' and 'to' fields for axis fixation. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Changed i18n strings for 'from' and 'to'. + +2012-01-09 Raimund Renkert + + Issue 358. Validation. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Added validator to integer and double field items. + + * src/main/java/de/intevation/flys/client/client/utils/Validator.java: + New. Validator for SmartGWT FormItems. Currently validates integer and + double values. + +2012-01-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Survive if no style for given Facet exists, notify user. + +2012-01-06 Ingo Weinzierl + + flys/issue196 (i18n/l10n: Zahlenformate einheitlich) + + * src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java, + src/main/java/de/intevation/flys/client/client/ui/wq/WTable.java: Set a + CellFormatter for the W/Q/D columns that localizes the double values. + +2012-01-06 Felix Wolfsteller + + flys/issue442 (i18n: Datenkorb: flood-protections) + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added "flood_protection" translation. + +2012-01-04 Felix Wolfsteller + + Adjusted the 'master' and 'km' mechanisms of CrossSections to + server-side changes, set stepwidth of spinner to hektokilometer. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Do not need to sendFeed for km/master setting, set spinners + stepwidth to hektokilometer. + +2012-01-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Added support for multiple point sizes. + +2012-01-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings used in the theme editor. + +2012-01-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/UserCollectionsServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/UserCollectionsServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/UserCollectionsService.java, + src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Removed unused Config.getServerUrl() calls. + +2012-01-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings displayed in the theme editor. + +2012-01-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Set with of DoubleRangePanel to 400. + +2012-01-02 Ingo Weinzierl + + flys/issue302 (Uncaught exception wenn bei Wasserspiegellage-Berechnung kein W/Q angegeben wird) + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java: + Catch a NumberFormatException in validateForm() and return in such cases + false for an invalid DoubleRangePanel. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: Catch + NullPointerExceptions when fetching from, to and step values from + DoubleRangePanel. Use DoubleRangePanel.validateForm() (with no parameters) + to validate the DoubleRangePanel correctly. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added errors/warnings. + +2012-01-02 Felix Wolfsteller + + Added and fixed translations of theme style properties. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + and fixed translations of theme style properties. + +2012-01-02 Ingo Weinzierl + + flys/issue431 (Karte: Hinzuladen externer WMS Layer nicht m�glich) + + * src/main/java/de/intevation/flys/client/server/CapabilitiesParser.java: + Added support for WMS 1.3.0: the projection's are defined in a + element instead of in version 1.1.0. + +2012-01-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CapabilitiesParser.java: + The URL to a Capabilities document is determined by a string property + "test.wms" in main(). + + * src/main/java/de/intevation/flys/client/shared/model/WMSLayer.java, + src/main/java/de/intevation/flys/client/shared/model/Capabilities.java: + Override toString(). + +2012-01-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java: + Improved the TableDataPanel, so that it is able to support CSV exports + with more that 5 columns. In addition, a small performance optimization + has been done: the Locale and the NumberFormat is created outside the loop + that walks over all rows. + +2011-12-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Introduced fields and methods to support free Q values. This panel now + has the cases: + 1) W array input + 2) W range input + 3) Q array input + 4) Q range input + 5) Q free array input + 6) Q free range input + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Set widt=-1 and height=-1 for exports. This allows the server to + distinguish between a chart export (as PNG, PDF and SVG) and the display + in the UI. + +2011-12-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings for the chart properties dialog's export section. + +2011-12-23 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Update chart if properties are changed successfully. + +2011-12-23 Raimund Renkert + + * src/main/webapp/images/properties.gif: + Modified icon background to transparent. + +2011-12-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CSVExportServiceImpl.java: + Skip empty lines. + +2011-12-22 Raimund Renkert + + Issue 427. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Changed visible strings in editor window to i18n strings. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for editor window. + +2011-12-22 Raimund Renkert + + Save output settings. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Create the XML elements for output settings. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Added handler to UI elements and call CollectionAttributeService to save the + new settings. + + * src/main/java/de/intevation/flys/client/shared/model/PropertySetting.java: + Fixed typo. + +2011-12-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CSVExportServiceImpl.java: + This service now skips lines that begin with a "#". This character is + used in FLYS as the beginning of a comment line. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Refactored, use string constant. + Uncommented some code paths and mark with todo, as they lead to + not yet well-understood side-effects. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java + (artifactReference, dataOf): Extracted and use new helper. + (CROSS_KM): Extracted and use static string. + (findCurrentCSMaster): Set km of collectionviews master. + Resolved some todos. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Set CollectionView in constructor. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/shared/model/ThemeList.java: + (getTheme): New, search theme(s) with uuid. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + When changing cross-section-masters kilometer in cross sections, + also feed the collection-master-artifact with the kilometer, so that + it can be displayed in the diagrams subtitle. + +2011-12-22 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Introduce CollectionView to all ChartPanel types. + +2011-12-21 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Renamed 'Master' to 'CSMaster' to avoid confusion between + MasterArtifact of Collection, CrossSection Master and Master of the + Universe. + +2011-12-21 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Fix over axis case, added new "over axis" menu item. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added translation for new menuitem. + +2011-12-21 Raimund Renkert + + * src/main/webapp/FLYS.css: + Added style for properties dialog axis tab. + +2011-12-21 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Changed i18n strings. + +2011-12-21 Raimund Renkert + + * src/main/webapp/images/properties.gif: + New. Added properties dialog icon. + +2011-12-21 Raimund Renkert + + Create the properties dialog dynamically. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Create the content based on the properties read from describe collection + document. + + * src/main/java/de/intevation/flys/client/shared/model/PropertyGroup.java: + Added getter for single property by name. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2011-12-20 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/Collection.java: + Added setter for settings. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java: + Ensure the settings is not null. + + * src/main/java/de/intevation/flys/client/shared/model/OutputSettings.java: + Ensure the categories object is not null. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Extract and parse the output settings. + +2011-12-20 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/PropertySetting.java, + src/main/java/de/intevation/flys/client/shared/model/PropertyGroup.java, + src/main/java/de/intevation/flys/client/shared/model/Property.java, + src/main/java/de/intevation/flys/client/shared/model/StringProperty.java: + Removed code for UI generation. SmartGWT classes are not usable on + serverside and in model classes. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Feed artifact with new area.between parameter, fix inversed + assignment of 'over' and 'under'. + +2011-12-20 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/BooleanProperty.java, + src/main/java/de/intevation/flys/client/shared/model/DoubleProperty.java, + src/main/java/de/intevation/flys/client/shared/model/IntegerProperty.java: + New. Property classes for outup settings. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Add other.wkms to list of area-compatible facets. + +2011-12-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Adapted the seperator character which is used to devide Ws and Qs (this + character has changed in flys-artifacts). + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Removed obsolete imports. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Minor refactoring to reuse existing code. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Add area-context menus. Most duplicate of code in + CrossSectionChartThemePanel, which will be merged in near future. + +2011-12-20 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + area-creation related strings and their translation. + +2011-12-20 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Minor, picky cosmetics. + +2011-12-20 Felix Wolfsteller + + Changed area-creation gui (menu) to cover three basic area modes + under, over and between. Feed new area.facet data understood by + area artifact to discern which diagram we are talking about. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Create different context menu to create area artifacts, feed + area.facet data item to area artifact. + +2011-12-19 Felix Wolfsteller + + Restore functionality of hand-sorted properties in style dialog, + which was removed by last commit. Carry better variable naming + and feature of displaying not-whitelisted properties over. + Added comment to prevent other people from "optimizing". + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Add properties in defined order. Add properties that do not occur + in ordered list last. + +2011-12-19 Felix Wolfsteller + + Minor refactoring to ease addition of new (theme-style) settings. + + * src/main/java/de/intevation/flys/client/shared/model/Style.java: + Added getter for list of settings. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Minor renaming, consume list instead of whitequerying entries. + +2011-12-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java, + src/main/java/de/intevation/flys/client/shared/model/PropertySetting.java, + src/main/java/de/intevation/flys/client/shared/model/OutputSettings.java, + src/main/java/de/intevation/flys/client/shared/model/Property.java, + src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Removed unused imports. + +2011-12-19 Ingo Weinzierl + + flys/issue409 (�berschwemmungsfl�che: Reihenfolge in Themenliste nicht immer synchron mit Rendering) + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: Added + a addLayer() method which should be used to add new layers to the map. New + layers are always displayed at the bottom of the layer stack. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Use FloodMap.addLayer() to add new layers instead of adding them directly + to the Map. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Removed the re-order process of map layers. This is no longer necessary, + because MapOutputTab uses FloodMap.addLayer() to add new layers instead of + adding new layers on its own using Map.addLayer() directly. + +2011-12-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings that force the user to select a DEM. + + * src/main/java/de/intevation/flys/client/client/ui/DemDatacagePanel.java: + Override validate() to make sure, that the user has selected a DEM. + Otherwise, a popup is displayed. + +2011-12-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + error strings for DEM selection. + +2011-12-19 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Feed name-data-item to area artifact, refresh collection. + Set initial master for cross sections to be first area artifact in + collection. + Set step-size for spinner to 0.5. + Added click handlers for "over" and "under" menu items. + +2011-12-16 Felix Wolfsteller + + Bring further UI regarding area creation (in cross-sections). + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java + (createAreaArtifact): New, create an areaartifact. + (feedTellArea): New, feed an areaartifact with relevant information. + (getSingleContextMenu): New, add further (sub)menuitems to trigger + area creation. + +2011-12-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + (createSeparator): New, create a menuitem separator. + +2011-12-16 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java, + src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/Recommendation.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultData.java, + src/main/java/de/intevation/flys/client/client/services/LoadArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/FeedService.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Cosmetics, doc. + +2011-12-15 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/PropertyGroup.java: + Fixed return type. + +2011-12-15 Raimund Renkert + + Added missing interface. + + * src/main/java/de/intevation/flys/client/client/ui/PropertyEditor.java: + New. Interface for property dialogs. + +2011-12-15 Raimund Renkert + + Added interfaces and classes for output settings. + + * src/main/java/de/intevation/flys/client/shared/model/Property.java, + src/main/java/de/intevation/flys/client/shared/model/PropertySetting.java, + src/main/java/de/intevation/flys/client/shared/model/PropertyGroup.java, + src/main/java/de/intevation/flys/client/shared/model/StringProperty.java: + New. Interface and container for output properties. + + * src/main/java/de/intevation/flys/client/shared/model/Settings.java, + src/main/java/de/intevation/flys/client/shared/model/OutputSettings.java: + New. Interface and container for properties. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Added methods to extract output properties. + + * src/main/java/de/intevation/flys/client/shared/model/Collection.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java: + Added getter/setter for settings. + +2011-12-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Minor refactoring. Correct intial settings for master-cs-artifact + and chosen km. + +2011-12-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/shared/model/ThemeList.java: + Fix. Respect fact that ThemeLists indices are not 0-based. + +2011-12-13 Felix Wolfsteller + + For CrossSections, enable kilometer- and master-selection from + client. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + translation. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Added input element to select a (cross section) master and + make km spinners work. + +2011-12-13 Felix Wolfsteller + + Provide access to Artifacts Data via Themes and CollectionItems. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Register data (key/value) from artifacts in CollectionItems. + Associate Themes with CollectionItems. + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java: + Added Accessors for CollectionItem. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java, + src/main/java/de/intevation/flys/client/shared/model/AttributedTheme.java: + Added Accessors and instance of CollectionItem. + + * src/main/java/de/intevation/flys/client/shared/model/CollectionItem.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultCollectionItem.java: + Allow access to data from artifact, cosmetics. + + * src/main/java/de/intevation/flys/client/shared/model/Collection.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java: + Added setter for ThemeList(s). + + * src/main/java/de/intevation/flys/client/shared/model/DefaultData.java: + (createSimpleStringData, createSimpleStringDataArray): Convenvience/ + helpers. + + * src/main/java/de/intevation/flys/client/shared/model/ThemeList.java: + Helpers to get maps that map relevant information. + +2011-12-13 Felix Wolfsteller + + Fix CrossSectionKMService. + + * src/main/java/de/intevation/flys/client/server/CrossSectionKMServiceImpl.java: + Use correct, badly named looping index. + +2011-12-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapPositionPanel.java: + Set width to 150px and set alignment to RIGHT. + + * src/main/java/de/intevation/flys/client/client/ui/map/MeasureControl.java: + Set width to 100. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Added a label that displays the current projection. Wrapped this label and + the mouse coordinates into a new layout which is RIGHT aligned in the + toolbar. + +2011-12-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + links to a cancel button and strings for a "Calculation canceled" message. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Register the ParameterList as StepBackHandler on the LoadingPanel. + + * src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java: The + loading dialog now includes a button to stop a running calculation. + Stopping a running calculation means to return to the previous state. + + * src/main/webapp/images/cancelCalculation.png: New. An image for a cancel + button. + +2011-12-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + Filled the window with property fields. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings for property fields. + +2011-12-12 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/client/shared/model/Collection.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java: + Documentation. + (getLastAccess): Added TODO. Never called, can it be removed? + + * src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DistanceInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/ArtifactFilter.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Minor Cosmetics. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Minor refactoring, extracted createLayout. + +2011-12-09 Raimund Renkert + + Added stub for chart property editor. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added button for chart properties editor. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java: + New. Create window with tabs for chart properties. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n strings. + +2011-12-09 Raimund Renkert + + Issue 377. + + * src/main/webapp/FLYS.css: + Added border style for floodmap. + +2011-12-08 Felix Wolfsteller + + * src/main/webapp/WEB-INF/web.xml: + Registered CrossSectionKM servlet. + +2011-12-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/CrossSectionKMServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/CrossSectionKMServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/CrossSectionKMService.java: + Added client to CrossSectionKMService. + +2011-12-08 Raimund Renkert + + * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java, + src/main/java/de/intevation/flys/client/server/FeedServiceImpl.java, + src/main/java/de/intevation/flys/client/server/SetCollectionNameServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/UserServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CollectionAttributeServiceImpl.java, + src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ExportServiceImpl.java, + src/main/java/de/intevation/flys/client/server/MapInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/SetCollectionTTLServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/GetArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CSVExportServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DescribeArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/StepForwardServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AdvanceServiceImpl.java, + src/main/java/de/intevation/flys/client/server/WQInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DistanceInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/RemoveArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ReportServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DeleteCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DistanceInfoXML.java, + src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/DeleteCollectionService.java, + src/main/java/de/intevation/flys/client/client/services/CreateCollectionService.java, + src/main/java/de/intevation/flys/client/client/services/RiverServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/RiverService.java, + src/main/java/de/intevation/flys/client/client/services/DescribeCollectionServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/LoadArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/DescribeArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/LoadArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/StepForwardServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/CollectionItemAttributeService.java, + src/main/java/de/intevation/flys/client/client/services/FeedServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/FeedService.java, + src/main/java/de/intevation/flys/client/client/services/DistanceInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/AddArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/SetCollectionNameService.java, + src/main/java/de/intevation/flys/client/client/services/ChartInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/DeleteCollectionServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/CollectionAttributeServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ChartInfoService.java, + src/main/java/de/intevation/flys/client/client/services/UserService.java, + src/main/java/de/intevation/flys/client/client/services/CollectionAttributeService.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataService.java, + src/main/java/de/intevation/flys/client/client/services/MapInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MapInfoService.java, + src/main/java/de/intevation/flys/client/client/services/SetCollectionTTLServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/CSVExportServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/GetArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/SetCollectionTTLService.java, + src/main/java/de/intevation/flys/client/client/services/DescribeCollectionService.java, + src/main/java/de/intevation/flys/client/client/services/CollectionItemAttributeServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/CSVExportService.java, + src/main/java/de/intevation/flys/client/client/services/GetArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/DescribeArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/AdvanceServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/StepForwardService.java, + src/main/java/de/intevation/flys/client/client/services/AdvanceService.java, + src/main/java/de/intevation/flys/client/client/services/WQInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/WQInfoService.java, + src/main/java/de/intevation/flys/client/client/services/DistanceInfoService.java, + src/main/java/de/intevation/flys/client/client/services/AddArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/SetCollectionNameServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ReportServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/RemoveArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ReportService.java, + src/main/java/de/intevation/flys/client/client/services/RemoveArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/UserServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/CreateCollectionServiceAsync.java, + src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java, + src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java, + src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java, + src/main/java/de/intevation/flys/client/client/ui/WspDatacagePanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java, + src/main/java/de/intevation/flys/client/client/FLYS.java: + Removed the URL parameter from service calls. The service + implementations read the URL from the web.xml config file now. + +2011-12-08 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Fixed typo in (German) translation. + +2011-12-08 Ingo Weinzierl + + flys/issue421 (Diagramm: L�schen eines Thema ohne R�ckfrage beim Nutzer) + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings used when the user is asked if he is sure to remove selected + themes. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Ask before removing themes. + +2011-12-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Reorder the layers in the map at the end of the layers initialization. A + reordering is necessary, because the order in the map is reflected + considering the order in the map theme panel. + +2011-12-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings for buttons used in ExternalWMSWindow. + + * src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java: + Use i18n strings for back, continue and cancel button. + +2011-11-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/CapabilitiesPanel.java: + Display only information that really exist. + +2011-11-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/WMSLayer.java: Added + a method supportsSrs(String srs) that determines, if the WMS layer + supports a given SRS. The 'srs' parameter needs to start with "EPSG:", + otherwise this prefix is appended automatically. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Create the ExternalWMSWindow with the SRS definition of FloodMap. + + * src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java: + Added a new constructor that takes a SRS. This srs is used to instantiate + the WMSLayersTree. + + * src/main/java/de/intevation/flys/client/client/ui/map/WMSLayersTree.java: + Added a new constructor that takes a SRS. If a SRS is specified, this tree + only displays layers that support the specified SRS. + +2011-11-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CapabilitiesParser.java: + New. An explicit parser for WMS capabilities documents. Its code has been + moved from GCServiceImpl. In addition to the implementation of + GCServiceImpl, this parser also reads the SRS definition of a layer. + + * src/main/java/de/intevation/flys/client/server/LoggingConfigurator.java: + New. This class is used to initialize logging via Apache Log4j. Its code + has been moved from BaseServlet. + + * src/main/java/de/intevation/flys/client/server/GCServiceImpl.java: + Removed code to fetch and parse WMS Capabilities documents. This work is + done using CapabilitiesParser. + + * src/main/java/de/intevation/flys/client/server/BaseServlet.java: Removed + code to initialize Log4j logging. This work is done using + LoggingConfigurator. + + * src/main/java/de/intevation/flys/client/shared/model/WMSLayer.java: Added + a list of SRS definitions (List). + +2011-11-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/GCServiceImpl.java: + Improved parsing Capabilities document - the root node of the document + can be "/WMS_Capabilities" oder "WMT_MS_Capabilities" now. + +2011-11-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Trigger the update of MapThemePanel after adding external WMS layers. + +2011-11-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/WMSLayer.java: Added + the URL of the WMS server to the constructor parameterlist, because this + information is absolutely required for a WMS layer. + + * src/main/java/de/intevation/flys/client/server/GCServiceImpl.java: + Modified the constructor call of WMSLayer. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Add WMS layers by using LoadArtifactService.loadMany() which creates a new + Artifact for each WMS layer. TODO: Trigger reload of MapThemePanel. + +2011-11-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/LoadArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/LoadArtifactService.java: + Removed the "url" from loadMany()'s parameterlist. We are able to fetch + the required Artifact-Server URL from ServletContext since I have + introduced a BaseServlet. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Removed the "url" from method call of LoadArtifactService.loadMany(). + +2011-11-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java: + Defined an internal interface LayerLoader to load selected WMSLayers of + the tree. The constructor of ExternalWMSWindow now requires an instance + of LayerLoader. The "go on" button in the layer panel will finally + trigger the LayerLoader.load() method. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Implements the ExternalWMSWindow.LayerLoader interface to add the + selected WMS layers to the map. TODO: implement code to load/add layers. + + * src/main/java/de/intevation/flys/client/client/ui/map/WMSLayersTree.java: + Added an inner class WMSLayerNode that extends TreeNode with the + addition to save a WMSLayer object. The reason here: we want to have all + information of the selected WMS layers for loading mechanisms. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Modified the constructor call of ExternalWMSWindow. The MapOutputTab is + used as ExternalWMSWindow.LayerLoader. + +2011-11-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/WMSLayer.java: New. + This class stores layer information provided by capabilities document. + Note, that a WMSLayer can have further sublayers. + + * src/main/java/de/intevation/flys/client/server/GCServiceImpl.java: Parse + layers from capabilities document. + + * src/main/java/de/intevation/flys/client/client/ui/map/WMSLayersTree.java: + New. This tree displays WMSLayers. + + * src/main/java/de/intevation/flys/client/shared/model/Capabilities.java: + Now, the list of layers is from type List instead of + List. + + * src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java: + Use the WMSLayersTree to display the layers provided by the given WMS + service. + +2011-11-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java: + Introduced I18N. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings used in ExternalWMSWindow. + +2011-11-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/ContactInformation.java: + New. This class is used to store contact information from Capabilities + documents. + + * src/main/java/de/intevation/flys/client/shared/model/Capabilities.java: + Added title, onlineResource and ContactInformation. + + * src/main/java/de/intevation/flys/client/server/GCServiceImpl.java: Read + more meta information from capabilities document. + + * src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java: + Center this window after stepping from URL input to information panel. + + * src/main/java/de/intevation/flys/client/client/ui/map/CapabilitiesPanel.java: + Display all information from Capabilities object and introduced I18N. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties: + Added strings used in the CapabilitiesPanel. + + * src/main/webapp/FLYS.css: Defined a style class for the user hint in the + CapabilitiesPanel. + +2011-11-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Capabilities.java: + New. This class is used to store information of a document returned by a + WMS GetCapabilities request. + + * src/main/java/de/intevation/flys/client/server/GCServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/GCServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/GCService.java: + A new service that fetches a GetCapabilities document of a given server. + It returns a Capabilities object that stores the information of the + response. + + * src/main/java/de/intevation/flys/client/client/ui/map/CapabilitiesPanel.java: + New. This VLayout is used to display FLYS relevant information of a + Capabilities object. TODO: I18N. + + * src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java: + Make use of GCService to query the Capabilities of the user specified + WMS. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + error strings used in the GCServiceImpl. + + * src/main/webapp/WEB-INF/web.xml: Registered the GCService. + +2011-11-21 Ingo Weinzierl + + * src/main/webapp/images/addWMS.png: Replaced by the same icon but with + transparent background. + +2011-11-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/ExternalWMSWindow.java: + New. This control is used to add map layers from external WMS. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added links to icon and tooltip for ExternalWMSWindow control. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Added the ExternalWMSWindow control. + + * src/main/webapp/images/addWMS.png: New. Icon for ExternalWMSWindow + control. + +2011-11-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/GFIServiceImpl.java: + Removed needless imports. + +2011-11-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfo.java: + Fetch the list of themes used for the GetFeatureInfo request on the fly + from MapThemePanel. + +2011-11-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Use the correct names of created WMS layers - which is no longer + Theme.getDescription() but AttributedTheme.getAttr("layers"). + +2011-11-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/FeatureInfo.java: + New. This object is used to store information retrieved by a + GetFeatureInfo response. A FeatureInfo object consists of a layername + and an attribute map. + + * src/main/java/de/intevation/flys/client/server/GFIServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/GFIServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/GFIService.java: + Modified the return value of this service. It will now return a list of + FeatureInfo objects. This list is parsed from GetFeatureInfo response on + our own. Relevant attributes of a feature are extracted. + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfo.java: + Adjusted the return value of GFIService. + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfoWindow.java: + Takes a list of FeatureInfo. Each FeatureInfo object is displayed in a + row which contains all the attributes of the object. + + * src/main/webapp/FLYS.css: Added a style class for the GetFeatureInfo + response row displayed in GetFeatureInfoWindow. + +2011-11-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/LocationsTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/RangeTable.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/FLYSHeader.java, + src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Removed needless imports. + +2011-11-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/GFIServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/GFIServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/GFIService.java: + New. A service that calls the WMS GetFeatureInfo operation. The result of + this service is currently the response text, which is slightly modified to + fulfill the requirements of the OpenLayers GML parser. + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfo.java: + New. This control starts a WMS GetFeatureInfo by using the GFIService and + displays the resulting features in a GetFeatureInfoWindow. + + * src/main/java/de/intevation/flys/client/client/ui/map/GetFeatureInfoWindow.java: + New. This window is used to display all attributes of a set of OpenLayers + VectorFeatures. + + * src/main/java/de/intevation/flys/client/client/ui/OutputTab.java: Added a + public method to retrieve the current Collection. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Added the GetFeatureInfo control. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Modified the call of OpenLayers WMS(). The names of the layers are the + 'layers' attribute provided in the facet. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + tooltips for GetFeatureInfo control, error message for the GFIService and + links to an icon used for the GetFeatureInfo control. + + * src/main/webapp/images/getFeatureInfo_Selected.png, + src/main/webapp/images/getFeatureInfo.png: New. Icons for the + GetFeatureInfo control. + + * src/main/webapp/WEB-INF/web.xml: Registered the GFIService. + +2011-11-17 Raimund Renkert + + Issue312: Moved images to completly support IE7. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added Images to constants. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/LocationsTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/RangeTable.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/FLYSHeader.java, + src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Get image urls from constants to support IE7. + + * src/main/java/de/intevation/flys/client/client/images/downloadPNG.png, + src/main/java/de/intevation/flys/client/client/images/flys_logo.gif, + src/main/java/de/intevation/flys/client/client/images/loading.gif, + src/main/java/de/intevation/flys/client/client/images/bfg_logo.gif, + src/main/java/de/intevation/flys/client/client/images/marker_green.png, + src/main/java/de/intevation/flys/client/client/images/downloadPDF.png, + src/main/java/de/intevation/flys/client/client/images/downloadSVG.png, + src/main/java/de/intevation/flys/client/client/images/gewkarte.png, + src/main/java/de/intevation/flys/client/client/images/marker_red.png: + Removed. + + * src/main/webapp/images/loading.gif + src/main/webapp/images/bfg_logo.gif + src/main/webapp/images/marker_red.png + src/main/webapp/images/flys_logo.gif + src/main/webapp/images/marker_green.png + src/main/webapp/images/downloadPDF.png + src/main/webapp/images/gewkarte.png + src/main/webapp/images/downloadPNG.png + src/main/webapp/images/downloadSVG.png: + Added images. + +2011-11-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Added a ScaleLine control to the map. + +2011-11-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Added an update() method that redraws all layers contained in the + current map. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Registered MapOutputTab as RedrawRequestHandler. When receiving a + RedrawRequestEvent, that map is updated (layers are redrawn). + +2011-11-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapPositionPanel.java, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Removed needless imports. + +2011-11-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added strings for datacage's 'floodmap' section. + +2011-11-10 Raimund Renkert + + Issue 339. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Do not wrap the radio button label. + +2011-11-10 Raimund Renkert + + Issue 338. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Increased input field width. + +2011-11-10 Felix Wolfsteller + + Fix cloning of static data artifacts, resolved todos. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Remove temporary hack that depended on dc conf. + +2011-11-10 Raimund Renkert + + Issue 355. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Cancel the double click event for projectlist header. + +2011-11-10 Raimund Renkert + + Issue 342 + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + The tables have now a unified design. All columns are set to left + align and decimal separators are set to ',' in german and '.' in the + english version. + +2011-11-09 Raimund Renkert + + Issue 265. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapPanel.java: + Added getter for toolbar. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java: + Hide the barrier layer and deactivate draw control on stacksection + minimize. + +2011-11-08 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Expand the map selection section in helper panel on project start. + +2011-11-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + Set value "distance" for attribute "ld_mode". + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java + Set value "locations" for attribute "ld_mode". + +2011-11-08 Raimund Renkert + + Issue 294. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapPositionPanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapPanel.java: + Removed the wrapper canvas. The only function of this wrapper was to + calculate the mouse position. This is now done by the map itself. + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Update map size and center. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Redesigned the layout and resize handler. Removed wrapper canvas. + +2011-11-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties: + Bugfix: Added a missing string that prevented packaging the client. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties: + Synced with FLYSConstants.properties. + + +2011-11-04 Felix Wolfsteller + + Added translations for datacage-element- strings. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties: + Added tranlations, corrected one. + +2011-11-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Added methods to add and remove Layer instance to/from Map and grant + public access to createWMSLayer() method. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: Moved + code to add new FacetRecords to the grid to an own method + addFacetRecord(). + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Override addFacetRecord() to be able to detect new FacetRecords. In this + case, we gonna create new WMS layers based on the FacetRecord and add a + new Layer object to the Map. + Override createRemoveItem() which removes a layer from Map and from + ThemePanel. + +2011-11-01 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Updated the theme editor window layout. + +2011-11-01 Raimund Renkert + + Issue 400. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Iterate over a list of all theme settings to display all available + settings. + +2011-11-01 Felix Wolfsteller + + Cosmetics, Refactoring. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java + (createSpinnerHandler): Extracetd, to improve readability. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java + (requestRedraw): Made final to be accessible from extracted handler + construction in CrossSectionChartThemePanel. + +2011-11-01 Felix Wolfsteller + + Fix flys/issue306 (CrossSections: Remove functionality from table + header). + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Disable context menu on listgrid header. + +2011-10-31 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Override getSingleContextMenu() to add a "zoom to layer" menu item which + is specific to the map. This menu item is displayed if the specific theme + has an "extent" attribute set. If the item is clicked, the + LayerZoomCallback is called. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Implements the LayerZoomCallback to zoom to the extent of a specific + layer. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings for the "zoom to layer" menu item. + +2011-10-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/MapHelper.java: New. It + currently provides a method that parses a MapConfig from Document. + + * src/main/java/de/intevation/flys/client/shared/model/MapConfig.java: New. + This object saves values in a HashMap. Some basic information like srid, + max extent and initial extent can be set/get via methods. + + * src/main/java/de/intevation/flys/client/client/services/MapOutputServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MapOutputService.java, + src/main/java/de/intevation/flys/client/server/MapOutputServiceImpl.java: + This service now returns an instance of MapConfig that contains some basic + information required by OpenLayers to create maps. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + OpenLayers maps are created using the MapConfig returned by + MapOutputService but the layers added to the map are taken from + MapThemePanel to keep the ThemePanel and the Map in sync. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + error strings for the case that no map config was retrieved in + MapOutputService. + +2011-10-26 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Let datacage-window include the "static" part. Note that now many + options might be shown with which interaction might not lead to the + epected results. + +2011-10-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/BaseServlet.java: Added a + an environment variable FLYS_CLIENT_LOG4J_PROPERIES that might be used + to use an alternative log4j.properties instead of the default one which + comes with the SVN. This variable needs to point to a properties file. + +2011-10-26 Ingo Weinzierl + + * .: Modified svn:ignore property to ignore log4j.properties. + +2011-10-25 Ingo Weinzierl + + * src/main/webapp/WEB-INF/web.xml: Added a context parameter that might be + used to determine the URL of the Artifact server. + + * src/main/java/de/intevation/flys/client/client/services/MapOutputServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MapOutputService.java, + src/main/java/de/intevation/flys/client/server/MapOutputServiceImpl.java: + Removed the URL parameter from doOut(). This parameter is fetched from + ServletContext. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Modified the call of MapOutputService.doOut(). + +2011-10-25 Raimund Renkert + + Issue 118/203 + + * src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java: + Added attribute to lock the table if the input rows are hidden. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Ignore clicks if the table is locked and clear values on input mehtod + change. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + Clear the input values if the input array length is 0. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Updated i18n strings. + +2011-10-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java, + src/main/java/de/intevation/flys/client/server/MapOutputServiceImpl.java, + src/main/java/de/intevation/flys/client/server/FeedServiceImpl.java, + src/main/java/de/intevation/flys/client/server/meta/Converter.java, + src/main/java/de/intevation/flys/client/server/SetCollectionNameServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/UserCollectionsServiceImpl.java, + src/main/java/de/intevation/flys/client/server/UserServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CollectionAttributeServiceImpl.java, + src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ExportServiceImpl.java, + src/main/java/de/intevation/flys/client/server/MapInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/SetCollectionTTLServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/GetArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CSVExportServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DescribeArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/StepForwardServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AdvanceServiceImpl.java, + src/main/java/de/intevation/flys/client/server/WQInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DistanceInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java, + src/main/java/de/intevation/flys/client/server/DoCollectionAction.java, + src/main/java/de/intevation/flys/client/server/ReportServiceImpl.java, + src/main/java/de/intevation/flys/client/server/RemoveArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DeleteCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ChartServiceHelper.java, + src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DistanceInfoXML.java, + src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java, + src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CollectionHelper.java, + src/main/java/de/intevation/flys/client/server/ArtifactHelper.java, + src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Replaced logging to stderr and stdout with log4j loggers. + +2011-10-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/BaseServlet.java: New. + This HttpServlet is used to setup some config stuff like log4j + configuration. + + * src/main/webapp/WEB-INF/log4j.properties: A Log4J configuration file. + + * src/main/webapp/WEB-INF/web.xml: Registered the BaseServlet which is + loaded initially to setup config stuff. + + * pom.xml: Added Apache Log4J dependency. + +2011-10-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/MapOutputServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MapOutputService.java, + src/main/java/de/intevation/flys/client/server/MapOutputServiceImpl.java: + New (but not finished yet). This service calls the out() REST resource + of an ArtifactCollection and should (work in progress) return a map + configuration which will be used to initialize an OpenLayers map. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Call the MapOutputService while instantiating a new MapOutputTab but + there is no code that handles the response yet (because the service + currently doesn't return a value). + + * src/main/webapp/WEB-INF/web.xml: Registered the new MapOutputService. + +2011-10-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/Toolbar.java: New. An + abstract toolbar that acts as parent for ChartToolbar and MapToolbar. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Subclass Toolbar which now makes the datacage stuff. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Adjusted the constructor call of OutputTab which now takes an instance + of CollectionView. + + * src/main/java/de/intevation/flys/client/client/ui/OutputTab.java: Stores + an instance of CollectionView and implements methods to retrieve the + current user and artifact. + +2011-10-24 Felix Wolfsteller + + Fix flys/issue390 (W-Diff: Icon zum L�schen anpassen). + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Polishing and use different icon to remove rows in selections + listgrid. + +2011-10-24 Felix Wolfsteller + + Replaced icons white by a transparent background. + + * src/main/webapp/images/removeFeature.png: Added transparency to + white background. + +2011-10-21 Ingo Weinzierl + + flys/issue352 (W-INFO / WSP: Markierung bei Verschieben in Steuerung geht verloren) + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Keep grid selection alive after theme has been modified. + +2011-10-21 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Renamed 'textbackground' to 'backgroundcolor'. + +2011-10-20 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Display new attributes in editor window. + +2011-10-20 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Moved the context menu handler to constructor to have the menu + available in each subclass. + +2011-10-20 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Reordered the attribute list. + +2011-10-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java, + src/main/java/de/intevation/flys/client/client/ui/ExportPanel.java: Removed + superfluous imports. + +2011-10-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Modified the visual result of createOld() which will now display each W + or Q in a single row. + +2011-10-19 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Group the theme attributes. + +2011-10-19 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Convert all color attributes from html to rgb notation. + +2011-10-19 Felix Wolfsteller + + Added a displayName propertie to Recommendations and add names to data + String such that they survive a "backjump" (reparameterization). + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java, + src/main/java/de/intevation/flys/client/shared/model/ToLoad.java: + Keep displayNames for recommendations. + + * src/main/java/de/intevation/flys/client/shared/model/Recommendation.java: + Added displayName, getter and setter. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Set displayName for create recommendations, add it to Data String. + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java, + src/main/java/de/intevation/flys/client/client/ui/RecommendationPairRecord.java: + Do not store name separately from Recommendation + +2011-10-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartServiceHelper.java: + Add the format string into the xml document for querying charts. + +2011-10-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Removed unused string which has been commited by mistake. + +2011-10-18 Felix Wolfsteller + + Make "zus" and flood protections usable for W-Differences (with yet + many constraints, e.g. server will fail if flood protection is + subtrahend). + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Discern static and calculated data by pretty ugly hack, set factory + to "clone" with accordingly. + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + Request the system ("static") part of datacage in wdiff-input + selection as well. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Enable hack in DatacageTwinPanel, set ids to id content, such that + recommendations and toloads can be created from selected elements in + Datacage. + + * src/main/java/de/intevation/flys/client/shared/model/Recommendation.java: + (setFactory): Allow to change factory during live time. + +2011-10-18 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Prepared editor UI for annotation styling. + +2011-10-18 Felix Wolfsteller + + Minor cosmetics. + + * src/main/java/de/intevation/flys/client/client/services/MetaDataService.java, + src/main/java/de/intevation/flys/client/client/Config.java, + src/main/java/de/intevation/flys/client/client/ui/DatacagePanel.java: + Cosmetics (whitespace). + +2011-10-18 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java: + Allow to load Artifacts with different factories in one go (as + fallback). Documentation added. + +2011-10-18 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/Style.java, + src/main/java/de/intevation/flys/client/shared/model/StyleSetting.java, + src/main/java/de/intevation/flys/client/shared/model/CollectionItemAttribute.java, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Added documentation. + +2011-10-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java: + Added support for chart exports. If the Http parameter "export=true" is + set, the header of the Http request is modified to trigger a download. + Currently, PNG, SVG and PDF export is supported. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added a method that returns the URL for a chart export. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Added download icons for png, pdf and svg. + + * src/main/java/de/intevation/flys/client/client/FLYSImages.java: Added + images for png/pdf/svg downloads. + + * src/main/java/de/intevation/flys/client/client/images/downloadPNG.png, + src/main/java/de/intevation/flys/client/client/images/downloadPDF.png, + src/main/java/de/intevation/flys/client/client/images/downloadSVG.png: + New. Icons for png/pdf/svg export of charts. + +2011-10-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ImgLink.java: New. + This class creates a link with an image. + + * src/main/java/de/intevation/flys/client/client/ui/ExportPanel.java: + Makes use of ImgLink to create export icons. + +2011-10-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Bugfix: adjusted a method call of XMLUtils.ElementCreator.addAttr() + which avoided compiling flys-client. + +2011-10-17 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Use images for line type and line size selection. + + * src/main/webapp/images/linestyle-dash-10.png, + src/main/webapp/images/linestyle-dash-10-5.png, + src/main/webapp/images/linestyle-1px.png, + src/main/webapp/images/linestyle-2px.png, + src/main/webapp/images/linestyle-3px.png, + src/main/webapp/images/linestyle-4px.png, + src/main/webapp/images/linestyle-5px.png, + src/main/webapp/images/linestyle-dash-20-10.png, + src/main/webapp/images/linestyle-6px.png, + src/main/webapp/images/linestyle-dash-30-10.png, + src/main/webapp/images/linestyle-7px.png, + src/main/webapp/images/linestyle-8px.png, + src/main/webapp/images/linestyle-dash-20-5-15-5.png: + New. + +2011-10-17 Ingo Weinzierl + + flys/issue253 (Diagramm: Mehrfachauswahl zum Verschieben/Löschen auf Themen) + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java, + src/main/java/de/intevation/flys/client/shared/model/AttributedTheme.java: + Prepared Themes to support a "visible" attribute. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Write the "visible" attribute of a Theme into the attribute of a + Collection. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: Do + not display Themes which are not visible (getVisible() == 0). + +2011-10-17 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Added new values for line type. + +2011-10-17 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Set window position to page center. + Removed parent element. + +2011-10-17 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Show theme name in static text field. + +2011-10-17 Raimund Renkert + + Request redraw on attribute change. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Made request redraw method public and added method to show editor + window. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Removed collection view, added theme panel. Request redraw on success. + +2011-10-17 Felix Wolfsteller + + Cosmetics, docs. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java, + src/main/java/de/intevation/flys/client/client/ui/RecommendationPairRecord.java, + src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Cosmetics, docs. + + * src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Cosmetics, docs, also made two methods static. + +2011-10-17 Felix Wolfsteller + + Donate own error for failcase of remove-artifact. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Donated own error code for remove-artifact. + +2011-10-17 Ingo Weinzierl + + flys/issue366 (W-INFO / Abflusskurve, Diagramm: Umbenennen von Themen + und Anzeige im Diagramm) + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java, + src/main/java/de/intevation/flys/client/shared/model/AttributedTheme.java: + Added a setter method for descriptions. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Description modifications will now be persisted to artifact server. + +2011-10-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties: + Added missing resources for datacage. + +2011-10-14 Raimund Renkert + + * src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java: + Set the correct index when saving changed attributes. + +2011-10-14 Ingo Weinzierl + + flys/issue288 (ÃœSK: Legende hinzufügen) + + * src/main/java/de/intevation/flys/client/shared/MapUtils.java: New. + Helper class for maps. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Set width and min width of MapThemePanel to 300px and allow to resize it. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: Moved + Record and ListGrid creation out to own methods which subclasses can + override. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Override createNewGrid() to add a column for displaying legend items. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added string for the "style" header in the MapThemePanel. + +2011-10-14 Raimund Renkert + + * src/main/java/de/intevation/flys/client/shared/model/Style.java, + src/main/java/de/intevation/flys/client/shared/model/CollectionItemAttribute.java, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Use the theme index to identify the correct style. + + * src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java: + Set the style index. + +2011-10-13 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Removed top level '${datacage}' using CHILDREN mode for tree. + Introduced i18n. + If tree contains less the MAX_OPEN (30) nodes and leafs the + tree is rendered all open. This minimizes clicks. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties: + i18n for data cage + +2011-10-13 Ingo Weinzierl + + * src/main/webapp/images/adjustElevation.png: Replaced old one that had a + gray background with a new one with transparent background. + +2011-10-13 Felix Wolfsteller + + Added error message(i18n) for fail case of removeArtifactService. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added error_remove_artifact . + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Resolved TODO by employing "own" error message (removeArtifact). + +2011-10-13 Felix Wolfsteller + + Removed obsolete imports. + + * src/main/java/de/intevation/flys/client/client/services/RemoveArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java: + Removed obsolete imports. + +2011-10-13 Felix Wolfsteller + + In W-Diff selection GUI, track which items have been removed from the + listgrid, remove corresponding artifacts from collection if they are + not needed anymore using the new RemoveArtifactService. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Track removed items from ListGrid until clicking on "proceed". Then, + check whether artifacts removed from the list are still needed to + calculate other difference (which are still in the ListGrid), remove + them otherwise. + +2011-10-13 Felix Wolfsteller + + Added helper in use of new RemoveArtifactService. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java + (removeArtifact): New method to remove an artifact from a + collection. + +2011-10-13 Felix Wolfsteller + + Added implementation and configuration of RemoveArtifactService. + + * src/main/java/de/intevation/flys/client/server/RemoveArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/RemoveArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/RemoveArtifactService.java: + New files with implementation of RemoveArtifactService. + + * src/main/webapp/WEB-INF/web.xml: Register new servlet/service. + +2011-10-13 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java, + src/main/java/de/intevation/flys/client/server/ArtifactHelper.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Cosmetics, doc. + +2011-10-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Moved code to mark features 'selected' to FloodMap. Display warnings if + elevation control is clicked but no feature is selected or more than one + feature is selected. + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: Do + the "select feature" stuff here. Selected features will now have a + fatter stroke. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added warning and error messages used when elevation control is used. + +2011-10-13 Sascha L. Teichmann + + Updated SmartGWT to 2.5 + + * pom.xml: Bumped SmartGWT from 2.4 to 2.5 + + * src/main/java/de/intevation/flys/client/FLYS.gwt.xml: + Using Enterprise instead of EnterpriseBlue theme. + +2011-10-13 Ingo Weinzierl + + flys/issue297 (ÃœSK: Eingabe von Höhen ermöglichen) + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Made those classes more robust while setting Styles for features without + barrier type. + + * src/main/java/de/intevation/flys/client/client/ui/map/DrawControl.java: + Moved the constant to mark features to FloodMap. Added a new control to + adjust the elevation values of features. + + * src/main/java/de/intevation/flys/client/client/ui/map/ElevationWindow.java: + New. This Window displays a grid that contains the vertices of the + specified vector feature. Users are able to modify the elevation value + for each vertex in the grid. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + New strings used for the elevation control button/icon. + + * src/main/webapp/images/adjustElevation.png: A new icon used for the + control to adjust the elevation values of features in the map. + +2011-10-12 Ingo Weinzierl + + flys/issue331 (ÃœSK: OpenLayers innerhalb der eigenen Distribution bereitstellen) + + * src/main/webapp/FLYS.html: Fetch OpenLayers-2.11 lib from local server + instead from remote repository. + +2011-10-12 Ingo Weinzierl + + flys/issue293 (ÃœSK: Legende hinzufügen) + + * src/main/java/de/intevation/flys/client/client/ui/map/DrawControl.java: + Added icons to the barrier combobox. + + * src/main/webapp/images/dam.png, + src/main/webapp/images/pipe1.png, + src/main/webapp/images/pipe2.png, + src/main/webapp/images/ditch.png, + src/main/webapp/images/ring_dike.png: New icons used in the barrier + combobox in the digitize panel. + +2011-10-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java: + Throw a ServerException if no styles were found in the XML document. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Display a warning dialog if no style for the selected theme was found. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties: + New error messages that are displayed if no style was found for a given + theme. + +2011-10-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: Moved + the ContextMenu creation from ChartThemePanel to ThemePanel - we want a + ContextMenu in the ChartThemePanel as well. In addition, there are new + menu items to activate/deactivate and remove themes. + + * src/main/java/de/intevation/flys/client/client/ui/chart/StyleEditorWindow.java, + src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java: + Moved the StyleEditorWindow to an upper package, because it will also be + used in the map. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added new strings for context menu items of the ThemePanel. + +2011-10-12 Felix Wolfsteller + + Validate selected pairs for differences, show errors if invalid. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java + (onClick, validate): Validate and show errors if data invalid. + Cosmetics, removed junk and resolved respective todo, documentation. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added error messages. + +2011-10-12 Felix Wolfsteller + + Show only "W"s in input helper for W-Diffs. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Request (datacage-specific!) "waterlevels"-out instead of more + general "longitudinal_section"-out. + +2011-10-12 Felix Wolfsteller + + Partial fix for flys/issue304 [1] (Erweiterte Funktionen W-Differenzen), + enable multiple clones of same recommendation, but be 'sparse'. + + * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java + (loadMany): While iterating over recommendations and creating + clones, keep track of results, do not clone a second time if same + recommendation is present multiple times in list, use "old" clone + instead. Throw excpetion in fail-case. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Use list instead of set, 'sparseness' is now achieved by + LoadArtifactService. Docs, removed junk. + +2011-10-11 Ingo Weinzierl + + flys/issue300 (ÃœSK: Reihenfolge der Ebenen findet keine Berücksichtigung) + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Implemented a ThemeMovedCallback to synchronize the ThemePanel's layer + order with the internal order of the Map. + +2011-10-11 Felix Wolfsteller + + Squashed "swapped minuend and subtrahend"-bug in wdiff calculation. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Use LinkedHashSet instead of HashSet to keep the given order. + Removed some debug statements. + +2011-10-11 Felix Wolfsteller + + Enable reparameterization of WINFO-Artifacts in WDiff-branch. Do not + reclone in parameterization. + + * src/main/java/de/intevation/flys/client/client/ui/RecommendationPairRecord.java: + Add flag to remember whether already cloned. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Recreate already cloned pairs of Ws from datastring, do not reclone + these. + +2011-10-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: Added + a method fireThemeMoved which is called after a Theme in this panel is + moved. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Added in internal interface ThemeMovedCallback which might be used to + listen to theme move events. Therefore, MapThemePanel overrides the + fireThemeMoved method and calls onThemeMoved() on ThemeMovedCallback if + it exists. + +2011-10-10 Ingo Weinzierl + + * src/main/webapp/FLYS.html: Import OpenLayers 2.11. + + * pom.xml: Upgrade of GWT-OpenLayers from 0.5 to 0.6 + +2011-10-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + Removed obsolete imports. + +2011-10-10 Ingo Weinzierl + + flys/issue289 (ÃœSK: Messen von Strecken und Flächen in falscher Dimension) + + * src/main/java/de/intevation/flys/client/client/ui/map/MeasureControl.java: + Measured areas are now displayed in 'ha'. + +2011-10-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/RecommendationPairRecord.java: + Polish with doc, removed junk. + +2011-10-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/RecommendationPairRecord.java: + New file. Extracted from DatacagePairWidget. + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + Extracted RecommendationPairRecord implementation and constats. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Improved displayed strings for selections of pairs. First steps + towards the ability to jump back ("reparameterize") the artifact. + Adjusted to RecommendationPairRecord-extraction. + +2011-10-10 Ingo Weinzierl + + flys/issue375 (ÃœSK, Streckemessung) + + * src/main/java/de/intevation/flys/client/client/ui/map/MeasureControl.java: + Added a formatter for lines and areas which is used to limit the number + of fractions. + +2011-10-10 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/shared/model/DataList.java, + src/main/java/de/intevation/flys/client/client/ui/TextProvider.java: + Cosmetics (docs and whitespace). + +2011-10-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/Style.java, + src/main/java/de/intevation/flys/client/client/services/CollectionItemAttributeService.java, + src/main/java/de/intevation/flys/client/client/services/CollectionItemAttributeServiceAsync.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + Removed superfluous imports. + +2011-10-10 Ingo Weinzierl + + flys/issue326 (Projektliste: Projekte ohne Parametrisierung werden angezeigt, können aber nicht geöffnet werden.) + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Take care on + empty projects while opening existing projects. Fetch the master + Artifact only if the Collection has an Artifact set. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Enabled CollectionView creation without Artifact but existing + Collection. + +2011-10-07 Ingo Weinzierl + + flys/issue233 (W-Info: Dauerlinienberechnung / "Lädt Daten") + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java: + Force a redraw of the computation data grid if no data could be + retrieved from server - this displays an error message. + +2011-10-05 Raimund Renkert + + Edited item attributes are saved and send to the server on accept. + + * src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/CollectionItemAttributeService.java, + src/main/java/de/intevation/flys/client/client/services/CollectionItemAttributeServiceAsync.java: + Added service method to save new item attributes. + + * src/main/java/de/intevation/flys/client/shared/model/Style.java: + Added facet to style attributes. + + * src/main/java/de/intevation/flys/client/shared/model/CollectionItemAttribute.java: + Added artifact uuid to collection item attributes. + + * src/main/java/de/intevation/flys/client/client/ui/chart/StyleEditorWindow.java: + Added item changed handler to save new values and update the + serverside values. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Set the selected facet record to the editor window. + +2011-10-05 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/StyleEditorWindow.java: + New methods for color transformation (html to rgb; rgb to html). + +2011-10-04 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/StyleEditorWindow.java: + Build up the editor window from CollectionItemAttribute response. + + * src/main/java/de/intevation/flys/client/shared/model/Style.java: + Added getter for number of settings and settings based on the index. + +2011-10-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added an error message that might be used if no calculation result was + found for calculation result panel. + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java: + Improved error handling if no calculation result was found - display + error message in this case. + +2011-09-30 Ingo Weinzierl + + flys/issue357 (W-Info / Wasserspiegellage, Diagramm) + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Removed header title of selection column. + +2011-09-30 Raimund Renkert + + Added skeleton for editor window. + + * src/main/java/de/intevation/flys/client/client/ui/chart/StyleEditorWindow.java: + New. Skeleton for editor window. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Set the collection view as attribute to have a parent for the + style editor window. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added strings for the style editor window. + +2011-09-30 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Added context menu to themes list. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added string for context menu entry. + +2011-09-30 Raimund Renkert + + * src/main/java/de/intevation/flys/client/server/CollectionItemAttributeServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/Style.java, + src/main/java/de/intevation/flys/client/shared/model/StyleSetting.java, + src/main/java/de/intevation/flys/client/shared/model/CollectionItemAttribute.java, + src/main/java/de/intevation/flys/client/client/services/CollectionItemAttributeService.java, + src/main/java/de/intevation/flys/client/client/services/CollectionItemAttributeServiceAsync.java: + New. Added new service and model for collection item attributes. + + * src/main/webapp/WEB-INF/web.xml: + Added the collection item attribute service. + +2011-09-30 Felix Wolfsteller + + Fix accidentally messed-up indentation. + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + Fix indentation. + +2011-09-30 Felix Wolfsteller + + Neaten displayed gridcontent when selecting waterlevels for wdiff, + do not allow multi-selection. + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + Display facets name in table when selecting pairs. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + (getSelectionTitle): New function to access visible titles of + selection. + +2011-09-29 Ingo Weinzierl + + flys/issue179 (Zoom Out funktioniert nichtzuverlässig) + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Repaired broken zoom-out function. + +2011-09-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Re-added the button to zoom-out by a given factor. Added a new one to + step back to the last extent. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Re-added the function to zoom-out by a given factor. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + the path to the zoom-back icon. + + * src/main/webapp/images/zoom-back.png: New. Icon for the zoom-back + button. + +2011-09-29 Ingo Weinzierl + + flys/issue198 (Diagramm: Zu vorheriger Zoomstufe per Klick zurückkehren) + + * src/main/java/de/intevation/flys/client/shared/model/ZoomObj.java: New. + This object is used to save the zoom extent of charts. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + The zoom-out button calls ChartOutputTab.zoomOut() without a integer + value. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + The Zoom-Out action no longer zooms out for a specific factor, but to the + last extent. The current extent of a chart is pushed onto a stack before + a Zoom-In action takes place. Zoom-out then zooms to the last extent + retrieved from the stack. + +2011-09-29 Ingo Weinzierl + + flys/issue336 (W-INFO / Berechnung Wasserstand an Orten, Zurodnung Bezugspegel) + + * src/main/java/de/intevation/flys/client/shared/model/DefaultArtifactDescription.java, + src/main/java/de/intevation/flys/client/shared/model/ArtifactDescription.java: + Added two new methods getRiver() (returns the selected river) and + getKMRange() (returns the selected min/max KM values). + + * src/main/java/de/intevation/flys/client/shared/DoubleUtils.java: New. + Utility class for working with double values. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Moved the code to determine the min/max KM range and river out to + ArtifactDescription. There, it is available for other classes as well. + +2011-09-28 Ingo Weinzierl + + flys/issue328 (W-INFO / ÃœSK: Auswahl der Wasserspiegellage / Auswahlunterstützung) + + * src/main/java/de/intevation/flys/client/client/ui/WspDatacagePanel.java: + Fetch datacage out 'waterlevels' only (possible since last rev in + flys-artifacts). The datacage will provide W facets only - no Q facets + are displayed. + +2011-09-28 Ingo Weinzierl + + flys/issue211 (W-INFO: Wasserspiegellagenberechnung / Auswahlunterstützung Abfluss) + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Reset values of km range mode if single km mode is selected and the + other way arround. + +2011-09-28 Ingo Weinzierl + + flys/issue119 (W-INFO: Wasserspiegellagenberechnung / Dateneingabe ausserhalb des Wertebereichs) + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Display min/max values when input validation for ranges failed. + +2011-09-28 Ingo Weinzierl + + flys/issue111 (W-INFO: Wasserspiegellagenberechnung / Strecke) + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Reset the values of range mode if single mode is selected and the other + way arround. + +2011-09-28 Felix Wolfsteller + + Make rows of in list with differences (WDiff) removable. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Make rows of in list with differences (WDiff) removable. + +2011-09-27 Felix Wolfsteller + + Use HashSet to avoid duplicate clones in Collections with WDiffs. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Use HashSet instead of list to avoid duplicate clones, cosmetics. + +2011-09-27 Felix Wolfsteller + + Cosmetics, documentation. + + * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java + (loadMany): Documented, added TODO. + +2011-09-27 Felix Wolfsteller + + Implement equals and hashCode for Recommendation, Recommendation.Facet + and Recommendation.Filter . + + * src/main/java/de/intevation/flys/client/shared/model/Recommendation.java + (equals, hashCode, Filter.equals, Filter.hashCode, Facet.equals) + (Facet.hashCode): New. + +2011-09-27 Ingo Weinzierl + + flys/issue321 (ÃœSK: Aktualisieren der Parameterliste nach Beendigung der Berechnung) + + * src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java: Put + the updated Artifact into the CollectionView when the calculation is + finished. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Update the UI after the Artifact of this CollectionView is updated. + +2011-09-26 Ingo Weinzierl + + flys/issue298 (Karte: Automatischer Zoom auf Berechnungsergebnisse) + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + The initial zoom of the map is determined by the extents of all layers + in the map OR by the wsplgen layer, if such layer is existing and if it + has an extent set. + +2011-09-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Added new method to adjust the selection type (multi or single select). + + * src/main/java/de/intevation/flys/client/client/ui/DemDatacagePanel.java, + src/main/java/de/intevation/flys/client/client/ui/WspDatacagePanel.java: + Set single selection type for DatacageWidget's grid - only one selected + item is allowed here. + +2011-09-26 Ingo Weinzierl + + flys/issue323 (Datenkorb: Doppelklick im Datenkorb sollte gewähltes Thema (Themen) laden) + + * src/main/java/de/intevation/flys/client/client/event/DatacageDoubleClickHandler.java: + New. Interface for double click handlers used in the datacage. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Implements the DatacageDoubleClickHandler. After a doubleClick event has + been received, the selected Themes from datacage widget are loaded and + the window is destroyed. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + A double click on a tree node triggers the onDoubleClick method for each + registered DatacageDoubleClickHandler. A DatacageDoubleClickHandler + may register itself via DatacageWidget.addDatacageDoubleClickHander() + method. + +2011-09-21 Felix Wolfsteller + + Clone Subtrahend and Minuend in WDiff-branch of WINFO with waterlevelfactory. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + Clone recommendations with waterlevel-factory, prepare to have a + third column in listgrid to remove pairs. + +2011-09-21 Ingo Weinzierl + + flys/issue315 (Ãœberschwemmungsfläche: String bei Streckenauswahl) + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java: + Little modifications to allow subclassing. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangeOnlyPanel.java: + New. A subclass of DoubleRangePanel that does NOT display a "step" + field. + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + Set correct title for this panel. + + * src/main/java/de/intevation/flys/client/client/ui/DistanceOnlyPanel.java: + New. A subclass of DistancePanel that instantiates a + DoubleRangeOnlyPanel instead of a DoubleRangePanel. So, there are only + "from" and "to" fields visible. In addition, this panel only returns + Data objects for these two fields. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Registered the DistanceOnlyPanel. + +2011-09-19 Hans Plum + + * NEWS for V 2.5.0: + Describing new functionality and some backgrounds in + MoinMoin-Wiki Syntax (in german only) from the user perspective. It + does not differentiate between client and server-specific code! + +2011-09-19 Hans Plum + + * NEWS for V 2.4.0: + Describing new functionality and some backgrounds in + MoinMoin-Wiki Syntax (in german only) from the user perspective. It + does not differentiate between client and server-specific code! + +2011-09-19 Ingo Weinzierl + + Tagged RELEASE 2.5 + + * Changes: Prepared changes for the release. + +2011-09-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/TableFilter.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java, + src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + Removed needless imports. + +2011-09-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DemDatacagePanel.java: + Display datacage panel with DEMs only. Return Data object with selected + database ID after pushing 'next' button. + +2011-09-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataService.java: + Added a further 'parameters' parameter to be able to adjust the metadata + query more precise. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Added a further 'parameters' attribute and a constructor. The + 'parameters' attribute is used for the metadata query as well as the + user and the outs. + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePanel.java: + The parameters for the metadata query can now be adjusted by overriding + getUser(), getOuts() and getParameters(). + + * src/main/java/de/intevation/flys/client/client/ui/DemDatacagePanel.java: + This panel now able to only display the DEMs in the datacage panel. + +2011-09-16 Raimund Renkert + + Issue265 + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Added method to be able to register TabSelecedHandler at the + CollectionView. + + * src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java, + src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Register the panel as TabSelectedHandler to hide or show the barrier + layer in the FloodMap. + + * src/main/java/de/intevation/flys/client/client/ui/UIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + Added setter for ParameterList. + +2011-09-16 Felix Wolfsteller + + Updated implementation to a working (but limited and buggy) DatacageTwinPanel. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + Eat recommendations and add them to list, on "proceed"-click, clone + selected artifacts and add them to selection, collapse list entries + to string and add that string as data. + +2011-09-16 Felix Wolfsteller + + Added a loadMany-Function to LoadArtifactService. + + * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/LoadArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/LoadArtifactServiceAsync.java: + Added a loadMany-Function to LoadArtifactService + +2011-09-16 Raimund Renkert + + Issue203 + + * src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Rollback for input assistance of "Q/D" table. + The selectable icon columns are visible in all modes except of + "Q" input mode. + +2011-09-15 Ingo Weinzierl + + flys/issue259 (Daten aus Datenkorb in Diagramm einladen) + + * src/main/java/de/intevation/flys/client/client/event/RedrawRequestEvent.java: + New. This event might be used to define the redraw type. Currently, + there are two types defined: RESET and DEFAULT. DEFAULT means the chart + should only be redrawn, RESET means the chart's state (zoom, etc) should + be reset. + + * src/main/java/de/intevation/flys/client/client/event/RedrawRequestHandler.java: + Added the RedrawRequestEvent to the onRedrawRequest() method. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Implements the HasRedrawRequestHandlers interface. After all Artifacts has + been loaded, the onRedrawRequest() event is fired. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Registered the ChartOutputTab as RedrawRequestHandler. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Distinguishes between the RedrawRequestEvent.Types now. The chart's + state is only reset if the RESET type is given. Otherwise, only the + ThemePanel and the chart image are refreshed. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: Fire + the RedrawRequestEvent with type RESET. + +2011-09-15 Ingo Weinzierl + + flys/issue259 (Daten aus Datenkorb in Diagramm einladen) + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Don't abuse the mechanism to load recommendations any longer. Selected + Facets/Artifacts in this Window are cloned and loaded into the current + Collection using the LoadArtifactService. + +2011-09-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/UIProvider.java: + Defined a setter method to inject a Collection. + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + Added a setter/getter method to inject a Collection. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Inject the current Collection into the UIProvider and add Artifacts that + have been created to the Collection of CollectionView. + + * src/main/java/de/intevation/flys/client/client/ui/WspDatacagePanel.java: + Clone an Artifact that is selected in the datacage widget and add it to + the current Collection. Finally, return its UUID, the name of the facet + and the index. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added new error messages that will be displayed when an error occured + while cloning an Artifact or adding it to a Collection. + +2011-09-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Create a new collection if no Collection is given while initializing a + CollectionView. This is necessary, because a Collection is required in + states that try to add cloned Artifacts (as it is the case in + WspDatacagePanel). + + !! NOTE: This changes the behaviour - before, Collections have been + created when a Collection has Outputs. Now, a Collection is initially + created when the user starts a new project. !! + +2011-09-15 Raimund Renkert + + Issue199 + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Validate than the input field contains a single value. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for error message. + +2011-09-15 Raimund Renkert + + Issue200 + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/range/LocationsTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/RangeTable.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Added formatter for numeric columns that converts the decimal + separator. + +2011-09-15 Ingo Weinzierl + + Refactored the HTTP related code for Collections and Artifacts out to helper + classes. This makes us able to combine several Artifact and Collection + protocol specific things in new Services. The first one which uses this + combination is the LoadArtifactService where a new Artifact is created and + finally added to a Collection. + + * src/main/java/de/intevation/flys/client/server/LoadArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/LoadArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/LoadArtifactService.java: + New service to create a new Artifact (with a given factory and a + recommendation) and add it directly to a specified Collection. + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java: + Removed HTTP related code - the CollectionHelper should do all this. + + * src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java: + Removed HTTP related code - the ArtifactHelper should do all this. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Added HTTP related methods from DescribeCollectionServiceImpl and + AddArtifactServiceImpl. + + * src/main/java/de/intevation/flys/client/server/ArtifactHelper.java: New. + This helper class should handle all the HTTP stuff for working with + Artifacts. + + * src/main/webapp/WEB-INF/web.xml: Registered the new LoadArtifactService. + +2011-09-15 Raimund Renkert + + Issue194 + + * src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java: + Changed table header string and set the column width to percental + value. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for "Q/D" table header. + +2011-09-14 Raimund Renkert + + Issue200 + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java, + src/main/java/de/intevation/flys/client/client/ui/wq/WTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/LocationsTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/RangeTable.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Changed columns to the correct type for most tables. + +2011-09-14 Raimund Renkert + + Issue195 + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Changed i18n string for "Q/D" table header. + +2011-09-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DemDatacagePanel.java, + src/main/java/de/intevation/flys/client/client/ui/WspDatacagePanel.java: + New. Two concrete subclasses of DatacagePanel - one for choosing a dem + and one for choosing a waterlevel. + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePanel.java: + Some refactoring that makes it able to subclass the DatacagePanel. Now, + this class is abstract and needs to be subclassed. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Registered the DemDatacagePanel and WspDatacagePanel as new UIProviders. + +2011-09-14 Raimund Renkert + + Issue313 + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties: + Changed i18n string for search field label. + +2011-09-14 Raimund Renkert + + Issue299 + + * src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java, + src/main/webapp/FLYS.css: + Changed style for loading panel. + +2011-09-14 Felix Wolfsteller + + New DatacageTwinWidget to be used in W-Differences GUI. + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePairWidget.java: + New, display two datacages and a "+" button. On selection and + plus-button press will in future add names of selections into a + given ListGrid. + +2011-09-14 Felix Wolfsteller + + Ease access to selected elements of a DatacageWidget. Make button-less + DatacageWidget possible. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Refactored to allow for button-less Widget and still be able to + access current selection as ToLoad-objects from "outside"; in coo + with Ingo Weinzierl. + +2011-09-14 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Fixed a problem with renaming collection view title and duplicating projects. + +2011-09-14 Raimund Renkert + + Issue166 + + * src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Update the collection view title when the project name changes. + +2011-09-14 Raimund Renkert + + Issue203 + + * src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Removed the table listener for "Q" input. The table is no longer used + for input assistance. + +2011-09-14 Raimund Renkert + + Issue305 + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/TableFilter.java: + Clear the table filter on tab selection change and input method + change. + +2011-09-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java: + Extract the name AND the description from dom Element. Use both + attributes to create a new DataCageNode with 'name' and 'description'. + The 'description' depends on the Element: if it has an attribute + 'description', this one is used otherwise the 'description' is + "${'name'}". + + * src/main/java/de/intevation/flys/client/shared/model/DataCageNode.java: + Added a new attribute 'description' with getter method and new + constructor. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Display the 'description' of DataCageNodes in the Datacage tree, but use + the 'name' for in the ToLoad object which is created after pressing the + "+" button. + +2011-09-14 Felix Wolfsteller + + Committed rest for fix flys/issue311 (translation of crosssection). + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Use translated "actions" string, use constant instead of spelled-out + string. + +2011-09-14 Felix Wolfsteller + + Fix flys/issue309 (crosssection-spinner does not trigger action when + return pressed). + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Trigger ChangedEvent on each keypress when any value given. + +2011-09-14 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Fixed NPE problem on empty list. + Changed filter to caseinsensitiv. (Issue285) + Changed the copy-prefix for duplicated projects. + +2011-09-14 Felix Wolfsteller + + Fix flys/issue311 (i18n of crosssection). + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added translation for crosssections "actions" and w-diff export. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Use translated "actions" string. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Use constant instead of spelled-out string. + +2011-09-13 Raimund Renkert + + Issue234/266 + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Added feature for duplicating projects. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for context menu and project name. + +2011-09-13 Raimund Renkert + + Issue239 + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/range/LocationsTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/RangeTable.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Changed field size from fixed to percental value. + +2011-09-13 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Added filter functionality to the project list. + +2011-09-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactFilter.java: + Call default constructor in parameterized constructor to initialize data + structures. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Repaired broken if-statement that avoided adding new DatacageHandlers. + +2011-09-13 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/OutputTab.java: Added + method that returns the name of the current output. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Resolved TODO: the datacage window fetches the data for the current + output now. + +2011-09-13 Ingo Weinzierl + + flys/issue293 (Karte: Farbliche Anpassung der digitalisierten Objekte) + + * src/main/java/de/intevation/flys/client/client/ui/map/DrawControl.java, + src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: Set + style attribute for newly created vector features. The styled is based + on the "type" attribute of a feature. FloodMap.getStyle(String type) + returns the Style for the specified type. + +2011-09-13 Ingo Weinzierl + + flys/issue289 (Karte: Messen von Strecken und Flächen in falscher + Dimension) + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: Set + map units 'm'. + +2011-09-13 Ingo Weinzierl + + flys/issue286 (Karte: Tooltips für die Werkzeugleiste) + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/map/MeasureControl.java, + src/main/java/de/intevation/flys/client/client/ui/map/DrawControl.java: + Added tooltips for map controls. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added tooltip texts. + +2011-09-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java: + Set the data table cells selectable for copy&paste. + +2011-09-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java: + Introduced i18n for messages in the loading panel. Note that messages + parsed from Artifact's DESCRIBE are _NOT_ based on the client's locale! + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added strings used in the loading panel. + +2011-09-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Set header fields to fixed order. (Issue240) + +2011-09-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/range/LocationsTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/RangeTable.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Changed i18n string for empty table and set header fields to fixed order. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for empty table. + +2011-09-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/TableFilter.java: + The TableFilter implements KeyUpHandler now to receive the last pressed + key. + Removed the 'clear' button and ClickHandler implementation and set the label + text to i18n strings. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n string for filter label. + +2011-09-12 Ingo Weinzierl + + flys/issue282 (Karte: Abstand interpolierte Profile - Default wert) + + * src/main/java/de/intevation/flys/client/client/ui/AutoIntegerPanel.java: + Set default value (if no other value is set) to 'auto'. + +2011-09-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + Implemented a method getDataValue(String state, String name) that searches + for a specific state and data name and returns the string value if such + a data object exists. + + * src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java: + Find out the rivername on the fly (was hard coded before). + +2011-09-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DataList.java: Made + the DataList cloneable. + + * src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java: + Remove the data "uesk.barriers" that contains the GeoJSON geometries + from cloned DataList to supress the GeoJSON string in UI. + +2011-09-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/TableFilter.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Removed needless imports. + +2011-09-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/CalculationMessage.java: + New. Status messages and progress information of Artifact's background + processes are stored in here. + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + Read status messages and progress information from Artifact's DESCRIBE. + Put a CalculationMessage object into the newly created artifacts. + + * src/main/java/de/intevation/flys/client/shared/model/WINFOArtifact.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultArtifact.java, + src/main/java/de/intevation/flys/client/shared/model/Artifact.java: + Artifacts provide a method getBackgroundMessages() that returns a list + of CalculationMessages. + + * src/main/java/de/intevation/flys/client/client/images/loading.gif: A + spinner used in the loading panel. + + * src/main/java/de/intevation/flys/client/client/FLYSImages.java: Declared + the loading.gif. + + * src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java: Use + the status message and progress information to fill the loading panel + with text. The 'loading.gif' is placed at the top of this panel for a + nice visual effect. + + * src/main/webapp/FLYS.css: Set some style information for the loading + box. + +2011-09-08 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Changed 'addChild()' to 'addMember' at layout container to be able to + remove the content. + + * src/main/java/de/intevation/flys/client/client/ui/TableFilter.java: + Uncommented the fire event line to make the filter work. + +2011-09-08 Felix Wolfsteller + + Minor cosmetics. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Minor cosmetics. + +2011-09-08 Felix Wolfsteller + + Added new UIProvider "DatacageTwinPanel"/ "datacage_twin_panel" (stub). As the + Datacage needs to know a user, Modified UIProviderFactory to accept user in + calls to getProvider. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java: + New. Display two DatacageWidgets. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java + (getProvider): Added "user" argument, create DatacageTwinPanel if asked to. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Pass user argument in call to UIProverFactory.getProvider(). + +2011-09-08 Felix Wolfsteller + + Added w_differences translation. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added "w_differences" translation. + +2011-09-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/DescribeArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/DescribeArtifactService.java, + src/main/java/de/intevation/flys/client/server/DescribeArtifactServiceImpl.java: + New. The task of this service is to fetch the current DESCRIBE document + of a specific Artifact (currently used in the LoadingPanel to determine + the background processing's state). + + * src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java: The + loading panel is finished when its Artifact has no longer a processing + background task. + + * src/main/webapp/WEB-INF/web.xml: Registered the DescribeArtifactService. + +2011-09-08 Felix Wolfsteller + + Cosmetics. + + * src/main/java/de/intevation/flys/client/client/FLYS.java. + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java. + src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java. + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Cosmetics; adjusted and corrected some doc. + + +2011-09-07 Raimund Renkert + + Added a filter for the "description" row of helper input tables. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Added a filter for the input tables. + The filter works as an "as you type" filter, if this is to slow, go to the + 'TableFilter' class and change the 'onKeyPress()' handler as documented in + the code. + + * src/main/java/de/intevation/flys/client/client/event/FilterHandler.java, + src/main/java/de/intevation/flys/client/client/event/StringFilterEvent.java, + src/main/java/de/intevation/flys/client/client/ui/TableFilter.java: + New. These classes/interfaces are implemented by Ingo and are used for the + table filter. + They provide common functionality and interfaces for filtering. + +2011-09-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Artifact.java,, + src/main/java/de/intevation/flys/client/shared/model/WINFOArtifact.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultArtifact.java: + An Artifact got a method isInBackground() that returns true, if the + Artifact has been started a background thread in the Artifact-Server - + otherwise it returns false. + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + Parse the "background-processing" attribute from Artifact's DESCRIBE + document. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: Add + a LoadingPanel if the new Artifact that is injected via setArtifact() is + in background mode. + + * src/main/java/de/intevation/flys/client/client/ui/LoadingPanel.java: New. + A window that places itself in front of another component - which disables + user interaction with the parent component. Currently, the loading panel + waits a few seconds an removes itself from parent component. + + * src/main/webapp/FLYS.css: Added a style for the loading panel's label + 'loading-message'. + +2011-09-07 Felix Wolfsteller + + Display Action Widget only for cross_section theme/facet. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + Put action widget only for cross_section theme, resolving a TODO. + Adjust layout slightly. + +2011-09-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/DrawControl.java: + Set WSPLGEN specific names for the 'type' attribute after digitizing new + geometries. + +2011-09-06 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Fix broken build by changed method name. + +2011-09-06 Felix Wolfsteller + + Subclassed ChartThemePanel, trigger redraws of Chart when interaction with + "Action" widgets in ThemePanel occured (but will still crash). + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Extracted CrossSection-specific stuff to own subclass. + + * src/main/java/de/intevation/flys/client/client/ui/chart/CrossSectionChartThemePanel.java: + New, contains specific parts that were extracted from ChartThemePanel. + After interaction via the "Actions" Widgets (currently only a spinner), + request a chart redraw. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Depending on the outputmode, create a CrossSectionChartThemePanel, register + as redrawRequestHandler. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Implement HasRedrawRequestHandlers interface. + +2011-09-06 Felix Wolfsteller + + Added concept of a RedrawRequestHandler to allow e.g. ChartThemePanel to + trigger a redraw of a Chart. + + * src/main/java/de/intevation/flys/client/client/event/HasRedrawRequestHandlers.java, + src/main/java/de/intevation/flys/client/client/event/RedrawRequestHandler.java: + New, trivial yet eventless notification handler interfaces. + +2011-09-06 Ingo Weinzierl + + flys/issue166 (Projektname in die Fensterleiste übernehmen) + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Read the name from Collection's DESCRIBE document and create new + Collection objects with this information. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java: + Adapted constructors which now require a name. + + * src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java: + Use the UUID as Collection name after a Collection has been created - at + that time no user defined name is existing. + +2011-09-06 Felix Wolfsteller + + Minor cosmetics. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultDataItem.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultArtifact.java, + src/main/java/de/intevation/flys/client/shared/model/FacetRecord.java, + src/main/java/de/intevation/flys/client/client/services/FeedService.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Minor cosmetics. + +2011-09-02 Felix Wolfsteller + +2011-09-02 Felix Wolfsteller + + Refactored to allow specialized controls within the ChartThemePanel, stubby + first steps towards such a control (bound to FeedService). + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: + Minor cosmetics. + (createGrid): + Extracted (trivial) to allow more concrete implementations in subclasses. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java + (createGrid): + Implementation, add a spinner that could talk with feedservice. + (initGrid): + Added new "actions" field. + +2011-09-02 Felix Wolfsteller + + Minor Cosmetics. + + * src/main/java/de/intevation/flys/client/server/FeedServiceImpl.java: + Removed superflouus import. + +2011-09-02 Felix Wolfsteller + + Cosmetics, doc. + + * src/main/java/de/intevation/flys/client/client/services/StepForwardService.java, + src/main/java/de/intevation/flys/client/client/services/StepForwardServiceAsync.java: + Modified docs so that the distinction to FeedService becomes clear. + + * src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java: + Whitespaces. + +2011-09-02 Felix Wolfsteller + + Added implementation of a FeedService. + + * src/main/java/de/intevation/flys/client/client/services/FeedServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/FeedService.java, + src/main/java/de/intevation/flys/client/server/FeedServiceImpl.java: + Added implementation of a FeedService (shamelessly copied from + ~AdvanceService) + + * src/main/webapp/WEB-INF/web.xml: + Added configuration of feedService. + +2011-09-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/DrawControl.java: + Set the 'typ' attribute of a feature that is added to the vector layer. + Features, that are loaded into the layer from GeoJSON file keep their + existing 'typ' attribute. New features get the attribute from combo box. + +2011-08-31 Felix Wolfsteller + + Added cross section translation. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added "cross_section" translation. + +2011-08-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWidget.java: + Moved datacage specific stuff into a VLayout. + * src/main/java/de/intevation/flys/client/client/event/DatacageHandler.java: + New. Event handler used by DatacageWidget to broadcast toLoad events. + + * src/main/java/de/intevation/flys/client/client/ui/DatacagePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageButton.java: + Adjusted calls. TODO: We need the user and the collection view. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Forward collection view to DatacageWindow. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Moved stuff out to DatacageWidget. Send recommendations to CollectionView. + +2011-08-25 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Ugly workaraound: If no reference artifact is given use current + artifact as master artifact. + +2011-08-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/ToLoad.java + (toRecommendations): Compile a list of recommendations out of + datacage tree selections. A lot of model conversions. :-/ + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactFilter.java, + src/main/java/de/intevation/flys/client/shared/model/FacetFilter.java, + src/main/java/de/intevation/flys/client/shared/model/OutFilter.java: + Added code to convert the models. + +2011-08-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/services/ArtifactService.java, + src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactServiceAsync.java: + Removed the UUID of the master artifact from interface. + Its transported in the recommendation. Set the creation + filter if its set in the recommendation. + + * src/main/java/de/intevation/flys/client/shared/model/Recommendation.java: + Added Filter/Facets. Its merely a copy of CreationFilter + but this cannot be serialized from JS to the RPC side. + + * src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Adjusted the calls to fulfill the changed interface. + +2011-08-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/Recommendation.java: + Added field for master artifact. Not uses, yet. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Allow passing no master artifact to RPC service when creating new artifact. + +2011-08-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/services/ArtifactService.java, + src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java: + Forward recommendations as a structure to RPC service. + TODO: use this to give filters to creation. + + * src/main/java/de/intevation/flys/client/client/services/ArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactService.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Adjusted calls. + +2011-08-24 Felix Wolfsteller + + Fix loading of recommendations when collection is not yet in place. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java + (createNewCollection): + Load recommendations when new Collection is created. + (onParameterChange): + Guard call to loadRecommendation to avoid NPE when no collection is yet set. + +2011-08-24 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java: + Ensure list of recommendations is non-null after construction. + +2011-08-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/DefaultRecommendation.java, + src/main/java/de/intevation/flys/client/shared/model/Recommendation.java: + Deleted DefaultRecommendation. Use Recommendation as a class directly. + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Use the Recommendation class directly. + +2011-08-24 Felix Wolfsteller + + Minor cosmetics. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Picky cosmetics about comment content. + +2011-08-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/ToLoad.java, + src/main/java/de/intevation/flys/client/shared/model/FacetFilter.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Use "ids" instead of "num". + +2011-08-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java, + src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + s/db-ids/ids/g to unify system and user specific loading. + +2011-08-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + The toolbar used in this map widget will no longer contain digitize + controls. + +2011-08-24 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactFilter.java, + src/main/java/de/intevation/flys/client/shared/model/ToLoad.java: + Generate unique keys for anonymous artifacts (aka static data). + +2011-08-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DigitizePanel.java: + New. A subclass of the SelectProvider which displays combo boxes on the + left and a map panel in the helper container. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Added a property that allows initializing the toolbar with no digitize + controls. + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Added a method that returns the vector features as GeoJSON string. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Creates a DigitizePanel if the uiprovider string "map_digitize" is set. + +2011-08-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapPanel.java: + New. A widget that displays a map with a toolbar. It wraps all the stuff + to combine SmartGWT with GWT-OpenLayers. + +2011-08-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/ToLoad.java: + Re-written to feature the new models. + + * src/main/java/de/intevation/flys/client/shared/model/FacetFilter.java: + Be aware of null values for num and name. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Adjusted calls for new toLoad semantics. + +2011-08-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactFilter.java, + src/main/java/de/intevation/flys/client/shared/model/FacetFilter.java, + src/main/java/de/intevation/flys/client/shared/model/OutFilter.java: + New. Models which are better suited for creating artifact facet filters. + TODO: Re-factor ToLoad to create these models. + +2011-08-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Parse the output modes of the first Artifact only. The output modes of + the other artifacts shouldn't be visible to the user. + +2011-08-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/MapInfo.java: New. + Instances of this class are used to store basic information which are + necessary to create maps. + + * src/main/java/de/intevation/flys/client/shared/model/BBox.java: New. An + internal representation of a bounding box which consists of four + coordinates. + + * src/main/java/de/intevation/flys/client/client/services/MapInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MapInfoService.java, + src/main/java/de/intevation/flys/client/server/MapInfoServiceImpl.java: + The interface definitions and the implementation of a service that + queries basic map information from artifact server. + + * src/main/webapp/WEB-INF/web.xml: Registered the new MapInfo service. + +2011-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataService.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Re-added the outs parameter to the meta data service. TODO: Pass + it from the UI. + +2011-08-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/ToLoad.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Aggregate the items to load by artifact id and factories. Makes + it easier to build filter views on new created artifacts to be + added to the current collection. + +2011-08-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Set the Collection and its Master-Artifact at first when we create a + CollectionView with an existing Collection instance. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Enabled the SelectFeature control to select a feature using a box. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + The geometries added by the user are saved as GeoJSON parameters of the + master artifact . The user does not need to save the geometries + explicitly - this is an automatic process. While initializing the map, + those geometries are reloaded and displayed again. + +2011-08-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/NoInputPanel.java: + This panel is used to suppress the creation of an input panel. + Currently, this panel is used in the floodmap state. This state is able + to save geometries, but we currently don't want to insert GeoJSON + strings manually. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Instantiate the NoInputPanel if the ui provider string "noinput" is + specified. + +2011-08-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Determine the max extent of all layers contained in the collection. + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: Set + the map projection and its max extent determined by MapOutputTab. + +2011-08-12 Sascha L. Teichmann + + Extract selected data from datacage panel + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java: + Removed some debugging. + + * src/main/java/de/intevation/flys/client/shared/model/ToLoad.java: New. + Contains artifact id, db ids, factory name and facet number. Should + be enough to identify the data to load. + * src/main/java/de/intevation/flys/client/shared/model/AttrList.java: + Fixed indexing bug. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Added a toLoad() method which returns a list of ToLoad data to load via + the corresponding factories. + If you double click on a tree node all data below this filled into this list + and the window is disposed. + You can do multipl selects on the and press the '+' button to do + a multiselect loading. + +2011-08-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java: + Do not use 'name' attribute of datacage. + + * src/main/java/de/intevation/flys/client/client/widgets/tree/AttributedTreeNode.java: + Removed. Not longer needed. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Build the UI tree in a more smartgwt compatible style. Prevents lots + of exception when using click listeners. + +2011-08-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Set window title to include UUID. + +2011-08-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Changed log message for two distinct malconditions. + +2011-08-09 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Adjusted German translation to use unique strings. + +2011-08-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/BooleanPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java, + src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Removed superfluous imports. + +2011-08-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/widgets/tree/AttributedTreeNode.java: + New. Subclassed TreeNode to carry the attribute data from + the meta data service. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Create AttributedTreeNodes instead of TreeNodes to have the + relevant information at hand if a listener wants to access + the data. + +2011-08-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/AttrList.java: + New. List of attributes for each DataCageNode. + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java: + Generate the list of attributes for each datacage node. + + * src/main/java/de/intevation/flys/client/shared/model/DataCageNode.java: + Added the attribute list. + +2011-08-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Do not cry for missing i18n if running into error. + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java: + Convert more stuff. + + * src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java: + Create correct request document now. + +2011-08-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/services/MetaDataService.java, + src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataServiceAsync.java: + Take the user id, too. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Adjusted call to pass the user id to the datacage window. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageButton.java, + src/main/java/de/intevation/flys/client/client/ui/DatacagePanel.java: + TODO: Bring user id into play. + +2011-08-02 Felix Wolfsteller + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java: + Unified spacing and punctuations in javadoc comments, removed + incorrect comment. + +2011-07-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java, + src/main/java/de/intevation/flys/client/shared/model/Collection.java: + Collections are able to store the recommendations they have already + loaded. Therefore, new methods have been added to add recommendations + and to determine, if a recommendation has already been loaded. + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Read the already loaded recommendations from Collection's DESCRIBE + document. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Write the Collection's recommendations into its attribute document. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Two things: + 1) Do no load recommendations that have already been loaded before. + 2) Update UI when there are no more artifacts to load (recommendations). + +2011-07-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Added missing slash in XPath expression. + +2011-07-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DefaultRecommendation.java, + src/main/java/de/intevation/flys/client/shared/model/Recommendation.java: + New. The interface and its default implementation that represent + recommendations provided by an Artifact. A recommendation consists at + least of the name of an ArtifactFactory and a list of database ids. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Read the recommendations from Artifact's DESCRIBE document (which + structure has changed.) + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactDescription.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultArtifactDescription.java: + Recommendation are no longer simple strings but Recommendation objects + now. So, the interface to retrieve those recommendations has changed. + + * src/main/java/de/intevation/flys/client/client/services/ArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactService.java, + src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java: + This service takes a further string now, which represents the database + ids used to create static artifacts that require data from database. + + * src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Adapted the call of the ArtifactService. + +M src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java + +2011-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: The + vector layer which is used to save features created by the user acts as + OpenLayers base layer. I decided to do so, because this is the first + and only layer that will always exist in our maps. Users aren't able to + remove it! + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + Added a callback interface that allows the MapOutputTab to react on + modifications in the ThemePanel. This special callback is used to + activate/deactivate layers. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Now, the layers in the map reflect the facets of the map output. Each + layer's extent is analyzed and finally the map is zoomed to the minimal + extent that contains all layers. + +2011-07-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ThemeNavigationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/ThemeNavigationPanel.java: + Moved the panel a package level higher. + + * src/main/java/de/intevation/flys/client/client/ui/ThemePanel.java: New. + Abstract class that consists basically of the code that was removed from + ChartThemePanel. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Sourced code base out to ThemePanel, so that's possible to reuse the + code for a MapThemePanel. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java: + New. A theme panel for the map widget. + +2011-07-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/AttributedTheme.java: + New. This theme stores all its attributes in a map. The intent of this + theme is to save all the facet's values contained in the DESCRIBE of the + Collection to be able to write an equivalent attribute part as the + incoming DESCRIBE has -> no loss of attributes like WMS URL or + layernames in a map theme! + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Instantiate new AttributedThemes to save all information of a facet. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Write all attributes of an AttributedTheme into a facet's element. + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java, + src/main/java/de/intevation/flys/client/shared/model/FacetRecord.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + The 'active' member variable is an integer value now as it is in the + Collection's DESCRIBE document, too. + +2011-07-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/ArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactService.java, + src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java: + An artifact can be created using a UUID as model artifact. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Read artifact recommendations from artifact description. + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactDescription.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultArtifactDescription.java: + Added method to retrieve recommendations. + + * src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Adapted the call of the ArtifactService. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + If the Artifact of a collection changes, the recommended Artifacts - if + existing - are created and added to the current Collection. + +2011-07-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MeasureControl.java: + New. This control consists of two OpenLayers controls to measure lines + and polygons. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Added the MeasureControl. + + * src/main/webapp/images/measurePolygon.png, + src/main/webapp/images/measurePolygon_Selected.png, + src/main/webapp/images/measureLine.png, + src/main/webapp/images/measureLine_Selected.png: New. Icons for the + measure control. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + path locations for the measurement tools. + +2011-07-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapPositionPanel.java: + New. This panel displays the mouse position in map coordinates. + + * src/main/java/de/intevation/flys/client/client/ui/map/DrawControl.java:: + New. This control consists of a button to enable the control and a + combobox that provides different types of barriers. Dependent on the + selected barrier type, the user can draw lines or polygons into the map. + + * src/main/java/de/intevation/flys/client/client/utils/EnableDisableCmd.java: + New. This interface might be used to react on enable/disable operations. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + Added controls to digitize lines and polygons. + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Added a method that returns a vector layer that might be used to insert + new barriers draw by the user. This layer is used by the DrawControl. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + The MapToolbar requires a Canvas object now, which is used to keep track + on the current mouse position. + + * src/main/webapp/images/selectFeature_Selected.png, + src/main/webapp/images/selectFeature.png, + src/main/webapp/images/digitize.png, + src/main/webapp/images/digitize_Selected.png, + src/main/webapp/images/removeFeature.png: New. Icons for the map control + elements. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + i18n strings and image pathes. + +2011-07-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java: + New. This toolbar provides controls that interact with the map. + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + Removed the initialization of map controls. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Added the MapToolbar at the top of the layout. + +2011-07-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Finished layouting the components. The map has the same layout as the + chart now. + +2011-07-08 Ingo Weinzierl + + * pom.xml: Added a dependency to GwtOpenLayers 0.5 (Apache 2.0). + + * src/main/java/de/intevation/flys/client/FLYS.gwt.xml: Include the GWT + OpenLayers code. + + * src/main/webapp/FLYS.html: Include OpenLayers 2.9 (currently from remote + openlayers.org server). For production use, we have to include a local + OpenLayers. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Small + modification on the way to render the HTML page. This lets us now + combine GWT and SmartGWT components. + + * src/main/java/de/intevation/flys/client/client/ui/map/FloodMap.java: + New. This components manages the map provided by GwtOpenLayers. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + Initializes a FloodMap now and renders the map in the middle area. Note, + that the layout is nearly completely using GWT components. Mixing + GwtOpenLayers with SmartGWT doesn't work here. + +2011-07-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/OutputMode.java: An + output mode has type member now. In addition, the interface describes a + method that creates an OutputTab. Concrete subclasses should return + OutputTabs that fit to their type. + + * src/main/java/de/intevation/flys/client/shared/model/ChartMode.java: + New. This OutputMode is instantiated if type == "chart" and creates + ChartOutputTabs. + + * src/main/java/de/intevation/flys/client/shared/model/MapMode.java: New. + This OutputMode is instantiated if type == "map". It creates + MapOutputTabs. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultOutputMode.java: + This default implementation of an OutputMode support the type member + now. The method to create OutputTabs will return null. + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Now, we support the 'type' attribute of Outputs in the DESCRIBE + document. Based on the type, we will now instantiate concrete subclasses + of the DefaultOutputMode. E.g. the type == 'chart', the instantiated + OutputMode will be ChartMode. + + * src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java: + New. This OutputTab is used to render a map. + + Note: This is currently a stub only! + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Creating OutputTabs based on the names of an OutputMode is obsolete. + Now, the OutputModes itself create their required OutputTab. + +2011-07-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added strings for the output mode 'floodmap'. + +2011-07-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/BooleanPanel.java, + src/main/java/de/intevation/flys/client/client/ui/TextProvider.java, + src/main/java/de/intevation/flys/client/client/ui/AutoIntegerPanel.java: + Default values provided by the data list used to create the panels are + set now. + +2011-07-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + Refactored getting labels out to own methods which enables subclasses to + changed them. + + * src/main/java/de/intevation/flys/client/client/ui/WaterlevelGroundPanel.java: + Override methods of DistancePanel to support own labels for this panel. + In addition, this panel has no distance/locations table as the + DistancePanel has. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + new strings for the distance panel and the waterlevel/ground panel. + +2011-07-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/BooleanPanel.java: + This panel is a sublcass of TextProvider now. The difference to the + TextProvider is, that there is the option to active/deactivate a + checkbox. So, the valid values returned by this panel are "true" and + "false". + +2011-07-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/TextProvider.java: + Made methods in this class much smaller to override them easily in + subclasses. In addition, the TextItem has been replaced with a + DataSourceField which seems to be more easily to change in subclasses. + + * src/main/java/de/intevation/flys/client/client/ui/AutoIntegerPanel.java: + Override required methods of TextProvider. This panel now accepts + integer values and the string "auto". An inner class + AutoIntegerValidator is used to validate the user input. + + * src/main/webapp/FLYS.css: Set style for html label elements. Those label + elements are used in forms to label items. + +2011-07-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/ParameterChangeEvent.java: + This event now supports a further member variable "type". Type is an + enum and can be FORWARD or BACK which reflects to stepping forward or + backward with the master artifact. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Improved the way of adding/removing items to/from the static list of + parameters. We now distinguish between the two ways: + - step forward: the last item in the list is added to the static + parameter list. This makes redrawing much smoother. + - step backward: only the necessary items are removed from the static + parameter list. Before, we have removed all items and + added the relevant ones afterwards. This makes + redrawing also much smoother. + + * src/main/java/de/intevation/flys/client/client/ui/ContinuePanel.java: + This panel will have no static widget. + + * src/main/java/de/intevation/flys/client/client/ui/AutoIntegerPanel.java: + This panel uses the parents createOld() now. + +2011-07-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/webapp/FLYS.css: Some layout improvements related to the height + of components. + +2011-07-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + The right side of the ParameterList now consists of a stacked panel that + itself consists of the helper panel and a panel for displaying the + calculation results. The user is now able to see both at the same time. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Improved the Collection update process. There is no need to update the + collection twice when the master artifact changed. Now, the collection + is updated only a single time if the collection itself changed - and it + changes everytime when its artifact is set. + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java: + The label 'Berechnungsergebnisse' is no longer part of the Canvas + created by this class. + + * src/main/java/de/intevation/flys/client/client/ui/UIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + The helper panel is now a VLayout, no longer a Canvas. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Add helper widgets as members to the helper panel, no longer as + children. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings for the input support stack. + +2011-07-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + Modified these classes with the intent to override them easier. + + * src/main/java/de/intevation/flys/client/client/ui/BooleanPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacagePanel.java, + src/main/java/de/intevation/flys/client/client/ui/TextProvider.java, + src/main/java/de/intevation/flys/client/client/ui/AutoIntegerPanel.java, + src/main/java/de/intevation/flys/client/client/ui/WaterlevelGroundPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageButton.java: + New panels for data input. The work on these classes is not finished + yet! + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Support more UI providers that return the new panels above. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: New + strings used in the WaterlevelGroundPanel. + +2011-07-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/AdvanceHandler.java: + New. This interface describes a handler that listens to events in order + to advance to a next step. + + * src/main/java/de/intevation/flys/client/client/ui/ContinuePanel.java: + New. This panel doesn't allow users to enter data. It only displays a + link that lets users step forward to a next state. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + The ParameterList needs to take care on states that do not require user + input but that aren't the final state of an artifact. In such case, the + UI provider should be the ContinuePanel only! It allows users to step to + the next state. In order to provide such functionality - step forward + without feeding the artifact - the ParameterList now implements the + AdvanceHandler. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + If the uiprovider attribute is 'continue', the ContinuePanel is + returned. + + * src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Adapted the width of the label field. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + strings for new states. + +2011-07-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + Added the missing "back"-button. + +2011-07-01 Ingo Weinzierl + + flys/issue159 (WINFO: Radiobutton - Ortsauswahl bei "W für ungleichwertigen Abflusslängsschnitt" entfernen) + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + Connected columns of the locations and distances tables with the + panels from/to fields. The first two columns of the locations and the + first column of the distances table might be used to set from/to values + in the panel. + +2011-07-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DistanceInfoXML.java: + New. This service - which is no GWT RPC Service - returns the distance + info document as XML. The content of the document is not modified, + parsed but only copied through. + + * src/main/java/de/intevation/flys/client/client/ui/range/DistanceInfoDataSource.java: + New. This data source is used to fill the LocationsTable and RangeTable. + It uses the DistanceInfoXML service to query the required data + automatically using a "locations" or "distances" filter to reduce the + size of the data document. + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + Use the DistanceInfoDataSource to fill the locations and distances tables. + + * src/main/webapp/WEB-INF/web.xml: Registered the new service. + +2011-06-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/range/LocationsTable.java, + src/main/java/de/intevation/flys/client/client/ui/range/RangeTable.java: + New. These two tables are used to support the user to select from/to + values in the distance panel. + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + Added LocationsTable and RangeTable that currently load no data. + +2011-06-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java: + New. This panel is used to insert kilometer ranges. There is no input + mode for locations as it is in LocationDistancePanel. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added i18n strings for the distance panel. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java: + Added a method to set the step width. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Create a DistancePanel UIProvider if the "uiprovider" string in the + DESCRIBE of an artifact equals "distance_panel". + +2011-06-29 Ingo Weinzierl + + flys/issue185 (IE8 + Chromium: Kein Zoomen von Diagrammen möglich) + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Create the chart image first before initialising listeners on it. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ZoomboxControl.java: + The zoombox that is displayed in while zooming is 2 pixel smaller than + the area between start and end point now. This should avoid the zoombox + absorbing mouse events. + +2011-06-29 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Reordered delete and rename in project context menu, add separator. + +2011-06-29 Ingo Weinzierl + + flys/issue181 (Erstes Thema in der Themenliste wählt sich automatisch wieder an) + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + We will no longer check if an update of the theme list is necessary. + The EditEvent that is caught should be enough information to start the + update process. + +2011-06-28 Ingo Weinzierl + + * pom.xml: GWT version upgrade from 2.1.1 to 2.3.0. + +2011-06-28 Ingo Weinzierl + + Tagged RELEASE 2.4 + +2011-06-27 Ingo Weinzierl + + flys/issue182 (WINFO: Vorbelegung Q bei "ungleichwertigem Abflusslängsschnitt") + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Set initial mode to Q. + +2011-06-27 Ingo Weinzierl + + * Changes: Prepared changes for the upcoming release. + +2011-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/**/*.java: + Removed trailing whitespace. + +2011-06-26 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/UserCollectionsServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/CollectionRecord.java, + src/main/java/de/intevation/flys/client/client/ui/chart/PanControl.java: + Removed superfluous imports. + +2011-06-24 Ingo Weinzierl + + flys/issue165 (Projektliste: Einige Auffälligkeiten nach Neuimplementierung) + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Set the maximal length of project names to 50 characters. If the name, + entered by the user, is longer than this max value, it is not saved to + artifact server and the old name is displayed again. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added warning message for too long project names. + +2011-06-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + The "zoom-to-max-extent" button will have the effect that no zoom values + are transfered to the server. + +2011-06-24 Ingo Weinzierl + + flys/issue21 (Gleiches Projekt kann mehr als einmal gleichzeitig geöffnet werden) + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Implements + CollectionChangeHandler to lock new projects. In addition, there is a + new method to close projects. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + If this view contains a Collection, FLYS is used to close this window. + FLYS needs to unlock the project before the view is destroyed. + Otherwise - if no Collection has been created yet - this view destroys + itself. + +2011-06-23 Ingo Weinzierl + + flys/issue170 (Diagramm: Initiales Zoomen zeigt verschobenen Bereich) + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + The chart image is no longer removed from DOM but it's source is set to + a new value after the panel's size changes. This makes the zoom actions + much smoother and there the initial zoom values are no longer broken. + + * src/main/java/de/intevation/flys/client/client/ui/chart/PanControl.java: + Panning will now move the image itself but not its parent element. + + * src/main/java/de/intevation/flys/client/shared/model/ChartInfo.java, + src/main/java/de/intevation/flys/client/shared/Transform2D.java: Added + methods to dump the objects to GWT log. + +2011-06-23 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Prepare for AT export. + +2011-06-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Removed the formatter that cuts out a piece of the middle of project + names. + +2011-06-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/CollectionRecord.java: + Store Html escaped strings as names. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Display the project's name stored at the CollectionRecord which is Html + escaped. + +2011-06-23 Ingo Weinzierl + + flys/issue165 (Projektliste: Einige Auffälligkeiten nach Neuimplementierung) + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Added tooltips and table headers. + +2011-06-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added more i18n strings for the project list and error messages. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Added a + handler that catches uncaught exceptions. Those exceptions are displayed + using a new method showWarning(Throwable t). This method brings up a + Window that displays the stacktrace of the exceptions. + +2011-06-23 Sascha L. Teichmann + + * pom.xml: Added dependency to Apache Commons Lang 2.6 http://commons.apache.org/lang/ + Used for proper HTML string escaping. + + * src/main/java/de/intevation/flys/client/server/ReportServiceImpl.java: Generate + error reports as HTML lists. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: Set report + in corresponding panel. + +2011-06-22 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/services/ReportService.java, + src/main/java/de/intevation/flys/client/server/ReportServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/ReportServiceAsync.java: + Stub for report service. + + * src/main/webapp/WEB-INF/web.xml: registered new service. + +2011-06-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added a new error string. + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Display a warning if there are no information of W and Q ranges that + might be used to validate user input. + +2011-06-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Register the CollectionView when a new collection is created. This is + necessary to avoid an inconsistent view that would otherwise display + projects that might have been deleted. + +2011-06-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + If an open project is removed (via context menu) the related + CollectionView is removed from screen. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Added a method + that returns the current FLYSWorkspace. + + * src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java: + Added a method that destroys a CollectionView if it is open. + +2011-06-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DoCollectionAction.java: + New. This base RPC service implementation handles collecion specific + actions. It has a doAction() method that takes a Collection, the action + document and a server url. + + * src/main/java/de/intevation/flys/client/server/SetCollectionNameServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DeleteCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/SetCollectionTTLServiceImpl.java: + Trigger the collection actions on the server using the + DoCollectionAction class which handles the Http stuff. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Bugfix: If no user collections returned, we will clear the project list. + +2011-06-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/SetCollectionNameServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/SetCollectionNameService.java, + src/main/java/de/intevation/flys/client/server/SetCollectionNameServiceImpl.java: + New. This service is used to set the name of a collection. Note, that + this is currently just a stub. The ServiceImpl currently throws a "NOT + IMPLEMENTED" exception. + + * src/main/java/de/intevation/flys/client/client/services/SetCollectionTTLServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/SetCollectionTTLService.java, + src/main/java/de/intevation/flys/client/server/SetCollectionTTLServiceImpl.java: + New. This service is used to set the time-to-live of a collection. Note, + that this is currently just a stub. The ServiceImpl currently throws a + "NOT IMPLEMENTED" exception. + + * src/main/java/de/intevation/flys/client/client/services/DeleteCollectionServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/DeleteCollectionService.java, + src/main/java/de/intevation/flys/client/server/DeleteCollectionServiceImpl.java: + New. This service is used to delete a collection. Note, that this is + currently just a stub. The ServiceImpl currently throws a "NOT + IMPLEMENTED" exception. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Calls the services SetCollectionTTLService, SetCollectionNameService and + DeleteCollectionService and display a warning if an error occured. + + * src/main/webapp/WEB-INF/web.xml: Registered the new services. + +2011-06-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java, + src/main/java/de/intevation/flys/client/shared/model/Collection.java: + There are setter methods for 'name' and 'ttl' now. The project list + requires this to set those attribute to a new value. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added strings for the project list's context menu item "rename project". + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Added a context menu item to rename the selected project and listeners + to trigger setting 'name' and 'ttl' to a new value. + + TODO: We still need to write RPC services to update those values! + +2011-06-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Renamed the german translation of wq mode for "Q at gauge". + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Adapted the layout to fit the (long) german wq mode string. + +2011-06-22 Ingo Weinzierl + + flys/issue104 (W-INFO: Wasserspiegellagenberechnung / Strecke) + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + The old/static panel will display the selected wq mode now, because it's + no longer possible to recognize the selected q mode based on the + displayed units (there are two different q modes now). + +2011-06-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Initialize the combobox correctly. + +2011-06-21 Ingo Weinzierl + + flys/issue156 (WINFO: Platzierung des Berechnungsberichtes) + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Do not display report modes as tabs. + +2011-06-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + The combobox is no longer editable now. + +2011-06-21 Ingo Weinzierl + + flys/issue21 (Gleiches Projekt kann mehr als einmal gleichzeitig geöffnet werden) + + * src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java: + Open projects that are opened again via ProjectList are brought up to + front and their size is restored. + +2011-06-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + Take care on empty fields when adding a new double value. + +2011-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/ReportMode.java: + New. Mode to detect out of type 'report'. + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Build ReportModes for 'report' outs. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Filter reports and dispatch them to updateReports(). + +2011-06-21 Ingo Weinzierl + + flys/issue132 (WINFO: Streckenauswahl per default setzen) + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Set the initial mode to "distance". + +2011-06-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/UserCollectionsServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java: + Read the time-to-live from collection's describe document. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java, + src/main/java/de/intevation/flys/client/shared/model/Collection.java: + Adapted the constructor calls. They require a time-to-live attribute + now. This value is retrievable via getTTL(). + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + The project list has now a column that displays an icon that shows the + favorite state of the project. A gold star means, the project is marked + as favorite, a silver one means that the project is no favorite project. + + * src/main/java/de/intevation/flys/client/shared/model/CollectionRecord.java: + The 'ttl' attribute returns the filename of the icon that should be + displayed in the project list. + + * src/main/webapp/images/star_silver.png, + src/main/webapp/images/star_gold.png: New. These icons - based on icons + copied from famfamfam - are used to mark a project as favorite or no + favorite. + +2011-06-21 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/config.xml: + Set project list update interval to 5 minutes. That is enough + for long living projects. + +2011-06-21 Ingo Weinzierl + + flys/issue22 (Abgelaufene Projekte/Collections werden noch in der Projektliste angezeigt.) + + * src/main/java/de/intevation/flys/client/client/Config.java, + src/main/java/de/intevation/flys/client/client/config.xml: + Added a config option to specify the update interval of the project + list. This value is retrievable using the method + Config.getProjectListUpdateInterval(). + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Added a timer to update the user's collections frequently. The interval + is determined by the constant UPDATE_INTERVAL which is currently 30 + seconds or a config.xml option that needs to be configured at + "/config/projectlist/update-interval/text()". + +2011-06-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added i18n strings for the new output "report" for each calculation + mode. + +2011-06-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: Added report panel. + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DistanceInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/MousePositionPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Removed superfluous imports. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + 'boolean ? true : false' <=> 'boolean' + +2011-06-20 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Removed more expensive XPath. + +2011-06-20 Ingo Weinzierl + + flys/issue140 (WINFO: WQ-Tabelle in Tabs aufsplitten) + flys/issue122 (W-INFO: Wasserspiegellagenberechnung / Auswahlunterstützung Abfluss (W-Werte sind nicht auswählbar)) + + * src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java: + New. This table is used to show Q and D values for the WQInputPanel. The + first two rows are selectable icons. + + * src/main/java/de/intevation/flys/client/client/ui/wq/WTable.java: New. + This table is used to show W values for the WQInputPanel. The rows in + this table are not selectable. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java: + Added methods to set the lower and upper value directly. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + Added a method to add a further double value to the current list. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Removed the old WQD tables and replaced them with a QDTable and a + WTable. The WQD values are sorted into the two tables when they are + initialized. The values in the WTable are not selectable. The QDTable + has two selectable columns. Based on the current mode (single values or + range mode), the selected values are filled into the array panel or into + the range panel. + +2011-06-17 Ingo Weinzierl + + flys/issue140 PART 1 (WINFO: WQ-Tabelle in Tabs aufsplitten) + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Splitted the code to determine min/max kilometer range and rivername + from code to fetch WQ data via RPC. + +2011-06-17 Ingo Weinzierl + + flys/issue118 (W-INFO: Eingabe Q aus Auswahlunterstützung und Manuell) + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Added the "wq_free" parameter to the feed data even if the single value + mode is selected. + +2011-06-17 Ingo Weinzierl + + flys/issue118 (W-INFO: Eingabe Q aus Auswahlunterstützung und Manuell) + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Added a further radio button to select a "Q at Gauge". In addition, this + panel returns a new value "wq_free" that depends on the selected Q mode. + It is "true" if Q is selected, otherwise "false". + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added strings for the new radio button. + +2011-06-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + Write "index" and "description" into the attribute document. This is + necessary for the ChartThemePanel. + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java: Added a + getIndex() method. + +2011-06-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Read "index" and "description" of facets from collection's describe + document. In addition, I replaced the expensive XPath search for + attributes with DOM methods. + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultFacet.java: + Themes and facets have now indices and descriptions. + + * src/main/java/de/intevation/flys/client/shared/model/FacetRecord.java: + Display the description of a theme in the theme panel instead of the + name (which represents the facet type). + +2011-06-16 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Alloc TreeNode array with the right size because its known. + +2011-06-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + Be more tolerant with entered whitespaces. + +2011-06-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Set height of the parameter panel that shows the "old" values to "1" if + no "old" value is existing. This avoids GWT throwing warning messages. + +2011-06-15 Ingo Weinzierl + + flys/issue117 (W-INFO: Wasserspiegellagenberechnung / Q-Eingabe) + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + This panel will return a list of unique values. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java: + Improved parsing of double values. + +2011-06-14 Sascha L. Teichmann + + flys/issue88 (WINFO/Wasserspiegellage: Namensänderung im Eingabebereich + von Orten und Strecken) + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Modified strings for the location/distance panel. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Modified strings for the radio button and panel titles. + +2011-06-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/DistanceInfoServiceImpl.java: + Got rid of namespace. Use DOM instead of XPath. + +2011-06-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/DistanceInfoRecord.java: + Adjusted table model. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Bring 'Oberkante' and 'Unterkante' into UI. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + i18n. Repaired a few wrong encoded strings, too. + +2011-06-14 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/DistanceInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/DistanceInfoObjectImpl.java, + src/main/java/de/intevation/flys/client/shared/model/DistanceInfoObject.java: + Loop through 'Unterkante' 'Oberkante' from service. + +2011-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Adapted the german error message that is displayed if the user entered a + value which is not in the valid range. + +2011-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/WQDataItem.java: + New. This DataItem is used to save min/max W/Q values. This enables the + UIProvider to validate the entered values. Currently, this is used in the + WQAdaptedInputPanel only. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Read the W/Q ranges from DESCRIBE document and create WQDataItems if + they are existing. + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Introduced a client side input validation for the entered W/Q values + with respect on their format and min/max range. + +2011-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: The + values entered by the user are validated on client side now taking + account on the format and the river's W/Q ranges. + +2011-06-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + Added a method to validate the form field. If a value is not a valid + double value, it returns false. + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + The values entered in the text field are validated regarding to the + river's range. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + error messages displayed if we were not able to read min/max values from + DESCRIBE document. + +2011-06-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added error strings for the range range/location panel. + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + Added a validate() method that is called before the event to step + forward is fired. If the method returns a list with errors, the event is + not fired. In that case, an error dialog is displayed. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Override the validate() method of AbstractUIProvider. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java: + Added a method that validates the form. + +2011-06-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java: + Parse min/max values for axes and all transformation matrix elements. + + * src/main/java/de/intevation/flys/client/shared/model/Axis.java: An axis + has a min and max value now. + + * src/main/java/de/intevation/flys/client/shared/model/ChartInfo.java: + The ChartInfo object provides a Transform2D object for each y axis + contained in the chart. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Refactored the zoom and pan actions. The values used to select a + concrete clip of the chart are computed based on the min/max range of an + axis. The chart request uses percentual values for axes ranges now. + +2011-06-09 Ingo Weinzierl + + flys/issue139 (WINFO: NPE bei Step-Back bei ungleichwertiger Berechnungsart) + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Fixed NPE while initialising user values. + +2011-06-08 Ingo Weinzierl + + flys/issue103 PART 2 (WINFO: Wasserspiegellagenberechnung / Layout-Inkonsistenz) + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Append the unit of W or Q to the values in the single mode. + +2011-06-08 Ingo Weinzierl + + flys/issue43 (i18n: Einige Verbesserungen) + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties: + Adjusted the english text that is displayed before switching to another + language. + +2011-06-08 Ingo Weinzierl + + flys/issue21 (Gleiches Projekt kann mehr als einmal gleichzeitig + geöffnet werden) + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Introduced a + lock mechanism for projects. When a project is opened, it becomes + locked. Further clicks on that project in the project list will have no + effect except it brings up the project window. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Implements the CloseClickHandler interface now. The operations triggered + by the "x" in the upper right corner of the window will close and + destroy the window. This has been done automatically before. + + * src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java: + Added a new method that brings up a project window. + +2011-06-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java: + Skip axes that lay out of valid bounds. E.g. there are 2 axes: if one of + those axes position is > 1 it is skipped. + +2011-06-08 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Don't crash if there is no transformer. + +2011-06-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Added a dirty hack to accept project names shorter than 30 characters + without cutting a part from the middle. + +2011-06-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/PanControl.java: + Implemented the onMouseOut() method. If this event is catched, the + current pan operation is finished (not canceled). + +2011-06-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Axis.java: New. + This class should represent an axis in a chart. + + * src/main/java/de/intevation/flys/client/shared/model/ChartInfo.java: + New. This class is used by the ChartInfoService to retrieve more + information about a Chart that just the Transform2D object to reproject + points. It currently stores x and y axes and the Transform2D object of a + chart. + + * src/main/java/de/intevation/flys/client/client/services/ChartInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/ChartInfoService.java: + Changed the return value of this service from Transform2D to ChartInfo. + The Transform2D object is included in this new ChartInfo. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Implements the PanHandler interface. If a PanEvent is fired by the + PanControl, a new chart range is computed using the axes information + provided by the ChartInfo object (that has been retrieved by the + ChartInfoService). + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added the PanControl to the toolbar. + +2011-06-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/HasPanHandlers.java, + src/main/java/de/intevation/flys/client/client/event/PanEvent.java, + src/main/java/de/intevation/flys/client/client/event/PanHandler.java: + New. Classes and interfaces necessary for a pan listeners mechanism. + + * src/main/java/de/intevation/flys/client/client/ui/chart/PanControl.java: + New. A control that enables the user to pan a chart. + + * src/main/webapp/images/pan.png, + src/main/webapp/images/pan_Selected.png: Icons for the PanControl. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + links to the pan icons. + +2011-06-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/CSVExportServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/CSVExportService.java, + src/main/java/de/intevation/flys/client/server/CSVExportServiceImpl.java: + Changed the return value of this service from List to List. + This helps GWT creating JavaScript objects. + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java: + Adjusted the return value of the CSVExportService and added a warning + dialog if an error occured while fetching those data. + +2011-06-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartServiceHelper.java: + New. This class helps generating the attribute document that is used for + generating charts. + + * src/main/java/de/intevation/flys/client/client/services/ChartInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ChartInfoService.java, + src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java, + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java: + Removed the code to create the chart attribute document. This work is + done in the ChartServiceHelper. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Added a method that returns all attribute that should be used for the + chart creation. Currently, there are width, height, x and y ranges. + +2011-06-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Repaired broken zoom-out control. We will now zoom out for 10% of the + axis range. E.g. range before = 2 - 10 , range after = 1.2 - 10.8 + +2011-06-06 Ingo Weinzierl + + flys/issue131 (Anzeige der Position bei großen Zahlen ungenau) + + * src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java: + Repaired a broken XPath expression for the chart attributes. + +2011-06-06 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ZoomboxControl.java: + Added a handler that listens to mouse out events. If the mouse moves out + of the chart area, the current zoom operation is canceled. The zoombox + and the coordinates are reset. + +2011-06-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Added a method that allows zooming out for a specified factor (between + 0-100). + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added a button to zoom out 10%. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + + * src/main/webapp/images/zoom-out.png: New. The icon for the zoom-out + control. + +2011-06-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + New method to reset the zoom. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added a button that resets the zoom and triggers an update of the chart. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ZoomboxControl.java: + This control inherits from ImgButton now. The icon displayed for this + control is the same as in the desktop version of this software. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added links to zoom button images. + + * src/main/webapp/images/zoom-in_Selected.png, + src/main/webapp/images/zoom-1.png, + src/main/webapp/images/zoom-in.png: Images used for the zoom buttons. + +2011-06-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java: + Append the selected min and max ranges for x and y axes to the attribute + document. This enables the server to zoom the chart to the specified + view. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + The x and y ranges specified after zooming are stored as instance + variables and used while creating the chart imgage url. The + ChartOutputService will put those ranges into the attribute document for + the chart creation. + +2011-06-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Implements the ZoomHandler interface now. Currently, the values are just + received from ZoomboxControl. We still need to refresh the chart with + those zoom values. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Registered the ChartOutputTab as ZoomHandler at the ZoomboxControl. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ZoomboxControl.java: + Bugfix: fire the ZoomEvent when mouse up events occur. The events was + not fired anytime. + +2011-06-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/HasZoomHandlers.java, + src/main/java/de/intevation/flys/client/client/event/ZoomHandler.java, + src/main/java/de/intevation/flys/client/client/event/ZoomEvent.java: + New. Necessary interfaces and classes for a listener mechanism for zoom + events. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ZoomboxControl.java: + New. A zoombox control that draws - if activated - an semi opaque + rectangle on the top of the observed panel. This control uses mouse + up/down/move events to draw the rectangle. A mouse down event starts the + zoom process, a mouse up event determines the coordinates for the zoom + and fires a ZoomEvent. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added the ZoomboxControl. + +2011-06-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Moved the mouse position panel to the right border of the toolbar panel. + + * src/main/java/de/intevation/flys/client/client/ui/chart/MousePositionPanel.java: + Improved the layout of this HLayout panel. It has a fixed width of 195px + now. The components inside this panel have also fixed width values. + +2011-06-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + After the chart panel is resized, we will now fetch a chart info + document using the ChartInfoService. This service lets us update the + current Transform2D - which is used to display mouse position in chart + coordinates and determine mouse clicks for zooming. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Changed the constructor call of the MousePositionPanel. It needs to + ChartOutputTab now. + + * src/main/java/de/intevation/flys/client/client/ui/chart/MousePositionPanel.java: + Changed the way to compute the chart coordinates. We will now use the + Transform2D object that is returned by the ChartInfoService. + +2011-06-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Made the collection object accessible. + +2011-06-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java: + Removed a debug statement. + +2011-06-01 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/Transform2D.java: New. + This class transforms coordinates into an other coordinate system based + on specified scale and translation factors. + + * src/main/java/de/intevation/flys/client/client/services/ChartInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ChartInfoService.java, + src/main/java/de/intevation/flys/client/server/ChartInfoServiceImpl.java: + New. A service that fetches the chart info document provided by the + artifact server and returns (currently) a Transform2D object. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + an error string that should be displayed if the chart info service + failed. + + * src/main/webapp/WEB-INF/web.xml: Registered the chart info service. + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Added a public method that returns the chart panel. + + * src/main/java/de/intevation/flys/client/client/ui/chart/MousePositionPanel.java: + New. A panel that displays the mouse position relative to a element. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + Added the MousePositionPanel. + + NOTE: The MousePositionPanel does NOT show the correct position and it + does NOT show the x|y coordinates in chart dimension yet! + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Moved the toolbar code into an own class. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartToolbar.java: + New. The toolbar used for chart panels. + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: + Replaced buttons displayed as labels with real buttons. + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ThemeNavigationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Replaced label buttons with real buttons. + + * src/main/webapp/images/theme_top.png, + src/main/webapp/images/theme_up.png, + src/main/webapp/images/theme_bottom.png, + src/main/webapp/images/theme_down.png: New. Images used in the + ThemeNavigationPanel for buttons to move themes. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + i18n string for the databasket and pathes for the icons used in the + ThemeNavigationPanel. + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/HasOutputParameterChangeHandlers.java, + src/main/java/de/intevation/flys/client/client/event/OutputParameterChangeHandler.java, + src/main/java/de/intevation/flys/client/client/event/OutputParameterChangeEvent.java: + Interface and class to realize a listener mechanism for output parameter + changes. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Implements the OutputParameterChangeHandler interface. After the output + parameter of the chart have changed, the chart is refreshed. + + NOTE: The panel is disabled right before the RPC call to replace the + collection's attribute is executed. It is enabled after the RPC call has + finished. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Implements the HasOutputParameterChangeHanders interface. The event is + fired if there are changes in the chart theme control panel. + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CollectionAttributeServiceImpl.java: + Connected this service with the artifact server. Modifications of a + Collection will be stored in the artifact database now. + + * src/main/java/de/intevation/flys/client/server/CollectionHelper.java: + New. This helper is currently used to create the attribute document of a + collection based on a Collection itself. This helper now takes the + attributes of the Collection and transforms those values into XML. + +2011-05-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java: + Added a setter method to set the 'active' attribute if a theme. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + After editing themes in the theme control panel will now modify the + themes stored at the collection as well. + +2011-05-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java: + Added further methods to set the position of a theme to a new value and + to compare two theme objects. + + * src/main/java/de/intevation/flys/client/shared/model/ThemeList.java: + Added a method to set the position of a theme to a new value. Based on + the new position, all other themes in this list are moved up or down. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + The actions in the navigation panel have now an effect on the order of + the themes in the theme list. The selected theme/s is/are moved to + top/bottom or just a single field up/down. + + NOTE: The order still have no effect on the chart rendering process. + +2011-05-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/OnMoveHandler.java, + src/main/java/de/intevation/flys/client/client/event/OnMoveEvent.java: + New. Necessary classes and interfaces for a listener mechanism that is + used to inform handlers about a movement. E.g. the movement of a theme. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ThemeNavigationPanel.java: + New. A panel that consist of four buttons that throw OnMoveEvents after + pushing it. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + In addition, it implements the OnMoveHandler interface to listen to move + events. + + NOTE: We need to implement the code that moves themes up/down. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Set the minimum width of the theme panel to 200px. + +2011-05-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/CollectionAttributeService.java, + src/main/java/de/intevation/flys/client/client/services/CollectionAttributeServiceAsync.java, + src/main/java/de/intevation/flys/client/server/CollectionAttributeServiceImpl.java: + New. This service should be used to modify/update the attribute of a + collection. + + NOTE: The update process needs to be implemented! Currently, the only + thing this service does is, that is waits 5sec and fetches a new + description right after this ;-) + + * src/main/java/de/intevation/flys/client/shared/model/ThemeList.java: + Added methods to remove and add themes. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Changes in the theme panel will now trigger the update process of the + collection's attribute using the CollectionAttributeService. + + * src/main/webapp/WEB-INF/web.xml: Registered the new service. + +2011-05-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java: + Removed a bug that caused that the artifact of a default theme is never + set. + +2011-05-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Parse the theme lists - contained in the attribute of the collection - + and add those lists to the collection. The lists are retrievable using + the method getThemeList(String outName). + + * src/main/java/de/intevation/flys/client/shared/model/Theme.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultTheme.java: + The interface and its default implementation of a theme. A theme + represents a curve in a chart or a layer in a map. The default + implementation knows about the facet, the position, the status and the + artifact this theme belongs to. + + * src/main/java/de/intevation/flys/client/shared/model/ThemeList.java: + New. A ThemeList is a wrapper for themes and should provide some + functions to process regularly used operations on a list of themes. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java, + src/main/java/de/intevation/flys/client/shared/model/Collection.java: + Added a new constructor that takes a ThemeList as well and a method to + retrieve a ThemeList based on the name of the output. + + * src/main/java/de/intevation/flys/client/shared/model/FacetRecord.java: + This record no longer stores facets but themes. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + Modified the process of adding new themes to the theme grid. + +2011-05-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/FacetRecord.java: + New. This ListRecord is used to display facets in grids. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java: + New. This panel contains elements to control the themes of a chart. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added i18n strings for the ChartThemePanel. + + * src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + The left side of this panel is filled with the ChartThemePanel now. + +2011-05-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java, + src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java, + src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Removed needless imports. + +2011-05-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/chart: A new package + for all chart relevant classes. + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/chart/ChartOutputTab.java: + Moved the ChartOutputTab to the chart package. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Adapted imports - added ChartOutputTab that has been moved to chart + subpackage. + +2011-05-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Bugfix: We return the inserted values only in getData(). We do not + return Data objects with no value. This prevents NullPointerExceptions + that occur if no location has been inserted - e.g. the case if we + selected a range. + +2011-05-24 Ingo Weinzierl + + ISSUE-91 + ISSUE-40 (part II/II) + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Read default values in those panels and fill the form items with that + data. + +2011-05-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added i18n error messages. + +2011-05-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Take care on empty Data objects while initializing default values. + +2011-05-24 Ingo Weinzierl + + ISSUE-85 (part II/III) + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Repaired this broken panel. Now, we distinguish between the two modes + 'range' and 'locations'. + +2011-05-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Read the default values for Data objects from DESCRIBE. + +2011-05-24 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Data.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultData.java: + A data item can now have a default value and a default label. + +2011-05-23 Ingo Weinzierl + + ISSUE-62 (part I/II) + + * src/main/java/de/intevation/flys/client/client/event/OutputModesChangeEvent.java, + src/main/java/de/intevation/flys/client/client/event/HasOutputModesChangeHandlers.java, + src/main/java/de/intevation/flys/client/client/event/OutputModesChangeHandler.java: + Classes and interfaces that are necessary to build up a listener + mechanism for output mode changes. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java:: + Implements the HasOutputModesChangeHandlers and OutputModesChangeHandler + interfaces. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Implements the OutputModesChangeHandler interface which enables us to + update the export panel even after the outs of an artifact have changed. + + + +2011-05-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/config.xml: + Reverted to default config; unintentional change in previous commit + +2011-05-20 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added missing i18n strings for duration curve export. + +2011-05-20 Ingo Weinzierl + + Tagged RELEASE 2.3.1 + +2011-05-20 Ingo Weinzierl + + * Changes: Prepared Changes for the upcoming release. + +2011-05-20 Hans Plum + + * src/main/java/de/intevation/flys/client/client/config.xml: + Reverted to default config; unintentional change in previous commit + +2011-05-20 Hans Plum + + * NEWS: + Added information for Release V 2.3.1 for endusers + +2011-05-19 Ingo Weinzierl + + Tagged RELEASE 2.3.1 + + * Changes: Prepared for release. + +2011-05-19 Ingo Weinzierl + + ISSUE-35 + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Added a maximize button to this view. + +2011-05-19 Ingo Weinzierl + + ISSUE-43 + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties: + Adapted the english waring that is displayed before a language switch + takes place. + +2011-05-19 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added i18n strings for exports of computed discharge curves. + +2011-05-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added i18n strings for exports. + +2011-05-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added i18n string for wst export. + + * src/main/java/de/intevation/flys/client/client/ui/ExportPanel.java: + Set a maximum size of the export button and added a tooltip to + distinguish exports. + + NOTE: We should consider using specific images for each export type. + +2011-05-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ExportServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java: + Adapted a method signature of ClientProtocolUtils that has been changed + in the last revision. + +2011-05-17 Ingo Weinzierl + + Tagged RELEASE 2.3 + +2011-05-16 Hans Plum + + * NEWS: + Added version number and release date for V 2.3 + +2011-05-16 Hans Plum + + * NEWS: + New. Describing new functionality and some backgrounds in + MoinMoin-Wiki Syntax (in german only) from the user perspective. It + does not differentiate between client and server-specific code! + +2011-05-13 Ingo Weinzierl + + * Changes: Prepared Changes for the upcoming release 2.3 - see Changes + file to get to know about the change of version number. + +2011-05-12 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/meta/Converter.java: + New. Converts the incoming XML to a more informative way. + + * src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java: + Use the new converter. + +2011-05-12 Raimund Renkert + + ISSUE-61 + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + Changed datacage button style. + +2011-05-12 Raimund Renkert + + ISSUE-46 + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Removed the table header context menu. + + * src/main/java/de/intevation/flys/client/client/ui/LinkSelection.java: + Removed log message. + +2011-05-12 Raimund Renkert + + ISSUE-43 + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Changed i18n strings. + +2011-05-12 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LinkSelection.java: + New. Shows a list of rivers displayed as links. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Use the new Panel to show rivers as links. + +2011-05-12 Ingo Weinzierl + + ISSUE-15 + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + After resizing the chart panel, the chart/image is replaced by a new + chart with adjusted width and height (requested from server). + +2011-05-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + Defined the chart size (600x500). + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java: + Query the chart in the requested size defined in the GET-parameters of + the request. + +2011-05-12 Ingo Weinzierl + + ISSUE-34 + + * src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java: + The number of windows which are moved the right lower browser window + corner is limited to 10 windows now. The 11th window is placed at the + left upper corner again. Window 12-20 are moved with an offset into to + the right lower corner again. + +2011-05-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/DataCageNode.java, + src/main/java/de/intevation/flys/client/shared/model/DataCageTree.java: + New. Server -> Client transport model. Ugly because it re-invents XML + documents. XML is received by the RPC service from the artifact server, + transformed into this transport representation and this is transformed + in ui elements on the client side. + + * src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java: + Transform the incoming XML to transport representation. TODO: + Do not simply copy the XML. + + * src/main/java/de/intevation/flys/client/client/services/MetaDataServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataService.java: + Changed signature tio transport the tree. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + Transform the transport tree into ui elements. + +2011-05-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ExportPanel.java: + Changed the height of this panel to be visible in all browsers. + +2011-05-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java: + Call the service. TODO: transport artifact server result to client. + + * src/main/java/de/intevation/flys/client/client/services/MetaDataServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataService.java: + Extended interfaces to cope with i18n. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Error messages if the artifact meta data service is not reachable. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Forward collection view to chart output tab. + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + Forward artifact to fetch river name later. + + * src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java: + New. UI code for the data cage panel. TODO: build tree from + service data. + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Added simple break in a loop if river was found. + +2011-05-11 Ingo Weinzierl + + ISSUE-56 + + * src/main/java/de/intevation/flys/client/shared/model/DefaultOutputMode.java, + src/main/java/de/intevation/flys/client/shared/model/OutputMode.java: + Added a further method that returns all available facets. + + * src/main/java/de/intevation/flys/client/client/ui/ExportPanel.java: New. + This panel is used to serve download links for each export mode / type + of a collection. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Implements the CollectionChangeHandler interface now. If a Collection + changes, the available output modes are analyzed. If there are export + modes available, those modes are displayed in a so called 'ExportPanel'. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Registered the ParameterList as CollectionChange handler. + + * src/main/webapp/FLYS.css: Added a stylesheet for the export panels + title. + + * src/main/webapp/images/save.gif: New. This image is displayed in the + export panel. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: New + i18n strings for the export panel. + +2011-05-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ExportServiceImpl.java: + New. This service is a "proxy servlet" that enables the GUI to add + download buttons for exporting the computed data of the artifact server. + + * src/main/java/de/intevation/flys/client/client/services/CSVExportService.java: + Changed the URL part to query the CSV export ('export' -> 'csv'). + + * src/main/webapp/WEB-INF/web.xml: Registered the new ExportService. + +2011-05-11 Raimund Renkert + + ISSUE 34 + + * src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java: + Move every new project window 20 px multiplicated with the window count + down and right. + +2011-05-11 Raimund Renkert + + ISSUE 44 + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Moved the location/range and WQ input tables to the helper panel on the + right. The tables have a dynamic size now. + +2011-05-11 Raimund Renkert + + ISSUE 41 (part2) + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Set the computation result panel width and height to 100%. The panel + resizes with its parent component now. + +2011-05-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/ExportMode.java: + New. A derived OutputMode that is used to mark an OutputMode as an + export. + + * src/main/java/de/intevation/flys/client/shared/model/OutputMode.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultOutputMode.java: + Added methods to provide facets in output modes. + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java: + Extract facets from DESCRIBE and distinguish between an ordinary + OutputMode or an ExportMode. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Replaced the determination of an export mode for creating new + OutputTabs. Now, we just create new OutputTabs for OutputModes that are + no instance of ExportMode. Furthermore, the computation output panel + is now displayed if there is an output mode which: + - is an ExportMode + - has a facet which name is "csv" + +2011-05-11 Ingo Weinzierl + + ISSUE-41 (part1) + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Moved the computation result panel right beside the parameterization. + + TODO: This panel has now hard coded width/height. The result of this is, + that it does not change its size when the parent component is resized. + So, the width and height should be set to 100%. + +2011-05-11 Ingo Weinzierl + + ISSUE-57 + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Replaced wrong i18n function name. + +2011-05-10 Ingo Weinzierl + + ISSUE-48 + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + Added labels placeholder for the theme control panel and the toolbar. + Both panels now have a black border. + +2011-05-10 Ingo Weinzierl + + ISSUE-38 + + * src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Set the first value of a select box as default value. + +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + i18n error messages required if the data input failed in the adapted WQ + panel. + +2011-05-10 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Changed the empty table message for the WQ input table. + +2011-05-10 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Changed the empty table text from default to "Loading data". + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added i18n strings for empty table text. + + * src/main/java/de/intevation/flys/client/server/CSVExportServiceImpl.java: + Changed author. + +2011-05-10 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/server/MetaDataServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/MetaDataService.java: + New. Stub for new meta data service. + + * src/main/webapp/WEB-INF/web.xml: Registered meta data service. + +2011-05-10 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Fixed the location input. A range selection sets the correct location values + now. + +2011-05-10 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Remove the data table on step back. + +2011-05-10 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Use the name instead of the description to determine the output mode. + + * src/main/java/de/intevation/flys/client/server/CSVExportServiceImpl.java: + Removed obsolete code. + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java: + Build up a dynamic table for different header count. The first line of CSV + data is used to set the header title. + +2011-05-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/CSVExportServiceImpl.java: + Bugfix: Use the ElementCreator from XMLUtils to add attribute to nodes + in the xml document. Then, those nodes will have the ArtifactNamespace + automatically. If we do something like + node.setAttribute("art:attr", "value") + Restlet will throw an exception, because it does not know the "art:" + namespace. + +2011-05-09 Ingo Weinzierl + + * pom.xml: Bugfix: replaced the goupId of the OpenCSV dependency with the + correct id. + +2011-05-09 Raimund Renkert + + * src/main/java/de/intevation/flys/client/server/CSVExportServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/CSVExportServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/CSVExportService.java: + New service. Requests CSV data and returns a list of lines in a string + array. + + * src/main/java/de/intevation/flys/client/client/ui/TableDataPanel.java: + New. Displays the data requested by the new service. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Added the table to UI. + + * src/main/webapp/WEB-INF/web.xml: Registered new service. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added strings for the new table. + + * pom.xml: Added dependency: au.com.bytecode.opencsv, version 2.0; + +2011-05-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Added radio buttons to choose between W/Q mode. + +2011-05-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + Bugfix: the current locale string is used to fetch the chart image now + which enables the client to present localized charts. + +2011-05-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Added a doubleclick listener to the rows of this list. A doubleclick + will now open the selected project. + +2011-05-09 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/client/shared/model/DistanceInfoRecord.java, + src/main/java/de/intevation/flys/client/client/Config.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Removed superfluous imports. + +2011-05-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties: + Changed wording: 'distance' -> 'range'. + +2011-05-05 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Enable or disable table rows depending on the WQ selection. + +2011-05-05 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Implemented handler for the value selection. + +2011-05-05 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Added table for WQ inputs. TODO: Implement the selection and set the + values. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + New i18n strings for the WQ input table. + +2011-05-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Moved functions getData() and getDataItem() from WQInputPanel to + AbstractUIProvider to make it accessible in all UIProvider that inherit + from AbstractUIProvider. + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + Implemented the methods to create the old widget of thi panel. + +2011-05-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: Added + new i18n displayed in the WQAdaptedInputPanel. + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + The list of input fields for each intersected gauge is created now. The + correct w/q values will be returned after the submit button has been + clicked. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + The orientation of the field label might be adjusted using a new + constructor parameter. Furthermore, there is a new method (which has no + parameters) that returns the double values inserted in this panel. + +2011-05-04 Raimund Renkert + + * src/main/java/de/intevation/flys/client/server/WQInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/WQInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/WQInfoService.java: + New. This service fetches WQ information from the server. + + * src/main/java/de/intevation/flys/client/shared/model/WQInfoRecord.java, + src/main/java/de/intevation/flys/client/shared/model/WQInfoObjectImpl.java, + src/main/java/de/intevation/flys/client/shared/model/WQInfoObject.java: + New. Data structures for the WQ information. + + * src/main/webapp/WEB-INF/web.xml: Added new service. + +2011-05-04 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Do not update the locations table if no data is cached. + +2011-05-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java: + New. This UIProvider is used to enter W/Q values associated with a set + of gauges. + + NOTE: This is currently just a stub implementation used for further + development. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Initialize the WQAdaptedInputPanel if the uiprovider flag is set to + "wq_panel_adapted". + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: New + i18n strings for the "discharge longitudinal section. + +2011-05-04 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + Fixed the input panel. It takes manual input now and the table data is + filtered correctly. + +2011-05-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Renamed the non-computed discharge curves into 'Discharge Curves at + Gauges' (german 'Abflusskurven an Pegeln') to distinuish the two output + types for discharge curves. + +2011-05-04 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + New i18n strings for the computed discharge curve. + +2011-05-03 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + New i18n strings for new output modes. + +2011-05-03 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + Added new UI provider for single location selection. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + Check if the values are not null. + + * src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java: + New. Takes a single location from the location input table. + +2011-05-02 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + The table data is cached in a new variable. The location table for + distance input is rebuild on distance selection. + +2011-05-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Introduced two further parameters to determine the selection mode of + this panel. + +2011-05-02 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Added location and distance tables. A selection fills the textfield with + the selected values. + + * src/main/java/de/intevation/flys/client/shared/model/DistanceInfoRecord.java: + New. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added i18n strings for the new tables. + + * src/main/java/de/intevation/flys/client/client/FLYSImages.java: Added new + images. + + * src/main/java/de/intevation/flys/client/client/images/marker_green.png, + src/main/java/de/intevation/flys/client/client/images/marker_red.png: New. + +2011-05-02 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Bugfix: The WQ panel now returns the correct step width value if the + range mode is selected. + +2011-04-29 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java: + Added setter for the location and distance values. + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/UIProvider.java: + Added setter for an artifact. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Set the current artifact to the provider to make the old data available + for the other widgets. + +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: New + i18n strings for a 'longitudinal section curve' output tab. + +2011-04-28 Raimund Renkert + + Added class diagrams. + + * doc/Flys-UI-Classes.png, doc/Flys-UI-Services-Classes.png: New. + +2011-04-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/StepForwardServiceImpl.java: + The error key that is provided by the FLYS artifact server is read from + feed() result document and used to bring up an error popup with an + translated error message. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties: + Added error messages for the feed operation. + +2011-04-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/Config.java: + A new method returns the name of the current locale now. + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/UserCollectionsServiceImpl.java, + src/main/java/de/intevation/flys/client/server/GetArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/UserServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/StepForwardServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AdvanceServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/DistanceInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/UserService.java, + src/main/java/de/intevation/flys/client/client/services/CreateCollectionService.java, + src/main/java/de/intevation/flys/client/client/services/RiverServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/RiverService.java, + src/main/java/de/intevation/flys/client/client/services/DescribeCollectionServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/GetArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/DescribeCollectionService.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/GetArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/StepForwardServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/AdvanceServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/StepForwardService.java, + src/main/java/de/intevation/flys/client/client/services/AdvanceService.java, + src/main/java/de/intevation/flys/client/client/services/AddArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/DistanceInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/AddArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/DistanceInfoService.java, + src/main/java/de/intevation/flys/client/client/services/UserCollectionsServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/UserServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/CreateCollectionServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/UserCollectionsService.java: + Introduced a "locale" parameter that stores the name of the current + locale. This is used to set the locale of the request object manually. + + * src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Modified the RPC service calls (introduction of a locale). + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + The title of the ParameterList depends on the Artifact's name if we + gonna create a new CollectionView with an existing Artifact. + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Artifact.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultArtifact.java: + An artifact knows its name now. It is retrievable via getName(). + + * src/main/java/de/intevation/flys/client/shared/model/WINFOArtifact.java: + New. A concrete class that represents an Artifact using the WINFO + parameterization. + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + The ArtifactCreator builds up new Artifacts based on the name in the + DESCRIBE document. If no name is included, a DefaultArtifact is created. + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/CollectionRecord.java: + This record class uses the default mechanism to store/load values - + it uses the setAttribute() and getAttribute() methods now. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: The + list is sorted based on the project's creation time now. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionGrid.java: + Removed. The collection grid is no longer used, because the fields are + created by using default mechanisms (setting the field type, using cell + formatter). + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYS.java: + Implemented a method to open an existing project. The method takes the + UUID of a Collection and creates a new CollectionView with + ParameterList based on the first Artifact that is stored in that + Collection. + + NOTE: Maybe we need to introduce a mechanism to mark the artifact that + defines the parameterization. I am not sure, if the first artifact is + always the artifact that the Collection's parameterization is based on! + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Triggers the method of FLYS to open an existing project. + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Added new constructors that enables us to create instances with an + existing parameterization (with a given artifact). + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added further error messages. + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/CollectionRecord.java: + There is a new method that returns the Collection object which is + represented by this record. + +2011-04-12 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/GetArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/GetArtifactService.java, + src/main/java/de/intevation/flys/client/server/GetArtifactServiceImpl.java: + New. A service that queries the artifact description based on the + identifier of an artifact. + + * src/main/webapp/WEB-INF/web.xml: Registered the new GetArtifactService. + +2011-04-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added strings that are used in the context menu of the project list. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + A right mouse click on a project opens a context menu with the options + to open / delete a project. + +2011-04-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DistanceInfoServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/DistanceInfoServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/DistanceInfoService.java: + New. This service fetches river specific distance information from + server. + + * src/main/webapp/WEB-INF/web.xml: Registered the DistanceInfoService. + +2011-04-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DistanceInfoObjectImpl.java, + src/main/java/de/intevation/flys/client/shared/model/DistanceInfoObject.java: + New. This model will be used by the LocationDistancePanel to bring up a + table with distances which supports the user while entering the start + and end point of the WINFO paramterization. A DistanceInfoObject + contains information about a specific distance (description, from, to + and riverside). + +2011-04-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/UserServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/UserService.java: + This service now throws an AuthenticationException if an error occured + while user authentication. + + * src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/RiverService.java: + This service now throws a ServerException if an error occured while + reading the supported rivers from artifact server. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Show warnings + if errors occur while fetching supported rivers or + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added further strings for error messages. + +2011-04-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/exceptions/AuthenticationException.java: + New. An exception that should be used if the user authentication fails. + +2011-04-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/StepForwardServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AdvanceServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/CreateCollectionService.java, + src/main/java/de/intevation/flys/client/client/services/DescribeCollectionService.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactService.java, + src/main/java/de/intevation/flys/client/client/services/StepForwardService.java, + src/main/java/de/intevation/flys/client/client/services/AdvanceService.java, + src/main/java/de/intevation/flys/client/client/services/AddArtifactService.java: + Improved the exception handling. If an exception occurs specific to an + artifact / collection specific operation, a ServerException is thrown. + The message of this exception is a key that needs to be translated using + the lookup mechanism of FLYSConstants. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + The dialog helper class SC of the SmartGWT framework is used to bring up + warning dialogs that inform the user about errors that occured after the + artifact / collection specific operations. + + * src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added strings for the exceptions thrown in the services. + +2011-04-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/exceptions/ServerException.java: + New. This exception is used to be thrown after an error occured while + one of the artifact / collection operations. + +2011-04-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java, + src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + Adjusted the code to trigger the out() operation of the Collection + instead of the out() operation of the first Artifact in that Collection. + +2011-04-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + Added new strings for a warning dialog that is opened when the user + start changing the current language. + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: Fixed + the function to toggle the language and added a warning dialog that + informs the user about the creation of a new session when the language + is changed. + +2011-04-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.properties, + src/main/java/de/intevation/flys/client/client/FLYSConstants.java: + New. A constants interface with the ability to lookup an i18n string + with a given key. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionGrid.java, + src/main/java/de/intevation/flys/client/client/ui/ProjectList.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java, + src/main/java/de/intevation/flys/client/client/ui/MainMenu.java, + src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/FLYSHeader.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java, + src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java, + src/main/java/de/intevation/flys/client/client/ui/FLYSFooter.java: + Replaced the FLYSMessages interface with the FLYSConstants interface. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: + Removed. + +2011-04-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: + Implemented the toggle button to switch the current locale. + +2011-04-05 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties: + Added missing strings used in the footer. + +2011-03-30 Ingo Weinzierl + + Tagged RELEASE 0.1 + +2011-03-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Removed some comments that have been commited by mistaken. + +2011-03-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages.java: + Derives the ConstantsWithLookup interface now. This makes it possible to + fetch i18n string using a getString(String key) lookup method. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties: + Removed '@DefaultMessage' annotations - they are not available for + ConstantsWithLookup, added a further i18n string and fixed another one. + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Some modifications related to the changes above. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Removed the hard coded title determination based on the selected module. + Now, the getString() of FLYSMessages is used to determine the human + readable string. + +2011-03-30 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/DescribeCollectionService.java, + src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java, + src/main/java/de/intevation/flys/client/client/ui/FLYSFooter.java: + Removed useless imports. + +2011-03-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYS.java: The + CollectionView no longer gets an empty collection when it is created. + + * src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java: + The CollectionViews are no longer stored in a Map but in a List. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Bugfix: We just create a new collection a single time - if no one is + existing. If the output modes of the artifact that is used for the + parameterization changes, we fetch the new DESCRIBE document of the + collection using the new DescribeCollectionService. + +2011-03-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/DescribeCollectionServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/DescribeCollectionServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/DescribeCollectionService.java: + New. This service is used to fetch the DESCRIBE document of a specific + collection and returns a Collection object that contains the information of + that document. The code to parse the DESCRIBE has been moved here from + the AddArtifactServiceImpl which now derives the + DescribeCollectionServiceImpl. + + * src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java: + This service is derived from DescribeCollectionServiceImpl now, because + the methods to parse the DESCRIBE document are moved to that service. + + * src/main/webapp/WEB-INF/web.xml: Registered the + DescribeCollectionService. + +2011-03-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties: + Replaced the german title of the project list 'Berechnungen' with + 'Projekte'. + +2011-03-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Registered the + ProjectList as CollectionChangeHandler of each created CollectionView. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Implements the CollectionChangeHandler to update the list of user + collections after a collection changed (or has been created). + + * src/main/java/de/intevation/flys/client/client/ui/CollectionGrid.java, + src/main/java/de/intevation/flys/client/shared/model/CollectionRecord.java: + Modified the output of the 'name' and 'date' fields. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: + Added a format for datetime strings. + +2011-03-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/UserCollectionsServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/UserCollectionsServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/UserCollectionsService.java: + New. This service returns a list of Collections owned by a specified + user. + + * src/main/webapp/WEB-INF/web.xml: Registered the UserCollectionsService. + +2011-03-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java, + src/main/java/de/intevation/flys/client/shared/model/Collection.java: + Added methods to retrieve the creation time. + +2011-03-29 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: Fixed code + in ProjectList toggle method. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: Fixed + the WQInputPanel label to have the correct size. + +2011-03-29 Raimund Renkert + + * src/main/webapp/FLYS.html: Added style information to avoid the smartgwt + theme margin. + +2011-03-29 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties: + Changed some german strings. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Changed tab title. + +2011-03-29 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: Set + label width to have a tabled style for WINFO selections. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Resized window to fit the content size. + +2011-03-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + The ParameterList is a Tab now and can set its title itself. So, the + title will change after the module is chosen. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Removed code to insert the ParameterList into a new Tab. This is no longer + needed, because the ParameterList is a Tab itself. + +2011-03-29 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: + Modified the string that points to the 'back button' image. + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + Modified the URL that points to the 'back button' image. Now, the + base URL is taken into account as well. The button will be shown + everywhere now (in every installation)! + +2011-03-29 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: Set + label width to have a tabled style for WINFO selections. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Resized window to fit the content size. + +2011-03-29 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: Fixed + toggle method. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/CollectionItem.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultCollectionItem.java: + A CollectionItem has a hash() method now. The value comes from the + Collection's DESCRIBE document. + + * src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java: + The hash value of a collection item is parsed from DESCRIBE document. + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + Appended the hash value of the artifact to the URL of the chart image. + This bypasses the browser cache of a previous chart image. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + A parameterization change will always remove all output tabs before + updating the output tab panel. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: + Modified existing string and added a new one. + + * src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Added a further radio button for a plugin and changed the alignment of + the radio button to vertical. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + Removed the "TODO: ThemeEditor" label. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Removed the date string from title bar. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/UIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + A UIProvider might now have a panel that can be used to render helper + widgets. E.g. the river selection will render its river map into this + panel. It is injected and can be placed somewhere around the + application. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Injected the right panel of the parameter panel into the UIProvider. + Helper widgets are rendered into this panel now! + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java, + src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Some layout improvements (heights, position of elements and so far). + +2011-03-28 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: The project + list button toggles the project list now. + +2011-03-28 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + Replaced next button image with smartgwt button. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Removed + button path, added text for new button. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties: + Removed image path, added english text for button. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties: + Removed image path, added german text for button. + +2011-03-28 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added text + for FLYSFooter. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties: + Added german text for footer label. + + * src/main/java/de/intevation/flys/client/client/ui/FLYSFooter.java: New. A + new ui element at the bottom of the page. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Added footer + element to FLYS webpage. + +2011-03-28 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: + Customized ProjectList style. + * src/main/java/de/intevation/flys/client/client/ui/FLYSView.java: Set + background color and size constraints. + + * src/main/webapp/FLYS.css: Added background style. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + The right side of this panel displays an image now. This image + represents a chart that is generated by an artifact. The request is made + up in the ChartOutputServiceImpl. + + * src/main/java/de/intevation/flys/client/server/ChartOutputServiceImpl.java: + New. This service creates the request to retrieve chart images and + writes the response to the output stream. + + NOTE: This service is not asynchron! It is derived directly from + HttpServlet. + + * src/main/webapp/WEB-INF/web.xml: Registered the ChartOutputService. + +2011-03-25 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Limited the area for CollectionView to the size of FLYSWorkspace. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/OutputTab.java: Fixed + a typo. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ChartOutputTab.java: + An OutputTab with two panels. The left one is not implemented yet + (ThemeEditor). The right one will display an image. + + * src/main/java/de/intevation/flys/client/client/ui/OutputTab.java: The + content pane is set in the constructor. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + New output tabs will use the ChartOutputTab. + + NOTE: We should move the code that constructs the concrete output tabs + into a factory class that decides which OutputTab has to be used. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + The tab bar is extended with output tabs if the artifact used for the + parameterization reaches a state with output modes. + + * src/main/java/de/intevation/flys/client/client/ui/OutputTab.java: A + base class that might be used to derive concrete output tabs for charts, + maps and so on. + +2011-03-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Moved parameterization specific code from CollectionView to + ParameterList. + +2011-03-26 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Moved ParameterList specific code into the ParameterList. + +2011-03-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/CreateCollectionService.java, + src/main/java/de/intevation/flys/client/client/services/CreateCollectionServiceAsync.java, + src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java: + Changed the return type to 'Collection' - returned a UUID (String) + before. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + The artifact is put into the collection (or new collection) if we reach + a step in the parameterization in that an artifact has reachable + outputs. Furthermore, some adjustments related to the changes of the + return type in the CreateCollectionService. + +2011-03-25 Ingo Weinzierl + + * src/main/webapp/WEB-INF/web.xml: Made the AddArtifactService accessible. + +2011-03-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/AddArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/AddArtifactService.java, + src/main/java/de/intevation/flys/client/server/AddArtifactServiceImpl.java: + New. This service adds an existing artifact to an existing collection. + The return value of this service is a Collection that is filled with + CollectionItems and OutputModes. + +2011-03-25 Raimund Renkert + + * src/main/java/de/intevation/flys/client/FLYS.gwt.xml: Changed theme to + smartgwt Enterprise Blue. + +2011-03-25 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Facet.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultFacet.java: + New. An interface and its default implementation that provide methods + to get information about facets. Currently, the only information that is + supported is the name of the facet. + + * src/main/java/de/intevation/flys/client/shared/model/CollectionItem.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultCollectionItem.java: + New. An interface and its default implementation that provide methods to + get information about the available output modes and its facets of + artifacts -> a CollectionItem is related to an artifact - both have the + same identifier. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java, + src/main/java/de/intevation/flys/client/shared/model/Collection.java: + The Collection no longer stores references to artifacts, but to + CollectionItems. I have changed this, because the artifact contains a + lot more information we need for the Collections. So, I decided to + create CollectionItems that are related to artiacts but just know about + the possible outputmodes and facets. + +2011-03-24 Raimund Renkert + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: Set styles + for label. + + * src/main/java/de/intevation/flys/client/client/ui/FLYSHeader.java: Fixed the + method to calculate the image width and resized the BfG logo. + + * src/main/webapp/FLYS.css: Introduced styles for fonts and BfG colorscheme. + +2011-03-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Extract the output modes from DESCRIBE document and fill the + ArtifactDescription with those objects. + +2011-03-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactDescription.java: + Added a method to retrieve the available output modes of the artifact. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultArtifactDescription.java: + Implemented the method to retrieve the available output modes and + enhanced the default constructor with a parameter for output modes. + +2011-03-23 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/OutputMode.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultOutputMode.java: + New. An interface and its default implementation that describes + available output modes of artifacts. + +2011-03-21 Ingo Weinzierl + + * src/main/webapp/images/next.xcf: Moved to images/next.xcf to avoid that + this file is included in the WAR archive of the web application. + + * images/next.xcf: Moved from src/main/webapp/images/next.xcf. + +2011-03-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Parse the selected values as human readable strings from the static UI + part. + + * src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Display human readable values in the static UI part. + +2011-03-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/HasStepBackHandlers.java, + src/main/java/de/intevation/flys/client/client/event/StepBackHandler.java, + src/main/java/de/intevation/flys/client/client/event/StepBackEvent.java: + New. These classes are used to realize a notification mechanism to + listen to the step-back part of the advance() operation. UI elements + should fire a StepBackEvent if the user tries to step back to a previous + state. + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + The UIProvider implements the HasStepBackHandlers interface and fires + StepBackEvents if the 'back' button has been clicked. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Listens to StepBackEvents. If such an event is received, we gonna remove + all old state items from the list and revert the view. Afterwards, the + artifact description is used to redraw the whole view. + + NOTE: I think we should just remove those items that belong to states + between the current state and the target state. This would avoid a + complete refresh of the ParameterPanel. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Listens to StepBackEvents. If such an event is received, the advance() + operation is triggerd with the current artifact and the new target + state identifier to step back to that state. + +2011-03-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java, + src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + The methods that validates a FormItem will skip StaticTextItem + validation. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Added a mechanism to validate and save user input before returning the + data entered in the fields. + Reason: the BlurEvent - after that we gonne validate and save the input + stuff - is not fired when the focus is still in one of the text fields + and we click the 'next' button immediately. A nullpointer exception + would be the result (which is avoided with the mechanism). + +2011-03-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: + Added localized strings that point to the source of the 'back' button. + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + Added a new method that creates the 'back' button and returns it. + + TODO: Fire an event that triggers the ADVANCE action. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Append the 'back' button in the panel with the 'old' parameters. + + * src/main/webapp/images/back.png, + src/main/webapp/images/back_en.png, + src/main/webapp/images/back_de.png: New. Images für the 'back' button in + the parameterization. + +2011-03-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added + localized strings that point to the images of the 'next' button. + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + There is a method that creates the 'next' button, adds the UIProvider as + ClickHandler and returns the button. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java, + src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + The 'next' button is created in the AbstractUIProvider. So, we have a + central place to adjust the look of this button. + + * src/main/webapp/images/next.xcf, + src/main/webapp/images/next.png, + src/main/webapp/images/next_en.png, + src/main/webapp/images/next_de.png: Images for the 'next' button in the + parameterization. + +2011-03-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Read min/max values and define those values as default values for the + distance modes. + +2011-03-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Read min/max values and define those values as default values for the + distance mode. + +2011-03-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + When a state is reached with no further user input, the 'current' + property of the ParameterList is set to 'null' and no dynamic panel is + shown. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties: + Fixed a typo. + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + The widgets displayed in the static panel are created using the + UIProvider defined in the DataList. + + * src/main/java/de/intevation/flys/client/client/ui/UIProvider.java: There + is a new method createOld() that is used to create the static + representation of a DataList. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Implemented the createOld() method. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DataList.java: + Added a constructor to create a DataList with a label. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Read the label of the static state data objects and create the DataList + objects with this attribute. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DataList.java: This + data structure manages a list of Data objects. A DataList is the list of + Data objects that a single State can have. So, this class has methods to + retrieve the name of the state it belongs to, the list of Data objects, + the recommended UIProvider and a label. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java, + src/main/java/de/intevation/flys/client/shared/model/ArtifactDescription.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultArtifactDescription.java, + src/main/java/de/intevation/flys/client/shared/model/Data.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultData.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/ParameterList.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java, + src/main/java/de/intevation/flys/client/client/ui/UIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java, + src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Necessary refactoring to introduce the DataList data structure to manage + the list of Data objects a single State provides. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Added a bit more space between the values that have been entered in + former states and the current input panel. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/UserServiceImpl.java, + src/main/java/de/intevation/flys/client/shared/model/Data.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultData.java, + src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Removed needless imported. + + * src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + The SelectProvider extends the AbstractUIProvider now. Now, each + concrete UIProvider is an instance of the AbstractUIProvider that + handles some basic events. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + The Single-W panel is displayed initially when the WQInputPanel is + rendered. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Implemented some methods to retrieve the data that have been entered by + the user. The getData() method retrieves data now! + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Implemented some methods to retrieve the data that have been entered by + the user. The getData() method retrieves data now! + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Defined the 'WINFO' plugin as default plugin. The initial view will + display a preselcted winfo radio button. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Added the missing 'next' button. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + Added the ClickHandler to the 'next' button. + +2011-03-17 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + The 'uiprovider' attribute 'wq_panel' will return a WQInputPanel + provider. + +2011-03-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + Some refactoring. This class now uses the DoubleRangePanel and + DoubleArrayPanel for the two different input modes as well. + +2011-03-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added + i18n strings used in the WQInputPanel. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleRangePanel.java: + New. This panel contains three input fields that enables the user to + enter a start and end value and a step width. Furthermore, there are + methods to validate the fields and to retrieve its values. + + * src/main/java/de/intevation/flys/client/client/ui/DoubleArrayPanel.java: + New. This panel contains a single input field that enables the user to + enter a list of double values. There is a method to validate the input + and a method to retrieve the list of entered double values. + + * src/main/java/de/intevation/flys/client/client/ui/WQInputPanel.java: + New. This panel allows the user to enter W or Q values for single or + range input in one single state. + +2011-03-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added + i18n strings used in the LocationDistancePanel. + + * src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java: + New. This abstract class implements the UIProvider and the + HasStepForwardHandlers interface and its necessary methods. These two + things are required by each concrete UIProvider, so this class should be + the base class for further concrete UIProviders. + + * src/main/java/de/intevation/flys/client/client/ui/LocationDistancePanel.java: + New. A UIProvider that enables the user to enter locations or a + distance. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + States with a uiprovider attribute set to 'location_distance_panel' use + the LocationDistancePanel for user input. + +2011-03-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Clear the panel that displays the current input widget before adding a + new one to this panel. + +2011-03-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added + a i18n string for a new calculation. + + * src/main/java/de/intevation/flys/client/client/FLYSImages.java, + src/main/java/de/intevation/flys/client/client/images/gewkarte.png: New + image: the map that shows the relevant rivers. + + * src/main/java/de/intevation/flys/client/client/ui/MapSelection.java: + Added the river map to the right panel of that widget. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Implemented the step forward mechanism. + +2011-03-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java, + src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + Save the name of the data item. We need the name for feed(). + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: + Before adding further old data items, we gonna check if the item is + already existing in the list. If it exists, the item is not added. + +2011-03-14 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Read i18n strings from DESCRIBE document and display them in the UI. + +2011-03-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Integrated the mechnism to listen on paramer changes. The CollectionView + is both: a HasParameterChangeHandler and a ParameterChangeHandler. + +2011-03-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Bugfix: Removed static string from gui. + +2011-03-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Parse the static data from DESCRIBE document and put it into the + ArtifactDescription. + +2011-03-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/HasParameterChangeHandler.java, + src/main/java/de/intevation/flys/client/client/event/ParameterChangeHandler.java, + src/main/java/de/intevation/flys/client/client/event/ParameterChangeEvent.java: + New. Interfaces and classes used for a listener mechanism to notify + listeners when the parameterization of a Collection/Artifact has + changed. + +2011-03-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/StepForwardServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/StepForwardService.java, + src/main/java/de/intevation/flys/client/server/StepForwardServiceImpl.java: + New. This service bundles the artifact operations feed() and advance() + into a single service. + + * src/main/java/de/intevation/flys/client/client/services/AdvanceServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/AdvanceService.java, + src/main/java/de/intevation/flys/client/server/AdvanceServiceImpl.java: + New. This service provides a method that triggers the advance() operation + of the artifact server. + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + Added code to parse the reachable states from DESCRIBE. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Make use of the 'forward' service after choosing the module and the river. + + * src/main/webapp/WEB-INF/web.xml: Registered the new services 'forward' and + 'advance'. + +2011-03-09 Ingo Weinzierl + + * src/test/java/de/intevation/flys/client/FLYSJUnit.gwt.xml, + src/main/java/de/intevation/flys/client/client/GreetingServiceAsync.java, + src/main/java/de/intevation/flys/client/client/GreetingService.java: + Removed the GreetingService from out application - this service has been + added initially by creating this repository. + +2011-03-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added + i18n strings for the module and river selection. + + * src/main/java/de/intevation/flys/client/client/ui/ModuleSelection.java: + New. A wrapper for the module and river selection. Both information can + be chosen in just one step. + + * src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: + Some layout improvements. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Makes use of the ModuleSelection if no artifact is existing in a new + CollectionView. Users may now choose the desired plugin and the river in + one single step. + +2011-03-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/RiverServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/RiverService.java, + src/main/java/de/intevation/flys/client/server/RiverServiceImpl.java: + New. A service that retrieves a list of supported rivers by the artifact + server. + + * src/main/java/de/intevation/flys/client/shared/model/River.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultRiver.java: + New. A model class and its default implementation to store rivers. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: At application + start, the provided rivers by the artifact server are fetched using the + RiverService. The rivers are queriable via a getRivers() method. + + * src/main/webapp/WEB-INF/web.xml: Registered the RiverService. + +2011-03-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added + i18n strings used in the menu panel. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Added a method + to retrieve the project list. + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: Added + further buttons (labels with ClickHandler) to switch the language, + logout the current user or open an info panel. + +2011-03-08 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/images/flys_logo.gif, + src/main/java/de/intevation/flys/client/client/images/bfg_logo.gif: New. + A logo of the BfG and a logo of the application FLYS. Both copied from + desktop FLYS. + + * src/main/java/de/intevation/flys/client/client/FLYSImages.java: New. + This interface grants access to the images used in this application. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: + Added the fullname of FLYS. + + * src/main/java/de/intevation/flys/client/client/ui/FLYSHeader.java: New. + This class displays the header containing a FLYS and a BfG logo. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: Integrated the + FLYSHeader into the layout at the bottom of the application. + + * src/main/webapp/FLYS.html: Set the title of the application to + "FLYS-3.0". + +2011-03-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/services/CreateCollectionService.java, + src/main/java/de/intevation/flys/client/client/services/CreateCollectionServiceAsync.java, + src/main/java/de/intevation/flys/client/server/CreateCollectionServiceImpl.java: + New. A service that might be used to create new collections in the + artifact server. + + * src/main/webapp/WEB-INF/web.xml: Registered the service to create new + collections. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Added the service to create new collections. Currently, this service is + not used. + +2011-03-07 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DefaultUser.java, + src/main/java/de/intevation/flys/client/shared/model/User.java: A user + interface and its default implementation. + + * src/main/java/de/intevation/flys/client/client/services/UserService.java, + src/main/java/de/intevation/flys/client/client/services/UserServiceAsync.java, + * src/main/java/de/intevation/flys/client/server/UserServiceImpl.java: This + service will currently return the first user that is returned by the + artifact server. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: The FLYS + instance stores the user that is logged in, because we need to make use of + this user in many services. + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java, + src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: Make use + of the User of this package - the User of the common package is not used + any longer. + +2011-03-02 Sascha L. Teichmann + + * pom.xml: Added missing SmartGWT repository. + +2011-02-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ParameterList.java: A UI + widget that stores and displays the data of former states and the current + data. The widget displaying of the current data is created by the + UIProvider that is stored in the Data object. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: We + are able to create new WINFO artifacts. After the artifact has been + created, the first 'state' is rendered in a 'WINFO tab' using the + ParameterList. + +2011-02-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + The 'uiprovider' attribute is parsed from DESCRIBE document and stored at + the Data object. + + * src/main/java/de/intevation/flys/client/shared/model/Data.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultData.java: + Implemented code to store the UIProvider (as string!) for the Data object. + +2011-02-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/StepForwardEvent.java: + An event that is thrown after the user has selected or entered data in the + UI and triggers the feed & advance operations via UI button. + + * src/main/java/de/intevation/flys/client/client/event/HasStepForwardHandlers.java: + This interface is used by classes that provide that step forward + mechanism. + + * src/main/java/de/intevation/flys/client/client/event/StepForwardHandler.java: + This interface is used by classes that want to listen to + StepForwardEvents. + +2011-02-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/UIProvider.java, + src/main/java/de/intevation/flys/client/client/ui/MapSelection.java, + src/main/java/de/intevation/flys/client/client/ui/SelectProvider.java: The + interface description and two implementations of a UIProvider. A + UIProvider is used to create widgets for the user input. The UIProvider + that is used in the current state depends on the data type in the describe + document and a 'uiprovider' flag that might be configured there. + + * src/main/java/de/intevation/flys/client/client/ui/UIProviderFactory.java: + The factory that is used to create new instances of UIProvider. + +2011-02-21 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + This view implements the HasCollectionChangeHandlers interface - + CollectionChangeHandler can register to this class and retrieve + notifications when the collection of this view changes. + +2011-02-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/event/CollectionChangeHandler.java, + src/main/java/de/intevation/flys/client/client/event/CollectionChangeEvent.java, + src/main/java/de/intevation/flys/client/client/event/HasCollectionChangeHandlers.java: + New. These interfaces and classes should be used to listen to changes in + Collections. + +2011-02-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java, + src/main/java/de/intevation/flys/client/shared/model/Collection.java: + Enhanced the Collection and its default implementation with new methods + to add new Artifacts, retrieve Artifacts and get the number of artifacts + managed by the Collection. + +2011-02-18 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactDescriptionFactory.java: + New. This factory is used to create an ArtifactDescription based on an + DESCRIBE document returned by the artifact server. + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: A + new DefaultArtifact with an ArtifactDescription that contains the dynamic + UI part is returned by the create() method now. + +2011-02-17 Ingo Weinzierl + + * pom.xml: This client uses the artifacts http-client for the communication + between client and server now. + + * src/main/java/de/intevation/flys/client/server/FLYSArtifactCreator.java: + New. An instance of the ArtitactCreator interface of the http-client. It + uses the document returned by the artifact server to create an artifact + instance. + + NOTE: The artifact creation needs to be implemented! This is currently + just a stub to make the other things work. + + * src/main/java/de/intevation/flys/client/client/services/ArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactService.java: + The method signature of create() changed: the server url is required now. + + * src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java: + Make use of the HttpClient and the FLYSArtifactCreator to create + artifacts. + + * src/main/java/de/intevation/flys/client/client/FLYS.java, + src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Added the server url to the create() call of the ArtifactService. + +2011-02-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + This view will now display radio buttons to choose between the module + 'WINFO', 'MINFO', 'Map' and 'Fix-Analyse'. A button is shown to create an + artifact of the selected module. + + NOTE: The next step here is to use the returning artifact with its + description and display widgets based on these information. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added + i18n strings for the CollectionView's 'next' button. + +2011-02-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactDescription.java, + src/main/java/de/intevation/flys/client/shared/model/DataItem.java, + src/main/java/de/intevation/flys/client/shared/model/Data.java: The + interfaces implement the Serializable interface now. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultArtifactDescription.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultDataItem.java, + src/main/java/de/intevation/flys/client/shared/model/DefaultData.java: + New. Default implementions of the interfaces above. These classes + implements constructors and the necessary methods of the interface + descriptions only! + +2011-02-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/server/ArtifactServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactServiceAsync.java, + src/main/java/de/intevation/flys/client/client/services/ArtifactService.java: + New. Interface descriptions and the server implementation of an artifact + service that provides basic methods for working with artifacts. + + NOTE: The implementation is currently just a stub. The artifact creation + needs to be implemented. + + * src/main/webapp/WEB-INF/web.xml: Added a servlet for the artifact + interface. + +2011-02-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Artifact.java: + Implements the serializable interface which is necessary to be able to + use this object in the GWT client code. + + * src/main/java/de/intevation/flys/client/shared/model/DefaultArtifact.java: + New. A simple default implementation of an artifact. + +2011-02-16 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/FLYS.gwt.xml: Added the + Resources and XML modules of GWT. + + * src/main/java/de/intevation/flys/client/client/config.xml: An xml file + that will contain the client configuration. + + * src/main/java/de/intevation/flys/client/client/Config.java: New. This + class should be used to handle the client configuration and provides + methods for retrieving information about the configuration. + + * src/main/java/de/intevation/flys/client/client/FLYSResources.java: The + configuration (Config) is initialized at the startup. + +2011-02-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/Artifact.java: New. + The interface description of an artifact used in this client. There are + several methods that provide information about the artifact itself and its + representation. + + * src/main/java/de/intevation/flys/client/shared/model/ArtifactDescription.java: + New. The ArtifactDescription provides information about the current + representation of an artifact. + + * src/main/java/de/intevation/flys/client/shared/model/DataItem.java, + src/main/java/de/intevation/flys/client/shared/model/Data.java: New. The + interfaces are used to handle user input. + +2011-02-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added + strings for the plugins. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + Display radio buttons if the collection is new and no plugin (winfo, + minfo, map, fix analyse) has been chosen. + +2011-02-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: New + strings for the CollectionViews. + + * src/main/java/de/intevation/flys/client/client/ui/FLYSWorkspace.java: New. + This is the workspace for FLYS. It contains the windows for each + collection of the user. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionView.java: + New. This window will display a collection. Currently, it has just a + title, but no content. + + * src/main/java/de/intevation/flys/client/client/ui/FLYSView.java: Displays + the FLYSWorkspace. + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: Added a + button to open new collections. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: The + FLYSWorkspace is created here. FLYS stores a reference to it and puts the + workspace into the FLYSView. Furthermore, there is a new method that + creates new Collections. + + NOTE: Currently, there is no communication with the artifact server, + because Collections aren't implemented yet! + +2011-02-11 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java, + src/main/java/de/intevation/flys/client/shared/model/Collection.java: + Added a new method that returns the UUID of the collection. + +2011-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/client/ui/ProjectList.java: The + ProjectList stores a reference to the current user and provides a list + with his existing projects. + + NOTE: There are created two Collections and two CollectionRecords for the + mockup. This code needs to be removed after a service to fetch the user + collections has been implemented. + + * src/main/java/de/intevation/flys/client/client/ui/CollectionGrid.java: + This grid will show a list of collections with its last modification date, + their uuid and two buttons to publish and delete the collection. + + NOTE: The buttons have no effect yet. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: The FLYS class + has a reference to the ProjectList. If a logged in user was found, the + ProjectList is initialized and added to the FLYSView. + + * src/main/java/de/intevation/flys/client/client/ui/FLYSView.java: There is + a new method to set the ProjectList. Furthermore, all UI components are + put into a HLayout now. On this way, we are able to open/close the + ProjectList. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages.java, + src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties: + Added strings for the project list. + +2011-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/shared/model/DefaultCollection.java, + src/main/java/de/intevation/flys/client/shared/model/Collection.java: The + interface and its default implementation of a Collection. + NOTE: I think both classes will change pretty much, but they have been + necessary for the ProjectList mockup. + +2011-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/flys/client/FLYS.gwt.xml: The artifact-common + package is available in the GWT code now. + + * pom.xml: Made the artifact-common package available. + + * src/main/java/de/intevation/flys/client/server/UserServiceImpl.java, + src/main/java/de/intevation/flys/client/client/services/UserService.java, + src/main/java/de/intevation/flys/client/client/services/UserServiceAsync.java: + A service definition that retrieves user information. Currently, this + service defines a single method that returns the user that is currently + logged in. + + * src/main/webapp/WEB-INF/web.xml: Added a servlet definition that provides + the UserService. + + * src/main/java/de/intevation/flys/client/client/FLYSMessages_en.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages_de.properties, + src/main/java/de/intevation/flys/client/client/FLYSMessages.java: Added + I18N string for a guest user. + + * src/main/java/de/intevation/flys/client/client/ui/MainMenu.java: There are + new methods to set the current user and to update the menu with its name. + + * src/main/java/de/intevation/flys/client/client/FLYS.java: After creating + the necessary components, the current user is queried by the UserService + and displayed in the menu bar. diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/NEWS --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/NEWS Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,552 @@ +NEWS + +2011-09-19 Release V 2.5.0 + +== Version 2.5.0 (19.09.2011, rev. 2786) == + +Diese Seite stellt primär Neuerungen in dieser Version aus Sicht des Nutzers zusammen bzw. verweist auf Vorarbeiten, die für jeweilige Funktionen benötigt werden. + +=== Zusammenfassung und Hintergedanken zur Version === +Die Version 2.5 verfolgt die folgenden Ziele auf den unterschiedlichen Ebenen: + * Bestehende textbasierte Daten von FLYS für die Gewässer Saar, Mosel und Elbe über Importmechanismen vollständig in die Datenbankhaltung samt dazugehörigen Datenmodell übernehmen + * Strukturierung von Geodaten und Import dieser in die Datenhaltung + * den Datenkorb als zentralen Datenmanager für statische und dynamische Daten bereitzustellen und in den unterschiedlichen Anwendungskontexten -- inline: Parameterisierung Überschwemmungsfläche, Parameterisierung Differenzen und als externes Fenster: Zuladen manueller Daten -- zugreifbar zu machen + * die Karte als Auswahlunterstützung und zur Anzeige von gerechneten Überschwemmungsflächen bereitzustellen + * die Integrationsfähigkeit der Karte in die Projektverwaltung zu ermöglichen + * Integration und Ansteuerung von WSPLGEN als asynchronen Prozeß in einer Mehrbenutzerumgebung zu integrieren + * Infrastruktur zur Ansteuerung und Generierung von Karten bereitzustellen + * die Projektverwaltung abzuschließen, um die Gesamtarbeitsweise im System greifbar zu machen. + * die Anwendung auf seine Zieldatendank Oracle 11 zu bringen + * das Gesamtsystem in seiner Zielumgebung SLES 11 bereitzustellen + * Erste Erfahrungsmöglichkeit mit FLYS togo bereitzustellen + +=== Framework === + + * Allgemeine Steuerung + + * Projektverwaltung + * Projekte umbenennen + * Projekte dublizieren + * Titel der Projekte nach Umbenennung in jeweiligem Projektfenster anzeigen + * Filterung der Projekteliste auf Basis der Titel + + +=== Fachdatenbestand === + + * Datenmodell + * Erweiterung um hyk-Datenbestand + * Erweiterung im Querprofildatenbestand + * Erweiterung im räumliche Tabellen für Kartenthemen + + * Importer hydrologischer und geodätischer Daten + * Querprofiledateien (*.prf) + * hyk-Dateien + + * Importer von Geodaten + * semiautomatischer Mechanismus zum Import von Shapedateien in Oracle 11 + + + +=== WINFO === + + * Gewässer- und Pegelinfos + * Einführung einer sog. Ziehharmonika, um Pegelinfos fortwährend integrieren zu können. + * Wahl von Strecke und Ort + * Filterung auf Streckenfavoriten und Orten durch Eingabe eines Begriffes - [[https://roundup-intern.intevation.de/flys/issue141|Details]] + * Wahl von Abflüssen, Wasserständen und Dauerzahlen + * Bei Wasserspiegellagenberechnungen können Qs nur noch angezeigt werden, wenn eine Berechnung auf freier Strecke gestartet wird. + + * Berechnungsausgabe + * Wasserspiegellagen + * Querprofile + * Darstellung der Querprofildatensätze aus der Datenbank + * Manuelle Eingabe von Kilometern + * Zur Zeit sind noch folgende Aspekte limitiert: + * Anzeige einer Wasserspiegellage und eines Querprofildatensatzes + * Durchlaufen des Kilometerzählers in 5 km Schritten + * kein synchrones bzw. asynchrones Navigieren möglich + + * Längsschnitt + * Anzeige von Streckenfavoriten + * Manuelles Hinzuladen früherer Berechnungen + + * Abflusskurven + * Automatisches Anzeigen von Hauptwerten aufgrund einer Vorbelegung + * Datenkorb: Exemplarische Darstellung des Gesamtbestandes von früheren und datenbankbasierten Inhalten + + * Überschwemmungsfläche (aufgrund zu wenig strukturierter Geodaten kann dies erstmalig an der Saar getestet werden!) + * Parameterisierung: + * Zugriff auf beliebige Wasserspiegellagen + * Auswahl eines beliebigen digitalen Geländemodells am Gewässer + * Digitalisierung von Rohren, Gräben und Dämmen + * Löschen bestehender Rohren, Gräben und Dämmen + * TODO: Berücksichtigen einer eigenen Shapedatei bei Berechnungstyp "Szenario" + * Durchführung der Berechnung: + * Informieren des Nutzers zum Fortgang der Berechnung + * TODO: Abbrechen der Berechnung + * Während der Berechnung kann das Projekt geschlossen werden und zu einem beliebigen Zeitpunkt wieder geöffnet werden. Der jeweilige Status wird dem Nutzer angezeigt. + * Technik/Hintergrund + * Ansteuerung von WSPLGEN mit seiner Parameterisierung und Bereitstellen der dazugehörigen Daten + * Management mehrerer gleichzeitiger WSPLGEN-Berechnungen + * Automatische Generierung einer WMS-Ebene zur Visualisierung des berechneten Überschwemmungsgebietes auf Basis einer Shapedatei unter Berücksichtigung der Eingabe von Differenzen zwischen Wasserspiegellage und Gelände + * Anzeige der Überschwemmungsfläche in der Karte + * siehe Abschnitt "Karte" + + * Differenzen + * Auswahl beliebiger Datenreihen aus dem Datenkorb + * TODO: Erweiterung der Konfiguration zur Filterung kompatibler Datensätze + * TODO: Erweiterung zu einer Mehrfachauswahl von Datenreihen + * TODO: Löschen von ausgewählten Differenzen aus der Tabelle + * Darstellung in einem Längsschnitt-Diagramm + * Hervorhebung der Null-Linie + * TODO: Anzeige der dazugehörigen Datenreihen mit absoluten Werten + * Export der Differenzen in einer CSV-Datei + + +=== Karte === + * Öffnen der Karte mit generiertem Überschwemmungsgebiet + * Themensteuerung Rohren, Gräben und Dämmenuerung (analog zum Diagramm) + * TODO: Anzeige einer Legende + * Kartennavigation + * Gesamtübersicht + * Hineinzoomen/Herauszoomen + * TODO: Layer-Zoom + * Karte verschieben + * Messen von Strecken + * Messen von Flächen + * Anzeige der Cursorkoordinaten im aktuellen Referenzsystem + * TODO: Auswahl alternativer Referenzsysteme + * TODO: Informationswerkzeug + * TODO: Integration des Datenkorbs + * TODO: Export der Karte als JPEG, PNG, GeoTiff + + +=== Diagramme === + + * Interna: + + * Themensteuerung + * Automatische Vorbelegung von Themen (technisch sog. recommendations) + * Beispiele + * Längsschnitte: Automatisches Einladen von Streckenfavoriten + * Abflusskurve: Automatisches Vorbelegung von Haupt- und Extremwerten + + * Werkzeugleiste + + +=== Datenkorb === + * Interna: + * "Mitlesen" früherer Berechnungen und Speicherung in einer speziellen Datenhaltung zur Bereitstellung in der Nutzeroberfläche + * Integration datenbankbasierter Inhalte (statisch) und nutzerspezifischer Berechnungen (dynamisch) zur Anzeige in einer Struktur + * Erstellen eines übergreifenden Konfigurationsmechanismus zur Umsetzung diagrammspezifischer Filterungen + * TODO: Erweiterung der Filterung auf bestehenden Diagrammtypen; bisher noch beispielhaft + * Mechanismus zum Einfügen statischer und dynamischer Daten aus der GUI in die Anwendung, die entsprechende Datensätze aus beiden Quellen heranzieht und automatisch in die Diagrammgenerierung übernimmt. + * Bereitstellen sogenannter "Recommendations" zur Umsetzung von Vorbelegungen + + * Manuelles Nachladen von Themen in Diagramme + * Beispiel: Längsschnitt: Einladen Früherer Berechnungen + +=== Themenstil-Editor === + * Intern: + * Weitere Diagrammtypen mit Vorbereitungen zur Implementierung der GUI versehen + + +=== Technische Umgebung === + * Integration der Testsysteme in SUSE Linux Enterprise Server 11, SP1 durchgängig auf Softwarepaketen, die von SUSE gepflegt werden (verringerte Wartung), ausgenommen + * WMS-Kartendienst: UMN MapServer 6.0.1 mit Anbindung an Oracle 11, bereitgestellt als RPM-Paket (Installer) + * Geodaten-Importer: GDAL 1.8.0 mit Anbindung an Oracle 11, bereitgestellt als RPM-Paket (Installer) + * Bestehendes WSPLGEN (unter Linux lauffähig gemacht) + +=== FLYS togo === + + * Umgebung + * Integration des Systems in SUSE Linux Enterprise Server 11, SP 1 + + * Software + * Installation von UMN MapServer 6.0.1 + * Installation von GDAL 1.8.0 + * Installation von WSPLGEN + * Installation des Geodatenimporters auf Basis von ogr2ogr + * Installation des Importers für hydrologische und geodätische Daten + * Installation von FLYS 2.5 + * Installation von QuantumGIS als Testclient für WMS und Shapedateien (nur zu internen Testzwecken; jenseits des Projektes) + + * Datenbestand und Import + * Import der hydrologischen, geodätischen für Saar, Mosel und Elbe (außer prfs) in Oracle 11 + * Import der Geodaten der Saar in Oracle 11 auf Basis des semi-automatischen Mechanismuses + * Konfiguration datenbankspezifischer Geodaten über einen WMS-Dienst aus Oracle 11 + + * Anwendung + * Ablauffähigkeit der Anwendung (ausgenommen Karte) auf Oracle 11 + + +=== Offene Punkte === + * Zur vereinfachten Übersicht sind die TODOs in die jeweilige Unterkapitel dieser Seite integriert. + + +=== Liste aller bearbeiteten Issues === + +{{{#!CSV , +"ID","Titel" +"id","title" +268,"WSPLGEN findet Feldname STATION und WSP nicht" +264,"Geodaten: Import - technisch-fachliche Evaluierung" +266,"Projektverwaltung: Duplizieren von Projekten" +256,"Datenkorb: XXX Issue festhalten" +280,"BoundingBoxen von Streckenfavoriten und Haupt- und Extremwerten unsichtbar machen" +258,"Datenkorb: Outs statt States führen" +254,"Datenkorb: Klonen von Artefakten in anderen Collections + Facettenfilter zum Ausblenden" +313,"""AssertionError"" beim Wechsel von Deutsch zu Englisch in der Projektliste" +286,"Karte: Tooltips für die Werkzeugleiste" +181,"Erstes Thema in der Themenliste wählt sich automatisch wieder an" +234,"W-INFO: Projektverwaltung" +262,"Datenkorb: Vereinigung der beiden Konfigurations-Templates" +259,"Daten aus Datenkorb in Diagramm einladen" +281,"Karte: Auswahl der berechnten Wasserspiegellage über Inline-Datenkorb" +314,"Datenkorb: Neue Berechnungen in laufender Sitzung werden nicht im Datenkorb angezeigt" +283,"Anzeige des Datenkorbs auf früheren Stand bringen" +159,"WINFO: Radiobutton - Ortsauswahl bei ""W für ungleichwertigen Abflusslängsschnitt"" entfernen" +260,"Datenkorb: Masterartefakt in View aufführen" +279,"WINFO: Elbe Wasserspiegellage - Index Out of Bounds" +20,"Versions-Clash bei slf4j verhindert Start des Artefakt-Servers." +290,"Karte: Eingabe von Differenzen zw. WSP und Gelände findet keine Ausprägung in der Karte" +310,"Querprofil: Farben der Themen" +309,"Querprofil: Manuelle Eingabe funktioniert nicht nach Return (nur nach Tab)" +311,"Querprofil: i18n" +291,"Karte: Farbdarstellung und Kartenkonfiguration von Desktop-FLYSübernehmen" +135,"Diagramm: Trotz abgeschalteter Themen bleiben Beschriftungen bestehen" +191,"AT-Export: Längsten monoton steigenden Bereich exportieren." +219,"W-INFO: Abflusskurvenberechnung / keine Themen im Diagramm" +176,"Diagramm: Benennung eines Abflusses bei gewählter Höhe am Pegel" +160,"WINFO: Auswahltabelle Orte bei Modus Strecke nach Step-Back" +180,"WINFO: Zeilen der Tabelle können nach der Markierung in die Zwischenablage kopiert werden." +282,"Karte: Abstand interpolierte Profile - Default wert" +}}} + + + +== Version 2.4.0 (27.06.2011, rev. 2257) == + +Diese Seite stellt primär Neuerungen in dieser Version aus Sicht des Nutzers zusammen bzw. verweist auf Vorarbeiten, die für jeweilige Funktionen benötigt werden. + +=== Zusammenfassung und Hintergedanken zur Version === +Die Version 2.4 verfolgt für WINFO das Ziel die fachliche Nachprüfbarkeit der bestehenden Berechnungsarten bereitzustellen. Hierbei sind folgende Aspekte wichtig: + * fachliche Richtigkeit und Genauigkeit der bestehenden Berechnungsarten + * Bereitstellung und Unterstützung eines Berichtswesens in den Berechnungsvorgängen + * Vorbereitung der Berechnungsarten für den Mehrbenutzerbetrieb + * Vollständigkeit der benötigten Fachdaten aus dem FLYS-Datei-Server für bestehende Funktionen (Kantenbilder, Typisierung Streckenfavoriten) + * Export aller benötigten Berechnungsdaten in entsprechenden Formaten (WST, WST korrigiert, CSV, AT) + +Um diese Ergebnisse visualisieren und im konsolidierten Diagrammbereich testen zu können, stellt das Diagramm die zentralen interaktiven Funktionen zur Navigation und Themensteuerung bereit und prüft die Kopplung von Client und Server Zusammenspiel. Um dem Nutzer die Verbindung seines Gesamtworkflows zu ermöglichen, ist die Projektverwaltung mit interaktiven Funktionen ausgestattet worden. Diese setzt unterschiedliche Parameterisierungen und Darstellungen in Projekten in Zusammenhang. + +=== Framework === + + * Allgemeine Steuerung + * Ehemalige Schriftzüge als Schaltflächen darstellen + + * Projektverwaltung + * Projektliste automatisch aktualisieren + * Projekt per Klick dauerhaft speichern + * Projekte mit eigenem Titel versehen + * Projekte manuell löschen + + +=== Fachdatenbestand === + * Importer + * Oberkanten und Unterkanten aus KM-Dateien extrahieren. + * Typisierung einzelner Objekte als Pegel, Brücke, Hafen, Zufluß, etc. + + * Analyse Datenmodellierung bestehender Geodaten in Shape-Dateien + * Bereitstellung eines WMS-Dienstes für die Saar + + +=== WINFO === + * Wahl von Strecke und Ort + * Anzeige von Oberkante und Unterkante zu einem jeweiligen Ort + * Suche in der Tabelle - Details https://roundup-intern.intevation.de/flys/issue141 + + * Wahl von Abflüssen, Wasserständen und Dauerzahlen + * Verteilen von Q/D und W auf zwei Reiter + + * Berechnungsausgabe + * Integration von Berechnungsberichten als Meldungen/Warnungen + * TODO: Beschreibungen verbessern und übersetzen. + * Wasserspiegellagen + * Interne Berechnung korrigiert und Genauigkeit geprüft. - https://roundup-intern.intevation.de/flys/issue96 + * Abflusskurven + * Ausgabe der berechneten Werte + * bzgl. Export siehe dort + * W bei ungleichwertigem Abflusslängsschnitt + * Interne Berechnung korrigiert und Genauigkeit geprüft. + + +=== Diagramme === + + * Interna: + * Infrastruktur geschaffen, um jeweilig Berechnungsergebnisse als einzelnes Thema auswählbar zu machen (technisch: Fazetten) + + * Themensteuerung + * Bereitstellung einer Themenliste + * Aktivieren und Deaktivieren der Themenliste mit automatischem Nachlademechanismus + * Verschieben von Themen schrittweise + * Verschieben von Themen nach ganz oben oder unten + * TODO: Alle markierten Themen an-/abwählen + * TODO: Alle markierten Themen löschen + + * Werkzeugleiste + * Navigationswerkzeuge + * Hereinzoomen über eine aufspannbaren Bereich + * Herauszoomen über einen statischen Faktor + * Auf Gesamtansicht zoomen + * Wertebereich in X- und Y-Richtung verschieben + * Anzeige der Cursorposition in der Einheit des Diagramms + + +=== Datenkorb === + * Intern + * Bereitstellung des Datentyps auf unterster Ebene zum Bereitstellung von "Früheren Berechnungen" + + +=== Themenstil-Editor === + * Intern: + * Vorbereitungen getroffen, um Stile auf Diagramme graphisch anwenden zu können. + + +=== Technische Aspekte === + * Beschleunigung der jeweiligen Berechnungen + * Stabilität der Kommunikation von Client und Server verbessern. + + +=== Offene Punkte === + * [[Flys-3.0/Version2.4Todo]]. + + +=== Liste aller bearbeiteten Issues === + +{{{#!CSV , +"ID","Titel" +10,"Fehler in FLYS-2.1 -> Anzeige Wertebereiche für Q am Pegel in FLYS-3 verschieden" +17,"Verhalten der Strecken-/Ortauswahl im FLYS-WebClient" +21,"Gleiches Projekt kann mehr als einmal gleichzeitig geöffnet werden" +40,"WINFO: Vorbelegung nach Rücksprung in der Historie stellt ursprgl. gewählten Wert nicht mehr her" +42,"Übergeordnete Navigation: Funktionen als Schaltflächen ausweisen" +43,"i18n: Einige Verbesserungen" +49,"Massenhafte Auswahl von Dauerzahlen als Berechnungsgrundlage von Wasserspiegellagen führt zu falschen Berechnungsergebnisse" +55,"WINFO: Gewichtungsfaktor für Abflusstabellen in der Berechnung 'W für angepaßten Abfluss-Längsschnitt'" +65,"Restlet akzeptiert keine weiteren Verbindungen" +69,"Berechnungsart 1 'Wasserstand/Wasserspiegellage' fehlerhaft" +76,"Importer: Lücken in den Q-Bereichen" +77,"Diagramm: Beschriftung der Kurven bei Dauerlinien" +81,"Rechenungenauigkeit Web-FLYS" +82,"ArrayIndexOutOfBoundsException wenn Berechnungen fehlschlagen" +84,"Kann nicht auf die erste Q-Spalte der Saar zugreifen." +85,"WINFO: Statt an einzelnen Orten wird eine Strecke gerechnet" +87,"WINFO-W/Wspl-Ort-gleichwertiger-Q" +89,"WINFO, Dauerlinie, erst ab D=1 rechnen" +90,"Diagramm: Trennung derDiagrammfläche und Achsenaufheben" +91,"WINFO: Vorbelegung Q statt W" +92,"WINFO: Saar-km 0.1-93 NQ HQ200 liefert keine Antwort" +93,"WINFO: Benennung der Berechnungsart korrigieren" +98,"W-INFO: Wasserspiegellagenberechnung und Auswahl über Q/W/D-Auswahl" +99,"WINFO: Wasserspiegellagenberechnung ohne Auswahlunterstützung" +100,"W-INFO: Wasserspiegellagenberechnung und veränderte Berechnungsrichtung" +101,"W-INFO: Wasserspiegellagenberechnung / Strecke" +102,"W-INFO: Wasserspiegellagenberechnung / Strecke - Probleme beim oberen und unteren Rand" +103,"WINFO: Wasserspiegellagenberechnung / Layout-Inkonsistenz" +105,"W-INFO: Wasserspiegellagenberechnung / Strecke und Bandbreite Q (Stabilitätsproblem)" +106,"W-INFO: Wasserspiegellagenberechnung / Strecke + W am Pegel (Vertauschen von Werten)" +108,"W-INFO: Wasserspiegellagenberechnung / W am Pegel (untere und obere Grenze)" +109,"W-INFO: Wasserspiegellagenberechnung / Strecke + W am Pegel (fehlerhafte Berechnung)" +111,"W-INFO: Wasserspiegellagenberechnung / Strecke" +112,"Berechnungsergebnis und Export verschieden" +116,"W-INFO: Wasserspiegellagenberechnung / Ort + Q-Auswahlunterstützung (Berechnungsergebnis bei punkthafter Berechnung fehlerhaft)" +117,"W-INFO: Wasserspiegellagenberechnung / Q-Eingabe" +118,"W-INFO: Eingabe Q aus Auswahlunterstützung und Manuell" +119,"W-INFO: Wasserspiegellagenberechnung / Dateneingabe ausserhalb des Wertebereichs" +122,"W-INFO: Wasserspiegellagenberechnung / Auswahlunterstützung Abfluss (W-Werte sind nicht auswählbar)" +128,"WINFO: Anzeige von gewählten Orten und Strecken" +129,"WINFO: Dauerlinie bei D=0" +131,"Anzeige der Position bei großen Zahlen ungenau" +132,"WINFO: Streckenauswahl per default setzen" +134,"WINFO: Tabellarische Ausgabe ('Berechnungsausgabe') bei Abflusskurven" +139,"WINFO: NPE bei Step-Back bei ungleichwertiger Berechnungsart" +140,"WINFO: WQ-Tabelle in Tabs aufsplitten" +142,"WINFO: Streckenauswahl: Oberkante/Unterkante hinzufügen" +147,"WINFO: Ort der Änderung des gleichwertigen Abflusses falsch" +149,"WINFO: Abflusskurve Mosel 242 wird an 1.904 km berechnet/gezeigt" +153,"Abflusskurven am Pegel über Facetten" +154,"Berechnete Abflusskurve/Abflusstafel zeigt keine Berechnungsergebnisse" +156,"WINFO: Platzierung des Berechnungsberichtes" +157,"Diagramm: Ursprung berechnete Abflusskurve" +161,"Diagramm: Q-Achse in W-Längsschnitten immer bei Q=0" +162,"WINFO: Kurzfassung von W/Q-Daten nicht vollständig" +164,"Berechnung 4: Umgekehrtes Berechnungsintervall führt zur" +165,"Projektliste: Einige Auffälligkeiten nach Neuimplementierung" +169,"WINFO: WSP kann nicht durchgeführt werden" +170,"Diagramm: Initiales Zoomen zeigt verschobenen Bereich" +172,"Diagramm: Ursprung der Diagramme bei Dauerzahlen" +173,"WINFO: W für ungleichwertigen Q-Längsschnitt: Abflussverteilung überschreitet obere Grenze" +174,"Diagramm: Q-Linie wird bei initialem Laden des Diagramms anders dargestellt als bei Ansicht auf gesamten Wertebereich" +175,"WINFO: Q um 7 qm/s zu hoch" +182,"WINFO: Vorbelegung Q bei 'ungleichwertigem Abflusslängsschnitt'" +}}} + + +2011-05-19 Release V 2.3.1 + +=== Framework === + + * Projektverwaltung + * Projektfenster maximieren (vgl. https://roundup-intern.intevation.de/flys/issue35) + + * Internationalisierung/Mehrsprachigkeit + * i18n: Untertitel bei Längsschnitten - Bereich der Strecke enthält "double" (https://roundup-intern.intevation.de/flys/issue66) + + +=== Fachdatenbestand === + * Import der hydrologischen Daten der Elbe + * Importer: Lücken in den Q-Bereichen (https://roundup-intern.intevation.de/flys/issue76) + * Seiteneffekt: Durch diese Lücken werden z.T. Berechungsausgaben verändert. Durch eine Fehlerbehebung und einen Reimport werden diese Lücken geschlossen. + + +=== WINFO === + + * Wahl von Abflüssen, Wasserständen und Dauerzahlen (Pflichtenheft: Bestehende Funktionen aus Desktop-FLYS; keine Entsprechung in Leistungsbeschreibung) + * WINFO: Q/W/D-Info liefert selten eine Antwort (https://roundup-intern.intevation.de/flys/issue72) + + * Berechnungsausgabe (Pflichtenheft: Teile in Kap. 3.4.1.1; bestehende Funktionen aus Desktop-FLYS + Verbesserungen) + * Ergebnisse werden jeweils im WST-Format ausgegeben (https://roundup-intern.intevation.de/flys/issue56) + * Auf Berechnungsergebnisse zu korrigierten Wasserstands-Abflussbeziehungen können über CSV-Dateien zugegriffen werden + + * Zu berücksichtigende Punkte bei der Durchführung der Berechnungsarten + * Allgemein: + * Besondere Beachtung der Berücksichtigung des Rücksprungverhaltens + * Wasserspiegellage/Wasserstand + * Berechnungsart 1 "Wasserstand/Wasserspiegellage" fehlerhaft (https://roundup-intern.intevation.de/flys/issue69) + * Abflusskurve/-tafel + * Weitere Infos zu Fällen für Rücksprünge werden benötigt. + * Dauerlinie + * WINFO: CSV-Export für Dauerlinien fehlt (https://roundup-intern.intevation.de/flys/issue79) + * Wird zur fachlichen Abnahme noch nachgereicht. + * W bei ungleichmäßigem Abflusslängsschnitt + * WINFO: Reihenfolge der Kilometer Eingabe liefert unterschiedliche Ergebnisse (https://roundup-intern.intevation.de/flys/issue71) + * WINFO: Gewichtungsfaktor für Abflusstabellen in der Berechnung "W für angepaßten Abfluss-Längsschnitt" (https://roundup-intern.intevation.de/flys/issue55); hier ist das Vorgehen zur Intervallbildung noch zu klären. + + + +=== Diagramme === + * Allgemein: + * Beschriftung der Legendeneinträge zu Kurven zu Eingangswerten in die Berechnung (https://roundup-intern.intevation.de/flys/issue77) + + +=== Offene Punkte === + * Version 2.3.1 behebt Fehler und ergänzt eine Funktion. Punkte mit noch nicht bereitgestellten Funktionen finden sich unter [[Flys-3.0/Version2.3Todo]]. + + +2011-05-16 Release V 2.3.0 + +=== Framework === + + * Projektverwaltung (Pflichtenheft Kap. 3.3, Lokale Daten > Arbeitssitzungen) + * Mit dem Anlegen eines neuen Projektes wird die Projektliste automatisch gefüllt. + * Zu beachten: Zur Zeit operiert das System noch mit '''einem''' Benutzer, so dass jeder alle auf dem Server liegenden Projekte sieht. Mit der Einführung einer Nutzeranmeldung sieht dann jeder Nutzer nur noch seine eigenen Projekte. + * Mit einem Doppelklick oder das Kontextmenü können die jeweiligen Projekte wieder geöffnet werden. Sie stellen den Arbeitszustand des letzten "Übernehmen" wieder her. Die Einstellung ist sprachunabhängig, d.h. auch wenn zuvor Diagramme in deutsch erstellt worden sind, können diese in englischer Sprache geöffnet und dargestellt werden. + * Projekte können Projekte noch in mehreren Fenster geöffnet werden. Um Konsistenz herzustellen, kann man ein Projekt nur einmal öffnen. (vgl. https://roundup-intern.intevation.de/flys/issue21) + * Neue Fenster überlappen sich nicht mit der Position des vorherigen Fensters, um beim Anlegen eines neuen Projektes eine vollständige Überdeckung zu vermeiden + * Projektfenster maximieren (vgl. https://roundup-intern.intevation.de/flys/issue35) + + * Projekteinstieg + * Klick-Optimierung der Gewässerauswahl über eine Liste: von 3 Klicks zu 1 Klick. + + * Internationalisierung (Pflichtenheft, Kap.4.3.4) + * Beim Start wird die Spracheinstellung des Browser automatisch ausgewertet und die dazugehörige Oberfläche in deutsch oder englisch geladen. Wenn eine andere Sprache als deutsch oder englisch angefragt wird, fällt die Anwendung auf englisch (TOCHECK) zurück. + * Die Sprache kann jeweils manuell gewechselt werden. Dies hat Auswirkungen auf die Bedienoberfläche, Diagramme und Nutzung von Dezimaltrenner und Punkt + +=== Fachdatenbestand === + * Import der hydrologischen Daten der Elbe +## * Was wird nicht berücksichtigt? +## * Spalten in wst-Dateien mit einer - Notation; andere, nicht einheitliche werde jeweils mit einer Ziffer erweitert + * Einige Zahlen zum Bestand: + * 3 Gewässern mit Saar, Mosel und Elbe + * 15 Pegel + * 108 wst/zus-Dateien + * 711 Spalten aus diesen + * rund 500.000 Einzelwerte + * rund 2.500 Stationierungen aus km-Dateien + + +=== WINFO === + + * Wahl des Gewässers (Pflichtenheft, Teile aus 3.4.1, 3.4.1.1) + * Automatische Vorbelegung des ersten Eintrags + + * Wahl der Berechnungsart (Pflichtenheft 3.4.1.1 - bestehende Funktionen) + * Automatische Vorbelegung des ersten Eintrags + * Umsetzung der folgenden Berechnungsarten + * Wasserstand/Wasserspiegellage + * Abflusskurve/Abflusstafel + * Dauerlinie + * W bei ungleichmäßigem Abflusslängsschnitt + + * Wahl von Strecke oder Ort (Pflichtenheft: Bestehende Funktionen aus Desktop-FLYS; keine Entsprechung in Leistungsbeschreibung) + + * Automatisches Umschalten der Reiter bei Wahl von Orten oder Strecken + + * Eingabe eines Ortes (Dauerlinie, Abflusstafel/-kurve) + * Freie Texteingabe + * Unterstützung der Eingabe durch Liste an Ortsfavoriten. Per Klick wird jeweils der Wert in das Textfeld eingetragen. + + * Eingabe mehrere Orte (Wasserstand/Wasserspiegellage) + * Freie Texteingabe + * Unterstützung der Eingabe durch Auswahltabellen an Ortsfavoriten. Per Klick wird jeweils der Wert in das Textfeld eingetragen. + * Übernehmen von Beginn einer Strecke und Ende einer Strecke (abweichend von Desktop-FLYS, um die Bedienführung gradliniger zu gestalten) + + * Eingabe von Strecken (Wasserstand/Wasserspiegellage) + * Freie Texteingabe + * Unterstützung der Eingabe durch Auswahltabellen an Streckenfavoriten. Per Klick wird jeweils der Wert in das Textfeld eingetragen. + * Übernehmen von Beginn einer Strecke und Ende einer Strecke aus den Ortsfavoriten mit explizitem Setzen von Beginn (grüne Fahne) und Ende (Rote Fahne) (Erweiterung zu Desktop-FLYS) + * Bemerkungen: + * Es gibt Streckendaten, die außerhalb der Berechnungsstrecke des Modells liegen. Können die Ortsfavoritenbestände hierauf reduziert werden, da hier keine Ermittlung von Wasserständen erfolgen kann bzw. Favoriten außerhalb der Bezugspegelstrecken erlauben keine Ermittlung eines Bezugspegels. + + * Automatische Ermittlung des Bezugspegels (Keine Entsprechung in Leistungsbeschreibung. Neue Anforderung als Ergebnis des Bedienkonzeptes.) + * Gewässer und Streckenwahl ermitteln den Bezugspegel automatisch + * Anzeige der Abflusskurven aller Pegel auf der vorgegebenen Strecke + + * Wahl von Abflüssen, Wasserständen und Dauerzahlen (Pflichtenheft: Bestehende Funktionen aus Desktop-FLYS; keine Entsprechung in Leistungsbeschreibung) + * Berechnungsart: Wasserspiegellagen/Wasserstand + * Eingabefelder wie in Desktop-FLYS für W oder Q; Einzelwerte oder Wertebereich + * Eingaben werden über eine tabellarische Auswahl unterstützt + * Bei der Eingabe von W: Wasserstände sind auswählbar + * Bei der Eingabe von Q: Hauptwerte und Dauerzahlen sind auswählbar + * Berechnungsart: W bei ungleichmäßigem Abflusslängsschnitt + * Eingabefelder für W und Q analog zu bisherigen genutzten Mechanismen + + * Berechnungsausgabe (Pflichtenheft: Teile in Kap. 3.4.1.1; bestehende Funktionen aus Desktop-FLYS + Verbesserungen) + * Ausgabe jeweils in einer strukturierten Tabelle. + * Die Werte können in Abhängigkeit von der Spalte auf- und absteigend sortiert werden. + * Ergebnisse werden jeweils im CSV-Format ausgegeben + * Es werden weitere Ausgaben in zusätzlichen Reitern angezeigt, die auch abgefragt werden können. + +=== Diagramme === + * Allgemein: + * Integrierte Ausgabe der Diagramme in WINFO (Pflichtenheft Kap. 3.1) + * Zugriff auf die Projektdefinition/Parameterisierung (WINFO-Reiter) + * Freie Größenskalierung der Diagramme in Abhängigkeit vom Projektfenster + * Internationalisierung der Diagramme in deutsch und englisch (Beschriftung, Dezimaltrennzeichen und Tausendertrennzeichen) + * Beschriftung der Diagrammtitel gemäß Anhang (Leistungsbeschreibung, Anhang 1) + + * Anpassungen in Abhängigkeit von Berechnungsart/Diagrammtyp (Bestehendes Verhalten aus Desktop-FLYS): + * Abflusskurve am Pegel + * Längsschnitt + * Wasser fließt immer von links nach rechts (unabhängig von der Orientierung der Stationierung; die Orientierung kann pro Gewässer explizit gesetzt werden.) + * Abflusskurve/-tafel + * Dauerlinie + * Kombiniertes Diagramm von W- und Q-Dauerlinie (Pflichtenheft 3.4.1.8.6) + * W bei ungleichmäßigem Abflusslängsschnitt + * Kombiniertes Diagramm von W-Diagramm und Q-Vorschau (Pflichtenheft 3.4.1.8.6) + + +=== Datenkorb (Pflichtenheft 3.4.1, ausgehend von Desktop-FLYS) === + * Anzeige aller in der Datenbank vorhandenen Datensätze für das gewählte Gewässer (FLYS-Daten aus der Datenbank) + * Mehrfachauswahl durch Bereiche mit der Taste "Shift"; kombinierte Einzelauswahl mit der Taste "Strg" + * XML-basierte Konfiguration des Datenkorbs diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/README.txt Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,84 @@ +--- Generated by GWT WebAppCreator --- + +Congratulations, you've successfully generated a starter project! What next? + +-- Option A: Import your project into Eclipse (recommended) -- + +If you use Eclipse, you can simply import the generated project into Eclipse. +We've tested against Eclipse 3.4 and 3.5. Later versions will likely also +work, earlier versions may not. + +If the directory containing this file does not have a .classpath or .project +file, generate them by running 'ant eclipse.generate' + +In Eclipse, go to the File menu and choose: + + File -> Import... -> Existing Projects into Workspace + + Browse to the directory containing this file, + select "FLYS". + + Be sure to uncheck "Copy projects into workspace" if it is checked. + + Click Finish. + +You can now browse the project in Eclipse. + +To launch your web app in GWT development mode, go to the Run menu and choose: + + Run -> Open Debug Dialog... + + Under Java Application, you should find a launch configuration + named "FLYS". Select and click "Debug". + + You can now use the built-in debugger to debug your web app in development mode. + +If you supplied the junit path when invoking webAppCreator, you should see +launch configurations for running your tests in development and production +mode. + +-- Option B: Build from the command line with Ant -- + +If you prefer to work from the command line, you can use Ant to build your +project. (http://ant.apache.org/) Ant uses the generated 'build.xml' file +which describes exactly how to build your project. This file has been tested +to work against Ant 1.7.1. The following assumes 'ant' is on your command +line path. + +To run development mode, just type 'ant devmode'. + +To compile your project for deployment, just type 'ant'. + +To compile and also bundle into a .war file, type 'ant war'. + +If you supplied the junit path when invoking webAppCreator, you can type 'ant +test' to run tests in development and production mode. + +For a full listing of other targets, type 'ant -p'. + +-- Option C: Using another IDE -- + +GWT projects can be run in other IDEs as well, but will require some manual +setup. If you go this route, be sure to: + +* Have your IDE build .class files into 'war/WEB-INF/classes'. +* Add gwt-user.jar and gwt-dev.jar to your project build path. +* When creating a launch configuration, add a classpath entry for your 'src' + folder (this is somewhat unusual but GWT needs access to your source files). + +If you get stuck, try to mimic what the Ant 'build.xml' would do. + +-- Option D: Using Maven -- + +If you have generated your project with the option '-maven', you have a 'pom.xml' +file ready to use. Assuming you have 'maven2' installed in your system, 'mvn' is +in your path, and you have access to maven repositories, you should be able to run: + +mvn clean # delete temporary stuff +mvn test # run all the tests (gwt and junit) +mvn gwt:run # run development mode +mvn gwt:compile # compile to javascript +mvn package # generate a .war package ready to deploy + +For more information about other available goals, read maven and gwt-maven-plugin +documentation (http://maven.apache.org, http://mojo.codehaus.org/gwt-maven-plugin) diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/doc/Flys-UI-Classes.png Binary file gwt-client/doc/Flys-UI-Classes.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/doc/Flys-UI-Services-Classes.png Binary file gwt-client/doc/Flys-UI-Services-Classes.png has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/images/next.xcf Binary file gwt-client/images/next.xcf has changed diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/pom.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/pom.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,236 @@ + + + + + 4.0.0 + org.dive4elements.river + client + war + 1.0-SNAPSHOT + org.dive4elements.river.client + + + UTF-8 + + 2.4.0 + + 1.6 + 1.6 + + + + + com.google.gwt + gwt-servlet + ${gwtVersion} + runtime + + + com.google.gwt + gwt-user + ${gwtVersion} + provided + + + + com.smartgwt + smartgwt + 3.0 + + + org.dive4elements + artifacts-common + 1.0-SNAPSHOT + + + org.dive4elements + http-client + 1.0-SNAPSHOT + + + net.sf.opencsv + opencsv + 2.0 + + + junit + junit + 4.4 + test + + + commons-lang + commons-lang + 2.6 + + + commons-fileupload + commons-fileupload + 1.2.1 + + + org.gwtopenmaps.openlayers + gwt-openlayers-client + 0.6 + + + commons-httpclient + commons-httpclient + 3.1 + + + org.apache.httpcomponents + httpclient + 4.2 + + + log4j + log4j + 1.2.14 + + + org.mapfish.print + print-lib + 1.2-SNAPSHOT + + + org.jdom + jdom + 1.1.3 + + + commons-io + commons-io + 2.2 + + + commons-codec + commons-codec + 1.4 + + + + + + target/www/WEB-INF/classes + + + + + + org.codehaus.mojo + gwt-maven-plugin + ${gwtVersion} + + + com.google.gwt + gwt-user + ${gwtVersion} + + + com.google.gwt + gwt-dev + ${gwtVersion} + + + + + + prepare-package + + compile + + + + + + + FLYS.html + + target/www + + true + + + + + + maven-surefire-plugin + + + ${project.build.sourceDirectory} + ${project.build.testSourceDirectory} + + false + always + + + + + gwt.args + -out target/www + + + + + + + + maven-resources-plugin + + + compile + + copy-resources + + + target/www + + + src/main/webapp + + + + + + + + + + maven-clean-plugin + + + src/main/webapp/flys + src/main/webapp/WEB-INF/classes + tomcat + www-test + .gwt-tmp + + + + + + + + + com.smartgwt + SmartGWT + http://www.smartclient.com/maven2 + + + org.mapfish + http://dev.mapfish.org/maven/repository + + + osgeo + Open Source Geospatial Foundation Repository + http://download.osgeo.org/webdav/geotools/ + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/FLYS.gwt.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/FLYS.gwt.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/Config.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/Config.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,110 @@ +package org.dive4elements.river.client.client; + +import com.google.gwt.i18n.client.LocaleInfo; + +import com.google.gwt.xml.client.Document; +import com.google.gwt.xml.client.Node; + + +/** + * A class that is used to handle the global configuration of this client. You + * can retrieve an instance of this class using the getInstance + * methods. NOTE: the configuration is initialized using {@link + * getInstance(Document)} the first time. + * + * @author Ingo Weinzierl + */ +public class Config { + + /** The instance of the configuration. */ + protected static Config INSTANCE; + + /** The xml document that contains the configuration options. */ + protected Document config; + + + /** + * Get an instance by using {@link getInstance(Document)} or {@link + * getInstance()}. + */ + private Config(Document config) { + this.config = config; + } + + + /** + * Returns an instance of this class and initializes the configuration of + * this has not been done so far. + * + * @param config The client configuration. + * + * @return an instance of this Config class. + */ + public static Config getInstance(Document config) { + if (INSTANCE == null) { + INSTANCE = new Config(config); + } + + return INSTANCE; + } + + + /** + * Returns an instance of this class. If it has not been initialized with a + * valid configuration, null is returned. + * + * @return an instance of this class or null, if the Config has not been + * initialized using {@link getInstance(Document)} so far. + */ + public static Config getInstance() { + return INSTANCE; + } + + + /** + * Returns the URL of the artifact server. + * + * @return the artifact server url. + */ + public String getServerUrl() { + Node server = config.getElementsByTagName("server").item(0); + return server.getFirstChild().getNodeValue(); + } + + + /** + * Returns the name of the current locale. + * + * @return the name of the current locale. + */ + public String getLocale() { + return LocaleInfo.getCurrentLocale().getLocaleName(); + } + + + /** + * Returns the integer configured at + * /config/projectlist/update-interval/text() or -1 if an error + * occured or no such option is defined. + * + * @return the update interval of the project list. + */ + public int getProjectListUpdateInterval() { + Node projectlist = config.getElementsByTagName("projectlist").item(0); + + if (projectlist == null) { + return -1; + } + + Node interval = config.getElementsByTagName("update-interval").item(0); + + if (interval == null) { + return -1; + } + + String value = interval.getFirstChild().getNodeValue(); + + return value != null ? Integer.valueOf(value) : -1; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYS.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYS.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,629 @@ +package org.dive4elements.river.client.client; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.shared.UmbrellaException; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.xml.client.XMLParser; + +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.HTMLPane; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.events.CloseClickEvent; +import com.smartgwt.client.widgets.events.CloseClickHandler; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.event.CollectionChangeEvent; +import org.dive4elements.river.client.client.event.CollectionChangeHandler; +import org.dive4elements.river.client.client.services.ArtifactService; +import org.dive4elements.river.client.client.services.ArtifactServiceAsync; +import org.dive4elements.river.client.client.services.CreateCollectionService; +import org.dive4elements.river.client.client.services.CreateCollectionServiceAsync; +import org.dive4elements.river.client.client.services.DescribeCollectionService; +import org.dive4elements.river.client.client.services.DescribeCollectionServiceAsync; +import org.dive4elements.river.client.client.services.GetArtifactService; +import org.dive4elements.river.client.client.services.GetArtifactServiceAsync; +import org.dive4elements.river.client.client.services.RiverService; +import org.dive4elements.river.client.client.services.RiverServiceAsync; +import org.dive4elements.river.client.client.services.UserService; +import org.dive4elements.river.client.client.services.UserServiceAsync; +import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.FLYSHeader; +import org.dive4elements.river.client.client.ui.FLYSView; +import org.dive4elements.river.client.client.ui.FLYSWorkspace; +import org.dive4elements.river.client.client.ui.ProjectList; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItem; +import org.dive4elements.river.client.shared.model.GaugeInfo; +import org.dive4elements.river.client.shared.model.River; +import org.dive4elements.river.client.shared.model.User; + +import org.dive4elements.river.client.client.ui.wq.WQAutoTabSet; + +import java.util.ArrayList; +import java.util.List; +import java.util.MissingResourceException; +import java.util.Set; + + +/** + * Entry point classes define onModuleLoad(). + * + * @author Ingo Weinzierl + */ +public class FLYS implements EntryPoint, CollectionChangeHandler { + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** The UserService used to retrieve information about the current user. */ + protected UserServiceAsync userService = GWT.create(UserService.class); + + /** The RiverService used to retrieve the supported rivers of the server.*/ + protected RiverServiceAsync riverService = GWT.create(RiverService.class); + + /** The ArtifactService used to communicate with the Artifact server. */ + protected ArtifactServiceAsync artifactService = + GWT.create(ArtifactService.class); + + /** The ArtifactService used to communicate with the Artifact server. */ + protected DescribeCollectionServiceAsync describeCollectionService = + GWT.create(DescribeCollectionService.class); + + /** The GetArtifactService used to open an existing collection. */ + protected GetArtifactServiceAsync getArtifactService = + GWT.create(GetArtifactService.class); + + /** The CreateCollectionServiceAsync used to create a new collection */ + protected CreateCollectionServiceAsync collectionService = + GWT.create(CreateCollectionService.class); + + /** The content window. It takes the whole space beneath the header. */ + protected FLYSView view; + + /** The project list that displays the projects of the user. */ + protected ProjectList projectList; + + /** The FLYSWorkspace. */ + protected FLYSWorkspace workspace; + + /** The user who is currently logged in. */ + protected User currentUser; + + /** The list of rivers supported by the server. */ + protected River[] rivers; + + /** This list is used to track the opened projects. */ + protected List openProjects; + + private FLYSHeader header; + + + public static String getExceptionString(FLYSConstants msg, Throwable caught) { + try { + return msg.getString(caught.getMessage()); + } + catch(MissingResourceException ex) { + // There are some server error exceptions with + // varying text messages that cannot be localized + // easily. In this rare cases, use the plain + // exception message. + GWT.log("Missing resource for: " + caught.getMessage()); + return caught.getLocalizedMessage(); + } + } + + /** + * This is the entry point method. + */ + @Override + public void onModuleLoad() { + openProjects = new ArrayList(); + + //GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() { + // public void onUncaughtException(Throwable e) { + // showWarning(e); + // } + //}); + + VLayout vertical = new VLayout(); + vertical.setLayoutMargin(1); + vertical.setWidth100(); + vertical.setHeight100(); + + view = new FLYSView(); + header = new FLYSHeader(this); + + vertical.addMember(header); + vertical.addMember(view); + + vertical.draw(); + + initConfiguration(); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + userService.getCurrentUser(locale, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not find a logged in user."); + String msg = getExceptionString(MSG, caught); + SC.warn(msg); + } + + @Override + public void onSuccess(User user) { + GWT.log("Found a user. Set '"+ user.getName() + "'"); + setCurrentUser(user); + + header.setCurrentUser(user); + + projectList = new ProjectList(FLYS.this, user); + workspace = new FLYSWorkspace(FLYS.this); + view.setProjectList(projectList); + view.setFLYSWorkspace(workspace); + + readRivers(); + } + }); + } + + + public void showWarning(Throwable e) { + StringBuilder sb = new StringBuilder(); + sb.append(""); + + if (e instanceof UmbrellaException) { + UmbrellaException u = (UmbrellaException) e; + Set throwables = u.getCauses(); + + for (Throwable t: throwables) { + sb.append(t.getLocalizedMessage()); + sb.append("
    "); + } + } + else { + sb.append(e.getLocalizedMessage()); + } + + sb.append("
    "); + + Window w = new Window(); + w.setTitle(MSG.unexpected_exception()); + w.setWidth(550); + w.setHeight(300); + w.centerInPage(); + w.setCanDragResize(true); + + HTMLPane p = new HTMLPane(); + p.setContents(sb.toString()); + + w.addItem(p); + w.show(); + } + + + /** + * This method should be called at system start. It initialzes the client + * configuration. + */ + protected void initConfiguration() { + String xml = FLYSResources.INSTANCE.initialConfiguration().getText(); + Config.getInstance(XMLParser.parse(xml)); + } + + + /** + * Returns the user that is currently logged in. + * + * @return the current user. + */ + public User getCurrentUser() { + return currentUser; + } + + + /** + * Sets the current user. + */ + public void setCurrentUser(User user) { + currentUser = user; + } + + + /** + * Returns the project list. + */ + public ProjectList getProjectList() { + return projectList; + } + + + /** + * Returns the projects workspace that contains all project windows. + * + * @return the FLYSWorkspace. + */ + public FLYSWorkspace getWorkspace() { + return workspace; + } + + + /** + * Returns a list of rivers supported by the artifact server. + * + * @return a list of rivers supported by the artifact server. + */ + public River[] getRivers() { + return rivers; + } + + + protected void readRivers() { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + riverService.list(locale, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not recieve a list of rivers."); + SC.warn(getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(River[] newRivers) { + GWT.log("Retrieved " + newRivers.length + " new rivers."); + rivers = newRivers; + } + }); + } + + + /** + * This method creates a new CollectionView and adds it to the workspace. + * NOTEThe user needs to be logged in and there need to at least one + * river - otherwise a warning is displayed and no CollectionView is + * created. + */ + public void newProject() { + if (getCurrentUser() == null) { + SC.warn(MSG.error_not_logged_in()); + return; + } + + if (getRivers() == null) { + SC.warn(MSG.error_no_rivers_found()); + readRivers(); + + return; + } + + CollectionView view = new CollectionView(this); + workspace.addView("new-project", view); + + view.addCollectionChangeHandler(getProjectList()); + } + + + protected void lockProject(String uuid) { + if (isProjectLocked(uuid)) { + return; + } + + openProjects.add(uuid); + } + + + protected void unlockProject(String uuid) { + openProjects.remove(uuid); + } + + + /** Whether project uuid is currently opened. */ + protected boolean isProjectLocked(String uuid) { + return openProjects.contains(uuid); + } + + + /** Opens (or bring into foreground) project with given id. */ + public void openProject(final String collectionID) { + if (collectionID == null) { + return; + } + + if (isProjectLocked(collectionID)) { + workspace.bringUp(collectionID); + return; + } + + lockProject(collectionID); + + GWT.log("Open existing project: " + collectionID); + + Config config = Config.getInstance(); + final String locale = config.getLocale(); + + describeCollectionService.describe(collectionID, locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + SC.warn(getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Collection c) { + final Collection collection = c; + + if (collection.getItemLength() == 0) { + CollectionView view = new CollectionView( + FLYS.this, collection, null); + + view.addCollectionChangeHandler( + getProjectList()); + view.addCloseClickHandler( + new CloseCollectionViewHandler( + FLYS.this, collectionID)); + + workspace.addView(collectionID, view); + + return; + } + + final CollectionItem item = c.getItem(0); + + if (item == null) { + SC.warn(MSG.error_load_parameterization()); + return; + } + + getArtifactService.getArtifact( + locale, + item.identifier(), + item.hash(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + unlockProject(collectionID); + SC.warn(getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Artifact artifact) { + CollectionView view = new CollectionView( + FLYS.this, collection, artifact); + + view.addCollectionChangeHandler( + getProjectList()); + view.addCloseClickHandler( + new CloseCollectionViewHandler( + FLYS.this, collectionID)); + + workspace.addView(collectionID, view); + } + }); + + } + }); + } + + + public void closeProject(String uuid) { + unlockProject(uuid); + workspace.destroyProject(uuid); + } + + + /** + * Create a new Artifact. + */ + public void newArtifact(String factory) { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + artifactService.create(locale, factory, null, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not create the new artifact."); + SC.warn(getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully created a new artifact."); + } + }); + } + + + /** Opens a window with Main Values from gauge. */ + public void newGaugeMainValueTable(GaugeInfo gauge) { + Window mainValueView = new Window(); + + // Take middle to avoid issues at borders. + double km = (gauge.getKmEnd() + gauge.getKmStart())/2d; + mainValueView.addItem(new WQAutoTabSet(gauge.getRiverName(), + new double[] {km, km})); + mainValueView.setWidth(450); + mainValueView.setHeight(600); + + mainValueView.setMaximized(false); + mainValueView.centerInPage(); + mainValueView.setCanDragReposition(true); + mainValueView.setCanDragResize(true); + mainValueView.setShowMaximizeButton(true); + mainValueView.setKeepInParentRect(true); + + mainValueView.setTitle(MSG.mainvalues() + " " + gauge.getName() + " (" + gauge.getRiverName() + ")" ); + workspace.addChild(mainValueView); + } + + public void newGaugeDischargeCurve(String river, Long gaugeref) { + Config config = Config.getInstance(); + + final String locale = config.getLocale(); + final String riv = river; + final Long ref = gaugeref; + final FLYS flys = this; + + User user = getCurrentUser(); + + if (user == null) { + SC.warn(MSG.error_not_logged_in()); + return; + } + + collectionService.create(locale, user.identifier(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not create new collection."); + SC.warn(getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Collection collection) { + GWT.log("Successfully created a new collection."); + final Collection col = collection; + artifactService.createGaugeDischargeCurveArtifact( + col, locale, riv, ref, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not create the new artifact."); + SC.warn(getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully created a new artifact."); + CollectionView view = new CollectionView(flys, + col, artifact); + workspace.addView(col.identifier(), view); + + view.addCollectionChangeHandler(getProjectList()); + view.addCloseClickHandler( + new CloseCollectionViewHandler( + FLYS.this, col.identifier())); + projectList.updateUserCollections(); + } + }); + } + }); + } + + public void newSQRelation(String river, int measurementStation) { + Config config = Config.getInstance(); + + final String locale = config.getLocale(); + final String riv = river; + final int mStation = measurementStation; + final FLYS flys = this; + + User user = getCurrentUser(); + + if (user == null) { + SC.warn(MSG.error_not_logged_in()); + return; + } + + collectionService.create(locale, user.identifier(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not create new collection."); + SC.warn(getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Collection collection) { + GWT.log("Successfully created a new collection."); + final Collection col = collection; + artifactService.createSQRelationArtifact( + col, locale, riv, mStation, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not create the new artifact."); + SC.warn(getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully created a new artifact."); + CollectionView view = new CollectionView(flys, + col, artifact); + workspace.addView(col.identifier(), view); + + view.addCollectionChangeHandler(getProjectList()); + view.addCloseClickHandler( + new CloseCollectionViewHandler( + FLYS.this, col.identifier())); + projectList.updateUserCollections(); + } + }); + } + }); + } + + @Override + public void onCollectionChange(CollectionChangeEvent event) { + Collection oldC = event.getOldValue(); + + if (oldC == null) { + Collection newC = event.getNewValue(); + lockProject(newC.identifier()); + } + } + + + + /** + * This CloseClickHandler is used to remove lock on a specific Collection so + * that is might be opened again. + */ + public class CloseCollectionViewHandler implements CloseClickHandler { + protected FLYS flys; + protected String uuid; + + public CloseCollectionViewHandler(FLYS flys, String uuid) { + this.flys = flys; + this.uuid = uuid; + } + + @Override + public void onCloseClick(CloseClickEvent event) { + flys.closeProject(uuid); + } + } + + public boolean isProjectListVisible() { + if (this.projectList == null) { + return true; + } + return this.projectList.isVisible(); + } + + public void hideProjectList() { + if (this.projectList != null) { + this.projectList.hide(); + } + } + + public void openProjectList() { + if (this.projectList != null) { + this.projectList.show(); + } + } + + public void hideHeaderProjectButton() { + this.header.hideProjectButton(); + } + + public void shoHeaderProjectButton() { + this.header.showProjectButton(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,1268 @@ +package org.dive4elements.river.client.client; + +import com.google.gwt.i18n.client.ConstantsWithLookup; + + +/** + * @author Ingo Weinzierl + */ +public interface FLYSConstants extends ConstantsWithLookup { + + String static_sqrelation(); + + String add(); + + String unexpected_exception(); + + String title(); + + String fullname(); + + String user(); + + String guest(); + + String projects(); + + String open_project(); + + String delete_project(); + + String rename_project(); + + String clone_project(); + + String copy_of (); + + String manage_projects(); + + String favorite_tooltip(); + + String favorite_tooltip_meaning(); + + String projectlist_creationTime(); + + String projectlist_title(); + + String projectlist_favorite(); + + String really_delete(); + + String project_name_too_long(); + + String logout(); + + String switch_language(); + + String info(); + + String warning(); + + String warning_language(); + + String warning_no_wsp_selected(); + + String warning_cannot_parse_date(); + + String no_projects(); + + String load_projects(); + + String empty_table(); + + String empty_filter(); + + String date_format(); + + String datetime_format(); + + String new_project(); + + String new_calculation(); + + String module_selection(); + + String river_selection(); + + String winfo(); + + String minfo(); + + String map(); + + String new_map(); + + String new_chart(); + + String diagram(); + + String axes(); + + String legend(); + + String chart_title(); + + String chart_subtitle(); + + String grid(); + + String antialiasing(); + + String axis_name(); + + String chart_start(); + + String chart_end(); + + String x_axis(); + + String y1_axis(); + + String y2_axis(); + + String y3_axis(); + + String legend_name(); + + String show_legend(); + + String aggregation_threshold(); + + String scale(); + + String databasket(); + + String databasket_loading(); + + String theme_top(); + + String theme_up(); + + String theme_down(); + + String theme_bottom(); + + String zoom_all(); + + String zoom_in(); + + String zoom_out(); + + String zoom_back(); + + String properties_ico(); + + String pan(); + + String askThemeRemove(); + + String fix(); + + String fixanalysis(); + + String next(); + + String river_km(); + + String uesk_profile_distance(); + + String location_distance_state(); + + String distance_state(); + + String waterlevel_ground_state(); + + String location(); + + String locations(); + + String single_location(); + + String distance(); + + String unitFrom(); + + String unitTo(); + + String dpLabelFrom(); + + String dpUnitFrom(); + + String dpLabelTo(); + + String dpUnitTo(); + + String dpLabelStep(); + + String dpUnitStep(); + + String wgLabelFrom(); + + String wgUnitFrom(); + + String wgLabelTo(); + + String wgUnitTo(); + + String wgLabelStep(); + + String wgUnitStep(); + + String unitWidth(); + + String unitFromInM(); + + String unitToInM(); + + String unitDiffInM(); + + String unitLocation(); + + String wrongFormat(); + + String atLeastOneValue(); + + String missingInput(); + + String too_many_values (); + + String from(); + + String to(); + + String riverside(); + + String calcTableTitle(); + + String helperPanelTitle(); + + String gaugePanelTitle(); + + String measurementStationPanelTitle(); + + String wqTitle(); + + String wqadaptedTitle(); + + String wqHistorical(); + + String unitWNN(); + + String wqWFree(); + + String wqW(); + + String wqQ(); + + String wqQatGauge(); + + String wqQGauge(); + + String wqSingle(); + + String wqRange(); + + String unitWSingle(); + + String unitWFrom(); + + String unitWTo(); + + String unitWStep(); + + String unitQSingle(); + + String unitQFrom(); + + String unitQTo(); + + String unitQStep(); + + String main_channel(); + + String total_channel(); + + String footerHome(); + + String footerContact(); + + String footerImpressum(); + + String projectListMin(); + + String projectListAdd(); + + String buttonNext(); + + String imageBack(); + + String imageSave(); + + String search(); + + String properties(); + + String activateTheme(); + + String deactivateTheme(); + + String removeTheme(); + + String manageThemes(); + + String label_ok(); + + String label_cancel(); + + String cancelCalculationLabel(); + + String calculationCanceled(); + + String flysLogo(); + + String bfgLogo(); + + String bfgLogoSmall(); + + String downloadPNG(); + + String downloadPDF(); + + String downloadSVG(); + + String downloadCSV(); + + String downloadAT(); + + String downloadWST(); + + String loadingImg(); + + String cancelCalculation(); + + String markerRed(); + + String markerGreen(); + + String riverMap(); + + String range(); + + String description(); + + String resultCount(); + + String start_year(); + + String end_year(); + + String period(); + + String gauge_class(); + + String eventselect(); + + String events(); + + String kmchart(); + + String addPointsTooltip(); + + String addWSPTooltip(); + + String downloadPNGTooltip(); + + String downloadPDFTooltip(); + + String downloadSVGTooltip(); + + String downloadCSVTooltip(); + + String zoomToMaxExtentTooltip(); + + String zoomOutTooltip(); + + String historyBackTooltip(); + + String panControlTooltip(); + + String zoomboxTooltip(); + + String chartPropertiesTooltip(); + + String year(); + + String sedimentload_ls(); + + // Gauges + + String gauge_mnq(); + + String gauge_mq(); + + String gauge_mhq(); + + String gauge_hq5(); + + // Elevation window + + String ele_window_title(); + + String ele_window_label(); + + String ele_window_x_col(); + + String ele_window_y_col(); + + String ele_window_z_col(); + + String ele_window_ok_button(); + + String ele_window_cancel_button(); + + String ele_window_format_error(); + + String ele_window_save_error(); + + String ele_window_geometry_error(); + + // OUTPUT TYPES + + String discharge_curve_gaugeless(); + + String discharge_curve(); + + String gauge_discharge_curve(); + + String computed_discharge_curve(); + + String computed_discharge_curves(); + + String longitudinal_section(); + + String duration_curve(); + + String reference_curve(); + + String reference_curve_normalized(); + + String reference_endpoint(); + + String reference_startpoint(); + + String name(); + + String type(); + + String wq_table_w(); + + String wq_waterlevel_label(); + + String wq_table_q(); + + String wq_value_w(); + + String wq_value_q(); + + String discharge_longitudinal_section(); + + String floodmap(); + + String cross_section(); + + String cross_sections(); + + String w_differences(); + + String historical_discharge(); + + String historical_discharge_wq(); + + String extreme_wq_curve(); + + String showextramark(); + + String fix_wq_curve(); + + String fix_deltawt_curve(); + + String fix_longitudinal_section_curve(); + + String fix_derivate_curve(); + + String fix_vollmer_wq_curve(); + + // EXPORTS + + String waterlevel_export(); + + String waterlevel_report(); + + String computed_dischargecurve_at_export(); + + String discharge_longitudinal_section_export(); + + String discharge_longitudinal_section_report(); + + String computed_dischargecurve_export(); + + String computed_dischargecurve_report(); + + String durationcurve_export(); + + String durationcurve_report(); + + String dataexport(); + + String reference_curve_export(); + + String w_differences_export(); + + String historical_discharge_export(); + + String csv(); + + String wst(); + + String at(); + + String pdf(); + + String chart_themepanel_header_themes(); + + String chart_themepanel_header_actions(); + + String chart_themepanel_synchron(); + + String chart_themepanel_asynchron(); + + String chart_themepanel_set_master(); + + String chart_themepanel_new_area(); + + String chart_themepanel_area_under(); + + String chart_themepanel_area_over(); + + String chart_themepanel_area_between(); + + String against_x_axis(); + + String discharge(); + + String flow_velocity(); + + String flow_velocity_export(); + + String bedheight_middle(); + + String bedheight_middle_export(); + + String bed_longitudinal_section(); + + String bed_longitudinal_section_export(); + + String sq_relation_a(); + + String sq_relation_b(); + + String sq_relation_c(); + + String sq_relation_d(); + + String sq_relation_e(); + + String sq_relation_f(); + + String sq_relation_export(); + + String exportATTooltip(); + + String load_diameter(); + + String bed_diameter(); + + String soundings(); + + String soundings_width(); + + String bed_difference_year(); + + String bed_difference_epoch(); + + String bed_difference_height_year(); + + // ERRORS + + String error_years_wrong(); + + String error_read_minmax_values(); + + String error_validate_range(); + + String error_validate_date_range(); + + String error_validate_date_range_invalid(); + + String error_validate_lower_range(); + + String error_validate_upper_range(); + + String error_create_artifact(); + + String error_describe_artifact(); + + String error_feed_data(); + + String error_advance_artifact(); + + String error_add_artifact(); + + String error_remove_artifact(); + + String error_create_collection(); + + String error_describe_collection(); + + String error_no_rivers_found(); + + String error_no_gaugeoverviewinfo_found(); + + String error_no_such_user(); + + String error_no_users(); + + String error_no_waterlevel_pair_selected(); + + String error_same_waterlevels_in_pair(); + + String error_not_logged_in(); + + String error_load_parameterization(); + + String error_feed_no_data(); + + String error_feed_from_out_of_range(); + + String error_feed_to_out_of_range(); + + String error_feed_from_bigger_to(); + + String error_feed_invalid_wq_mode(); + + String error_feed_number_format_float(); + + String error_feed_invalid_calculation_mode(); + + String error_feed_no_calculation_mode(); + + String error_feed_no_such_river(); + + String error_feed_no_river_selected(); + + String error_feed_no_wq_mode_selected(); + + String error_feed_q_values_invalid(); + + String error_feed_w_values_invalid(); + + String error_no_meta_data_found(); + + String error_chart_info_service(); + + String error_invalid_double_value(); + + String error_load_artifact(); + + String error_no_calc_result(); + + String error_no_theme_styles_found(); + + String error_no_feature_selected(); + + String error_no_map_config(); + + String error_no_map_output_type(); + + String error_no_module_found(); + + String warning_use_first_feature(); + + String warning_select_two_values(); + + String error_no_valid_gfi_url(); + + String error_gfi_req_failed(); + + String error_gfi_parsing_failed(); + + String error_gc_req_failed(); + + String error_gc_doc_not_valid(); + + String error_malformed_url(); + + String error_no_dgm_selected(); + + String error_invalid_dgm_selected(); + + String error_bad_dgm_range(); + + String error_bad_dgm_river(); + + String error_dialog_not_valid(); + + String error_invalid_date(); + + String error_wrong_date(); + + String bottom_edge(); + + String top_edge(); + + String error_same_location(); + + String error_contains_same_location(); + + String error_update_collection_attribute(); + + String error_values_needed(); + + // MAP RELATED STRINGS + + String digitize(); + + String pipe1(); + + String pipe2(); + + String ditch(); + + String dam(); + + String ring_dike(); + + String selectFeature(); + + String removeFeature(); + + String getFeatureInfo(); + + String getFeatureInfoTooltip(); + + String getFeatureInfoWindowTitle(); + + String addWMS(); + + String printMapSettings(); + + String addWMSTooltip(); + + String adjustElevation(); + + String adjustElevationTooltip(); + + String measureLine(); + + String measurePolygon(); + + String step(); + + String calculationStarted(); + + String zoomMaxExtent(); + + String zoomIn(); + + String zoomOut(); + + String zoomLayer(); + + String moveMap(); + + String digitizeObjects(); + + String selectObject(); + + String removeObject(); + + String measureDistance(); + + String measureArea(); + + String map_themepanel_header_style(); + + String zoomToLayer(); + + String requireDGM(); + + String upload_file(); + + String shape_file_upload(); + + // data cage + + String waterlevels(); + + String old_calculations(); + + String officiallines(); + + String datacageAdd(); + + String fixations(); + + String flood_protections(); + + String columns(); + + String basedata(); + + String heightmarks(); + + String annotation(); + + String annotations(); + + String all_annotations(); + + String flowvelocitymeasurement(); + + String bed_quality_bed(); + + String bed_quality_load(); + + String additionals(); + + String differences(); + + String kilometrage(); + + String riveraxis(); + + String km(); + + String qps(); + + String hws(); + + String catchments(); + + String catchment_wms(); + + String floodplain(); + + String lines(); + + String buildings(); + + String fixpoints(); + + String uesk(); + + String calculations(); + + String current(); + + String bfg(); + + String land(); + + String potential(); + + String rastermap(); + + String background(); + + String discharge_tables_chart(); + + String discharge_table_nn(); + + String discharge_table_gauge(); + + String mainvalue(); + + String mainvalues(); + + String wmainvalue(); + + String qmainvalue(); + + String show_mainvalues(); + + String dems(); + + String hydrboundaries(); + + String gaugelocations(); + + String single(); + + String epoch(); + + String bedheights(); + + String morph_width(); + + String datacage(); + + String datacage_add_pair(); + + // Capabilities Information Panel + + String addwmsInputTitle(); + + String addwmsInfoTitle(); + + String addwmsLayerTitle(); + + String addwmsBack(); + + String addwmsContinue(); + + String addwmsCancel(); + + String addwmsInvalidURL(); + + String capabilitiesHint(); + + String capabilitiesTitle(); + + String capabilitiesURL(); + + String capabilitiesAccessConstraints(); + + String capabilitiesFees(); + + String capabilitiesContactInformation(); + + String capabilitiesEmail(); + + String capabilitiesPhone(); + + String chart(); + + String export(); + + String width(); + + String height(); + + String visibility(); + + String upper(); + + String lower(); + + String fixation(); + + String font_size(); + + String label(); + + String subtitle(); + + String display_grid(); + + String display_logo(); + + String logo_placeh(); + + String logo_placev(); + + String top(); + + String bottom(); + + String center(); + + String left(); + + String right(); + + String none(); + + String notselected(); + + String linetype(); + + String textstyle(); + + String linecolor(); + + String showhorizontalline(); + + String showverticalline(); + + String horizontal(); + + String vertical(); + + String textcolor(); + + String textsize(); + + String font(); + + String showborder(); + + String showpoints(); + + String showbackground(); + + String textshowbg(); + + String backgroundcolor(); + + String bandwidthcolor(); + + String textbgcolor(); + + String textorientation(); + + String linesize(); + + String pointsize(); + + String bandwidth(); + + String pointcolor(); + + String showlines(); + + String showlinelabel(); + + String showpointlabel(); + + String labelfontsize(); + + String labelfontcolor(); + + String labelfontface(); + + String labelfontstyle(); + + String labelbgcolor(); + + String labelshowbg(); + + String showwidth(); + + String showlevel(); + + String showminimum(); + + String showmaximum(); + + String transparent(); + + String transparency(); + + String showarea(); + + String showarealabel(); + + String showmiddleheight(); + + String fillcolor(); + + String wsplgen_cat1(); + + String wsplgen_cat2(); + + String wsplgen_cat3(); + + String wsplgen_cat4(); + + String wsplgen_cat5(); + + String areabgcolor(); + + String areashowborder(); + + String areashowbg(); + + String areabordercolor(); + + String areatransparency(); + + String attribution(); + + // Manual Points editor + + String addpoints(); + + String pointname(); + + String removepoint(); + + String newpoint(); + + String standby(); + + String points(); + + String editpoints(); + + // Manual WaterLine (WSP) Editor. + + String addWSPButton(); + + String addWSP(); + + String selection(); + + String fix_deltawt_export(); + + String select(); + + String add_date(); + + String fix_parameters_export(); + + String fix_parameters(); + + String sq_overview(); + + // Gauge Overview Info + + String gauge_zero(); + + String gauge_q_unit(); + + String gauge_info_link(); + + String gauge_river_info_link(); + + String gauge_river_url(); + + String gauge_url(); + + String gauge_curve_link(); + + String gauge_discharge_curve_at_export(); + + // Measurement Station Info + + String measurement_station_type(); + + String measurement_station_operator(); + + String measurement_station_start_time(); + + String measurement_station_url(); + + String measurement_station_info_link(); + + String measurement_station_gauge_name(); + + String discharge_timeranges(); + + String discharge_chart(); + + String projectlist_close(); + + String startcolor(); + + String endcolor(); + + String numclasses(); + + String welcome(); + + String welcome_open_or_create(); + + String official(); + + String inofficial(); + + String custom_lines(); + + String hws_lines(); + + String hws_points(); + + String hws_fed_unknown(); + + String jetties(); + + String route_data(); + + String other(); + + String axis(); + + String bfg_model(); + + String federal(); + + String areas(); + + String sobek_areas(); + + String sobek_flooded(); + + String measurements(); + + String floodmarks(); + + String pegel_had_measurement_points(); + + String gauge_points(); + + String gauge_names(); + + String gauge_level(); + + String gauge_tendency(); + + String printTooltip(); + + String print(); + + String printWindowTitle(); + + String mapfish_data_range(); + + String mapfish_data_subtitle(); + + String mapfish_data_strech(); + + String mapfish_data_institution(); + + String mapfish_data_source(); + + String mapfish_data_creator(); + + String mapfish_data_dateplace(); + + String mapfish_data_river(); + + String mapTitle(); + + String mapSubtitle(); + + String mapRange(); + + String mapStretch(); + + String mapCreator(); + + String mapInstitution(); + + String mapSource(); + + String mapDate(); + + String mapLogo(); + + String wmsURLMenuItem(); + + String wmsURLBoxTitle(); + + String requireTheme(); + + String PATH(); + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,668 @@ +fullname = Flusshydrologische Software +user = User: +guest = guest +logout = Logout +projects = Projects +open_project = Open Project +delete_project = Delete Project +rename_project = Rename Project +clone_project = Clone Project +copy_of = Copy +manage_projects = Manage Projects +favorite_tooltip = Permanently store? +favorite_tooltip_meaning = Golden star: stored +projectlist_creationTime = Creation time +projectlist_title = Title +projectlist_favorite = Permanent +projectlist_close = Close +really_delete = Do you really want to delete this project? +project_name_too_long = The entered project name is too long. Max length is $LEN characters. +switch_language = German +info = Info +warning = Attention +warning_language = Choosing a new language starts a new session. All open windows will be closed. +no_projects = No existing calculations found. +load_projects = Load calculations... +empty_table = Loading data... +empty_filter = No data found. +date_format = yyyy-MM-dd +datetime_format = yyyy-MM-dd HH:mm +new_project = New Project +new_calculation = New Calculation +module_selection = Module +river_selection = Rivers +winfo = W-INFO +minfo = M-INFO +new_map = New Map +map = Map +new_chart = New Chart +diagram = Chart +axes = Axes +legend = Legend +chart_title = Title +chart_subtitle = Subtitle +grid = Grid +antialiasing = Antialiasing +axis_name = Name +chart_start = start +chart_end = end +x_axis = X-Axis +y1_axis = Y1-Axis +y2_axis = Y2-Axis +y3_axis = Y3-Axis +legend_name = Name +show_legend = Show +aggregation_threshold = Threshold for aggregation of legend entries +scale = Scale +databasket = Databasket +databasket_loading = Loading Databasket content +fix = Fixing +fixanalysis = Fixing Analysis +next = Next +location_distance_state = Choose calculation location(s) / range [km] +distance_state = Choose calculation range [km] +waterlevel_ground_state = Choose differences betweeen waterlevel and ground [m] +location = Location(s) +locations = Locations +single_location = Location +distance = Range +unitFrom = km +unitTo = km a +unitWidth = m +search = Search +discharge = Discharge Name +properties = Properties +activateTheme = Activate +deactivateTheme = Deactivate +removeTheme = Remove +manageThemes = Manage themes +label_ok = Ok +label_cancel = Cancel +cancelCalculationLabel = Stop the current calculation. +calculationCanceled = The calculation has been canceled. +range = Range +resultCount = Hits +start_year = Start +end_year = End +period = Period +year = Year +sedimentload_ls = Sediment Load +welcome = Welcome to Flusshydrologische Software +welcome_open_or_create = Please open a project from the project list or create a +# Header images +flysLogo = images/flys_logo.gif +bfgLogo = images/bfg_logo.gif +bfgLogoSmall = images/bfg_logo_small.png + +# Images +downloadPNG = images/png_export.png +downloadPDF = images/pdf_export.png +downloadSVG = images/svg_export.png +downloadCSV = images/save_csv.png +downloadAT = images/save_at.png +downloadWST = images/save_wst.png +loadingImg = images/loading.gif +loadingImg = images/loading.gif +cancelCalculation = images/cancelCalculation.png +markerRed = images/marker_red.png +markerGreen = images/marker_green.png +riverMap = images/FLYS_Karte.png +properties_ico = images/properties.png + +dpLabelFrom = from +dpUnitFrom = km +dpLabelTo = to +dpUnitTo = km +dpLabelStep = a +dpUnitStep = m + +wgLabelFrom = From +wgUnitFrom = m +wgLabelTo = To +wgUnitTo = m +wgLabelStep = a +wgUnitStep = m + +unitFromInM = From [m]: +unitToInM = To [m]: +unitDiffInM = Diff [m]: +unitLocation = km +wrongFormat = Wrong format +atLeastOneValue = You need to insert at least one value. +missingInput = You need to enter a value. +too_many_values = Only one value allowed + +addPointsTooltip = Add manual points +addWSPTooltip = Add manual LS +downloadPNGTooltip = Download chart as PNG +downloadPDFTooltip = Download chart as PDF +downloadSVGTooltip = Download chart as SVG +downloadCSVTooltip = Download data as CSV +zoomToMaxExtentTooltip = Zoom to max extent +zoomOutTooltip = Zoom out +historyBackTooltip = Previous zoom +panControlTooltip = Pan +zoomboxTooltip = Zoombox +chartPropertiesTooltip = Chartproperties +printTooltip = Print + +description = Description +from = From +to = To +riverside = Riverside +bottom_edge = Bottom edge +top_edge = Top edge +name = Name +type = Type +wq_table_w = Characteristic Waterlevels +wq_waterlevel_label = Characteristic Waterlevel +wq_table_q = Characteristic Discharges / Durations +wq_value_w = W [cm at Gauge] +wq_value_q = Q [m\u00b3/s] +river_km = River-Km +uesk_profile_distance = Distance [m] + +wqTitle = Input for W/Q Data +wqadaptedTitle = Input for W/Q Data +wqHistorical = Selection of Analyse Type +calcTableTitle = Values +helperPanelTitle = Input Support +gaugePanelTitle = Gauge Information +measurementStationPanelTitle = Measurement Station Information +wqW = W at Gauge [cm] +wqQ = Q [m\u00b3/s] +wqQatGauge = Q at Gauge [m\u00b3/s] +wqWFree = W free position [m+NHN] +wqQGauge = Discharge at Gauge +wqSingle = Single values +wqRange = Range +unitWNN = W [NN+m] +unitWSingle = cm +unitWFrom = cm - +unitWTo = cm a +unitWStep = cm +unitQSingle = m³/s +unitQFrom = m³/s - +unitQTo = m³/s a +unitQStep = m³/s +main_channel = Main Channel +total_channel = Total Channel +footerHome = Home +footerContact = Contact +footerImpressum = Legal info +print = Print +printWindowTitle = PDF-Print Settings + +projectListMin = format-indent-less.png +projectListAdd = list-add.png +buttonNext = Next +imageBack = images/back_en.png +imageSave = images/save.png +theme_top = images/go-first.png +theme_up = images/go-up.png +theme_down = images/go-down.png +theme_bottom = images/go-bottom.png +zoom_all = images/mag_100.png +zoom_in = images/mag_zoom_box.png +zoom_out = images/mag_zoom_minus.png +zoom_back = images/mag_zoom_back.png +pan = images/hand.png +askThemeRemove = Are you sure that you want to remove the selected theme / themes? +add = Add + +static_sqrelation = SQ relation +discharge_curve = Discharge Curve at Gauge +discharge_curve_gaugeless = Discharge Curve +gauge_discharge_curve = Discharge Table at Gauge +computed_discharge_curve = Discharge Curve +computed_discharge_curves = Discharge Curves +longitudinal_section = Longitudinal Section Curve +duration_curve = Duration Curve +discharge_longitudinal_section = Discharge Longitudinal Section +floodmap = Floodmap +historical_discharge = Time-Chart +historical_discharge_wq = W/Q-Chart +flow_velocity = Flow Velocity +flow_velocity_export = Flow Velocity Export +bedheight_middle = Middle Bed Height +bedheight_middle_export = Middle Bed Height Export +bed_longitudinal_section = Bed Quality +bed_longitudinal_section_export = Bed Quality Export +sq_relation_a = A Feinkornanteil +sq_relation_b = B Sand (Suspensionstransport) +sq_relation_c = C Sand (Geschiebetransport) +sq_relation_d = D Fein- und Mittelkies +sq_relation_e = E Grobkornanteil (> Mittelkies) +sq_relation_f = F Geschiebetransport Gesamt +sq_relation_export = SQ Export +cross_section = Cross Section +cross_sections = Cross Sections +w_differences = Differences +w_differences_export = Differences Export +reference_curve_export = Reference Curve Export +historical_discharge_export = Historical Discharge Curve Export +showextramark = Show begin of extrapolation +extreme_wq_curve = W/Q +fix_wq_curve = W/Q-Diagram +fix_deltawt_curve = \u0394 W/t +fix_longitudinal_section_curve = Longitudinal Section +fix_derivate_curve = Derivate +fix_vollmer_wq_curve = W/Q-Diagram +datacage_add_pair = Add difference pair +load_diameter = Bedload Diameter +bed_diameter = Bed Diameter +soundings = Soundings +soundings_width = Soundings Width +bed_difference_year = Single Bedheight Differences +bed_difference_epoch = Epoch Bedheight Differences +bed_difference_height_year = Bedheight Differences per year + +exportATTooltip = Export as AT file + +waterlevel_export = Waterlevel Export +waterlevel_report = Waterlevel Report +computed_dischargecurve_export = Discharge Curve Export +computed_dischargecurve_report = Discharge Curve Report +discharge_longitudinal_section_export = Discharge Longitudinal Section Export +discharge_longitudinal_section_report = Discharge Longitudinal Section Report +durationcurve_export = Duration Curve Export +durationcurve_report = Duration Curve Report +dataexport = Data export +csv = CSV +wst = WST +at = AT +pdf = PDF +computed_dischargecurve_at_export = AT Export +gauge_discharge_curve_at_export = Gauge Discharge Curve +gauge_class = Gauge Class +eventselect = Eventselection +events = Events +kmchart = W/Q-Preview + +chart_themepanel_header_themes = Theme +chart_themepanel_header_actions = Actions +chart_themepanel_synchron = Navigate synchronously +chart_themepanel_asynchron = Navigate independently +chart_themepanel_set_master = Reference +chart_themepanel_new_area = New Area... +chart_themepanel_area_under = under ... +chart_themepanel_area_over = over ... +chart_themepanel_area_between = between ... +against_x_axis = Over X-Axis + +gauge_mnq = around MNQ +gauge_mq = around MQ +gauge_mhq = around MHQ +gauge_hq5 = above HQ5 + +ele_window_title = Elevation Node +ele_window_label = Elevation settings in m \u00fc. NN. +ele_window_x_col = X +ele_window_y_col = Y +ele_window_z_col = Z-Coordinate +ele_window_ok_button = Set elevations +ele_window_cancel_button = Cancel +ele_window_format_error = The elevation you have entered is invalid: +ele_window_save_error = Error while saving elevations. +ele_window_geometry_error = The geometry is not supported: + +unexpected_exception = There occured an unexpected exception +error_years_wrong = The second year needs to be bigger than the first year. +error_read_minmax_values = Error while reading min/max values for the location input. +error_validate_range = The value $1 needs to be smaller than $3 and bigger than $2. +error_validate_date_range = Start date needs to be before end date. +error_validate_date_range_invalid = The specified timerange is invalid. +error_validate_lower_range = The lower value $1 needs to be bigger than $2. +error_validate_upper_range = The upper value $1 needs to be smaller than $2. +error_empty_state = Required inputs are missing. +error_invalid_double_value = Wrong format for a floating point number. +error_create_artifact = Error while creating new project. +error_describe_artifact = Error while loading the parameterization. +error_feed_data = Error while inserting new data. +error_advance_artifact = Error while changing the project's state. +error_add_artifact = Error while inserting new data. +error_remove_artifact = Error while removing data. +error_create_collection = Error while creating a new collection. +error_describe_collection = Error while fetching the projects state. +error_no_rivers_found = Error while reading supported rivers. +error_no_such_user = Error - no such user found. +error_no_users = Error - no users found. +error_no_waterlevel_pair_selected = Error - no waterlevel pair for building differences selected. +error_same_waterlevels_in_pair = Error - minuend and subtrahend have to differ. +error_not_logged_in = You need to log in before you are allowed to start your work. +error_load_parameterization = Could not load the parameterization. +error_wrong_date = Please enter valid dates. +error_no_gaugeoverviewinfo_found = Error while fetching the river and gauge info + +error_feed_no_data = No input data found. +error_feed_from_out_of_range = The lower value is bigger than the upper value. +error_feed_to_out_of_range = The upper value is out or the valid range. +error_feed_from_bigger_to = The lower value is bigger than the upper value. +error_feed_invalid_wq_mode = Invalid WQ-Mode selected. +error_feed_number_format_float = The inserted value is no floating point number. +error_feed_invalid_calculation_mode = The chosen calculation method is invalid. +error_feed_no_calculation_mode = No calculation method chosen. +error_feed_no_such_river = The selected river is not provided. +error_feed_no_river_selected = No river selected. +error_feed_no_wq_mode_selected = No W/Q mode selected. +error_feed_q_values_invalid = Selected Q values are outside the valid range. +error_feed_w_values_invalid = Selected W values are outside the valid range. +error_chart_info_service = Could not fetch meta information of the chart. +error_no_meta_data_found = No meta data found. +error_load_artifact = Error while adding data to the current project. +error_no_calc_result=No calculation results found. +error_no_theme_styles_found=No style for the selected theme found. +error_no_feature_selected = No object selected. +error_no_map_config = No Map configuration found. +error_no_map_output_type = No Map output found. +error_no_valid_gfi_url = No valid GetFeatureInfo response found. +error_gfi_req_failed = GetFeatureInfo request failed. +error_gfi_parsing_failed = Failed to read GetFeatureInfo response. +error_gc_req_failed = Error while loading Capabilities document. +error_gc_doc_not_valid = Capabilities document is not valid. +error_malformed_url = The URL you have entered is not valid. +error_no_dgm_selected = No DEM selected. +error_invalid_dgm_selected = You have selected an invalid DEM. +error_bad_dgm_range = You have selected a DEM with an invalid range. +error_bad_dgm_river = You have selected a DEM for a wrong river. +error_dialog_not_valid = One or more values are not valid. +error_invalid_date = The entered date is not valid. +error_same_location = Reference location equals selected location. +error_contains_same_location = Target locations contains reference location. +error_update_collection_attribute = Error while updating the collection attribut +error_values_needed = You must provide values. +error_no_module_found = No modules found + +warning_use_first_feature = You have more that one object selected. The first one is used. +warning_no_wsp_selected = No waterlevel selected! +warning_cannot_parse_date = Invalid date! +warning_select_two_values = Please select two values! + +## map related strings +digitize = images/digitize.png +pipe1 = Pipe1 +pipe2 = Pipe12 +ditch = Ditch +dam = Dam +ring_dike = Ringdike +selectFeature = images/selectFeature.png +removeFeature = images/removeFeature.png +getFeatureInfo = images/info.png +getFeatureInfoTooltip = Information Tool +getFeatureInfoWindowTitle = Information for Map Layer: +addWMS = images/add_map.png +printMapSettings = images/print_map_settings.png +addWMSTooltip = Load layers from external WMS service. +adjustElevation = images/adjustElevation.png +measureLine = images/measure_line.png +measurePolygon = images/measure_plane.png +step = Step +calculationStarted = Calculation started. +zoomMaxExtent = Max extent +zoomIn = Zoom in +zoomOut = Zoom out +zoomLayer = Zoom to layer +moveMap = Move +digitizeObjects = Creation of pipes, ditches, dams and ringdikes +selectObject = Select tool +removeObject = Remove selected object +adjustElevationTooltip = Define elevations for barriers +measureDistance = Measure line +measureArea = Measure area +map_themepanel_header_style = Style +zoomToLayer = Layer-Zoom +requireDGM = You need to choose a DEM. +upload_file = upload +shape_file_upload = Upload shapefile + +# data cage +waterlevels = Waterlevels +old_calculations = Former Calculations +officiallines = Official lines +datacageAdd = Add data +heightmarks = Height Marks +basedata = Base Data +fixations = Fixations +flood_protections = Flood Protections +columns = Columns +annotation = Annotations +annotations = Annotations +all_annotations = All annotations +flowvelocitymeasurement = Flowvelocity measurements +bed_quality_bed = Quality - Bed +bed_quality_load = Quality - Load +additionals = Additional Longitudinal Section Curves +differences = Differences +kilometrage = Kilometrage +riveraxis = Riveraxis +km = Km +qps = Crosssection Tracks +hws = Floodplain Protection Work +catchments = Catchments +catchment_wms = Catchments (WMS) +floodplain = Floodplain +lines = Lines +buildings = Buildings +fixpoints = Fixpoints +uesk = Floodmaps +calculations = Calculations +current = Current +potential = Potential +bfg = BfG +land = Land +rastermap = Rastermap +background = Background Map +discharge_tables_chart = W/Q-Preview +discharge_table_nn = Discharge Tables at Gauge +discharge_table_gauge = Discharge Table at Gauge +mainvalue = Mainvalue +mainvalues = Mainvalues +wmainvalue = Mainvalues (W) +qmainvalue = Mainvalues (Q) +show_mainvalues = Show Mainvalues +dems = Digital Elevation Models +hydrboundaries = Hydrological Boundaries +gaugelocations = Location of Gauges +single = Year +epoch = Epoch +bedheights = Bedheights +morph_width = morphologic Width +datacage = Datacage +official = Offical +inofficial = Inofficiall +custom_lines = Own Digitalizations +hws_lines = Lines +hws_points = Points +hws_fed_unknown = Unknown State +jetties = Jetties +route_data = Route Data +other = Other +axis = Axis +bfg_model = BfG-Model +federal = Federal States +areas = Areas +sobek_flooded = SOBEK-Boundary flooded / not flooded +sobek_areas = SOBEK-Areas +measurements = Measurements +floodmarks = Flood Marks +pegel_had_measurement_points = HAD Discharge-Measurement points +# No translation for the pegelonline wms service layer names. +gauge_points = Pegelpunkte (WSV) +gauge_level = Aktueller Wasserstand (WSV) +gauge_names = Pegelnamen (WSV) +gauge_tendency = Tendenz des Wasserstands (WSV) + +startcolor = Colorrange start color +endcolor = Colorrange end color +numclasses = Number of classes + +# capabilities information panel +addwmsInputTitle = Base URL of WMS service +addwmsInfoTitle = Information about WMS service +addwmsLayerTitle = Choose Layer +addwmsBack = Back +addwmsContinue = Continue +addwmsCancel = Cancel +addwmsInvalidURL = The URL is not valid. +capabilitiesHint = Please notice the information of the WMS service. +capabilitiesTitle = Title +capabilitiesURL = URL +capabilitiesAccessConstraints = Access Constraints +capabilitiesFees = Fees +capabilitiesContactInformation = Further Information +capabilitiesEmail = Email +capabilitiesPhone = Phone + +#Properties dialog +chart = Chart +export = Export +width = Width +height = Height +visibility = Visibility +upper = to +lower = from +fixation = Fix +font_size = Fontsize +label = Title +title = Title +subtitle = Subtitle +display_grid = Display grid +display_logo = Display logo +logo_placeh = Horiz. Place for logo +logo_placev = Vertic. Place for logo +top = top +bottom = bottom +center = center +left = left +right = right +none = none + +notselected = none + +linetype = Linetype +textstyle = Textstyle +linecolor = Linecolor +showhorizontalline = Show horizonal line +showverticalline = Show vertical line +textcolor = Textcolor +textsize = Textsize +font = Font +showpoints = Show points +showbackground = Show background +textshowbg = Show background +backgroundcolor = Backgroundcolor +bandwidthcolor = Bandwidthcolor +textbgcolor = Backgroundcolor +textorientation = Textorientation +linesize = Linesize +pointsize = Pointsize +bandwidth = Bandwidth +pointcolor = Punktfarbe +showlines = Show lines +showlinelabel = Show line label +showpointlabel = Show point label +labelfontface = Label: Font +labelfontcolor = Label: Color +labelfontsize = Label: Size +labelfontstyle = Label: Style +labelbgcolor = Label: Background Color +labelshowbg = Label: Show Background +horizontal = horizontal +vertical = vertical +showwidth = Show width +showlevel = Show waterlevel +showminimum = Show minimum +showmaximum = Show maximum +showborder = Show line +transparent = Transparency +transparency = Transparency +showarea = Show area +showarealabel = Show area label +showmiddleheight = Show middle depth +fillcolor = Fill Color +areabgcolor = Fill Color +areashowborder = Show area border +areashowbg = Show area background +areabordercolor = Border color +areatransparency = Tranparency +wsplgen_cat1 = Fill Color 0.0 <= DIFF < 1 +wsplgen_cat2 = Fill Color 1.0 <= DIFF < 2 +wsplgen_cat3 = Fill Color 2.0 <= DIFF < 3 +wsplgen_cat4 = Fill Color 3.0 <= DIFF < 4 +wsplgen_cat5 = Fill Color 4.0 <= DIFF +attribution = ©Intevation GmbH 2013
    Data ©OpenStreetMap +wmsURLMenuItem = WMS URL +wmsURLBoxTitle = Layer WMS URL +requireTheme = You need to choose a Layer. + +# Manual Points Editor +addpoints = Add points +pointname = Name +removepoint = Remove +newpoint = New Point +standby = Creating Artifact ... please wait. +points = Points +editpoints = Edit Points +addWSPButton = Add Manual LS +addWSP = Add Manual LS +selection = Selection + +# Reference Curves +reference_curve = Reference Curve +reference_curve_normalized = Reduced Reference Curve +reference_startpoint = Point of reference +reference_endpoint = Point(s) of projection + +fix_deltawt_export = \u0394 W/t +select=Selected +add_date=Add + +fix_parameters_export = Adjusted coefficient +fix_parameters = CSV + +sq_overview=Overview + +gauge_zero = GZG +gauge_q_unit = m\u00b3/s +gauge_river_info_link = Riverinfo +gauge_info_link = Gaugeinfo +gauge_url = https://flys-intern.intevation.de/PegelInfo/ +gauge_river_url = https://flys-intern.intevation.de/GewaesserInfo/ +gauge_curve_link = Dischargecurve/-table +discharge_timeranges = DC-Timeranges +discharge_chart = W/Q-Preview + +measurement_station_type = Type of Measurement Station +measurement_station_operator = Operator +measurement_station_start_time = Observation Start Time +measurement_station_url = https://flys-intern.intevation.de/MessstellenInfo/ +measurement_station_info_link = Measurement Station Info +measurement_station_gauge_name = Reference Gauge + +# The prefix is used to classify them and will be stripped +# If the payload part sarts with a number it will be sorted +# By this number and the number will be stripped. +# Number must be a single digit 0-9. This hack was made necessary +# by the usage of an attribute table in mapfish + +mapfish_data_range = mapfish_data_3Range +mapfish_data_subtitle = mapfish_data_0Subtitle +mapfish_data_strech = mapfish_data_2Stretch +mapfish_data_institution = mapfish_data_5Institution +mapfish_data_source = mapfish_data_6Source +mapfish_data_creator = mapfish_data_5Creator +mapfish_data_dateplace = mapfish_data_7Place, Date +mapfish_data_river = mapfish_data_1River + +mapTitle = Title +mapSubtitle = Subtitle +mapRange = Range +mapStretch = Stretch +mapCreator = Creator +mapInstitution = Institution +mapSource = Source +mapDate = Place, Date +mapLogo = Logo + +# Get Feature Info Window +PATH = Path diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,667 @@ +fullname = Flusshydrologische Software +user = Benutzer: +guest = Gast +logout = Abmelden +projects = Projekte +open_project = Projekt \u00f6ffnen +delete_project = Projekt l\u00f6schen +rename_project = Projekt umbenennen +clone_project = Projekt duplizieren +copy_of = Kopie +manage_projects = Projekte verwalten +favorite_tooltip = Dauerhaft speichern? +favorite_tooltip_meaning = Goldener Stern: gespeichert +projectlist_creationTime = Anlegezeitpunkt +projectlist_title = Titel +projectlist_favorite = Dauerhaft +projectlist_close = Schlie\u1E9Een +really_delete = Wollen Sie dieses Projekt wirklich l\u00f6schen? +project_name_too_long = Der eingegebene Projektname ist zu lang. Die maximale L\u00e4nge betr\u00e4gt $LEN Zeichen. +switch_language = Englisch +info = Info +warning = Achtung +warning_language = Das \u00c4ndern der Sprache startet eine neue Sitzung des Programms. Alle offenen Fenster werden geschlossen. +no_projects = Keine alten Berechnungen gefunden. +load_projects = Lade Berechnungen... +empty_table = Lade Daten... +empty_filter = Keine Daten gefunden. +date_format = dd.MM.yyyy +datetime_format = dd.MM.yyyy HH:mm +new_project = Neues Projekt +new_calculation = Neue Berechnung +module_selection = Modul +river_selection = Gew\u00e4sser +winfo = W-INFO +minfo = M-INFO +map = Karte +new_map = Neue Karte +new_chart = Neues Diagramm +diagram = Diagramm +axes = Achsen +legend = Legende +chart_title = Titel +chart_subtitle = Untertitel +grid = Gitternetz +antialiasing = Kantengl\u00e4ttung +axis_name = Name +chart_start = von +chart_end = bis +x_axis = X-Achse +y1_axis = Y1-Achse +y2_axis = Y2-Achse +y3_axis = Y3-Achse +legend_name = Name +show_legend = Anzeigen +aggregation_threshold = Schwellwert zur Aggregation von Legendeneintr\u00e4gen +scale = Skalierung +databasket = Datenkorb +databasket_loading=Lade Datenkorb Inhalt +fix = Fixierungsanalyse +fixanalysis = Fixierungsanalyse +next = Weiter +location_distance_state = Berechnungsort(e) / strecke w\u00e4hlen [km] +distance_state = Berechnungsstrecke w\u00e4hlen [km] +waterlevel_ground_state = Differenzen zwischen Wasserspiegel und Gel\u00e4nde [m] +location = Ort(e) +locations = Orte +single_location = Ort +distance = Strecke +unitFrom = km - +unitTo = km a +unitWidth = m +search = Suchbegriff +discharge = Kennzeichnender Abfluss +properties = Eigenschaften +activateTheme = Aktivieren +deactivateTheme = Deaktivieren +removeTheme = Entfernen +manageThemes = Themen verwalten +label_ok = Ok +label_cancel = Abbrechen +cancelCalculationLabel = Aktuelle Berechnung abbrechen. +calculationCanceled = Die Berechnung wurde abgebrochen. +range = Bereich +resultCount = Treffer +start_year = Start +end_year = Ende +period = Zeitraum +year = Jahr +sedimentload_ls = Sediment Fracht +welcome = Willkommen bei der Flusshydrologischen Software +welcome_open_or_create = Bitte \u00f6ffnen Sie ein bestehendes Projekt aus der Projektliste oder erstellen Sie ein + +# Header images +flysLogo = images/flys_logo.gif +bfgLogo = images/bfg_logo.gif +bfgLogoSmall = images/bfg_logo_small.png + +# Images +downloadPNG = images/png_export.png +downloadPDF = images/pdf_export.png +downloadSVG = images/svg_export.png +downloadCSV = images/save_csv.png +downloadAT = images/save_at.png +downloadWST = images/save_wst.png +loadingImg = images/loading.gif +cancelCalculation = images/cancelCalculation.png +markerRed = images/marker_red.png +markerGreen = images/marker_green.png +riverMap = images/FLYS_Karte.png +properties_ico = images/properties.png + +dpLabelFrom = von +dpUnitFrom = km +dpLabelTo = bis +dpUnitTo = km +dpLabelStep = a +dpUnitStep = m + +wgLabelFrom = Von +wgUnitFrom = m +wgLabelTo = Bis +wgUnitTo = m +wgLabelStep = a +wgUnitStep = m + +unitFromInM = Von [m]: +unitToInM = Bis [m]: +unitDiffInM = Diff [m]: +unitLocation = km +wrongFormat = Falsches Format +atLeastOneValue = Sie m\u00fcssen mindestens einen Wert eingeben. +missingInput = Sie m\u00fcssen einen Wert eingeben. +too_many_values = Nur ein Eingabewert erlaubt + +description = Beschreibung +from = von +to = bis +bottom_edge = Unterkante +top_edge = Oberkante +riverside = Flussseite +name = Name +type = Typ +wq_waterlevel_label = Kennzeichnender Wassterstand +wq_table_w = Kennzeichnende Wasserst\u00e4nde +wq_table_q = Kennzeichnende Abfl\u00fcsse / Dauerzahlen +wq_value_w = W [cm am Pegel] +wq_value_q = Q [m\u00b3/s] +river_km = Fluss-Km +uesk_profile_distance = Abstand [m] + +wqTitle = Eingabe f\u00fcr W/Q Daten +wqadaptedTitle = Eingabe f\u00fcr W/Q Daten +wqHistorical = Auswahl der Analyseart +calcTableTitle = Ergebnisausgabe +helperPanelTitle = Eingabeunterst\u00fctzung +gaugePanelTitle = Gew\u00e4sser/Pegel-Info +measurementStationPanelTitle = Gew\u00e4sser/Messstellen-Info +wqW = W am Pegel [cm] +wqQ = Q [m\u00b3/s] +wqQatGauge = Q am Pegel [m\u00b3/s] +wqWFree = W auf freier Strecke [m+NHN] +wqQGauge = Kennzeichnender Abfluss am Pegel +wqSingle = Einzelwerte +wqRange = Wertebereich +unitWNN = W [NN+m] +unitWSingle = cm +unitWFrom = cm - +unitWTo = cm a +unitWStep = cm +unitQSingle = m\u00b3/s +unitQFrom = m\u00b3/s - +unitQTo = m\u00b3/s a +unitQStep = m\u00b3/s +main_channel = Hauptgerinne +total_channel = Gesamtgerinne +footerHome = Home +footerContact = Kontakt +footerImpressum = Impressum +print = Drucken +printWindowTitle = PDF-Druckeinstellungen + +projectListMin = format-indent-less.png +projectListAdd = list-add.png +buttonNext = \u00dcbernehmen +imageBack = images/back_de.png +imageSave = images/save.png +theme_top = images/go-first.png +theme_up = images/go-up.png +theme_down = images/go-down.png +theme_bottom = images/go-bottom.png +zoom_all = images/mag_100.png +zoom_in = images/mag_zoom_box.png +zoom_out = images/mag_zoom_minus.png +zoom_back = images/mag_zoom_back.png +pan = images/hand.png +askThemeRemove = Sind Sie sicher, dass sie die gew\u00e4hlten / das gew\u00e4lte Thema l\u00f6eschen wollen? +add = Hinzuf\u00fcgen + +addPointsTooltip = Manuelle Punkte hinzuf\u00fcgen +addWSPTooltip = Manuelle WSP hinzuf\u00fcgen +downloadPNGTooltip = Diagramm als PNG herunterladen +downloadPDFTooltip = Diagramm als PDF herunterladen +downloadSVGTooltip = Diagramm als SVG herunterladen +downloadCSVTooltip = Daten als CSV herunterladen +zoomToMaxExtentTooltip = Auf maximale Ausdehnung zoomen +zoomOutTooltip = Herauszoomen +historyBackTooltip = Voriger Zoom +panControlTooltip = Verschieben +zoomboxTooltip = Ausschnitt vergr\u00f6\u00dfern +chartPropertiesTooltip = Diagrammeigenschaften +printTooltip = Drucken + +static_sqrelation = Transport-Abfluss Beziehung +discharge_curve = Abflusskurve am Pegel +discharge_curve_gaugeless = Abflusskurve +gauge_discharge_curve = Abflusstafel am Pegel +computed_discharge_curve = Abflusskurve +computed_discharge_curves = Abflusskurven +longitudinal_section = L\u00e4ngsschnitt +duration_curve = Dauerlinie +discharge_longitudinal_section = W f\u00fcr benutzerdefinierten Abflussl\u00e4ngsschnitt +floodmap = \u00dcberschwemmungsfl\u00e4che +historical_discharge = Zeit-Diagramm +historical_discharge_wq = W/Q-Diagramm +flow_velocity = Flie\u00dfgeschwindigkeiten +flow_velocity_export = Flie\u00dfgeschwindigkeiten Export +bedheight_middle = Mittlere Sohlh\u00f6he +bedheight_middle_export = Mittlere Sohlh\u00f6he Export +bed_longitudinal_section = Sohlbeschaffenheit +bed_longitudinal_section_export = Sohlbeschaffenheit Export +sq_relation_a = A Feinkornanteil +sq_relation_b = B Sand (Suspensionstransport) +sq_relation_c = C Sand (Geschiebetransport) +sq_relation_d = D Fein- und Mittelkies +sq_relation_e = E Grobkornanteil (> Mittelkies) +sq_relation_f = F Geschiebetransport Gesamt +sq_relation_export = SQ Export +cross_section = Querprofil +cross_sections = Querprofile +w_differences = Differenzen +w_differences_export = Differenzen Export +reference_curve_export = Bezugslinien Export +historical_discharge_export = Historische Abflusskurven Export +showextramark = Zeige Anfang der Extrapolation +extreme_wq_curve = W/Q +fix_wq_curve = W/Q-Diagramm +fix_deltawt_curve = \u0394 W/t +fix_longitudinal_section_curve = L\u00e4ngsschnitt +fix_derivate_curve = Ableitungskurve +fix_vollmer_wq_curve = W/Q-Diagramm +datacage_add_pair = Differenzenpaar hinzuf\u00fcgen +load_diameter = Geschiebedurchmesser +bed_diameter = Sohldurchmesser +soundings = Peilungen +soundings_width = Gepeilte Breite +bed_difference_year = Sohlh\u00f6hendifferenz (Jahr) +bed_difference_epoch = Sohlh\u00f6hendifferenz (Epoche) +bed_difference_height_year = Sohlh\u00f6hendifferenz pro Jahr + +waterlevel_export = Wasserstand/Wasserspiegellagen Export +waterlevel_report = Wasserstand/Wasserspiegellagen Bericht +computed_dischargecurve_export = Abflusskurven Export +computed_dischargecurve_report = Abflusskurven Bericht +discharge_longitudinal_section_export = Abflussl\u00e4ngsschnitt Export +discharge_longitudinal_section_report = Abflussl\u00e4ngsschnitt Bericht +durationcurve_export = Dauerzahlen Export +durationcurve_report = Dauerzahlen Bereicht +dataexport = Datenexport +csv = CSV +wst = WST +at = AT +pdf = PDF +computed_dischargecurve_at_export = AT Export +gauge_discharge_curve_at_export = Abflusskurve am Pegel +gauge_class = Abflussklasse +eventselect = Ereignisauswahl +events = Ereignisse +kmchart = W/Q-Vorschau + +exportATTooltip = Daten als AT Datei exportieren + +chart_themepanel_header_themes = Thema +chart_themepanel_header_actions = Aktionen +chart_themepanel_synchron = Synchron navigieren +chart_themepanel_asynchron = Einzeln navigieren +chart_themepanel_set_master = Referenz +chart_themepanel_new_area = Erzeuge Fl\u00e4che ... +chart_themepanel_area_under = unter ... +chart_themepanel_area_over = \u00fcber ... +chart_themepanel_area_between = zwischen ... +against_x_axis = \u00fcber X-Achse + +gauge_mnq = um MNQ +gauge_mq = um MQ +gauge_mhq = um MHQ +gauge_hq5 = \u00fcber HQ5 + +ele_window_title = H\u00f6henknoten setzen +ele_window_label = H\u00f6henangaben in m \u00fc. NN. +ele_window_x_col = X +ele_window_y_col = Y +ele_window_z_col = Z-Koordinate +ele_window_ok_button = H\u00f6he setzen +ele_window_cancel_button = Abbrechen +ele_window_format_error = Die von Ihnen eigegebene H\u00f6he ist ung\u00fcltig: +ele_window_save_error = Fehler beim Speichern der H\u00f6hen. +ele_window_geometry_error = Die Geometrie wird nicht unterst\u00fctzt: + +unexpected_exception = Ein unerwarteter Fehler ist aufgetreten +error_years_wrong = Das zweite Jahr muss gr\u00f6\u00dfer als das erste sein. +error_read_minmax_values = Fehler beim Lesen der min/max Werte. Es kann keine Validierung der eingegebenen Strecke durchgef\u00fchrt werden. +error_validate_range = Der Wert $1 muss kleiner als $3 und gr\u00f6\u00dfer als $2 sein. +error_validate_date_range = Anfangsdatum muss fr\u00fcher sein als Enddatum. +error_validate_date_range_invalid = Der eingegebene Zeitbereich ist ung\u00fcltig. +error_validate_lower_range = Der untere Wert $1 muss gr\u00f6\u00dfer sein als $2. +error_validate_upper_range = Der obere Wert $1 muss kleiner sein als $2. +error_empty_state = Es wurden nicht alle ben\u00d6tigten Daten eingegeben. +error_invalid_double_value = Falsches Format f\u00fc eine Flie\u00dfkommazahl. +error_create_artifact = Fehler beim Erstellen eines neuen Projekts. +error_describe_artifact = Fehler beim Laden der Parametrisierung. +error_feed_data = Fehler beim Hinzuf\u00fcgen neuer Daten. +error_advance_artifact = Fehler beim Wechseln des Zustands des Projektes. +error_add_artifact = Fehler beim Hinzuf\u00fcgen einer Parametrisierung. +error_remove_artifact = Fehler beim Entfernen einer Parametrisierung. +error_create_collection = Fehler beim Erstellen eines neuen Projektes. +error_describe_collection = Fehler beim Laden des Projektzustandes. +error_no_rivers_found = Fehler beim Lesen der unterst\u00fctzten Fl\u00fcsse. +error_no_such_user = Fehler - Kein solcher Benutzer vorhanden. +error_no_users = Fehler - Keine Benutzer vorhanden. +error_no_waterlevel_pair_selected = Fehler - kein Paar zur Differenzenbildung gew\u00e4hlt. +error_same_waterlevels_in_pair = Error - minuend and subtrahend m\u00fcssen sich unterscheiden. +error_not_logged_in = Sie m\u00fcssen sich erst einloggen um mit der Arbeit beginnen zu k\u00f6nnen. +error_load_parameterization = Fehler beim Laden der Parametrisierung. +error_wrong_date = Bitte geben Sie gültige Daten ein. +error_no_gaugeoverviewinfo_found = Fehler beim Laden der Fluss- und Pegelinformationen + +error_feed_no_data = Keine Eingabedaten gefunden. +error_feed_from_out_of_range = Der untere Wert liegt au\u00dferhalb des g\u00fcltigen Wertebereiches. +error_feed_to_out_of_range = Der obere Wert liegt au\u00dferhalb des g\u00fcltigen Wertebereiches. +error_feed_from_bigger_to = Der untere Wert ist gr\u00f6\u00dfer als der obere Wert. +error_feed_invalid_wq_mode = Ung\u00fcltiger Modus f\u00fcr die WQ-Eingabe gew\u00e4hlt. +error_feed_number_format_float = Der eingegebene Wert ist keine Flie\u00dfkommazahl. +error_feed_invalid_calculation_mode = Die gew\u00e4hlte Berechnungsart ist ung\u00fcltig. +error_feed_no_calculation_mode = Es ist keine Berechnungsart gew\u00e4hlt. +error_feed_no_such_river = Der gew\u00e4hlte Fluss wird nicht unterst\u00fctzt. +error_feed_no_river_selected = Es wurde kein Fluss gew\u00e4hlt. +error_feed_no_wq_mode_selected = Es ist kein W/Q Modus gew\u00e4hlt. +error_feed_q_values_invalid = Die gew\u00e4hlten Q Werte liegen au\u00dferhalb des g\u00fcltigen Bereiches. +error_feed_w_values_invalid = Die gew\u00e4hlten W Werte liegen au\u00dferhalb des g\u00fcltigen Bereiches. +error_chart_info_service = Meta Informationen des Diagramms konnten nicht geladen werden. +error_no_meta_data_found = Keine Meta-Daten gefunden. +error_load_artifact = Fehler beim Hinzu\u00fcgen neuer Daten in das aktuelle Projekt. +error_no_calc_result=Es wurden keine Berechnungsergebnisse gefunden. +error_no_theme_styles_found=Es konnten keine Stile f\u00fcr das gew\u00e4hlte Thema gefunden werden. +error_no_feature_selected = Kein Objekt ausgew\u00e4hlt. +error_no_map_config = Es konnte keine Kartenkonfiguration gefunden werden. +error_no_map_output_type = Es konnte kein Ausgabemodus f\u00fcr Karten gefunden werden. +error_no_valid_gfi_url = Ung\u00fcltige GetFeatureInfo URL. +error_gfi_req_failed = Die GetFeatureInfo Anfrage ist fehlgeschlagen. +error_gfi_parsing_failed = Fehler beim Lesen der GetFeatureInfo Antwort. +error_gc_req_failed = Fehler beim Laden des Capabilities Dokuments. +error_gc_doc_not_valid = Das Capabilities Dokument ist nicht valide. +error_malformed_url = Die eingegebene URL ist ung\u00fcltig. +error_no_dgm_selected = Sie haben kein DGM gew\u00e4hlt. +error_invalid_dgm_selected = Sie haben ein falsches DGM gew\u00e4hlt. +error_bad_dgm_range = Das gew\u00e4hlte DGM passt nicht zur gew\u00e4hlten Berechnungsstrecke. +error_bad_dgm_river = Das gew\u00e4hlte DGM passt nicht zum gew\u00e4hlten Fluss. +error_dialog_not_valid = Eine oder mehrere Daten sind nicht korrekt. +error_invalid_date = Das eingegebene Datum ist nicht korrekt. +error_same_location = Der gew\u00e4hlte Ort ist der Bezugsort. +error_contains_same_location = Zielorte beinhalten den Bezugsort. +error_update_collection_attribute = Fehler beim Aktualisieren des Collection-Attributs. +error_values_needed = Es muss mindestens ein Wert selektiert sein. +error_no_module_found = Keine nutzbaren Module gefunden. + +warning_use_first_feature = Sie haben mehr als ein Objekt ausgew\u00e4hlt. Das erste Objekt wird benutzt. +warning_no_wsp_selected = Kein Wasserstand ausgew\u00e4hlt! +warning_cannot_parse_date = Datum ist ung\u00fcltig! +warning_select_two_values = Bitte zwei Werte w\u00e4hlen! + +## map related strings +digitize = images/digitize.png +pipe1 = Rohr1 +pipe2 = Rohr2 +ditch = Graben +dam = Damm +ring_dike = Ringdeich +selectFeature = images/selectFeature.png +removeFeature = images/removeFeature.png +getFeatureInfo = images/info.png +getFeatureInfoTooltip = Informationswerkzeug +getFeatureInfoWindowTitle = Information zur Kartenebene: +addWMS = images/add_map.png +printMapSettings = images/print_map_settings.png +addWMSTooltip = Laden von Kartenebenen eines externen WMS Dienstes. +adjustElevation = images/adjustElevation.png +measureLine = images/measure_line.png +measurePolygon = images/measure_plane.png +step = Schritt +calculationStarted = Berechnung wurde gestarted. +zoomMaxExtent = Gesamtausschnitt +zoomIn = Hereinzoomen +zoomOut = Herauszoomen +zoomLayer = Zoom auf Layer +moveMap = Verschieben +digitizeObjects = Erstellung von Rohren, Gr\u00e4ben, D\u00e4mmen und Ringdeichen +selectObject = Auswahlwerkzeug +removeObject = Ausgew\u00e4hltes Objekt l\u00f6schen +adjustElevationTooltip = Festlegen von H\u00f6hen f\u00fcr D\u00e4mme, Ringeiche, Gr\u00e4ben und Rohre +measureDistance = L\u00e4ngenmessung +measureArea = Fl\u00e4chenmessung +map_themepanel_header_style = Stil +zoomToLayer = Layer-Zoom +requireDGM = Sie m\u00fcssen ein DGM ausw\u00e4hlen. +upload_file = hochladen +shape_file_upload = Shapedatei hochladen +attribution = ©Intevation GmbH 2013
    Data ©OpenStreetMap +wmsURLMenuItem = WMS URL +wmsURLBoxTitle = WMS URL der Kartenebene +requireTheme = Sie m\u00fcssen ein Thema ausw\u00e4hlen. + +# data cage +waterlevels = Wasserst\u00e4nde +old_calculations = Fr\u00fchere Berechnungen +officiallines = Amtliche Linien +datacageAdd = Daten laden +heightmarks = Hochwassermarken +basedata = Basis-Daten +fixations = Fixierungen +flood_protections = HW-Schutzanlagen +columns = Spalten +annotation = Streckenfavoriten +annotation = Streckenfavoriten - Typen +annotations = Streckenfavoriten +all_annotations = Alle Streckenfavoriten +flowvelocitymeasurement = gemessene Flie\u00dfgeschwindigkeiten +bed_quality_bed = Sohlbeschaffenheit - Sohle +bed_quality_load = Sohlbeschaffenheit - Geschiebe +additionals = Zus\u00e4tzliche L\u00e4ngsschnitte +differences = Differenzen +kilometrage = Stationierung +riveraxis = Flussachse +km = Km +qps = Querprofilspuren +hws = Hochwasserschutzanlagen +catchments = Einzugsgebiete +catchment_wms = Einzugsgebiete (WMS) +floodplain = Talaue +lines = Darstellungstyp: Linien +buildings = Bauwerke +fixpoints = Festpunkte +uesk = \u00dcberschwemmungsfl\u00e4chen +calculations = Berechnungen +current = Aktuell +potential = Potenziell +bfg = BfG +land = Land +rastermap = Rasterkarte +background = Hintergrundkarte (WMS) +discharge_tables_chart = W/Q-Vorschau +discharge_table_nn = Abflusstafeln am Pegel +discharge_table_gauge = Abflusstafel am Pegel +mainvalue = Hauptwerte +mainvalues = Hauptwerte +wmainvalue = Hauptwerte (W) +qmainvalue = Hauptwerte (Q) +show_mainvalues = Hauptwerte anzeigen +dems = Digitale Gel\u00e4ndemodelle +hydrboundaries = Hydrologische Grenzen +gaugelocations = PEGELONLINE aktuell (WMS) +single = Jahr +epoch = Epoche +bedheights = Sohlh\u00f6hen +morph_width = Morphologische Breite +datacage = Datenkorb +official = Offiziell +inofficial = Inoffiziell +custom_lines = Eigene Digitalisierungen +hws_lines = Liniendaten +hws_points = Punktdaten +hws_fed_unknown = Unbekanntes Bundesland +jetties = Buhnen +route_data = Streckendaten +other = Sonstige +axis = Achse +bfg_model = BfG-Modell +federal = Bundesländer +areas = Darstellungstyp: Flächen +sobek_flooded = SOBEK-Grenzlinie durchflutet / nicht durchflutet +sobek_areas = SOBEK-Bereiche +measurements = Messungen +floodmarks = HW-Marken +pegel_had_measurement_points = HAD Abflussmessstellen (WMS) +gauge_points = Pegelmessstelle (WMS) +gauge_level = Wasserstand (WMS) +gauge_names = Pegelname (WMS) +gauge_tendency = Tendenz des Wasserstands (WMS) + +startcolor = Farbverlauf Startfarbe +endcolor = Farbverlauf Endfarbe +numclasses = Anzahl Klassen + +# capabilities information panel +addwmsInputTitle = Basis URL des WMS Dienstes +addwmsInfoTitle = Informationen des WMS Dienstes +addwmsLayerTitle = Ebene ausw\u00e4hlen +addwmsBack = Zur\u00fcck +addwmsContinue = Weiter +addwmsCancel = Abbrechen +addwmsInvalidURL = Die URL ist nicht g\u00fcltig. +capabilitiesHint = Bitte beachten Sie die folgenden Informationen des WMS-Dienstes. +capabilitiesTitle = Titel +capabilitiesURL = URL +capabilitiesAccessConstraints = Nutzungsbedingungen +capabilitiesFees = Geb\u00fchren +capabilitiesContactInformation = Weitere Informationen +capabilitiesEmail = Email +capabilitiesPhone = Telefon + +#Property dialog +chart = Diagramm +export = Export +width = Breite +height = H\u00f6he +visibility = Sichtbarkeit +upper = bis +lower = von +fixation = Fix +font_size = Schriftgr\u00f6\u00dfe +label = Titel +title = Titel +subtitle = Untertitel +display_grid = Gitterlinien anzeigen +display_logo = Logo anzeigen +logo_placeh = Horizontale Ausrichtung Logo +logo_placev = Vertikale Ausrichtung Logo +top = oben +bottom = unten +center = mittig +left = links +right = rechts +none = keines + +notselected = keine + +linetype = Linientyp +textstyle = Textstil +linecolor = Linienfarbe +showhorizontalline = Horizontale Linie +showverticalline = Vertikale Linie +textcolor = Textfarbe +textsize = Textgr\u00f6\u00dfe +font = Schriftart +showpoints = Punkte anzeigen +showbackground = Hintergrund anzeigen +textshowbg = Hintergrund anzeigen +backgroundcolor = Hintergrundfarbe +bandwidthcolor = Bandbreitenfarbe +textbgcolor = Hintergrundfarbe +textorientation = Textausrichtung +linesize = Liniendicke +pointsize = Punktdicke +bandwidth = Bandbreite +pointcolor = Punktfarbe +showlines = Linien anzeigen +showlinelabel = Linienbeschriftung anzeigen +showpointlabel = Punktbeschriftung anzeigen +labelfontface = Beschriftung: Schriftart +labelfontcolor = Beschriftung: Schriftfarbe +labelfontsize = Beschriftung: Schriftgr\u00f6\u00dfe +labelfontstyle = Beschriftung: Schriftstil +labelbgcolor = Beschriftung: Hintergrundfarbe +labelshowbg = Beschriftung: Hintergrund f\u00fcllen +horizontal = horizontal +vertical = vertikal +showwidth = Breite anzeigen +showlevel = Wasserstand anzeigen +showminimum = Minimum anzeigen +showmaximum = Maximum anzeigen +showborder = Linie anzeigen +transparent = Transparent +transparency = Transparenz +showarea = Show area +showarealabel = Fl\u00e4che beschriften +showmiddleheight = Mittlere Tiefe anzeigen +fillcolor = F\u00fcllfarbe +areabgcolor = F\u00fcllfarbe +areashowborder = Fl\u00e4chenumrandung +areashowbg = Fl\u00e4chenhintergrund +areabordercolor = Umrandungsfarbe +areatransparency = Tranparenz +wsplgen_cat1 = F\u00fcllfarbe 0.0 <= DIFF < 1 +wsplgen_cat2 = F\u00fcllfarbe 1.0 <= DIFF < 2 +wsplgen_cat3 = F\u00fcllfarbe 2.0 <= DIFF < 3 +wsplgen_cat4 = F\u00fcllfarbe 3.0 <= DIFF < 4 +wsplgen_cat5 = F\u00fcllfarbe 4.0 <= DIFF + +# Manual Points Editor +addpoints = Punkte hinzuf\u00fcgen +pointname = Bezeichner +removepoint = Entfernen +newpoint = Neuer Punkt +standby = Erstelle Parameterisierung ... bitte warten. +points = Punktthema +editpoints = Eintr\u00e4ge editieren +addWSP = Neues WSP Thema anlegen +addWSPButton = WSP Thema +selection = Auswahl + +# Reference Curves +reference_curve = Bezugslinie +reference_curve_normalized = Reduzierte Bezugslinie +reference_startpoint = Bezugsort/pegel +reference_endpoint = Zielort/pegel + +fix_deltawt_export = \u0394 W/t +select=Ausgewählt +add_date=Hinzuf\u00fcgen + +fix_parameters_export = Angepasste Koeffizienten +fix_parameters = CSV +sq_overview=\u00dcbersicht + +gauge_zero = PNP +gauge_q_unit = m\u00b3/s +gauge_river_info_link = Gew\u00e4sserinfo +gauge_info_link = Pegelinfo +gauge_url = https://flys-intern.intevation.de/PegelInfo/ +gauge_river_url = https://flys-intern.intevation.de/GewaesserInfo/ +gauge_curve_link = Abflusskurve/-tafel +discharge_timeranges = AK-Zeitr\u00e4ume +discharge_chart = W/Q-Vorschau + +measurement_station_type = Messstellenart +measurement_station_operator = Betreiber +measurement_station_start_time = Beginn der Aufzeichnung +measurement_station_url = https://flys-intern.intevation.de/MessstellenInfo/ +measurement_station_info_link = Messstelleninfo +measurement_station_gauge_name = hydrologischer Bezugspegel + +# The prefix is used to classify them and will be stripped +# If the payload part sarts with a number it will be sorted +# By this number and the number will be stripped. +# Number must be a single digit 0-9. This hack was made necessary +# by the usage of an attribute table in mapfish + +mapfish_data_range = mapfish_data_3Bereich +mapfish_data_subtitle = mapfish_data_0Untertitel +mapfish_data_strech = mapfish_data_2Strecke +mapfish_data_institution = mapfish_data_5Institution +mapfish_data_source = mapfish_data_6Datenquelle +mapfish_data_creator = mapfish_data_4Bearbeiter +mapfish_data_dateplace = mapfish_data_7Ort, Datum +mapfish_data_river = mapfish_data_1Gew\u00e4sser + +mapTitle = Titel +mapSubtitle = Untertitel +mapRange = Bereich +mapStretch = Strecke +mapCreator = Bearbeiter +mapInstitution = Institution +mapSource = Datenquelle +mapDate = Ort, Datum +mapLogo = Logo + +# Get Feature Info Window +PATH = Dateipfad diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_en.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_en.properties Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,618 @@ +fullname = Flusshydrologische Software +user = User: +guest = guest +logout = Logout +projects = Projects +open_project = Open Project +delete_project = Delete Project +rename_project = Rename Project +clone_project = Clone Project +copy_of = Copy +manage_projects = Manage Projects +favorite_tooltip = Permanently store? +favorite_tooltip_meaning = Golden star: stored +projectlist_creationTime = Creation time +projectlist_title = Title +projectlist_favorite = Permanent +projectlist_close = Close +really_delete = Do you really want to delete this project? +project_name_too_long = The entered project name is too long. Max length is $LEN characters. +switch_language = German +info = Info +warning = Attention +warning_language = Choosing a new language starts a new session. All open windows will be closed. +no_projects = No existing calculations found. +load_projects = Load calculations... +empty_table = Loading data... +empty_filter = No data found. +date_format = yyyy-MM-dd +datetime_format = yyyy-MM-dd HH:mm +new_project = New Project +new_calculation = New Calculation +module_selection = Module +river_selection = Rivers +winfo = WINFO +minfo = MINFO +map = Map +new_map = New Map +new_chart = New Chart +diagram = Chart +axes = Axes +legend = Legend +chart_title = Title +chart_subtitle = Subtitle +grid = Grid +antialiasing = Antialiasing +axis_name = Name +chart_start = Start +chart_end = End +x_axis = X-Axis +y1_axis = Y1-Axis +y2_axis = Y2-Axis +y3_axis = Y3-Axis +legend_name = Name +show_legend = Show +aggregation_threshold = Threshold for aggregation of legend entries +scale = Scale +databasket = Databasket +databasket_loading = Loading Databasket content +fix = Fixing +fixanalysis = Fixing Analysis +next = Next +location_distance_state = Choose calculation location(s) / range [km] +distance_state = Choose calculation range [km] +waterlevel_ground_state = Choose differences betweeen waterlevel and ground [m] +location = Location(s) +locations = Locations +single_location = Location +distance = Range +unitFrom = km +unitTo = km a +unitWidth = m +search = Search +discharge = FIXME(Name) +properties = Properties +activateTheme = Activate +deactivateTheme = Deactivate +removeTheme = Remove +manageThemes = Manage themes +label_ok = Ok +label_cancel = Cancel +cancelCalculationLabel = Stop the current calculation. +calculationCanceled = The calculation has been canceled. +range = Range +resultCount = Hits +start_year = Start +end_year = end +period = Period +year = Year +sedimentload_ls = Sediment Load +welcome = Welcome to Flusshydrologische Software +welcome_open_or_create = Please open a project from the project list or create a + +# Header images +flysLogo = images/flys_logo.gif +bfgLogo = images/bfg_logo.gif +bfgLogoSmall = images/bfg_logo_small.png + +# Images +downloadPNG = images/png_export.png +downloadPDF = images/pdf_export.png +downloadSVG = images/svg_export.png +downloadCSV = images/save.png +downloadAT = images/save_at.png +downloadWST = images/save_wst.png +loadingImg = images/loading.gif +loadingImg = images/loading.gif +cancelCalculation = images/cancelCalculation.png +markerRed = images/marker_red.png +markerGreen = images/marker_green.png +riverMap = images/FLYS_Karte.png +properties_ico = images/properties.png + +dpLabelFrom = from +dpUnitFrom = km +dpLabelTo = to +dpUnitTo = km +dpLabelStep = a +dpUnitStep = m + +wgLabelFrom = From +wgUnitFrom = m +wgLabelTo = To +wgUnitTo = m +wgLabelStep = a +wgUnitStep = m + +unitFromInM = From [m]: +unitToInM = To [m]: +unitDiffInM = Diff [m]: +unitLocation = km +wrongFormat = Wrong format +atLeastOneValue = You need to insert at least one value. +missingInput = You need to enter a value. +too_many_values = Only one value allowed + +addPointsTooltip = Add manual points +addWSPTooltip = Add manual LS +downloadPNGTooltip = Download chart as PNG +downloadPDFTooltip = Download chart as PDF +downloadSVGTooltip = Download chart as SVG +downloadCSVTooltip = Download data as CSV +zoomToMaxExtentTooltip = Zoom to max extent +zoomOutTooltip = Zoom out +historyBackTooltip = Previous zoom +panControlTooltip = Pan +zoomboxTooltip = Zoombox +chartPropertiesTooltip = Chartproperties + +description = Description +from = From +to = To +riverside = Riverside +bottom_edge = Bottom edge +top_edge = Top edge +name = Name +type = Type +wq_waterlevel_label = Characteristic Waterlevel +wq_table_w = Characteristic Waterlevels +wq_table_q = Characteristic Discharges / Durations +wq_value_w = W [cm at Gauge] +wq_value_q = Q [m\u00b3/s] +river_km = River-Km +uesk_profile_distance = Distance [m] + +wqTitle = Input for W/Q Data +wqadaptedTitle = Input for W/Q Data +wqHistorical = Selection of Analyse Type +calcTableTitle = Values +helperPanelTitle = Input Support +gaugePanelTitle = Gauge Information +measurementStationPanelTitle = Measurement Station Information +wqW = W at Gauge [cm] +wqQ = Q [m\u00b3/s] +wqQatGauge = Q at Gauge [m\u00b3/s] +wqWFree = W at free position [m+NHN] +wqQGauge = Discharge at Gauge +wqSingle = Single values +wqRange = Range +unitWNN = W [NN+m] +unitWSingle = cm +unitWFrom = cm - +unitWTo = cm a +unitWStep = cm +unitQSingle = m³/s +unitQFrom = m³/s - +unitQTo = m³/s a +unitQStep = m³/s +main_channel = Main Channel +total_channel = Total Channel +footerHome = Home +footerContact = Contact +footerImpressum = Legal info + +projectListMin = format-indent-less.png +projectListAdd = list-add.png +buttonNext = Next +imageBack = images/back_en.png +imageSave = images/save.png +theme_top = images/go-first.png +theme_up = images/go-up.png +theme_down = images/go-down.png +theme_bottom = images/go-bottom.png +zoom_all = images/mag_100.png +zoom_in = images/mag_zoom_box.png +zoom_out = images/mag_zoom_minus.png +zoom_back = images/mag_zoom_back.png +pan = images/hand.png +askThemeRemove = Are you sure that you want to remove the selected theme / themes? +add = Add + +static_sqrelation = SQ relation +discharge_curve = Discharge Curve at Gauge +discharge_curve_gaugeless = Discharge Curve +gauge_discharge_curve = Discharge Table at Gauge +computed_discharge_curve = Discharge Curve +computed_discharge_curves = Discharge Curves +longitudinal_section = Longitudinal Section Curve +duration_curve = Duration Curve +discharge_longitudinal_section = Discharge Longitudinal Section +floodmap = Floodmap +historical_discharge = Time Chart +historical_discharge_wq = W/Q Chart +flow_velocity = Flow Velocity +flow_velocity_export = Flow Velocity Export +bedheight_middle = Middle Bed Height +bedheight_middle_export = Middle Bed Height Export +bed_longitudinal_section = Bed Quality +bed_longitudinal_section_export = Bed Quality Export +sq_relation_a = A Feinkornanteil +sq_relation_b = B Sand (Suspensionstransport) +sq_relation_c = C Sand (Geschiebetransport) +sq_relation_d = D Fein- und Mittelkies +sq_relation_e = E Grobkornanteil (> Mittelkies) +sq_relation_f = F Geschiebetransport Gesamt +sq_relation_export = SQ Export +cross_section = Cross Section +cross_sections = Cross Sections +w_differences = Differences +w_differences_export = Differences Export +reference_curve_export = Reference Curve Export +historical_discharge_export = Historical Discharge Curve Export +showextramark = Show begin of extrapolation +extreme_wq_curve = W/Q +fix_wq_curve = W/Q-Diagram +fix_deltawt_curve = \u0394 W/t +fix_longitudinal_section_curve = Longitudinal Section +fix_derivate_curve = Derivate +fix_vollmer_wq_curve = W/Q-Diagram +datacage_add_pair = Add difference pair +load_diameter = Bedload Diameter +bed_diameter = Bed Diameter +soundings = Soundings +soundings_width = Soundings Width +bed_difference_year = Single Bedheight Differences +bed_difference_epoch = Epoch Bedheight Differences +bed_difference_height_year = Bedheight Difference per year + +exportATTooltip = Export as AT file + +waterlevel_export = Waterlevel Export +waterlevel_report = Waterlevel Report +computed_dischargecurve_export = Discharge Curve Export +computed_dischargecurve_report = Discharge Curve Report +discharge_longitudinal_section_export = Discharge Longitudinal Section Export +discharge_longitudinal_section_report = Discharge Longitudinal Section Report +durationcurve_export = Duration Curve Export +durationcurve_report = Duration Curve Report +dataexport = Data export +csv = CSV +wst = WST +at = AT +pdf = PDF +computed_dischargecurve_at_export = AT Export +gauge_discharge_curve_at_export = Gauge Discharge Curve +gauge_class = Gauge Class +eventselect = Eventselection +events = Events +kmchart = W/Q-Preview + +chart_themepanel_header_themes = Theme +chart_themepanel_header_actions = Actions +chart_themepanel_synchron = Navigate synchronously +chart_themepanel_asynchron = Navigate independently +chart_themepanel_set_master = Reference +chart_themepanel_new_area = New Area... +chart_themepanel_area_under = under ... +chart_themepanel_area_over = over ... +chart_themepanel_area_between = between ... +against_x_axis = Over X-Axis + +gauge_mnq = around MNQ +gauge_mq = around MQ +gauge_mhq = around MHQ +gauge_hq5 = above HQ5 + +ele_window_title = Elevation Node +ele_window_label = Elevation settings in m \u00fc. NN. +ele_window_x_col = X +ele_window_y_col = Y +ele_window_z_col = Z-Coordinate +ele_window_ok_button = Set elevations +ele_window_cancel_button = Cancel +ele_window_format_error = The elevation you have entered is invalid: +ele_window_save_error = Error while saving elevations. +ele_window_geometry_error = The geometry is not supported: + +unexpected_exception = There occured an unexpected exception +error_years_wrong = The second year needs to be bigger than the first year. +error_read_minmax_values = Error while reading min/max values for the location input. +error_validate_range = The value $1 needs to be smaller than $3 and bigger than $2. +error_validate_date_range = Start date needs to be before end date. +error_validate_date_range_invalid = The specified timerange is invalid. +error_validate_lower_range = The lower value $1 needs to be bigger than $2. +error_validate_upper_range = The upper value $1 needs to be smaller than $2. +error_empty_state = Required inputs are missing. +error_invalid_double_value = Wrong format for a floating point number. +error_create_artifact = Error while creating new project. +error_describe_artifact = Error while loading the parameterization. +error_feed_data = Error while inserting new data. +error_advance_artifact = Error while changing the project's state. +error_add_artifact = Error while inserting new data. +error_remove_artifact = Error while removing data. +error_create_collection = Error while creating a new collection. +error_describe_collection = Error while fetching the projects state. +error_no_rivers_found = Error while reading supported rivers. +error_no_such_user = Error - no such user found. +error_no_users = Error - no users found. +error_no_waterlevel_pair_selected = Error - no waterlevel pair for building differences selected. +error_same_waterlevels_in_pair = Error - minuend and subtrahend have to differ. +error_not_logged_in = You need to log in before you are allowed to start your work. +error_load_parameterization = Could not load the parameterization. +error_wrong_date = Please enter valid dates. +error_no_gaugeoverviewinfo_found = Error while fetching the river and gauge info + +error_feed_no_data = No input data found. +error_feed_from_out_of_range = The lower value is bigger than the upper value. +error_feed_to_out_of_range = The upper value is out or the valid range. +error_feed_from_bigger_to = The lower value is bigger than the upper value. +error_feed_invalid_wq_mode = Invalid WQ-Mode selected. +error_feed_number_format_float = The inserted value is no floating point number. +error_feed_invalid_calculation_mode = The chosen calculation method is invalid. +error_feed_no_calculation_mode = No calculation method chosen. +error_feed_no_such_river = The selected river is not provided. +error_feed_no_river_selected = No river selected. +error_feed_no_wq_mode_selected = No W/Q mode selected. +error_feed_q_values_invalid = Selected Q values are outside the valid range. +error_feed_w_values_invalid = Selected W values are outside the valid range. +error_chart_info_service = Could not fetch meta information of the chart. +error_no_meta_data_found = No meta data found. +error_load_artifact = Error while adding data to the current project. +error_no_calc_result=No calculation results found. +error_no_theme_styles_found=No style for the selected theme found. +error_no_feature_selected = No object selected. +error_no_map_config = No Map configuration found. +error_no_map_output_type = No Map output found. +error_no_valid_gfi_url = No valid GetFeatureInfo response found. +error_gfi_req_failed = GetFeatureInfo request failed. +error_gfi_parsing_failed = Failed to read GetFeatureInfo response. +error_gc_req_failed = Error while loading Capabilities document. +error_gc_doc_not_valid = Capabilities document is not valid. +error_malformed_url = The URL you have entered is not valid. +error_no_dgm_selected = No DEM selected. +error_invalid_dgm_selected = You have selected an invalid DEM. +error_bad_dgm_range = You have selected a DEM with an invalid range. +error_bad_dgm_river = You have selected a DEM for a wrong river. +error_dialog_not_valid = One or more values are not valid. +error_invalid_date = The entered date is not valid. +error_same_location = Reference location equals selected location. +error_contains_same_location = Target locations contains reference location. +error_update_collection_attribute = Error while updating the collection attribut +error_values_needed = You must provide values. +error_no_module_found = No modules found + +warning_use_first_feature = You have more that one object selected. The first one is used. +warning_no_wsp_selected = No waterlevel selected! +warning_cannot_parse_date = Date is invalid! +warning_select_two_values = Please select two values! + +## map related strings +digitize = images/digitize.png +pipe1 = Pipe1 +pipe2 = Pipe12 +ditch = Ditch +dam = Dam +ring_dike = Ringdike +selectFeature = images/selectFeature.png +removeFeature = images/removeFeature.png +getFeatureInfo = images/info.png +getFeatureInfoTooltip = Information Tool +getFeatureInfoWindowTitle = Information for Map Layer: +addWMS = images/add_map.png +printMapSettings = images/print_map_settings.png +addWMSTooltip = Load layers from external WMS service. +adjustElevation = images/adjustElevation.png +measureLine = images/measure_line.png +measurePolygon = images/measure_plane.png +step = Step +calculationStarted = Calculation started. +zoomMaxExtent = Max extent +zoomIn = Zoom in +zoomOut = Zoom out +zoomLayer = Zoom to layer +moveMap = Move +digitizeObjects = Creation of pipes, ditches, dams and ringdikes +selectObject = Select tool +removeObject = Remove selected object +adjustElevationTooltip = Define elevations for barriers +measureDistance = Measure line +measureArea = Measure area +map_themepanel_header_style = Style +zoomToLayer = Layer-Zoom +requireDGM = You need to choose a DEM. +upload_file = upload +shape_file_upload = Upload shapefile +attribution = ©Intevation GmbH 2013
    Data ©OpenStreetMap +wmsURLMenuItem = WMS URL +wmsURLBoxTitle = Layer WMS URL +requireTheme = You need to choose a Layer. + +# data cage +waterlevels = Waterlevels +old_calculations = Former Calculations +officiallines = Official lines +datacageAdd = Add data +heightmarks = Height Marks +basedata = Base Data +fixations = Fixations +flood_protections = Flood Protections +columns = Columns +annotation = Annotations +annotations = Annotations +all_annotations = All annotations +flowvelocitymeasurement = Flowvelocity measurements +bed_quality_bed = Quality - Bed +bed_quality_load = Quality - Load +additionals = Additional Longitudinal Section Curves +differences = Differences +kilometrage = Kilometrage +riveraxis = Riveraxis +km = Km +qps = Crosssection Tracks +hws = Floodplain Protection Work +catchments = Catchments +catchment_wms = Catchment (WMS) +floodplain = Floodplain +lines = Lines +buildings = Buildings +fixpoints = Fixpoints +uesk = Floodmaps +calculations = Calculations +current = Current +potentiel = Potentiel +bfg = BfG +land = Land +rastermap = Rastermap +background = Background Layer (WMS) +discharge_tables_chart = W/Q-Preview +discharge_table_nn = Discharge Tables at Gauge +discharge_table_gauge = Discharge Table at Gauge +mainvalue = Mainvalue +mainvalues = Mainvalues +wmainvalue = Mainvalues (W) +qmainvalue = Mainvalues (Q) +show_mainvalues = Show Mainvalues +dems = Digital Elevation Models +hydrboundaries = Hydrological Boundaries +gaugelocations = Location of Gauges (WMS) +single = Year +epoch = Epoch +bedheights = Bedheights +morph_width = morphologic Width +datacage = Datacage + +startcolor = Colorrange start color +endcolor = Colorrange end color +numclasses = Number of classes + +# capabilities information panel +addwmsInputTitle = Base URL of WMS service +addwmsInfoTitle = Information about WMS service +addwmsLayerTitle = Choose Layer +addwmsBack = Back +addwmsContinue = Continue +addwmsCancel = Cancel +addwmsInvalidURL = The URL is not valid. +capabilitiesHint = Please notice the information of the WMS service. +capabilitiesTitle = Title +capabilitiesURL = URL +capabilitiesAccessConstraints = Access Constraints +capabilitiesFees = Fees +capabilitiesContactInformation = Further Information +capabilitiesEmail = Email +capabilitiesPhone = Phone + +#Properties dialog +chart = Chart +export = Export +width = Width +height = Height +visibility = Visibility +upper = to +lower = from +fixation = Fix +font_size = Fontsize +label = Title +title = Title +subtitle = Subtitle +display_grid = Display grid +display_logo = Display logo +logo_placeh = Horiz. Place for logo +logo_placev = Vertic. Place for logo +top = top +bottom = bottom +center = center +left = left +right = right +none = none + +notselected = none + +linetype = Linetype +textstyle = Textstyle +linecolor = Linecolor +showhorizontalline = Show horizonal line +showverticalline = Show vertical line +textcolor = Textcolor +textsize = Textsize +font = Font +showpoints = Show points +showbackground = Show background +textshowbg = Show background +backgroundcolor = Backgroundcolor +bandwidthcolot = Bandwidthcolor +textbgcolor = Backgroundcolor +textorientation = Textorientation +linesize = Linesize +pointsize = Pointsize +bandwidth = Bandwidth +pointcolor = Pointcolor +showlines = Show lines +showlinelabel = Show label +showpointlabel = Show point label +labelfontface = Label: Font +labelfontcolor = Label: Color +labelfontsize = Label: Size +labelfontstyle = Label: Style +labelbgcolor = Label: Background Color +labelshowbg = Label: Show Background +horizontal = horizontal +vertical = vertical +showwidth = Show width +showlevel = Show waterlevel +showminimum = Show minimum +showmaximum = Show maximum +showborder = Show line +transparent = Transparency +transparency = Transparency +showarea = Show area +showarealabel = Show area label +showmiddleheight = Show middle depth +fillcolor = Fill Color +areabgcolor = Fill Color +areashowborder = Show area border +areashowbg = Show area background +areabordercolor = Border color +areatransparency = Tranparency +wsplgen_cat1 = Fill Color 0.0 <= DIFF < 1 +wsplgen_cat2 = Fill Color 1.0 <= DIFF < 2 +wsplgen_cat3 = Fill Color 2.0 <= DIFF < 3 +wsplgen_cat4 = Fill Color 3.0 <= DIFF < 4 +wsplgen_cat5 = Fill Color 4.0 <= DIFF + +# Manual Points Editor +addpoints = Add points +pointname = Name +removepoint = Remove +newpoint = New Point +standby = Creating Artifact ... please wait. +points = Points +editpoints = Edit Points +addWSP = Add Manual LS +addWSPButton = Add Manual LS +selection = Selection + +# Reference Curves +reference_curve = Reference Curve +reference_curve_normalized = Reduced Reference Curve +reference_startpoint = Point of reference +reference_endpoint = Point(s) of projection + +fix_deltawt_export = \u0394 W/t +select=Selected +add_date=Add + +fix_parameters_export = Adjusted coefficient +fix_parameters = CSV +sq_overview=Overview + +gauge_zero = GZG +gauge_q_unit = m\u00b3/s +gauge_river_info_link = Riverinfo +gauge_info_link = Gaugeinfo +gauge_url = https://flys-intern.intevation.de/PegelInfo/ +gauge_river_url = https://flys-intern.intevation.de/GewaesserInfo/ +gauge_curve_link = Dischargecurve/-table +discharge_timeranges = DC-Timeranges +discharge_chart = W/Q-Preview + +measurement_station_type = Type of Measurement Station +measurement_station_operator = Operator +measurement_station_start_time = Observation Start Time +measurement_station_url = https://flys-intern.intevation.de/MessstellenInfo/ +measurement_station_info_link = Measurement Station Info +measurement_station_gauge_name = Reference Gauge + +# Get Feature Info Window +PATH = Path + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSImages.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSImages.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,40 @@ +package org.dive4elements.river.client.client; + +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ImageResource; + + +/** + * This interface grants access to the images used in this application. + * + * @author Ingo Weinzierl + */ +public interface FLYSImages extends ClientBundle { + + @Source("images/bfg_logo.gif") + ImageResource logoBfg(); + + @Source("images/flys_logo.gif") + ImageResource logoFlys(); + + @Source("images/FLYS_Karte.png") + ImageResource riverMap(); + + @Source("images/marker_red.png") + ImageResource markerRed (); + + @Source("images/marker_green.png") + ImageResource markerGreen (); + + @Source("images/loading.gif") + ImageResource loading(); + + @Source("images/downloadPNG.png") + ImageResource downloadPNG(); + + @Source("images/downloadPDF.png") + ImageResource downloadPDF(); + + @Source("images/downloadSVG.png") + ImageResource downloadSVG(); +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSResources.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSResources.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,21 @@ +package org.dive4elements.river.client.client; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.TextResource; + + +/** + * A {@link ClientBundle} that is used to handle resources in this client. + * + * @author Ingo Weinzierl + */ +public interface FLYSResources extends ClientBundle { + + public static final FLYSResources INSTANCE = + GWT.create(FLYSResources.class); + + @Source("config.xml") + public TextResource initialConfiguration(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/config.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/config.xml Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,8 @@ + + http://localhost:8181 + + + + 300000 + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/AdvanceHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/AdvanceHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.client.event; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public interface AdvanceHandler extends Serializable { + + public void onAdvance(String target); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/CollectionChangeEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/CollectionChangeEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,29 @@ +package org.dive4elements.river.client.client.event; + +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This events stores references to the old collection and the new one. + * + * @author Ingo Weinzierl + */ +public class CollectionChangeEvent { + + protected Collection oldCollection; + protected Collection newCollection; + + public CollectionChangeEvent(Collection old, Collection newArt) { + oldCollection = old; + newCollection = newArt; + } + + public Collection getOldValue() { + return oldCollection; + } + + public Collection getNewValue() { + return newCollection; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/CollectionChangeHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/CollectionChangeHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.event; + + +/** + * Handler interface for CollectionChangeEvent events. + * + * @author Ingo Weinzierl + */ +public interface CollectionChangeHandler { + + /** + * Called when a CollectionChangeEvent is fired. + * + * @param event The CollectionChangeEvent. + */ + public void onCollectionChange(CollectionChangeEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/DatacageDoubleClickHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/DatacageDoubleClickHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,9 @@ +package org.dive4elements.river.client.client.event; + +import org.dive4elements.river.client.shared.model.ToLoad; + + +public interface DatacageDoubleClickHandler { + + void onDoubleClick(ToLoad toLoad); +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/DatacageHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/DatacageHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,9 @@ +package org.dive4elements.river.client.client.event; + +import org.dive4elements.river.client.shared.model.ToLoad; + +public interface DatacageHandler +{ + void toLoad(ToLoad toLoad); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/FilterHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/FilterHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface FilterHandler { + + void onFilterCriteriaChanged(StringFilterEvent event); + + void onFilterCriteriaChanged(RangeFilterEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasCollectionChangeHandlers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasCollectionChangeHandlers.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface HasCollectionChangeHandlers { + + /** + * Adds a new CollectionChangeHandler. + * + * @param handler The new CollectionChangeHandler. + */ + public void addCollectionChangeHandler(CollectionChangeHandler handler); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasOutputModesChangeHandlers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasOutputModesChangeHandlers.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface HasOutputModesChangeHandlers { + + /** + * Adds a new OutputModesChangeHandler. + * + * @param handler The new OutputModesChangeHandler. + */ + public void addOutputModesChangeHandler(OutputModesChangeHandler handler); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasOutputParameterChangeHandlers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasOutputParameterChangeHandlers.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface HasOutputParameterChangeHandlers { + + /** + * Registers a new OutputParameterChangeHandler. + * + * @param handler The new handler. + */ + void addOutputParameterChangeHandler(OutputParameterChangeHandler handler); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasPanHandlers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasPanHandlers.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,11 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface HasPanHandlers { + + void addPanHandler(PanHandler handler); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasParameterChangeHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasParameterChangeHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface HasParameterChangeHandler { + + /** + * Adds a new ParameterChangeHandler. + * + * @param handler The new ParameterChangeHandler. + */ + public void addParameterChangeHandler(ParameterChangeHandler handler); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasRedrawRequestHandlers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasRedrawRequestHandlers.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,17 @@ +package org.dive4elements.river.client.client.event; + + +/** + * Implements function to add a RedrawRequestHandler. + */ +public interface HasRedrawRequestHandlers { + + /** + * Adds a new RedrawRequestHandler. + * + * @param handler The new RedrawRequestHandler + */ + public void addRedrawRequestHandler(RedrawRequestHandler rrh); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasStepBackHandlers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasStepBackHandlers.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.client.event; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public interface HasStepBackHandlers extends Serializable { + + public void addStepBackHandler(StepBackHandler handler); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasStepForwardHandlers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasStepForwardHandlers.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.client.event; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public interface HasStepForwardHandlers extends Serializable { + + public void addStepForwardHandler(StepForwardHandler handler); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasZoomHandlers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/HasZoomHandlers.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,11 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface HasZoomHandlers { + + void addZoomHandler(ZoomHandler handler); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/OnMoveEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/OnMoveEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,27 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public class OnMoveEvent { + + public static final int TOP = 0; + public static final int UP = 1; + public static final int DOWN = 2; + public static final int BOTTOM = 3; + + + protected int type; + + + public OnMoveEvent(int type) { + this.type = type; + } + + + public int getType() { + return type; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/OnMoveHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/OnMoveHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,11 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface OnMoveHandler { + + void onMove(OnMoveEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/OutputModesChangeEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/OutputModesChangeEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,26 @@ +package org.dive4elements.river.client.client.event; + +import org.dive4elements.river.client.shared.model.OutputMode; + + +/** + * An event that is thrown if the output modes of a collection or an artifact + * have changed. + * + * @author Ingo Weinzierl + */ +public class OutputModesChangeEvent { + + protected OutputMode[] outs; + + + public OutputModesChangeEvent(OutputMode[] outs) { + this.outs = outs; + } + + + public OutputMode[] getOutputModes() { + return outs; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/OutputModesChangeHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/OutputModesChangeHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.event; + + +/** + * Handler interface for OutputModesChangeEvent events. + * + * @author Ingo Weinzierl + */ +public interface OutputModesChangeHandler { + + /** + * Called when a OutputModesChangeEvent is fired. + * + * @param event The OutputModesChangeEvent. + */ + public void onOutputModesChange(OutputModesChangeEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/OutputParameterChangeEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/OutputParameterChangeEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,12 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public class OutputParameterChangeEvent { + + public OutputParameterChangeEvent() { + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/OutputParameterChangeHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/OutputParameterChangeHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,17 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface OutputParameterChangeHandler { + + /** + * Called when the parameter of an output have changed. E.g. when the state + * of themes in a theme panel changed. + * + * @param event The event that is fired. + */ + void onOutputParameterChanged(OutputParameterChangeEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/PanEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/PanEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public class PanEvent { + + protected int[] startPos; + protected int[] endPos; + + + public PanEvent(int[] startPos, int[] endPos) { + this.startPos = startPos; + this.endPos = endPos; + } + + + public int[] getStartPos() { + return startPos; + } + + + public int[] getEndPos() { + return endPos; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/PanHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/PanHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,11 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface PanHandler { + + void onPan(PanEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/ParameterChangeEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/ParameterChangeEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,48 @@ +package org.dive4elements.river.client.client.event; + +import org.dive4elements.river.client.shared.model.Artifact; + + +/** + * This events stores references to the old artifact and the new one. + * + * @author Ingo Weinzierl + */ +public class ParameterChangeEvent { + + public static enum Type { + FORWARD, BACK + } + + + protected Artifact oldArtifact; + protected Artifact newArtifact; + + protected Type type; + + + public ParameterChangeEvent(Artifact old, Artifact newArt) { + this(old, newArt, Type.FORWARD); + } + + + public ParameterChangeEvent(Artifact oArt, Artifact nArt, Type type) { + oldArtifact = oArt; + newArtifact = nArt; + this.type = type; + } + + + public Artifact getOldValue() { + return oldArtifact; + } + + public Artifact getNewValue() { + return newArtifact; + } + + public Type getType() { + return type; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/ParameterChangeHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/ParameterChangeHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.event; + + +/** + * Handler interface for ParameterChangeEvent events. + * + * @author Ingo Weinzierl + */ +public interface ParameterChangeHandler { + + /** + * Called when a ParameterChangeEvent is fired. + * + * @param event The ParameterChangeEvent. + */ + public void onParameterChange(ParameterChangeEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/RangeFilterEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/RangeFilterEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,44 @@ +package org.dive4elements.river.client.client.event; + +import com.google.gwt.i18n.client.NumberFormat; + +/** + * @author Raimund Renkert + */ +public class RangeFilterEvent { + + protected Float from; + protected Float to; + + + public RangeFilterEvent(String from, String to) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + double d; + + try { + d = nf.parse(from); + this.from = Float.valueOf(String.valueOf(d)); + } + catch(NumberFormatException nfe) { + this.from = Float.NaN; + } + try { + d = nf.parse(to); + this.to = Float.valueOf(String.valueOf(d)); + } + catch(NumberFormatException nfe) { + this.to = Float.NaN; + } + } + + + public Float getFrom() { + return this.from; + } + + + public Float getTo() { + return this.to; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/RedrawRequestEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/RedrawRequestEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ +package org.dive4elements.river.client.client.event; + + +public class RedrawRequestEvent { + + public static enum Type { + RESET, DEFAULT + } + + + protected Type type; + + + public RedrawRequestEvent() { + this.type = Type.DEFAULT; + } + + + public RedrawRequestEvent(Type type) { + this.type = type; + } + + + public Type getType() { + return type; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/RedrawRequestHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/RedrawRequestHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,15 @@ +package org.dive4elements.river.client.client.event; + + +/** + * Handler interface for RedrawRequests. + */ +public interface RedrawRequestHandler { + + /** + * Handle the redraw request. + */ + public void onRedrawRequest(RedrawRequestEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/StepBackEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/StepBackEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,36 @@ +package org.dive4elements.river.client.client.event; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public class StepBackEvent implements Serializable { + + private static final long serialVersionUID = 7895180143662002198L; + + /** The identifier of the target state.*/ + protected String target; + + + /** + * Creates a new StepBackEvent with the identifier of the target state. + * + * @param target The identifier of the target state. + */ + public StepBackEvent(String target) { + this.target = target; + } + + + /** + * A method to retrieve the target identifier. + * + * @return the target identifier. + */ + public String getTarget() { + return target; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/StepBackHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/StepBackHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.client.event; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public interface StepBackHandler extends Serializable { + + public void onStepBack(StepBackEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/StepForwardEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/StepForwardEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,38 @@ +package org.dive4elements.river.client.client.event; + +import org.dive4elements.river.client.shared.model.Data; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public class StepForwardEvent implements Serializable { + + private static final long serialVersionUID = -5527511690213770954L; + + /** The selected data.*/ + protected Data[] data; + + /** + * Creates a new StepForwardEvent with the Data that has been selected in + * the UI. + * + * @param data The selected data. + */ + public StepForwardEvent(Data[] data) { + this.data = data; + } + + + /** + * A method to retrieve the data stored in the event. + * + * @return the data. + */ + public Data[] getData() { + return data; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/StepForwardHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/StepForwardHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.client.event; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public interface StepForwardHandler extends Serializable { + + public void onStepForward(StepForwardEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/StringFilterEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/StringFilterEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.event; + +/** + * @author Ingo Weinzierl + */ +public class StringFilterEvent { + + protected String filter; + + + public StringFilterEvent(String filter) { + this.filter = filter; + } + + + public String getFilter() { + return filter; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/ZoomEvent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/ZoomEvent.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,43 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public class ZoomEvent { + + protected int xmin; + protected int ymin; + + protected int xmax; + protected int ymax; + + + public ZoomEvent(int xmin, int ymin, int xmax, int ymax) { + this.xmin = xmin; + this.xmax = xmax; + this.ymin = ymin; + this.ymax = ymax; + } + + + public int getStartX() { + return xmin; + } + + + public int getEndX() { + return xmax; + } + + + public int getStartY() { + return ymin; + } + + + public int getEndY() { + return ymax; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/event/ZoomHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/event/ZoomHandler.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,11 @@ +package org.dive4elements.river.client.client.event; + + +/** + * @author Ingo Weinzierl + */ +public interface ZoomHandler { + + void onZoom(ZoomEvent event); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/AddArtifactService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/AddArtifactService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,35 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This interface describes the service to add an existing artifact to an + * existing collection. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("add-artifact") +public interface AddArtifactService extends RemoteService { + + /** + * Adds an artifact to a collection. + * + * @param collection The Collection that should be extended. + * @param artifact The artifact that should be added. + * @param url The url of the artifact server. + * + * @return the Collection after the operation. + */ + Collection add( + Collection collection, + Artifact artifact, + String locale) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/AddArtifactServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/AddArtifactServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +public interface AddArtifactServiceAsync { + + public void add( + Collection collection, + Artifact artifact, + String locale, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/AdvanceService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/AdvanceService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,33 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; + +/** + * This interface provides artifact specific operation ADVANCE. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("advance") +public interface AdvanceService extends RemoteService { + + /** + * This method inserts new data into the an existing artifact. + * + * @param serverUrl The url of the artifact server. + * @param locale The locale used for the request. + * @param artifact The artifact. + * @param target The identifier of the target state. + * + * @return the artifact which description might have been changed. + */ + public Artifact advance( + String locale, + Artifact artifact, + String target) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/AdvanceServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/AdvanceServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,21 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Artifact; + + +/** + * This interface provides artifact specific operation ADVANCE. + * + * @author Ingo Weinzierl + */ +public interface AdvanceServiceAsync { + + public void advance( + String locale, + Artifact artifact, + String target, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ArtifactService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ArtifactService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,64 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; + +import org.dive4elements.river.client.shared.model.Recommendation; + +/** + * This interface provides artifact specific services as CREATE, DESCRIBE, FEED, + * ADVANCE and OUT. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("artifact") +public interface ArtifactService extends RemoteService { + + /** + * This method creates a new artifact based on the given factory. + * + * @param serverUrl The url of the artifact server. + * @param locale The locale used for the request. + * @param factory The factory that should be used for the artifact creation. + * + * @return the new artifact. + */ + public Artifact create( + String locale, + String factory, + Recommendation recommendation + ) throws ServerException; + + /** + * Create a new GaugeDischageCurveArtifact + * + * @param collection the collection to add the artifact to + * @param river the river + * @param gaugeref reference id of the gauge + */ + public Artifact createGaugeDischargeCurveArtifact( + Collection collection, + String locale, + String river, + Long gaugeref + ) throws ServerException; + + /** + * Create a new SQRelationArtifact + * + * @param collection the collection to add the artifact to + * @param river the river + * @param measurementStation the measurement station id + */ + public Artifact createSQRelationArtifact( + Collection collection, + String locale, + String river, + int measurementStation + ) throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ArtifactServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ArtifactServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,40 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; + +import org.dive4elements.river.client.shared.model.Recommendation; + +/** + * This interface provides artifact specific services as CREATE, DESCRIBE, FEED, + * ADVANCE and OUT. + * + * @author Ingo Weinzierl + */ +public interface ArtifactServiceAsync { + + public void create( + String locale, + String factory, + Recommendation recommendation, + AsyncCallback callback); + + public void createGaugeDischargeCurveArtifact( + Collection collection, + String locale, + String river, + Long gaugeref, + AsyncCallback callback + ); + + public void createSQRelationArtifact( + Collection collection, + String locale, + String river, + int measurementStation, + AsyncCallback callback + ); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CSVExportService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CSVExportService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import java.util.List; + +import org.dive4elements.river.client.shared.exceptions.ServerException; + +/** + * This service is used to fetch a list of DistanceInfoObjects from artifact + * server for a specific river. + * + * @author Raimund Renkert + */ +@RemoteServiceRelativePath("csv") +public interface CSVExportService extends RemoteService { + + /** + * This method returns a list of DistanceInfoObjects for a specific river. + */ + List getCSV( + String locale, + String uuid, + String name) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CSVExportServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CSVExportServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import java.util.List; + +/** + * @author Raimund Renkert + */ +public interface CSVExportServiceAsync { + + void getCSV( + String locale, + String uuid, + String name, + AsyncCallback> cb); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ChartInfoService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ChartInfoService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,25 @@ +package org.dive4elements.river.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.ChartInfo; +import org.dive4elements.river.client.shared.model.Collection; + +/** + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("chart-info") +public interface ChartInfoService extends RemoteService { + + ChartInfo getChartInfo( + Collection collection, + String locale, + String type, + Map attr) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ChartInfoServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ChartInfoServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,23 @@ +package org.dive4elements.river.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.ChartInfo; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +public interface ChartInfoServiceAsync { + + public void getChartInfo( + Collection collection, + String locale, + String type, + Map attr, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CollectionAttributeService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CollectionAttributeService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,19 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("collection-attribute") +public interface CollectionAttributeService extends RemoteService { + + Collection update(Collection collection, String locale) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CollectionAttributeServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CollectionAttributeServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +public interface CollectionAttributeServiceAsync { + + void update( + Collection collection, + String locale, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CollectionItemAttributeService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CollectionItemAttributeService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,32 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItemAttribute; + +/** + * This interface provides a method to retrieve an artifact based on its uuid. + * + * @author Raimund Renkert + */ +@RemoteServiceRelativePath("collection-item-attribute") +public interface CollectionItemAttributeService extends RemoteService { + + CollectionItemAttribute getCollectionItemAttribute( + Collection collection, + String artifact, + String locale) + throws ServerException; + + void setCollectionItemAttribute( + Collection collection, + String artifact, + String locale, + CollectionItemAttribute attribute) + throws ServerException; + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CollectionItemAttributeServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CollectionItemAttributeServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItemAttribute; + + +/** + * @author Ingo Weinzierl + */ +public interface CollectionItemAttributeServiceAsync { + + public void getCollectionItemAttribute( + Collection collection, + String artifact, + String locale, + AsyncCallback callback); + + public void setCollectionItemAttribute( + Collection collection, + String artifact, + String locale, + CollectionItemAttribute attributes, + AsyncCallback callback); + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CreateCollectionService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CreateCollectionService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,27 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This interface describes the service for creating new collections. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("create-collection") +public interface CreateCollectionService extends RemoteService { + + /** + * This method creates a new collection in the artifact server and returns + * the uuid of this collection. + * + * @return the uuid of the created collection. + */ + Collection create(String locale, String ownerId) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CreateCollectionServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CreateCollectionServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This interface describes the service for creating new collections. + * + * @author Ingo Weinzierl + */ +public interface CreateCollectionServiceAsync { + + void create( + String locale, + String owner, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CrossSectionKMService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CrossSectionKMService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,30 @@ +package org.dive4elements.river.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; + +/** + * This interface provides access to CrossSectionKMService . + */ +@RemoteServiceRelativePath("cross-section-km") +public interface CrossSectionKMService extends RemoteService { + + /** + * @param serverUrl The url of the artifact server. + * @param locale The locale used for the request. + * @param artifact The artifact. + * @param data The data that should be inserted. + * + * @return the artifact which description might have been changed. + */ + public Map getCrossSectionKMs( + String locale, + Map data, + int nNeightbours) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/CrossSectionKMServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/CrossSectionKMServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * Talk-to interface for crosssectionkm service. + */ +public interface CrossSectionKMServiceAsync { + + void getCrossSectionKMs( + String locale, + Map data, + int nNeighbours, + AsyncCallback> cb); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DeleteCollectionService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DeleteCollectionService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,27 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This interface describes the service to add an existing artifact to an + * existing collection. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("delete-collection") +public interface DeleteCollectionService extends RemoteService { + + /** + * Deletes a collection. + * + * @param collection The Collection that should be deleted. + */ + void delete(Collection collection) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DeleteCollectionServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DeleteCollectionServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,17 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +public interface DeleteCollectionServiceAsync { + + public void delete( + Collection collection, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DescribeArtifactService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DescribeArtifactService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,31 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; + +/** + * This interface provides artifact specific operation DESCRIBE. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("describe") +public interface DescribeArtifactService extends RemoteService { + + /** + * This method inserts new data into the an existing artifact. + * + * @param url The url of the artifact server. + * @param locale The locale used for the request. + * @param artifact The artifact. + * + * @return the artifact which description might have been changed. + */ + public Artifact describe( + String locale, + Artifact artifact) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DescribeArtifactServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DescribeArtifactServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Artifact; + + +/** + * This interface provides artifact specific operation DESCRIBE. + * + * @author Ingo Weinzierl + */ +public interface DescribeArtifactServiceAsync { + + public void describe( + String locale, + Artifact artifact, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DescribeCollectionService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DescribeCollectionService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,31 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This service describes an operation the fetches the DESCRIBE document of a + * specific collection and returns a Collection. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("describe-collection") +public interface DescribeCollectionService extends RemoteService { + + /** + * Adds an artifact to a collection. + * + * @param uuid The uuid of the desired collection. + * @param url The url of the artifact server. + * @param locale The name of the locale used for the request. + * + * @return the Collection after the operation. + */ + Collection describe(String uuid, String locale) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DescribeCollectionServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DescribeCollectionServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +public interface DescribeCollectionServiceAsync { + + public void describe( + String uuid, + String locale, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DischargeInfoService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DischargeInfoService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,26 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.DischargeInfoObject; + +/** + * This service is used to fetch a list of DischargeInfoObjects from artifact + * server for a specific gauge. + * + * @author Raimund Renkert + */ +@RemoteServiceRelativePath("dischargeinfo") +public interface DischargeInfoService extends RemoteService { + + /** + * This method returns a list of DischargeInfoObjects for a specific gauge. + */ + DischargeInfoObject[] getDischargeInfo( + String locale, + long gauge) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DischargeInfoServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DischargeInfoServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.DischargeInfoObject; + + +/** + * @author Raimund Renkert + */ +public interface DischargeInfoServiceAsync { + + void getDischargeInfo( + String locale, + long gauge, + AsyncCallback cb); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DistanceInfoService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DistanceInfoService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,26 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.DistanceInfoObject; + +/** + * This service is used to fetch a list of DistanceInfoObjects from artifact + * server for a specific river. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("distanceinfo") +public interface DistanceInfoService extends RemoteService { + + /** + * This method returns a list of DistanceInfoObjects for a specific river. + */ + DistanceInfoObject[] getDistanceInfo( + String locale, + String river) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/DistanceInfoServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/DistanceInfoServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.DistanceInfoObject; + + +/** + * @author Ingo Weinzierl + */ +public interface DistanceInfoServiceAsync { + + void getDistanceInfo( + String locale, + String river, + AsyncCallback cb); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/FeedService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/FeedService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,49 @@ +package org.dive4elements.river.client.client.services; + +import java.util.List; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Data; + +/** + * This interface provides artifact specific operation FEED. + */ +@RemoteServiceRelativePath("feed") +public interface FeedService extends RemoteService { + + /** + * Inserts new data into an existing artifact. + * + * @param locale The locale used for the request. + * @param artifact The artifact. + * @param data The data that should be inserted. + * + * @return the artifact which description might have been changed. + */ + public Artifact feed( + String locale, + Artifact artifact, + Data[] data) + throws ServerException; + + + /** + * Inserts (the same) new data into existing artifacts. + * + * @param locale The locale used for the request. + * @param artifact The artifact. + * @param data The data that should be inserted. + * + * @return the artifact which description might have been changed. + */ + public List feedMany( + String locale, + List artifacts, + Data[] data) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/FeedServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/FeedServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,42 @@ +package org.dive4elements.river.client.client.services; + +import java.util.List; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Data; + + +/** + * This interface provides artifact specific operation FEED. + */ +public interface FeedServiceAsync { + + /** + * Inserts new data into an existing artifact. + * + * @param locale The locale used for the request. + * @param artifact The artifact. + * @param data The data that should be inserted. + */ + public void feed( + String locale, + Artifact artifact, + Data[] data, + AsyncCallback callback); + + /** + * Inserts (the same) new data into existing artifacts. + * + * @param locale The locale used for the request. + * @param artifact The artifact. + * @param data The data that should be inserted. + */ + public void feedMany( + String locale, + List artifacts, + Data[] data, + AsyncCallback> callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/FixingsOverviewService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/FixingsOverviewService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,21 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; + +import org.dive4elements.river.client.shared.model.FixingsOverviewInfo; + +@RemoteServiceRelativePath("fixings-overview") +public interface FixingsOverviewService extends RemoteService { + + FixingsOverviewInfo generateOverview( + String locale, + String uuid, + String filter, + boolean checkbox, + String callback + ) throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/FixingsOverviewServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/FixingsOverviewServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,17 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.FixingsOverviewInfo; + +public interface FixingsOverviewServiceAsync { + + void generateOverview( + String locale, + String uuid, + String filter, + boolean checkbox, + String callbackFunction, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/GCService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/GCService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Capabilities; + + +@RemoteServiceRelativePath("getcapabilities") +public interface GCService extends RemoteService { + + public Capabilities query(String path) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/GCServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/GCServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,15 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Capabilities; + + +/** + * @author Ingo Weinzierl + */ +public interface GCServiceAsync { + + void query(String path, AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/GFIService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/GFIService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ +package org.dive4elements.river.client.client.services; + +import java.util.List; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.FeatureInfoResponse; +import org.dive4elements.river.client.shared.model.Theme; + + +@RemoteServiceRelativePath("getfeatureinfo") +public interface GFIService extends RemoteService { + + public FeatureInfoResponse query( + Theme theme, + String format, + String bbox, + String projection, + int height, + int width, + int x, + int y + ) throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/GFIServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/GFIServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ +package org.dive4elements.river.client.client.services; + +import java.util.List; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.FeatureInfoResponse; +import org.dive4elements.river.client.shared.model.Theme; + + +/** + * @author Ingo Weinzierl + */ +public interface GFIServiceAsync { + + void query( + Theme theme, + String format, + String bbox, + String projection, + int height, + int width, + int x, + int y, + AsyncCallback callback + ); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/GaugeInfoService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/GaugeInfoService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.services; + +import java.util.List; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Gauge; + +/** + * @author Raimund Renkert + */ +@RemoteServiceRelativePath("gaugeinfo") +public interface GaugeInfoService extends RemoteService { + + List getGaugeInfo(String river, String refnumber) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/GaugeInfoServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/GaugeInfoServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.services; + +import java.util.List; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Gauge; + + +/** + * @author Raimund Renkert + */ +public interface GaugeInfoServiceAsync { + + void getGaugeInfo( + String river, + String refnumber, + AsyncCallback> gauges); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/GetArtifactService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/GetArtifactService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,31 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; + +/** + * This interface provides a method to retrieve an artifact based on its uuid. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("getartifact") +public interface GetArtifactService extends RemoteService { + + /** + * This method inserts new data into the an existing artifact. + * + * @param url The url of the artifact server. + * @param locale The string representation of a locale that is used for the + * request. + * @param uuid The artifact's identifier. + * @param hash The artifact's hash. + * + * @return the artifact. + */ + Artifact getArtifact(String locale, String uuid, String hash) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/GetArtifactServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/GetArtifactServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,19 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Artifact; + + +/** + * @author Ingo Weinzierl + */ +public interface GetArtifactServiceAsync { + + public void getArtifact( + String locale, + String uuid, + String hash, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/LoadArtifactService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/LoadArtifactService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,31 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.Recommendation; + +/** @see LoadArtifactServiceImpl */ +@RemoteServiceRelativePath("load-artifact") +public interface LoadArtifactService extends RemoteService { + + /** @see LoadArtifactServiceImpl */ + Artifact load( + Collection parent, + Recommendation recom, + String factory, + String locale) + throws ServerException; + + /** @see LoadArtifactServiceImpl */ + Artifact[] loadMany( + Collection parent, + Recommendation[] recom, + String factory, + String locale) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/LoadArtifactServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/LoadArtifactServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,29 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.Recommendation; + + +/** + * @author Ingo Weinzierl + */ +public interface LoadArtifactServiceAsync { + + public void load( + Collection parent, + Recommendation recom, + String factory, + String locale, + AsyncCallback callback); + + public void loadMany( + Collection parent, + Recommendation[] recom, + String factory, + String locale, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapInfoService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapInfoService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,19 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.MapInfo; + + +/** + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("map-info") +public interface MapInfoService extends RemoteService { + + MapInfo getMapInfo(String locale, String river) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapInfoServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapInfoServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.MapInfo; + + +/** + * @author Ingo Weinzierl + */ +public interface MapInfoServiceAsync { + + public void getMapInfo( + String locale, + String river, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapOutputService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapOutputService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,22 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.MapConfig; + + +/** + * This interface describes the service to add an existing artifact to an + * existing collection. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("map") +public interface MapOutputService extends RemoteService { + + MapConfig doOut(Collection collection) throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapOutputServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapOutputServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.MapConfig; + + +/** + * @author Ingo Weinzierl + */ +public interface MapOutputServiceAsync { + + public void doOut(Collection collection, AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapUrlService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapUrlService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; + +/** + * This interface describes the service to get wms urls for UESK and new maps. + * + * @author Raimund Renkert + */ +@RemoteServiceRelativePath("map-urls") +public interface MapUrlService extends RemoteService { + + Map getUrls() throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapUrlServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/MapUrlServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,15 @@ +package org.dive4elements.river.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.AsyncCallback; + + +/** + * @author Raimund Renkert + */ +public interface MapUrlServiceAsync { + + public void getUrls(AsyncCallback > callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/MetaDataService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/MetaDataService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,21 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; + +import org.dive4elements.river.client.shared.model.DataCageTree; + +@RemoteServiceRelativePath("meta-data") +public interface MetaDataService extends RemoteService +{ + DataCageTree getMetaData( + String locale, + String artifactId, + String userId, + String outs, + String parameters + ) throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/MetaDataServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/MetaDataServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.DataCageTree; + +public interface MetaDataServiceAsync { + void getMetaData( + String locale, + String artifactId, + String userId, + String outs, + String parameters, + AsyncCallback cb); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : + + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ModuleService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ModuleService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,22 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Module; + +@RemoteServiceRelativePath("modules") +public interface ModuleService extends RemoteService { + + /** + * Returns the list of available modules of a user + * + * @param locale The locale used for the request + * @return a String array of all available modules + * + */ + public Module[] list(String locale) throws ServerException; +} + +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 tw=80 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ModuleServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ModuleServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,12 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Module; + +public interface ModuleServiceAsync { + + public void list(String locale, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 tw=80 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/RemoveArtifactService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/RemoveArtifactService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,34 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This interface describes the service to remove an existing artifact to an + * existing collection. + * + */ +@RemoteServiceRelativePath("remove-artifact") +public interface RemoveArtifactService extends RemoteService { + + /** + * Removes an artifact from a collection. + * + * @param collection The Collection that should be modified. + * @param artifactId The artifact that should be removed. + * @param url The url of the artifact server. + * @param locale locae to use (for localized responses). + * + * @return the Collection after the operation. + */ + Collection remove( + Collection collection, + String artifactId, + String locale) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/RemoveArtifactServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/RemoveArtifactServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; + +/** + * @see RemoveArtifactService, RemoveArtifactServiceImpl + */ +public interface RemoveArtifactServiceAsync { + + public void remove( + Collection collection, + String artifactId, + String locale, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ReportService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ReportService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,15 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +@RemoteServiceRelativePath("report") +public interface ReportService +extends RemoteService +{ + String report( + String collectionId, + String locale, + String out); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ReportServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ReportServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +public interface ReportServiceAsync +{ + void report( + String collectionId, + String locale, + String out, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/RiverInfoService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/RiverInfoService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,27 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.RiverInfo; + +/** + * @author Björn Ricks + */ +@RemoteServiceRelativePath("riverinfo") +public interface RiverInfoService extends RemoteService { + + /** + * Returns a RiverInfo object with GaugeInfos + */ + public RiverInfo getGauges(String river) + throws ServerException; + + /** + * Returns a RiverInfo object with MeasurementStations + */ + public RiverInfo getMeasurementStations(String river) + throws ServerException; + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/RiverInfoServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/RiverInfoServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,19 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.RiverInfo; + + +/** + * @author Björn Ricks + */ +public interface RiverInfoServiceAsync { + + public void getGauges(String river, AsyncCallback callback); + + public void getMeasurementStations(String river, + AsyncCallback callback); +} + +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 tw=80 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/RiverService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/RiverService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.River; + +/** + * This interface provides a method to list the supported rivers of the artifact + * server. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("rivers") +public interface RiverService extends RemoteService { + + /** + * This method returns a list of rivers provided by the artifact server. + * + * @param locale The locale used for the request. + * + * @return a list of rivers provided by the artifact server. + */ + public River[] list(String locale) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/RiverServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/RiverServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.River; + + +/** + * This interface provides a method to list the supported rivers of the artifact + * server. + * + * @author Ingo Weinzierl + */ +public interface RiverServiceAsync { + + public void list( + String locale, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/SedimentLoadInfoService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/SedimentLoadInfoService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,29 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoObject; + +/** + * This service is used to fetch a list of SedimentLoadInfoObjects from artifact + * server for a specific river. + * + * @author Raimund Renkert + */ +@RemoteServiceRelativePath("sedimentloadinfo") +public interface SedimentLoadInfoService extends RemoteService { + + /** + * This method returns a list of SedimentLoadInfoObjects for a specific river. + */ + SedimentLoadInfoObject[] getSedimentLoadInfo( + String locale, + String river, + String type, + double startKm, + double endKm) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/SedimentLoadInfoServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/SedimentLoadInfoServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.SedimentLoadInfoObject; + +/** + * @author Raimund Renkert + */ +public interface SedimentLoadInfoServiceAsync { + + void getSedimentLoadInfo( + String locale, + String river, + String type, + double startKm, + double endKm, + AsyncCallback cb); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/SetCollectionNameService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/SetCollectionNameService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,27 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This interface describes the service to add an existing artifact to an + * existing collection. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("set-collectionname") +public interface SetCollectionNameService extends RemoteService { + + /** + * Set the name of a collection. + * + * @param collection The Collection that should be extended. + */ + void setName(Collection collection) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/SetCollectionNameServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/SetCollectionNameServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,17 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +public interface SetCollectionNameServiceAsync { + + public void setName( + Collection collection, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/SetCollectionTTLService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/SetCollectionTTLService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,19 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("set-collectionttl") +public interface SetCollectionTTLService extends RemoteService { + + void setTTL(Collection c) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/SetCollectionTTLServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/SetCollectionTTLServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,17 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +public interface SetCollectionTTLServiceAsync { + + public void setTTL( + Collection collection, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/StepForwardService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/StepForwardService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,34 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Data; + +/** + * This interface provides artifact specific operations FEED and ADVANCE. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("forward") +public interface StepForwardService extends RemoteService { + + /** + * This method inserts new data into the an existing artifact and + * advances its state. + * + * @param locale The locale used for the request. + * @param artifact The artifact. + * @param data The data that should be inserted. + * + * @return the artifact which description might have been changed. + */ + public Artifact go( + String locale, + Artifact artifact, + Data[] data) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/StepForwardServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/StepForwardServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,22 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Data; + + +/** + * This interface provides artifact specific operation FEED and ADVANCE. + * + * @author Ingo Weinzierl + */ +public interface StepForwardServiceAsync { + + public void go( + String locale, + Artifact artifact, + Data[] data, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ThemeListingService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ThemeListingService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,29 @@ +package org.dive4elements.river.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Style; + +/** + * This interface provides a method to list themes filtered by name. + * + * @author Raimund.Renkert + */ +@RemoteServiceRelativePath("themelisting") +public interface ThemeListingService extends RemoteService { + + /** + * This method returns a list of themes filtered by name. + * + * @param locale The locale used for the request. + * + * @return a list of themes provided by the artifact server. + */ + public Map list(String locale, String name) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/ThemeListingServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/ThemeListingServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,22 @@ +package org.dive4elements.river.client.client.services; + +import java.util.Map; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Style; + + +/** + * This interface provides a method to list themes filterd by name. + * + * @author Raimund Renkert + */ +public interface ThemeListingServiceAsync { + + public void list( + String locale, + String name, + AsyncCallback> callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/UserCollectionsService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/UserCollectionsService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,29 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This interface describes a method that retrieves a list of Collections owned + * by a specified user. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("user-collections") +public interface UserCollectionsService extends RemoteService { + + /** + * This method retrieves the user that is currently logged in. + * + * @param serverUrl The url of the artifact server. + * @param locale The locale used for the request object. + * @param userid The identifier of the owner. + * + * @return the current {@link User}. + */ + Collection[] getUserCollections(String locale, String userid); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/UserCollectionsServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/UserCollectionsServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,21 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * This interface describes a method that retrieves a list of Collections owned + * by a specified user. + * + * @author Ingo Weinzierl + */ +public interface UserCollectionsServiceAsync { + + void getUserCollections( + String locale, + String userid, + AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/UserService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/UserService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,33 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.AuthenticationException; +import org.dive4elements.river.client.shared.model.User; + + +/** + * This interface describes services for the user. + * + * @author Ingo Weinzierl + */ +@RemoteServiceRelativePath("user") +public interface UserService extends RemoteService { + + /** + * This method retrieves the user that is currently logged in. + * + * @param locale The current locale. + * + * @return the current {@link User}. + */ + User getCurrentUser(String locale) + throws AuthenticationException; + + /** + * Removes the current user object from the session + */ + void logoutCurrentUser(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/UserServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/UserServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,21 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.User; + + +/** + * This interface describes services for the user. + * + * @author Ingo Weinzierl + */ +public interface UserServiceAsync { + + void getCurrentUser( + String locale, + AsyncCallback callback); + + void logoutCurrentUser(AsyncCallback callback); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/WQInfoService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/WQInfoService.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.WQInfoObject; + +/** + * This service is used to fetch a list of DistanceInfoObjects from artifact + * server for a specific river. + * + * @author Raimund Renkert + */ +@RemoteServiceRelativePath("mainvalues") +public interface WQInfoService extends RemoteService { + + /** + * This method returns a list of DistanceInfoObjects for a specific river. + */ + WQInfoObject[] getWQInfo( + String locale, + String river, + double start, + double end) + throws ServerException; +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/services/WQInfoServiceAsync.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/services/WQInfoServiceAsync.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.client.services; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.shared.model.WQInfoObject; + + +/** + * @author Raimund Renkert + */ +public interface WQInfoServiceAsync { + + void getWQInfo( + String locale, + String river, + double start, + double end, + AsyncCallback cb); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/AbstractUIProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/AbstractUIProvider.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,341 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.HasStepBackHandlers; +import org.dive4elements.river.client.client.event.HasStepForwardHandlers; +import org.dive4elements.river.client.client.event.StepBackEvent; +import org.dive4elements.river.client.client.event.StepBackHandler; +import org.dive4elements.river.client.client.event.StepForwardEvent; +import org.dive4elements.river.client.client.event.StepForwardHandler; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.Collection; +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 java.util.ArrayList; +import java.util.List; + + +/** + * An abstract UIProvider that provides some basic methods. + * + * @author Ingo Weinzierl + */ +public abstract class AbstractUIProvider +implements UIProvider, HasStepForwardHandlers, ClickHandler, + HasStepBackHandlers +{ + private static final long serialVersionUID = -1610874613377494184L; + + /** The message class that provides i18n strings. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** The StepForwardHandlers. */ + protected List forwardHandlers; + + /** The StepForwardHandlers. */ + protected List backHandlers; + + /** The container that is used to position helper widgets. */ + protected VLayout helperContainer; + + /** The artifact that contains status information. */ + protected Artifact artifact; + + /** The Collection. */ + protected Collection collection; + + /** The ParameterList. */ + protected ParameterList parameterList; + + /** + * Creates a new UIProvider instance of this class. + */ + public AbstractUIProvider() { + forwardHandlers = new ArrayList(); + backHandlers = new ArrayList(); + } + + + /** + * Appends a StepBackHandler that wants to listen to StepBackEvents. + * + * @param handler A new StepBackHandler. + */ + @Override + public void addStepBackHandler(StepBackHandler handler) { + if (handler != null) { + backHandlers.add(handler); + } + } + + + /** + * Appends a StepForwardHandler that wants to listen to StepForwardEvents. + * + * @param handler A new StepForwardHandler. + */ + @Override + public void addStepForwardHandler(StepForwardHandler handler) { + if (handler != null) { + forwardHandlers.add(handler); + } + } + + + /** + * This method is called after the user has clicked one of the buttons to + * step back to a previous state. + * + * @param e The StepBackEvent. + */ + protected void fireStepBackEvent(StepBackEvent e) { + GWT.log("AbstractUIProvider - fireStepBackEvent() handlers: " + backHandlers.size()); + for (StepBackHandler handler: backHandlers) { + handler.onStepBack(e); + } + } + + + /** + * This method is called after the user has clicked on the 'next' button to + * step to the next state. + * + * @param e The StepForwardEvent. + */ + protected void fireStepForwardEvent(StepForwardEvent e) { + GWT.log("AbstractUIProvider - fireStepForwardEvent() handlers: " + forwardHandlers.size()); + for (StepForwardHandler handler: forwardHandlers) { + handler.onStepForward(e); + } + } + + + /** + * This method is used to listen to click events on the 'next' button. The + * fireStepForwardEvent() method is called here. + * + * @param e The click event. + */ + @Override + public void onClick(ClickEvent e) { + List errors = validate(); + if (errors == null || errors.isEmpty()) { + Data[] data = getData(); + fireStepForwardEvent(new StepForwardEvent(data)); + } + else { + showErrors(errors); + } + } + + + protected void showErrors(List errors) { + StringBuilder sb = new StringBuilder(); + + for (String error: errors) { + sb.append(error); + sb.append("
    "); + } + + SC.warn(sb.toString()); + } + + + /** + * Creates the 'next' button to step forward to the next state. + * + * @return the 'next' button. + */ + protected Canvas getNextButton() { + Button next = new Button(MSG.buttonNext()); + next.addClickHandler(this); + + return next; + } + + + @Override + public Canvas createHelpLink(DataList dataList, Data data) { + String iUrl = GWT.getHostPageBaseURL() + MSG.getFeatureInfo(); + String helpUrl = dataList.getHelpText(); + + return new ImgLink(iUrl, helpUrl, 30, 30, true); + } + + + /** + * Creates the 'back' button to step back to a previous state. + * + * @param targetState The identifier of the target state. + * + * @return the 'back' button. + */ + protected Canvas getBackButton(final String targetState) { + String url = GWT.getHostPageBaseURL() + MSG.imageBack(); + Img back = new Img(url, 16, 16); + + back.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + fireStepBackEvent(new StepBackEvent(targetState)); + } + }); + + return back; + } + + + /** + * This method injects a container that is used to position helper widgets. + * + * @param helperContainer A container that is used to position helper + * widgets. + */ + @Override + public void setContainer(VLayout helperContainer) { + this.helperContainer = helperContainer; + } + + + /** + * This method injects an artifact that contains the status information. + * + * @param art An artifact containing status information. + */ + @Override + public void setArtifact(Artifact art) { + this.artifact = art; + } + + + @Override + public void setCollection(Collection collection) { + this.collection = collection; + } + + + @Override + public void setParameterList(ParameterList list) { + this.parameterList = list; + } + + + public Collection getCollection() { + return collection; + } + + + /** + * This method greps the Data with name name from the list and + * returns it. + * + * @param items A list of Data. + * @param name The name of the Data that we are searching for. + * + * @return the Data with the name name. + */ + protected Data getData(List data, String name) { + for (Data d: data) { + if (name.equals(d.getLabel())) { + return d; + } + } + + return null; + } + + + protected String getDataValue(String state, String name) { + ArtifactDescription desc = artifact.getArtifactDescription(); + + DataList[] old = desc.getOldData(); + + for (DataList list: old) { + if (list == null) { + continue; + } + Data d = getData(list.getAll(), name); + + if (d != null) { + return d.getItems()[0].getStringValue(); + } + } + + return null; + } + + /** + * This method greps the DataItem with name name from the list and + * returns it. + * + * @param items A list of DataItems. + * @param name The name of the DataItem that we are searching for. + * + * @return the DataItem with the name name. + */ + protected DataItem getDataItem(DataItem[] items, String name) { + for (DataItem item: items) { + if (name.equals(item.getLabel())) { + return item; + } + } + + return null; + } + + + public List validate() { + return new ArrayList(); // FIXME: What's this? + } + + + /** Create simple DefaultData with single DataItem inside. */ + public static DefaultData createDataArray(String name, String value) { + DataItem item = new DefaultDataItem( + name, + name, + value); + + return new DefaultData(name, + null, + null, + new DataItem[] {item}); + } + + + /** + * This method needs to be implemented by concrete subclasses. It should + * create a new Canvas object with a representation of data. + * + * @param data The data that should be displayed. + * + * @return a Canvas object that displays data. + */ + @Override + public abstract Canvas create(DataList data); + + + /** + * This method needs to be implemented by concrete subclasses. It should + * return the selected data. + * + * @return the selected data. + */ + protected abstract Data[] getData(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/AutoIntegerPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/AutoIntegerPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,119 @@ +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.validator.CustomValidator; +import com.smartgwt.client.widgets.form.validator.Validator; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; + + +/** + * @author Ingo Weinzierl + */ +public class AutoIntegerPanel extends TextProvider { + + private static final long serialVersionUID = -6525461829035465820L; + + public static final String FIELD_NAME = "integer_field"; + + public static final String FIELD_DEFAULT_VALUE = "auto"; + + + protected static FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected String dataName; + + + @Override + public Canvas create(DataList dataList) { + Data data = dataList.get(0); + this.dataName = data.getLabel(); + + Canvas label = new Label(data.getDescription()); + Canvas form = createForm(getTitle()); + Canvas submit = getNextButton(); + + VLayout layout = new VLayout(); + layout.setHeight(35); + label.setHeight(35); + + layout.addMember(label); + layout.addMember(form); + layout.addMember(submit); + layout.setMembersMargin(10); + + initDefaultValues(dataList); + + return layout; + } + + + @Override + protected void initDefaultValues(DataList dataList) { + super.initDefaultValues(dataList); + + String def = getValueAsString(); + + if (def == null || def.length() == 0) { + form.setValue(getFieldName(), FIELD_DEFAULT_VALUE); + } + } + + + protected String getTitle() { + return MSG.uesk_profile_distance(); + } + + + @Override + protected String getDataName() { + return dataName; + } + + + @Override + protected String getValueAsString() { + String v = (String) form.getValue(getFieldName()); + return v.toLowerCase(); + } + + + @Override + protected Validator getValidator() { + Validator v = new AutoIntegerValidator(); + v.setValidateOnChange(false); + + return v; + } + + + public class AutoIntegerValidator extends CustomValidator { + @Override + protected boolean condition(Object value) { + String v = (String) value; + + if (v == null || v.length() == 0) { + return false; + } + + if (v.trim().equalsIgnoreCase("auto")) { + return true; + } + + try { + Integer.parseInt(v); + return true; + } + catch (NumberFormatException nfe) { + return false; + } + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/BooleanPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/BooleanPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,101 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.types.FieldType; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DataList; + +/** + * @author Ingo Weinzierl + */ +public class BooleanPanel extends TextProvider { + + private static final long serialVersionUID = -8448442865635399232L; + + public static final String FIELD_NAME = "boolean_field"; + public static final int TITLE_WIDTH = 0; + + protected String dataName; + + + @Override + public Canvas create(DataList dataList) { + Data data = dataList.get(0); + DataItem[] items = data.getItems(); + + this.dataName = data.getLabel(); + + VLayout layout = new VLayout(); + Label label = new Label(data.getDescription()); + Canvas form = createForm(getTitle(items[0])); + + layout.setMembersMargin(10); + layout.setHeight(35); + label.setHeight(35); + + layout.addMember(label); + layout.addMember(form); + layout.addMember(getNextButton()); + layout.setMembersMargin(10); + + initDefaultValues(dataList); + + return layout; + } + + + protected String getTitle(DataItem item) { + return item.getLabel(); + } + + + @Override + protected void initDefaultValues(DataList dataList) { + Data data = dataList.get(0); + DataItem item = data.getDefault(); + + String value = item.getStringValue(); + Boolean bool = Boolean.valueOf(value); + + if (bool) { + form.setValue(getFieldName(), bool); + } + } + + + @Override + protected FieldType getFieldType() { + return FieldType.BOOLEAN; + } + + + @Override + protected String getFieldName() { + return FIELD_NAME; + } + + + @Override + protected String getDataName() { + return dataName; + } + + + @Override + protected String getValueAsString() { + Boolean aBool = (Boolean) form.getValue(getFieldName()); + + return aBool != null ? aBool.toString() : "false"; + } + + + @Override + protected int getTitleWidth() { + return TITLE_WIDTH; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,790 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.util.SC; + +import com.smartgwt.client.widgets.Window; + +import com.smartgwt.client.widgets.events.CloseClickEvent; +import com.smartgwt.client.widgets.events.CloseClickHandler; + +import com.smartgwt.client.widgets.layout.Layout; +import com.smartgwt.client.widgets.layout.VLayout; + +import com.smartgwt.client.widgets.tab.TabSet; + +import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.client.FLYSConstants; + +import org.dive4elements.river.client.client.event.CollectionChangeEvent; +import org.dive4elements.river.client.client.event.CollectionChangeHandler; +import org.dive4elements.river.client.client.event.HasCollectionChangeHandlers; +import org.dive4elements.river.client.client.event.HasOutputModesChangeHandlers; +import org.dive4elements.river.client.client.event.OutputModesChangeEvent; +import org.dive4elements.river.client.client.event.OutputModesChangeHandler; +import org.dive4elements.river.client.client.event.ParameterChangeEvent; +import org.dive4elements.river.client.client.event.ParameterChangeHandler; + +import org.dive4elements.river.client.client.services.AddArtifactService; +import org.dive4elements.river.client.client.services.AddArtifactServiceAsync; +import org.dive4elements.river.client.client.services.ArtifactService; +import org.dive4elements.river.client.client.services.ArtifactServiceAsync; +import org.dive4elements.river.client.client.services.CollectionAttributeService; +import org.dive4elements.river.client.client.services.CollectionAttributeServiceAsync; +import org.dive4elements.river.client.client.services.CreateCollectionService; +import org.dive4elements.river.client.client.services.CreateCollectionServiceAsync; +import org.dive4elements.river.client.client.services.DescribeCollectionService; +import org.dive4elements.river.client.client.services.DescribeCollectionServiceAsync; +import org.dive4elements.river.client.client.services.LoadArtifactService; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; + +import org.dive4elements.river.client.client.ui.ScreenLock; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.ExportMode; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.ReportMode; +import org.dive4elements.river.client.shared.model.User; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Stack; + + +/** + * @author Ingo Weinzierl + */ +public class CollectionView +extends Window +implements CollectionChangeHandler, HasCollectionChangeHandlers, + OutputModesChangeHandler, HasOutputModesChangeHandlers, + ParameterChangeHandler, CloseClickHandler +{ + /** The ArtifactService used to communicate with the Artifact server. */ + protected CreateCollectionServiceAsync createCollectionService = + GWT.create(CreateCollectionService.class); + + /** The ArtifactService used to communicate with the Artifact server. */ + protected ArtifactServiceAsync createArtifactService = + GWT.create(ArtifactService.class); + + /** The AddArtifactService used to add an artifact to a collection. */ + protected AddArtifactServiceAsync addArtifactService = + GWT.create(AddArtifactService.class); + + /** The DescribeCollectionService used to update the existing collection. */ + protected DescribeCollectionServiceAsync describeCollectionService = + GWT.create(DescribeCollectionService.class); + + protected CollectionAttributeServiceAsync updater = + GWT.create(CollectionAttributeService.class); + + /** The LoadArtifactService used to load recommendations*/ + protected LoadArtifactServiceAsync loadArtifactService = + GWT.create(LoadArtifactService.class); + + /** The message class that provides i18n strings. */ + protected FLYSConstants messages = GWT.create(FLYSConstants.class); + + /** The FLYS instance used to call services. */ + protected FLYS flys; + + /** The ParameterList. */ + protected ParameterList parameterList; + + /** The list of CollectionChangeHandlers. */ + protected List handlers; + + /** The list of OutputModesChangeHandlers. */ + protected List outHandlers; + + /** The collection to be displayed. */ + protected Collection collection; + + /** The artifact that handles the parameterization. */ + protected Artifact artifact; + + protected TabSet tabs; + + /** The output tab. */ + protected Map outputTabs; + + /** The layout. */ + protected Layout layout; + + /** Layout to show spinning wheel of joy. */ + protected VLayout lockScreen; + + protected int artifactsQueue; + protected int recommendationQueue; + protected Stack newRecommendations; + + /** Values for fix analysis charts*/ + protected double currentKm; + protected double minKm; + protected double maxKm; + protected double steps; + + /** + * This constructor creates a new CollectionView that is used to display the + * collection. + */ + public CollectionView(FLYS flys) { + this.flys = flys; + this.tabs = new TabSet(); + this.outputTabs = new HashMap(); + this.handlers = new ArrayList(); + this.outHandlers = new ArrayList(); + this.layout = new VLayout(); + this.parameterList = new ParameterList( + flys, this, messages.new_project()); + this.artifactsQueue = 0; + this.recommendationQueue = 0; + this.newRecommendations = new Stack(); + + this.currentKm = -1d; + this.minKm = -1d; + this.maxKm = -1d; + this.steps = -1d; + + addCollectionChangeHandler(this); + addCollectionChangeHandler(parameterList); + addCollectionChangeHandler(flys); + addOutputModesChangeHandler(this); + addOutputModesChangeHandler(parameterList); + addCloseClickHandler(this); + + parameterList.addParameterChangeHandler(this); + + init(); + } + + /** + * @param collection The collection to be displayed. + */ + public CollectionView(FLYS flys, Collection collection, Artifact artifact) { + this.flys = flys; + this.artifact = artifact; + this.collection = collection; + this.tabs = new TabSet(); + this.outputTabs = new HashMap(); + this.handlers = new ArrayList(); + this.outHandlers = new ArrayList(); + this.layout = new VLayout(); + + this.currentKm = -1d; + this.minKm = -1d; + this.maxKm = -1d; + this.steps = -1d; + + if (artifact != null) { + this.parameterList = new ParameterList( + flys, + this, + messages.getString(artifact.getName()), + artifact); + } + else { + this.parameterList = new ParameterList( + flys, this, messages.new_project()); + } + + this.artifactsQueue = 0; + this.newRecommendations = new Stack(); + + addCollectionChangeHandler(this); + addCollectionChangeHandler(parameterList); + addCollectionChangeHandler(flys); + addOutputModesChangeHandler(this); + addOutputModesChangeHandler(parameterList); + addCloseClickHandler(this); + + parameterList.addParameterChangeHandler(this); + + init(); + + setCollection(collection); + + if (artifact != null) { + setArtifact(artifact); + } + } + + + /** + * This method handles the initial layout stuff. + */ + protected void init() { + setWidth(1010); + setHeight(700); + + setMaximized(true); + + layout.setWidth100(); + + setCanDragReposition(true); + setCanDragResize(true); + setShowMaximizeButton(true); + setKeepInParentRect(true); + + setTitle(""); + + addItem(layout); + + layout.addMember(tabs); + tabs.addTab(parameterList); + } + + protected FLYS getFlys() { + return flys; + } + + + /** + * This method registers a new CollectionChangeHandler. + * + * @param handler The new CollectionChangeHandler. + */ + @Override + public void addCollectionChangeHandler(CollectionChangeHandler handler) { + if (handler != null) { + handlers.add(handler); + } + } + + + /** + * This method registers a new OutputModesChangeHandler. + * + * @param handler The new OutputModesChangeHandler. + */ + @Override + public void addOutputModesChangeHandler(OutputModesChangeHandler handler) { + if (handler != null) { + outHandlers.add(handler); + } + } + + + /** + * This method calls the onValueChange() method of all + * registered ValueChangeHanders. + */ + protected void fireCollectionChangeEvent( + Collection old, Collection newCol) + { + for (CollectionChangeHandler handler: handlers) { + handler.onCollectionChange(new CollectionChangeEvent(old, newCol)); + } + } + + + protected void fireOutputModesChangeEvent(OutputMode[] outputs) { + if (collection == null) { + return; + } + + for (OutputModesChangeHandler handler: outHandlers) { + handler.onOutputModesChange(new OutputModesChangeEvent(outputs)); + } + } + + + /** Disables input, grey out, show spinning wheel of joy. */ + public void lockUI() { + lockScreen = ScreenLock.lockUI(layout, lockScreen); + } + + + /** Enable input, remove grey, remove spinning wheel of joy. */ + public void unlockUI() { + ScreenLock.unlockUI(layout, lockScreen); + } + + + /** + * This method returns true, if the Collection is new and no plugins has + * been chosen. + * + * @return true, if the Collection is new. + */ + public boolean isNew() { + return collection.hasItems(); + } + + + /** + * Returns the artifact that is used for the parameterization. + * + * @return the artifact that is used for the parameterization. + */ + public Artifact getArtifact() { + return artifact; + } + + + public User getUser() { + return getFlys().getCurrentUser(); + } + + + /** + * Set the current artifact that is the master of the parameterization. + * + * @param artifact The new artifact. + */ + public void setArtifact(Artifact artifact) { + this.artifact = artifact; + + onArtifactChanged(artifact); + } + + + public void onArtifactChanged(Artifact artifact) { + artifactChanged(); + + if (artifact.isInBackground()) { + LoadingPanel p = new LoadingPanel(this, artifact); + p.addStepBackHandler(parameterList); + } + } + + + /** + * Implements the onCollectionChange() method to do update the GUI after the + * parameterization has changed. + * + * @param event The ParameterChangeEvent. + */ + @Override + public void onParameterChange(ParameterChangeEvent event) { + GWT.log("CollectionView.onParameterChange"); + setArtifact(event.getNewValue()); + } + + + protected void artifactChanged() { + Collection c = getCollection(); + + if (c != null) { + loadCollection(c); + } + else { + updateView(); + } + } + + /** + * Loads all information of a collection + * @param c the Collection + */ + private void loadCollection(Collection c) { + ArtifactDescription desc = getArtifact().getArtifactDescription(); + final Recommendation[] recom = desc.getRecommendations(); + Config config = Config.getInstance(); + String locale = config.getLocale(); + + describeCollectionService.describe(c.identifier(), locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not DESCRIBE collection."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection newCollection) { + GWT.log("Successfully DESCRIBED collection."); + boolean loaded = true; + for (Recommendation r: recom) { + if(!newCollection.loadedRecommendation(r)) { + loaded = false; + } + } + if (!loaded) { + loadRecommendedArtifacts(recom); + } + else { + setCollection(newCollection); + } + } + } + ); + } + + + /** + * Returns the collection of displayed by this view. + * + * @return the collection of this view. + */ + public Collection getCollection() { + return collection; + } + + + protected void setCollection(Collection collection) { + setCollection(collection, false); + } + + + /** + * Set the current collection. + * + * @param collection The new collection. + * @param suppress Whether to fire a collectionchangeevent. + */ + protected void setCollection(Collection collection, boolean suppress) { + if (collection != null && this.collection == null) { + flys.getWorkspace().addView(collection.identifier(), this); + } + + Collection tmp = this.collection; + this.collection = collection; + + setTitle(collection.getDisplayName()); + + if (!suppress) { + fireCollectionChangeEvent(tmp, this.collection); + } + } + + + @Override + public void onCollectionChange(CollectionChangeEvent event) { + if (artifactsQueue > 0) { + GWT.log("Do not update UI because we are still loading Artifacts."); + return; + } + + Collection newCol = event.getNewValue(); + + Map outs = newCol.getOutputModes(); + + Set keys = outs.keySet(); + OutputMode[] prepared = new OutputMode[outs.size()]; + + int idx = 0; + for (String outname: keys) { + prepared[idx++] = outs.get(outname); + } + + fireOutputModesChangeEvent(prepared); + + updateView(); + } + + + @Override + public void onOutputModesChange(OutputModesChangeEvent event) { + clearOutputTabs(); + OutputMode[] outs = event.getOutputModes(); + + if (outs == null) { + return; + } + + boolean hasCSV = false; + + for (OutputMode out: outs) { + addOutputTab(out.getName(), out); + + if (out instanceof ExportMode) { + ExportMode export = (ExportMode) out; + + if (export.getFacet("csv") != null) { + hasCSV = true; + parameterList.contractInfoPanel(); + } + } + } + + if (!hasCSV) { + parameterList.removeTable(); + } + } + + + /** + * Adds a new tab for the OutputMode out. + * + * @param name The name and title of the output. + */ + protected void addOutputTab(String name, OutputMode out) { + if (out instanceof ExportMode) { + ExportMode export = (ExportMode) out; + + if (export.getFacet("csv") != null && !parameterList.hasTable()) { + TableDataPanel p = new TableDataPanel(); + p.setUuid(collection.identifier()); + p.setName(out.getName()); + parameterList.setTable(p); + } + + return; + } + + if (out instanceof ReportMode) { + // we don't want to display report modes at all + return; + } + + GWT.log("Add new output tab for '" + name + "'"); + + String title = messages.getString(name); + OutputTab tab = out.createOutputTab(title, getCollection(), this); + + if (tab != null) { + outputTabs.put(name, tab); + } + } + + + /** + * Removes all output mode tabs from tab bar. + */ + protected void clearOutputTabs() { + GWT.log("Clear OutputTabs."); + + int num = tabs.getNumTabs(); + + for (int i = num-1; i >= 1; i--) { + tabs.removeTab(i); + } + + outputTabs.clear(); + } + + + /** + * Update the view (refresh the list of old and current data). + */ + protected void updateView() { + GWT.log("CollectionView.updateView()"); + updateOutputTabs(); + } + + + /** + * This method is used to update the tabs to show specific output modes. + */ + protected void updateOutputTabs() { + GWT.log("Update output tabs."); + if (outputTabs != null) { + Set keys = outputTabs.keySet(); + + for (String key: keys) { + tabs.addTab(outputTabs.get(key)); + } + } + } + + + @Override + public void onCloseClick(CloseClickEvent event) { + if (collection != null) { + if(artifact != null) { + flys.closeProject(collection.identifier()); + } + else { + flys.getProjectList().deleteCollection(collection); + } + } + else { + hide(); + destroy(); + } + } + + + public void addArtifactToCollection(Artifact artifact) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + final Collection collection = getCollection(); + + GWT.log("CollectionView.addArtifactToCollection " + collection); + + if (collection != null) { + addArtifactService.add( + collection, artifact, locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("An error occured while adding artifact."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection newCollection) { + GWT.log("Successfully added artifacts."); + setCollection(newCollection, true); + } + } + ); + } + else { + // Create new collection and add artifact + final Artifact art = artifact; + createCollectionService.create( + locale, + flys.getCurrentUser().identifier(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not create the new collection."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection collection) { + GWT.log("Successfully created a new collection."); + addArtifactService.add( + collection, art, locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("An error occured while adding artifact."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection newCollection) { + GWT.log("Successfully added artifacts."); + setCollection(newCollection); + } + } + ); + } + } + ); + } + } + + + protected void addRecommendationsToCollection() { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + final Collection collection = getCollection(); + + collection.addRecommendations(newRecommendations); + + updater.update(collection, locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + newRecommendations.removeAllElements(); + setCollection(collection); + + GWT.log("An error occured while saving recommendations."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection newCol) { + GWT.log("Successfully saved recommendations."); + newRecommendations.removeAllElements(); + setCollection(newCol); + } + } + ); + } + + + protected void loadRecommendedArtifacts(Recommendation[] recommendations) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + final Collection collection = getCollection(); + + Artifact masterArtifact = getArtifact(); + + if (recommendations == null) { + GWT.log("WARNING: Currently no recommendations."); + return; + } + + for (final Recommendation recommendation: recommendations) { + if (collection.loadedRecommendation(recommendation)) { + continue; + } + newRecommendations.push(recommendation); + + // XXX: UGLY! If no reference artifact given use uuid of + // current artifact as reference. + if (recommendation.getMasterArtifact() == null) { + recommendation.setMasterArtifact(masterArtifact.getUuid()); + } + + } + + loadArtifactService.loadMany( + collection, + recommendations, + null, + locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Error loading recommendations: " + + caught.getMessage()); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Artifact[] artifacts) { + GWT.log("Loaded artifacts: " + artifacts.length); + addRecommendationsToCollection(); + } + }); + } + + + public void registerTabHandler(TabSelectedHandler tse) { + tabs.addTabSelectedHandler(tse); + } + + + public void setCurrentKm(double currentKm) { + this.currentKm = currentKm; + } + + public double getCurrentKm() { + return this.currentKm; + } + + public void setMinKm(double km) { + this.minKm = km; + } + + public double getMinKm() { + return this.minKm; + } + + public void setMaxKm(double km) { + this.maxKm = km; + } + + public double getMaxKm() { + return this.maxKm; + } + + public void setSteps(double step) { + this.steps = step; + } + + public double getSteps() { + return this.steps; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ContinuePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ContinuePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,92 @@ +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.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.LinkItem; +import com.smartgwt.client.widgets.form.fields.events.ClickEvent; +import com.smartgwt.client.widgets.form.fields.events.ClickHandler; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.AdvanceHandler; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; + +import java.util.ArrayList; +import java.util.List; + + +/** + * @author Ingo Weinzierl + */ +public class ContinuePanel extends AbstractUIProvider { + + private static final long serialVersionUID = -5882814816875137397L; + + protected static FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected List advHandlers; + + + @Override + public Canvas create(DataList dataList) { + DynamicForm form = new DynamicForm(); + form.setWidth(200); + form.setHeight(35); + + LinkItem next = new LinkItem(); + next.setShowTitle(false); + next.setLinkTitle(MSG.next()); + + final ArtifactDescription desc = artifact.getArtifactDescription(); + final String[] reachable = desc.getReachableStates(); + + next.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + fireOnAdvance(reachable[0]); + } + }); + + form.setFields(next); + + return form; + } + + + @Override + public Canvas createOld(DataList dataList) { + return null; + } + + + @Override + protected Data[] getData() { + return new Data[0]; + } + + + public void addAdvanceHandler(AdvanceHandler handler) { + if (advHandlers == null) { + advHandlers = new ArrayList(); + } + + if (handler != null) { + advHandlers.add(handler); + } + } + + + public void fireOnAdvance(String target) { + if (advHandlers == null || advHandlers.isEmpty()) { + return; + } + + for (AdvanceHandler handler: advHandlers) { + handler.onAdvance(target); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageButton.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageButton.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,49 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.events.CloseClickHandler; +import com.smartgwt.client.widgets.events.CloseClickEvent; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.User; + +/** Button that opens view of datacage (DataCageWindow). */ +public class DatacageButton extends Button implements ClickHandler { + + protected Artifact artifact; + protected User user; + protected CollectionView view; + + public DatacageButton( + String title, + Artifact artifact, + User user, + CollectionView view + ) { + super(title); + + this.artifact = artifact; + this.user = user; + this.view = view; + + addClickHandler(this); + } + + + public void onClick(ClickEvent event) { + // TODO: fetch outs! + String outs = ""; + + final DatacageWindow dc = new DatacageWindow( + artifact, user, outs, view); + dc.addCloseClickHandler(new CloseClickHandler() { + public void onCloseClick(CloseClickEvent event) { + dc.destroy(); + } + }); + dc.show(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacagePairWidget.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacagePairWidget.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,107 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.ToLoad; +import org.dive4elements.river.client.shared.model.User; + + +/** + * Widget showing two Datacages and a add-this-button. + * Insert a record into a listgrid when add-this-button clicked. + */ +public class DatacagePairWidget +extends VLayout +{ + /** i18n resource. */ + protected FLYSConstants MSG = + GWT.create(FLYSConstants.class); + + /** The "remote" ListGrid to insert data to when add-button is clicked. */ + protected ListGrid grid; + + /** First (upper) DataCage Grid. */ + protected DatacageWidget firstDatacageWidget; + + /** Second (lower) DataCage Grid. */ + protected DatacageWidget secondDatacageWidget; + + + /** + * + * @param artifact Artifact to query datacage with. + * @param user User to query datacage with. + * @param outs outs to query datacage with. + * @param grid Grid into which to insert selection of pairs. + */ + public DatacagePairWidget(Artifact artifact, + User user, + String outs, + ListGrid grid) { + this.grid = grid; + + HLayout hLayout = new HLayout(); + firstDatacageWidget = new DatacageWidget( + artifact, + user, + outs, + "load-system:true", + false); + secondDatacageWidget = new DatacageWidget( + artifact, + user, + outs, + "load-system:true", + false); + firstDatacageWidget.setIsMutliSelectable(false); + secondDatacageWidget.setIsMutliSelectable(false); + + hLayout.addMember(firstDatacageWidget); + hLayout.addMember(secondDatacageWidget); + + // TODO: icon + Button plusBtn = new Button(MSG.datacage_add_pair()); + plusBtn.setAutoFit(true); + plusBtn.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + plusClicked(); + } + }); + + addMember(hLayout); + addMember(plusBtn); + } + + + /** + * Callback for add-button. + * Fires to load for every selected element and handler. + */ + public void plusClicked() { + ToLoad toLoad1 = firstDatacageWidget.getSelection(); + ToLoad toLoad2 = secondDatacageWidget.getSelection(); + + if (toLoad1 == null || toLoad2 == null || + toLoad1.toRecommendations().isEmpty() || + toLoad2.toRecommendations().isEmpty()) { + SC.say(MSG.warning_select_two_values()); + return; + } + + grid.addData(new RecommendationPairRecord( + toLoad1.toRecommendations().get(0), + toLoad2.toRecommendations().get(0))); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacagePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacagePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,94 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.User; + +import java.util.ArrayList; +import java.util.List; + + +/** + * @author Ingo Weinzierl + */ +public abstract class DatacagePanel extends TextProvider { + + private static final long serialVersionUID = 6937994648371673222L; + + protected String dataName; + + protected User user; + + protected DatacageWidget widget; + + + public DatacagePanel() { + super(); + } + + + public DatacagePanel(User user) { + super(); + this.user = user; + } + + + @Override + public Canvas create(DataList dataList) { + Data data = dataList.get(0); + this.dataName = data.getLabel(); + + createWidget(); + + Canvas label = new Label(data.getDescription()); + Canvas submit = getNextButton(); + VLayout layout = new VLayout(); + label.setHeight(25); + + layout.addMember(label); + layout.addMember(submit); + layout.setMembersMargin(10); + + return layout; + } + + + protected void createWidget() { + widget = new DatacageWidget( + artifact, + getUser(), + getOuts(), + getParameters(), + false); + + widget.setHeight100(); + + helperContainer.addMember(widget); + } + + + @Override + public List validate() { + return new ArrayList(); + } + + + public User getUser() { + return user; + } + + + public String getOuts() { + return null; + } + + + public String getParameters() { + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageTwinPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageTwinPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,492 @@ +package org.dive4elements.river.client.client.ui; + +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.widgets.Canvas; +import com.smartgwt.client.widgets.events.ClickEvent; +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; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.StepForwardEvent; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; +import org.dive4elements.river.client.client.services.RemoveArtifactServiceAsync; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +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.Recommendation; +import org.dive4elements.river.client.shared.model.Recommendation.Facet; +import org.dive4elements.river.client.shared.model.Recommendation.Filter; +import org.dive4elements.river.client.shared.model.User; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +// TODO Probably better to branch off AbstractUIProvider. +// TODO Merge with other datacage-widget impls. +/** + * Panel containing a Grid and a "next" button. The Grid is fed by a + * DatacagePairWidget which is put in the input-helper area. + */ +public class DatacageTwinPanel +extends TextProvider { + + private static final long serialVersionUID = 8906629596491827857L; + + protected static FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected String dataName; + + protected User user; + + /** ListGrid that displays user-selected pairs to build differences with. */ + protected ListGrid differencesList; + + /** + * List to track previously selected but now removed pairs. (Needed to + * be able to identify artifacts that can be removed from the collection. + */ + protected List removedPairs = + new ArrayList(); + + /** Service handle to clone and add artifacts to collection. */ + LoadArtifactServiceAsync loadArtifactService = GWT.create( + org.dive4elements.river.client.client.services.LoadArtifactService.class); + + /** Service to remove artifacts from collection. */ + RemoveArtifactServiceAsync removeArtifactService = GWT.create( + org.dive4elements.river.client.client.services.RemoveArtifactService.class); + + + public DatacageTwinPanel(User user) { + super(); + this.user = user; + } + + + /** + * Remove first occurrence of "[" and "]" (if both do occur). + * @param value String to be stripped of [] (might be null). + * @return input string but with [ and ] removed, or input string if no + * brackets were found. + * @see StringUtil.unbracket + */ + public static final String unbracket(String value) { + // null- guard. + if (value == null) return value; + + int start = value.indexOf("["); + int end = value.indexOf("]"); + + if (start < 0 || end < 0) { + return value; + } + + value = value.substring(start + 1, end); + + return value; + } + + + /** + * Create a recommendation from a string representation of it. + * @TODO describe format of input string + * @param from string in format as shown above. + * @return recommendation from input string. + */ + public Recommendation createRecommendationFromString(String from) { + // TODO Construct "real" filter. + String[] parts = unbracket(from).split(";"); + Recommendation.Filter filter = new Recommendation.Filter(); + Recommendation.Facet facet = new Recommendation.Facet( + parts[1], + parts[2]); + + List facets = new ArrayList + (); + facets.add(facet); + filter.add("longitudinal_section", facets); + Recommendation r = new Recommendation("waterlevel", parts[0], + this.artifact.getUuid(), filter); + r.setDisplayName(parts[3]); + return r; + } + + + /** + * Add RecomendationPairRecords from input String to the ListGrid. + */ + public void populateGridFromString(String from){ + // Split this string. + // Create according recommendations and display strings. + String[] recs = from.split("#"); + if (recs.length % 2 != 0) return; + for (int i = 0; i < recs.length; i+=2) { + Recommendation minuend = + createRecommendationFromString(recs[i+0]); + Recommendation subtrahend = + createRecommendationFromString(recs[i+1]); + + RecommendationPairRecord pr = new RecommendationPairRecord( + minuend, subtrahend); + // This Recommendation Pair comes from the data string and was thus + // already cloned. + pr.setIsAlreadyLoaded(true); + this.differencesList.addData(pr); + } + } + + + /** + * Creates the graphical representation and interaction widgets for the data. + * @param dataList the data. + * @return graphical representation and interaction widgets for data. + */ + @Override + public Canvas create(DataList dataList) { + GWT.log("createData()"); + + Canvas widget = createWidget(); + Canvas submit = getNextButton(); + + VLayout layout = new VLayout(); + HLayout helperLayout = new HLayout(); + helperLayout.addMember(new DatacagePairWidget(this.artifact, + user, "waterlevels", differencesList)); + + layout.addMember(widget); + layout.addMember(submit); + layout.setMembersMargin(10); + this.helperContainer.addMember(helperLayout); + + // Find old data, if any, handle "diffids". + Data data = dataList.get(0); + this.dataName = data.getLabel(); + for (int i = 0; i < dataList.size(); i++) { + if (dataList.get(i) != null && dataList.get(i).getItems() != null) { + if (dataList.get(i).getItems() != null) { + populateGridFromString( + dataList.get(i).getItems()[0].getStringValue()); + } + } + } + + return layout; + } + + + /** + * Validates the selection. + * @return List of internationalized errror messages (if any). + */ + @Override + public List validate() { + List errors = new ArrayList(); + if (differencesList.getRecords().length == 0) { + errors.add(MSG.error_no_waterlevel_pair_selected()); + } + // Check whether minuend and subtrahend are equal. + for (ListGridRecord record: differencesList.getRecords()) { + RecommendationPairRecord r = (RecommendationPairRecord) record; + if (r.getFirst().equals(r.getSecond())) { + errors.add(MSG.error_same_waterlevels_in_pair()); + } + } + + return errors; + } + + + /** + * Creates layout with grid that displays selection inside. + */ + public Canvas createWidget() { + VLayout layout = new VLayout(); + differencesList = new ListGrid(); + + differencesList.setCanEdit(false); + differencesList.setCanSort(false); + differencesList.setShowHeaderContextMenu(false); + differencesList.setHeight(150); + differencesList.setShowAllRecords(true); + + ListGridField nameField = new ListGridField("first", "Minuend"); + ListGridField capitalField = new ListGridField("second", "Subtrahend"); + // Track removed rows, therefore more or less reimplement + // setCanRecomeRecords. + final ListGridField removeField = + new ListGridField("_removeRecord", "Remove Record"){{ + setType(ListGridFieldType.ICON); + setIcon(GWT.getHostPageBaseURL() + MSG.removeFeature()); + setCanEdit(false); + setCanFilter(false); + setCanSort(false); + setCanGroupBy(false); + setCanFreeze(false); + setWidth(25); + }}; + + differencesList.setFields(new ListGridField[] {nameField, + capitalField, removeField}); + + differencesList.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent event) { + // Just handle remove-clicks + if(!event.getField().getName().equals(removeField.getName())) { + return; + } + trackRemoved(event.getRecord()); + event.getViewer().removeData(event.getRecord()); + } + }); + layout.addMember(differencesList); + + return layout; + } + + + /** + * Add record to list of removed records. + */ + public void trackRemoved(Record r) { + RecommendationPairRecord pr = (RecommendationPairRecord) r; + this.removedPairs.add(pr); + } + + + /** + * Validates data, does nothing if invalid, otherwise clones new selected + * waterlevels and add them to collection, forward the artifact. + */ + @Override + public void onClick(ClickEvent e) { + GWT.log("DatacageTwinPanel.onClick"); + + List errors = validate(); + if (errors != null && !errors.isEmpty()) { + showErrors(errors); + return; + } + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + ListGridRecord[] records = differencesList.getRecords(); + + List ar = new ArrayList(); + List all = new ArrayList(); + + for (ListGridRecord record : records) { + RecommendationPairRecord r = + (RecommendationPairRecord) record; + // Do not add "old" recommendations. + if (!r.isAlreadyLoaded()) { + // Check whether one of those is a dike or similar. + // TODO differentiate and merge: new clones, new, old. + Recommendation firstR = r.getFirst(); + if(firstR.getIDs() != null) { + GWT.log("First IDs: " + firstR.getIDs() + " factory: " + + firstR.getFactory()); + } + if(firstR.getIDs() != null) { + // These do not get cloned but loaded ("spawned"). + firstR.setFactory("staticwkms"); + } + else { + firstR.setFactory("waterlevel"); + } + Recommendation secondR = r.getSecond(); + if(secondR.getIDs() != null) { + GWT.log("Second IDs: " + secondR.getIDs() + " factory: " + + secondR.getFactory()); + } + if (secondR.getIDs() != null) { + // These do not get cloned but loaded ("spawned"). + secondR.setFactory("staticwkms"); + } + else { + secondR.setFactory("waterlevel"); + } + + ar.add(firstR); + ar.add(secondR); + } + else { + all.add(r.getFirst()); + all.add(r.getSecond()); + } + } + + final Recommendation[] toClone = ar.toArray(new Recommendation[ar.size()]); + final Recommendation[] toUse = all.toArray(new Recommendation[all.size()]); + + // Find out whether "old" artifacts have to be removed. + List artifactIdsToRemove = new ArrayList(); + for (RecommendationPairRecord rp: this.removedPairs) { + Recommendation first = rp.getFirst(); + Recommendation second = rp.getSecond(); + + for (Recommendation recommendation: toUse) { + if (first != null && first.getIDs().equals(recommendation.getIDs())) { + first = null; + } + if (second != null && second.getIDs().equals(recommendation.getIDs())) { + second = null; + } + + if (first == null && second == null) { + break; + } + } + if (first != null) { + artifactIdsToRemove.add(first.getIDs()); + } + if (second != null) { + artifactIdsToRemove.add(second.getIDs()); + } + } + + // Remove old artifacts, if any. Do this asychronously without much + // feedback. + for(final String uuid: artifactIdsToRemove) { + removeArtifactService.remove(this.collection, + uuid, + locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("RemoveArtifact (" + uuid + ") failed."); + } + @Override + public void onSuccess(Collection collection) { + GWT.log("RemoveArtifact succeeded"); + } + }); + } + + // Clone new ones (and spawn statics), go forward. + loadArtifactService.loadMany( + this.collection, + toClone, + //"staticwkms" and "waterlevel" + null, + locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Failure of cloning with factories!"); + } + @Override + public void onSuccess(Artifact[] artifacts) { + GWT.log("Successfully cloned " + toClone.length + + " with factories."); + + fireStepForwardEvent(new StepForwardEvent( + getData(toClone, artifacts, toUse))); + } + }); + } + + + /** + * Create Data and DataItem from selection (a long string with identifiers + * to construct diff-pairs). + * + * @param newRecommendations "new" recommendations (did not survive a + * backjump). + * @param newArtifacts artifacts cloned from newRecommendations. + * @param oldRecommendations old recommendations that survived a backjump. + * + * @return dataitem with a long string with identifiers to construct + * diff-pairs. + */ + protected Data[] getData( + Recommendation[] newRecommendations, + Artifact[] newArtifacts, + Recommendation[] oldRecommendations) + { + // Construct string with info about selections. + String dataItemString = ""; + for (int i = 0; i < newRecommendations.length; i++) { + Recommendation r = newRecommendations[i]; + Artifact newArtifact = newArtifacts[i]; + String uuid = newArtifact.getUuid(); + r.setMasterArtifact(uuid); + if (i>0) dataItemString += "#"; + + dataItemString += createDataString(uuid, r); + } + + for (int i = 0; i < oldRecommendations.length; i++) { + Recommendation r = oldRecommendations[i]; + String uuid = r.getIDs(); + if (dataItemString.length() > 0) dataItemString += "#"; + + dataItemString += createDataString(uuid, r); + } + + // TODO some hassle could be resolved by using multiple DataItems + // (e.g. one per pair). + DataItem item = new DefaultDataItem(dataName, dataName, dataItemString); + return new Data[] { new DefaultData( + dataName, null, null, new DataItem[] {item}) }; + } + + + /** + * Creates part of the String that encodes minuend or subtrahend. + * @param artifact Artifacts UUID. + * @param recommendation Recommendation to wrap in string. + */ + protected String createDataString( + String artifact, + Recommendation recommendation) + { + Filter filter = recommendation.getFilter(); + Facet f = null; + + if(filter != null) { + Map> outs = filter.getOuts(); + Set>> entries = outs.entrySet(); + + for (Map.Entry> entry: entries) { + List fs = entry.getValue(); + + f = fs.get(0); + if (f != null) { + break; + } + } + + return "[" + artifact + ";" + + f.getName() + + ";" + + f.getIndex() + + ";" + + recommendation.getDisplayName() + "]"; + } + else { + return "[" + + artifact + + ";staticwkms;0;" + + recommendation.getDisplayName() + "]"; + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageWidget.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageWidget.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,504 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.SelectionStyle; +import com.smartgwt.client.types.TreeModelType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.grid.HoverCustomizer; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent; +import com.smartgwt.client.widgets.grid.events.RecordDoubleClickHandler; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tree.Tree; +import com.smartgwt.client.widgets.tree.TreeGrid; +import com.smartgwt.client.widgets.tree.TreeNode; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.DatacageDoubleClickHandler; +import org.dive4elements.river.client.client.event.DatacageHandler; +import org.dive4elements.river.client.client.services.MetaDataService; +import org.dive4elements.river.client.client.services.MetaDataServiceAsync; +import org.dive4elements.river.client.client.ui.ScreenLock; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.AttrList; +import org.dive4elements.river.client.shared.model.DataCageNode; +import org.dive4elements.river.client.shared.model.DataCageTree; +import org.dive4elements.river.client.shared.model.ToLoad; +import org.dive4elements.river.client.shared.model.User; + +import java.util.ArrayList; +import java.util.List; +import java.util.MissingResourceException; +import java.util.Stack; + +// TODO: refactor, extract ~DataCageGrid +/** + * Display tree of, for example, previous calculations and allows + * selection in order to access/clone these. + */ +public class DatacageWidget +extends VLayout +{ + public static final int MAX_OPEN = 30; + + protected MetaDataServiceAsync metaDataService = + GWT.create(MetaDataService.class); + + protected FLYSConstants messages = + GWT.create(FLYSConstants.class); + + protected Artifact artifact; + protected User user; + protected String outs; + protected String parameters; + + protected TreeGrid treeGrid; + protected Tree tree; + + protected ToLoad toLoad; + + protected List handlers; + protected List doubleHandlers; + + /** Layout to show spinning wheel of joy. */ + protected VLayout lockScreen; + + + public DatacageWidget() { + handlers = new ArrayList(); + doubleHandlers = new ArrayList(); + } + + + public DatacageWidget(Artifact artifact, User user) { + this(artifact, user, null); + } + + public DatacageWidget(Artifact artifact, User user, String outs) { + this(artifact, user, outs, true); + } + + public DatacageWidget( + Artifact artifact, + User user, + String outs, + boolean showButton + ) { + this(artifact, user, outs, null, showButton); + } + + + public DatacageWidget( + Artifact artifact, + User user, + String outs, + String parameters, + boolean showButton + ) { + this(); + + this.artifact = artifact; + this.user = user; + this.outs = outs; + this.parameters = parameters; + + toLoad = new ToLoad(); + + setWidth100(); + + tree = new Tree(); + tree.setModelType(TreeModelType.CHILDREN); + tree.setNameProperty("name"); + tree.setIdField("id"); + tree.setChildrenProperty("children-nodes"); + tree.setShowRoot(false); + + treeGrid = new TreeGrid(); + treeGrid.setLoadDataOnDemand(false); + treeGrid.setWidth100(); + treeGrid.setHeight100(); + treeGrid.setShowRoot(false); + treeGrid.setNodeIcon("[SKIN]/../blank.gif"); + treeGrid.setShowConnectors(true); + treeGrid.setLoadingMessage(messages.databasket_loading()); + treeGrid.setEmptyMessage(messages.databasket_loading()); + treeGrid.setLoadingDataMessage(messages.databasket_loading()); + + treeGrid.setHoverMoveWithMouse(true); + treeGrid.setCanHover(true); + treeGrid.setShowHover(true); + treeGrid.setHoverOpacity(75); + treeGrid.setHoverWidth(120); + + treeGrid.setHoverCustomizer(new HoverCustomizer() { + @Override + public String hoverHTML(Object value, + ListGridRecord record, + int rowNum, + int colNum + ) { + if(record instanceof TreeNode) { + TreeNode hoveredTreeNode = (TreeNode)record; + String info = hoveredTreeNode.getAttribute("info"); + if (info == null) { + info = hoveredTreeNode.getName(); + } + return info; + } + else { + return "";// should not happen + } + } + }); + + treeGrid.addRecordDoubleClickHandler(new RecordDoubleClickHandler() { + @Override + public void onRecordDoubleClick(RecordDoubleClickEvent event) { + doubleClickedOnTree(event); + } + }); + + addMember(treeGrid); + + if (showButton) { + addMember(createPlusButton()); + } + + triggerTreeBuilding(); + } + + public void lockUI() { + lockScreen = ScreenLock.lockUI(this, lockScreen); + } + + /** Enable input, remove grey, remove spinning wheel of joy. */ + public void unlockUI() { + ScreenLock.unlockUI(this, lockScreen); + } + + /** + * @param handler Handler to be added (notified on add-action). + */ + public DatacageWidget(Artifact artifact, User user, String outs, + DatacageHandler handler) { + this(artifact, user, outs); + this.addDatacageHandler(handler); + } + + + public DatacageWidget( + Artifact artifact, + User user, + String outs, + DatacageHandler handler, + String parameters + ) { + this(artifact, user, outs, handler); + this.parameters = parameters; + } + + + /** + * Sets whether more than one item can be selected. + * @param multi if true, allow mutliple selections. + */ + public void setIsMutliSelectable(boolean multi) { + if (multi) { + treeGrid.setSelectionType(SelectionStyle.MULTIPLE); + } + else { + treeGrid.setSelectionType(SelectionStyle.SINGLE); + } + } + + + /** + * @param handler Handler to be added (notified on add-action). + */ + public void addDatacageHandler(DatacageHandler handler) { + if (!handlers.contains(handler)) { + handlers.add(handler); + } + } + + + /** + * @param h Handler to be added (notified on Double click on node). + */ + public void addDatacageDoubleClickHandler(DatacageDoubleClickHandler h) { + if (!doubleHandlers.contains(h)) { + doubleHandlers.add(h); + } + } + + + /** + * @param handler Handler to remove from list. + */ + public void removeDatacageHandler(DatacageHandler handler) { + handlers.remove(handler); + } + + + public ToLoad getToLoad() { + return toLoad; + } + + + public ToLoad getSelection() { + // Reset content of toLoads. + toLoad = new ToLoad(); + + if (treeGrid == null) { + return toLoad; + } + + ListGridRecord [] selection = treeGrid.getSelectedRecords(); + + if (selection != null) { + for (ListGridRecord record: selection) { + if (record instanceof TreeNode) { + collectToLoads((TreeNode)record); + } + } + } + + return toLoad; + } + + + /** + * Returns the titles of selected items (if any). + */ + public String[] getSelectionTitles() { + if (treeGrid == null) { + return new String[] {}; + } + + ListGridRecord [] selection = treeGrid.getSelectedRecords(); + + if (selection == null) { + return new String[] {}; + } + + List titleList = new ArrayList(); + for (ListGridRecord record: selection) { + if (record instanceof TreeNode) { + titleList.add(((TreeNode)record).getAttribute("name")); + } + } + + return titleList.toArray(new String[titleList.size()]); + } + + + /** + * Callback for add-button. + * Fires to load for every selected element and handler. + */ + public void plusClicked() { + if (!getSelection().isEmpty()) { + fireToLoad(); + } + } + + + protected Button createPlusButton() { + Button plusBtn = new Button(messages.datacageAdd()); + plusBtn.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + plusClicked(); + } + }); + return plusBtn; + } + + + protected void fireToLoad() { + for (DatacageHandler handler: handlers) { + handler.toLoad(toLoad); + } + } + + + /** Notify DatacageDoubleClickHandlers that a doubleclick happened. */ + protected void fireOnDoubleClick() { + for (DatacageDoubleClickHandler handler: doubleHandlers) { + handler.onDoubleClick(toLoad); + } + } + + + protected void doubleClickedOnTree(RecordDoubleClickEvent event) { + TreeNode node = (TreeNode)event.getRecord(); + collectToLoads(node); + fireOnDoubleClick(); + } + + + /** + * Adds to toLoad, from info in node. + * Afterwards, add all children of node to stack to parse (next time + * collectToLoads is called). + */ + protected void collectToLoads(TreeNode node) { + Stack stack = new Stack(); + + stack.push(node); + + while (!stack.isEmpty()) { + node = stack.pop(); + String factory = node.getAttribute("factory"); + if (factory != null) { // we need at least a factory + String artifact = node.getAttribute("artifact-id"); + String out = node.getAttribute("out"); + String name = node.getAttribute("facet"); + String ids = node.getAttribute("ids"); + String displayname = node.getAttribute("name"); + String debugAttributeValues = ""; + for (String attr: node.getAttributes()) { + debugAttributeValues += ("[" + attr +": " + + node.getAttributeAsString(attr) + "] "); + } + GWT.log("DatacageWidget.collectToLoad, attributes are " + + debugAttributeValues); + + toLoad.add(artifact, + factory, + out, + name, + ids, + displayname); + } + TreeNode [] children = tree.getChildren(node); + if (children != null) { + for (TreeNode child: children) { + stack.push(child); + } + } + } + } + + + /** Get meta-data and populate tree with it. */ + protected void triggerTreeBuilding() { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + String artifactId = artifact.getUuid(); + String userId = (user != null) ? user.identifier() : null; + + lockUI(); + + metaDataService.getMetaData( + locale, + artifactId, + userId, + outs, + parameters, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not load meta data."); + SC.warn(caught.getMessage()); + unlockUI(); + } + + @Override + public void onSuccess(DataCageTree dcTree) { + GWT.log("Successfully loaded meta data."); + IdGenerator idGenerator = new IdGenerator(); + DataCageNode dcRoot = dcTree.getRoot(); + TreeNode root = buildRecursiveChildren( + dcRoot, idGenerator); + tree.setRoot(root); + + TreeNode[] nodes = tree.getChildren(root); + for (TreeNode node: nodes) { + if (node.getAttribute("factory") == null && + !tree.hasChildren(node)) { + node.setIsFolder(true); + } + } + + if (idGenerator.current() < MAX_OPEN) { + tree.openAll(); + } + treeGrid.setData(tree); + unlockUI(); + } + }); + } + + private static final class IdGenerator { + protected int current; + + public IdGenerator() { + } + + public int next() { + return current++; + } + + public int current() { + return current; + } + } // class IdGenerator + + private String i18n(String s) { + if (!(s.startsWith("${") && s.endsWith("}"))) { + return s; + } + + s = s.substring(2, s.length()-1); + + try { + return messages.getString(s); + } + catch (MissingResourceException mre) { + GWT.log("cannot find i18n for + '" + s + "'"); + return s; + } + } + + protected TreeNode buildRecursiveChildren( + DataCageNode node, + IdGenerator idGenerator + ) { + TreeNode tn = new TreeNode(); + tn.setAttribute("id", idGenerator.next()); + + List children = node.getChildren(); + + if (children != null) { + TreeNode [] tns = new TreeNode[children.size()]; + for (int i = 0; i < tns.length; ++i) { + DataCageNode child = children.get(i); + tns[i] = buildRecursiveChildren(child, idGenerator); + } + tn.setAttribute("children-nodes", tns); + } + + tn.setAttribute("name", i18n(node.getDescription())); + tn.setAttribute("facet", node.getName()); + + AttrList attrs = node.getAttributes(); + if (attrs != null) { + for (int i = 0, N = attrs.size(); i < N; ++i) { + String key = attrs.getKey(i); + String value = attrs.getValue(i); + tn.setAttribute(key, value); + } + } + + return tn; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageWindow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageWindow.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,201 @@ +package org.dive4elements.river.client.client.ui; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Window; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; + +import org.dive4elements.river.client.client.event.DatacageHandler; +import org.dive4elements.river.client.client.event.DatacageDoubleClickHandler; +import org.dive4elements.river.client.client.event.HasRedrawRequestHandlers; +import org.dive4elements.river.client.client.event.RedrawRequestHandler; +import org.dive4elements.river.client.client.event.RedrawRequestEvent; +import org.dive4elements.river.client.client.event.RedrawRequestEvent.Type; + +import org.dive4elements.river.client.client.services.LoadArtifactService; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.Collection; +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.ToLoad; +import org.dive4elements.river.client.shared.model.User; +import org.dive4elements.river.client.shared.model.Recommendation; + + +/** Window that access the datacageservice and shows a datacagewidget. */ +public class DatacageWindow +extends Window +implements DatacageHandler, + DatacageDoubleClickHandler, + HasRedrawRequestHandlers +{ + /** i18ner. */ + protected FLYSConstants messages = + GWT.create(FLYSConstants.class); + + /** Service to create/clone artifacts. */ + protected LoadArtifactServiceAsync loadService = + GWT.create(LoadArtifactService.class); + + protected CollectionView view; + + protected List handlers; + + protected int inProgress; + + + public DatacageWindow( + Artifact artifact, + User user, + String outs, + CollectionView view + ) { + this.view = view; + this.handlers = new ArrayList(); + this.inProgress = 0; + + setWidth(400); + setHeight(500); + + DatacageWidget dw = new DatacageWidget( + artifact, + user, + outs, + "load-system:true", + true); + dw.addDatacageHandler(this); + dw.addDatacageDoubleClickHandler(this); + + addItem(dw); + + String river = findRiver(artifact); + // TODO: i18n + setTitle("Datenkorb: " + river); + setShowMinimizeButton(false); + setIsModal(true); + setShowModalMask(true); + setCanDragResize(true); + + centerInPage(); + } + + + @Override + public void toLoad(ToLoad toLoad) { + destroy(); + List recs = toLoad.toRecommendations(); + loadArtifacts(recs); + } + + + @Override + public void onDoubleClick(ToLoad toLoad) { + destroy(); + List recs = toLoad.toRecommendations(); + loadArtifacts(recs); + } + + + @Override + public void addRedrawRequestHandler(RedrawRequestHandler handler) { + if (handler != null) { + handlers.add(handler); + } + } + + + protected String findRiver(Artifact artifact) { + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList [] data = adescr.getOldData(); + + if (data != null && data.length > 0) { + for (int i = 0; i < data.length; i++) { + DataList dl = data[i]; + if (dl.getState().equals("state.winfo.river")) { + for (int j = dl.size()-1; j >= 0; --j) { + Data d = dl.get(j); + DataItem [] di = d.getItems(); + if (di != null && di.length == 1) { + return d.getItems()[0].getStringValue(); + } + } + } + } + } + + return ""; + } + + + protected void decreateInProgress() { + if (this.inProgress > 0) { + this.inProgress--; + } + + if (this.inProgress == 0) { + fireRedrawRequest(); + } + } + + + protected void fireRedrawRequest() { + RedrawRequestEvent evt = new RedrawRequestEvent(Type.DEFAULT); + + for (RedrawRequestHandler handler: handlers) { + handler.onRedrawRequest(evt); + } + } + + + protected void loadArtifacts(List recommendations) { + Config cfg = Config.getInstance(); + + final Collection collection = view.getCollection(); + final Artifact masterArtifact = view.getArtifact(); + final String locale = cfg.getLocale(); + + this.inProgress = recommendations.size(); + + for (final Recommendation recommendation: recommendations) { + // XXX: UGLY! If no reference artifact given use uuid of + // current artifact as reference. + if (recommendation.getMasterArtifact() == null) { + recommendation.setMasterArtifact(masterArtifact.getUuid()); + } + + final String factory = recommendation.getFactory(); + + GWT.log("Load new artifact with factory: " + factory); + + loadService.load( + collection, + recommendation, + factory, + locale, + new AsyncCallback() { + public void onFailure(Throwable caught) { + decreateInProgress(); + GWT.log("Create-artifact failed: " + caught.getMessage()); + SC.warn(caught.getMessage()); + } + + public void onSuccess(Artifact artifact) { + decreateInProgress(); + GWT.log("Created new artifact: " + artifact.getUuid()); + } + }); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DemDatacagePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DemDatacagePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,88 @@ +package org.dive4elements.river.client.client.ui; + +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.ToLoad; +import org.dive4elements.river.client.shared.model.User; + +import java.util.ArrayList; +import java.util.List; + + +public class DemDatacagePanel extends DatacagePanel { + + private static final long serialVersionUID = -2301633938080411687L; + + public static final String OUT = "floodmap"; + public static final String PARAMETERS = "dem:true"; + + + public DemDatacagePanel() { + super(); + } + + + public DemDatacagePanel(User user) { + super(user); + } + + + @Override + protected void createWidget() { + super.createWidget(); + widget.setIsMutliSelectable(false); + } + + + @Override + public User getUser() { + return null; + } + + + @Override + public String getOuts() { + return OUT; + } + + + @Override + public String getParameters() { + return PARAMETERS; + } + + + @Override + public List validate() { + List errors = new ArrayList(); + + Recommendation r = getSelectedRecommendation(); + if (r == null) { + errors.add(MSG.requireDGM()); + } + + return errors; + } + + + @Override + protected Data[] getData() { + Recommendation r = getSelectedRecommendation(); + + DataItem item = new DefaultDataItem(dataName, dataName, r.getIDs()); + return new Data[] { new DefaultData( + dataName, null, null, new DataItem[] { item }) }; + } + + + protected Recommendation getSelectedRecommendation() { + ToLoad toLoad = widget.getSelection(); + List recoms = toLoad.toRecommendations(); + + return recoms != null && recoms.size() >= 1 ? recoms.get(0) : null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DigitizePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DigitizePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,260 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.events.ParentMovedEvent; +import com.smartgwt.client.widgets.events.ParentMovedHandler; +import com.smartgwt.client.widgets.events.ResizedEvent; +import com.smartgwt.client.widgets.events.ResizedHandler; +import com.smartgwt.client.widgets.events.VisibilityChangedEvent; +import com.smartgwt.client.widgets.events.VisibilityChangedHandler; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; +import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.MapInfoService; +import org.dive4elements.river.client.client.services.MapInfoServiceAsync; +import org.dive4elements.river.client.client.ui.map.FloodMap; +import org.dive4elements.river.client.client.ui.map.MapPanel; +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.MapInfo; + +import java.util.List; + +import org.gwtopenmaps.openlayers.client.Map; +import org.gwtopenmaps.openlayers.client.control.Attribution; +import org.gwtopenmaps.openlayers.client.layer.TransitionEffect; +import org.gwtopenmaps.openlayers.client.layer.WMS; +import org.gwtopenmaps.openlayers.client.layer.WMSOptions; +import org.gwtopenmaps.openlayers.client.layer.WMSParams; + + +public class DigitizePanel +extends SelectProvider +implements TabSelectedHandler, VisibilityChangedHandler { + + private static final long serialVersionUID = 3529775660871273314L; + + protected MapInfoServiceAsync mapInfo = GWT.create(MapInfoService.class); + + protected FloodMap floodMap; + + protected MapPanel mapPanel; + + public static final String UESK_BARRIERS = "uesk.barriers"; + + /** The message class that provides i18n strings. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + public DigitizePanel() { + } + + + @Override + public Canvas create(DataList list) { + helperContainer.addVisibilityChangedHandler(this); + + DataList clone = (DataList) list.clone(); + List all = clone.getAll(); + all.remove(UESK_BARRIERS); + + Canvas widget = createWidget(list); + + final Config cfg = Config.getInstance(); + final String locale = cfg.getLocale(); + + String river = getDataValue("state.winfo.river", "river"); + mapInfo.getMapInfo(locale, river, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + String msg = caught.getMessage(); + + GWT.log("Error while fetching MapInfo: " + msg); + SC.warn(FLYS.getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(MapInfo info) { + createMapWidget(info); + } + }); + + return widget; + } + + + /** + * This method creates the content of the widget. + * + * @param data The {@link DataList} object. + * + * @return a combobox. + */ + @Override + protected Canvas createWidget(DataList data) { + GWT.log("DigitizePanel - createWidget()"); + + VLayout layout = new VLayout(); + layout.setAlign(VerticalAlignment.TOP); + layout.setHeight(25); + + int size = data.size(); + + for (int i = 0; i < size; i++) { + Data d = data.get(i); + + Label label = new Label(d.getDescription()); + label.setValign(VerticalAlignment.TOP); + label.setHeight(20); + label.setWidth(400); + + layout.addMember(label); + layout.addMember(getNextButton()); + } + + layout.setAlign(VerticalAlignment.TOP); + + return layout; + } + + + @Override + protected Data[] getData() { + final Data[] total = new Data[1]; + + if (floodMap != null) { + DataItem item = new DefaultDataItem( + UESK_BARRIERS, UESK_BARRIERS, floodMap.getFeaturesAsGeoJSON()); + total[0] = new DefaultData( + UESK_BARRIERS, null, null, new DataItem[] { item }); + } + else { + // Happens when OpenLayers is missing + GWT.log("floodMap is null -> OpenLayers missing?"); + } + + return total; + } + + + public void createMapWidget(MapInfo mapInfo) { + mapPanel = new MapPanel(mapInfo, true); + + floodMap = mapPanel.getFloodMap(); + Map map = floodMap.getMap(); + + helperContainer.addResizedHandler(new ResizedHandler() { + @Override + public void onResized(ResizedEvent event) { + mapPanel.doLayout(helperContainer.getWidth(), helperContainer.getHeight()); + } + }); + helperContainer.addParentMovedHandler(new ParentMovedHandler() { + @Override + public void onParentMoved(ParentMovedEvent event) { + mapPanel.getFloodMap().updateSize(); + } + }); + helperContainer.addVisibilityChangedHandler(new VisibilityChangedHandler() { + @Override + public void onVisibilityChanged(VisibilityChangedEvent event) { + mapPanel.doLayout(helperContainer.getWidth(), helperContainer.getHeight()); + } + }); + helperContainer.addMember(mapPanel); + + parameterList.registerCollectionViewTabHandler(this); + + WMS axis = getLayer( + mapInfo.getWmsUrl(), mapInfo.getWmsLayers(), + mapInfo.getProjection(), false, true); + WMS back = getLayer( + mapInfo.getBackgroundWmsUrl(), mapInfo.getBackgroundWmsLayers(), + mapInfo.getProjection(), false, false); + + map.addLayer(back); + map.addLayer(axis); + + String hws = getDataValue("state.winfo.uesk.dc-hws", "uesk.hws"); + if (hws != null && hws.length() > 0) { + WMS hwsLayer = getLayer( + //TODO: Use Mapinfo to get hws layer infos. + mapInfo.getWmsUrl().replace("river", "user"), + "ms_layer-hws-lines" + artifact.getUuid(), + mapInfo.getProjection(), + false, true); + map.addLayer(hwsLayer); + } + String userRgd = getDataValue("state.winfo.uesk.user-rgd", "uesk.user-rgd"); + if (userRgd != null && userRgd.length() > 0) { + WMS userLayer = getLayer( + //TODO: Use Mapinfo to get hws layer infos. + mapInfo.getWmsUrl().replace("river", "user"), + "ms_layer-user-rgd" + artifact.getUuid(), + mapInfo.getProjection(), + false, true); + map.addLayer(userLayer); + } + map.addControl(new Attribution()); + map.zoomToMaxExtent(); + + mapPanel.doLayout(helperContainer.getWidth(), helperContainer.getHeight()); + } + + + protected WMS getLayer(String url, String layers, String proj, boolean isBaseLayer, boolean singleTiled) { + final WMSParams params = new WMSParams(); + params.setLayers(layers); + params.setFormat("image/png"); + params.setIsTransparent(!isBaseLayer); + + final WMSOptions opts = new WMSOptions(); + opts.setProjection(proj); + opts.setSingleTile(false); // FIXME: Make working... + opts.setTransitionEffect(TransitionEffect.RESIZE); + opts.setRatio(1); + opts.setBuffer(0); + if (layers.equals("OSM-WMS-Dienst")) { + opts.setAttribution(MSG.attribution()); + } + final WMS wms = new WMS(layers, url, params, opts); + wms.setIsVisible(true); + wms.setIsBaseLayer(isBaseLayer); + + return wms; + } + + + @Override + public void onTabSelected(TabSelectedEvent tse) { + if (tse.getTabNum () != 0) { + floodMap.hideBarrierLayer(); + } + else { + floodMap.showBarrierLayer(); + } + } + + @Override + public void onVisibilityChanged(VisibilityChangedEvent vce) { + if (!vce.getIsVisible()) { + floodMap.hideBarrierLayer(); + mapPanel.getMapToolbar().activateDrawFeature(false); + } + else { + floodMap.showBarrierLayer(); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DistanceOnlyPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DistanceOnlyPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,74 @@ +package org.dive4elements.river.client.client.ui; + +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 java.util.List; + + +public class DistanceOnlyPanel extends DistancePanel { + + private static final long serialVersionUID = -5794138573892656947L; + + + public DistanceOnlyPanel() { + this("right"); + } + + + public DistanceOnlyPanel(String labelOrientation) { + distancePanel = new DoubleRangeOnlyPanel( + labelFrom(), labelTo(), 0d, 0d, 250, this, labelOrientation); + } + + + @Override + protected String getOldSelectionString(DataList dataList) { + List items = dataList.getAll(); + + Data dFrom = getData(items, getLowerField()); + Data dTo = getData(items, getUpperField()); + + DataItem[] from = dFrom.getItems(); + DataItem[] to = dTo.getItems(); + + StringBuilder sb = new StringBuilder(); + sb.append(from[0].getLabel()); + sb.append(" " + getUnitFrom() + " - "); + sb.append(to[0].getLabel()); + sb.append(" " + getUnitTo()); + + return sb.toString(); + } + + + @Override + protected void initDefaultStep(DataList data) { + // do nothing + } + + + @Override + public Data[] getData() { + Data[] data = new Data[2]; + + data[0] = getDataFrom(); + data[1] = getDataTo(); + + return data; + } + + + @Override + protected String labelFrom() { + return getUnitFrom() + " - "; + } + + + @Override + protected String labelTo() { + return getUnitTo(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DistancePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DistancePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,647 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.data.AdvancedCriteria; +import com.smartgwt.client.data.Criteria; +import com.smartgwt.client.data.Criterion; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.OperatorId; +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.SelectItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.grid.ListGrid; +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; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; +import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; +import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.FilterHandler; +import org.dive4elements.river.client.client.event.RangeFilterEvent; +import org.dive4elements.river.client.client.event.StringFilterEvent; +import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource; +import org.dive4elements.river.client.client.ui.range.LocationsTable; +import org.dive4elements.river.client.client.ui.range.RangeTable; +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 java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + + +public class DistancePanel extends AbstractUIProvider implements BlurHandler, FilterHandler +{ + + private static final long serialVersionUID = -883142387908664588L; + + public static final int DEFAULT_STEP_WIDTH = 100; + + public static final String FIELD_LOWER = "ld_from"; + public static final String FIELD_UPPER = "ld_to"; + public static final String FIELD_STEP = "ld_step"; + + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected RangeTable distancesTable; + protected LocationsTable locationsTable; + + protected DoubleRangePanel distancePanel; + + protected TableFilter filterDescription; + protected RangeTableFilter filterRange; + + protected TabSet tabs; + + protected double min; + protected double max; + + protected StaticTextItem filterResultCount; + protected ListGrid currentFiltered; + + public DistancePanel() { + this("right"); + } + + + public DistancePanel(String labelOrientation) { + distancePanel = new DoubleRangePanel( + labelFrom(), labelTo(), labelStep(), + 0d, 0d, 0d, 250, this, labelOrientation); + } + + + @Override + public Canvas create(DataList data) { + VLayout layout = new VLayout(); + layout.setMembersMargin(10); + + Label label = new Label(getLabel()); + + Canvas submit = getNextButton(); + + label.setHeight(25); + distancePanel.setHeight(50); + + layout.addMember(label); + layout.addMember(distancePanel); + layout.addMember(submit); + + initMinMaxValues(data); + initDefaultValues(data); + initHelperPanel(); + + return layout; + } + + + @Override + public Canvas createOld(DataList dataList) { + String s = getOldSelectionString(dataList); + String l = dataList.getLabel(); + + Label label = new Label(l); + Label selected = new Label(s); + + HLayout layout = new HLayout(); + + layout.setWidth(400); + label.setWidth(200); + selected.setWidth(130); + + layout.addMember(label); + layout.addMember(selected); + layout.addMember(getBackButton(dataList.getState())); + + return layout; + } + + + protected String getOldSelectionString(DataList dataList) { + List items = dataList.getAll(); + + Data dFrom = getData(items, getLowerField()); + Data dTo = getData(items, getUpperField()); + Data dStep = getData(items, getStepField()); + + DataItem[] from = dFrom.getItems(); + DataItem[] to = dTo.getItems(); + DataItem[] step = dStep.getItems(); + + StringBuilder sb = new StringBuilder(); + sb.append(from[0].getLabel()); + sb.append(" " + getUnitFrom() + " - "); + sb.append(to[0].getLabel()); + sb.append(" " + getUnitTo() + " - "); + sb.append(step[0].getLabel()); + sb.append(" " + getUnitStep()); + + return sb.toString(); + } + + + protected String getLabel() { + return MSG.distance_state(); + } + + + protected String labelFrom() { + return getLabelFrom() + " [" + getUnitFrom() + "]"; + } + + + protected String getLabelFrom() { + return MSG.dpLabelFrom(); + } + + + protected String getUnitFrom() { + return MSG.dpUnitFrom(); + } + + + protected String labelTo() { + return getLabelTo() + " [" + getUnitTo() + "]"; + } + + + protected String getLabelTo() { + return MSG.dpLabelTo(); + } + + + protected String getUnitTo() { + return MSG.dpUnitTo(); + } + + + protected String labelStep() { + return getLabelStep() + " [" + getUnitStep() + "]"; + } + + + protected String getLabelStep() { + return MSG.dpLabelStep(); + } + + + protected String getUnitStep() { + return MSG.dpUnitStep(); + } + + + protected String getLowerField() { + return FIELD_LOWER; + } + + + protected String getUpperField() { + return FIELD_UPPER; + } + + + protected String getStepField() { + return FIELD_STEP; + } + + + @Override + public List validate() { + List errors = new ArrayList(); + + if (!distancePanel.validateForm()) { + errors.add(MSG.wrongFormat()); + + return errors; + } + + validateFrom(errors); + validateTo(errors); + + return errors; + } + + + protected void validateFrom(List errors) { + double from = distancePanel.getFrom(); + + if (from < min || from > max) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + + String tmp = MSG.error_validate_lower_range(); + tmp = tmp.replace("$1", nf.format(from)); + tmp = tmp.replace("$2", nf.format(min)); + + distancePanel.setFrom(min); + errors.add(tmp); + } + } + + + protected void validateTo(List errors) { + double to = distancePanel.getTo(); + + if (to < min || to > max) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + + String tmp = MSG.error_validate_upper_range(); + tmp = tmp.replace("$1", nf.format(to)); + tmp = tmp.replace("$2", nf.format(max)); + + distancePanel.setTo(max); + errors.add(tmp); + } + } + + + @Override + public Data[] getData() { + Data[] data = new Data[4]; + + data[0] = getDataFrom(); + data[1] = getDataTo(); + data[2] = getDataStep(); + + DataItem item = new DefaultDataItem("ld_mode","ld_mode", "distance"); + data[3] = new DefaultData( + "ld_mode", null, null, new DataItem[] { item }); + + return data; + } + + + protected Data getDataFrom() { + String value = String.valueOf(distancePanel.getFrom()); + String field = getLowerField(); + + DataItem item = new DefaultDataItem(field, field, value); + return new DefaultData( + field, null, null, new DataItem[] { item }); + } + + + protected Data getDataTo() { + String value = String.valueOf(distancePanel.getTo()); + String field = getUpperField(); + + DataItem item = new DefaultDataItem(field, field, value); + return new DefaultData( + field, null, null, new DataItem[] { item }); + } + + + protected Data getDataStep() { + String value = String.valueOf(distancePanel.getStep()); + String field = getStepField(); + + DataItem item = new DefaultDataItem(field, field, value); + return new DefaultData( + field, null, null, new DataItem[] { item }); + } + + + @Override + public void onBlur(BlurEvent event) { + distancePanel.validateForm(); + } + + + protected void initMinMaxValues(DataList data) { + Data f = getData(data.getAll(), getLowerField()); + Data t = getData(data.getAll(), getUpperField()); + + DataItem[] fItems = f.getItems(); + DataItem[] tItems = t.getItems(); + + try { + min = Double.valueOf(fItems[0].getStringValue()); + max = Double.valueOf(tItems[0].getStringValue()); + } + catch (NumberFormatException nfe) { + min = -Double.MAX_VALUE; + max = Double.MAX_VALUE; + } + } + + + protected void initDefaultValues(DataList data) { + initDefaultFrom(data); + initDefaultTo(data); + initDefaultStep(data); + } + + + protected void initDefaultFrom(DataList data) { + Data f = getData(data.getAll(), getLowerField()); + + double from = getDefaultFrom(); + + try { + from = getDefaultValue(f); + } + catch (NumberFormatException nfe) { + // do nothing + } + + distancePanel.setFrom(from); + } + + + protected double getDefaultFrom() { + return min; + } + + + protected void initDefaultTo(DataList data) { + Data t = getData(data.getAll(), getUpperField()); + + double to = getDefaultTo(); + + try { + to = getDefaultValue(t); + } + catch (NumberFormatException nfe) { + // do nothing + } + + distancePanel.setTo(to); + } + + + protected double getDefaultTo() { + return max; + } + + + protected void initDefaultStep(DataList data) { + Data s = getData(data.getAll(), getStepField()); + + double step = getDefaultStep(); + + try { + step = getDefaultValue(s); + } + catch (NumberFormatException nfe) { + // do nothing + } + + distancePanel.setStep(step); + } + + + protected double getDefaultStep() { + return DEFAULT_STEP_WIDTH; + } + + + protected double getDefaultValue(Data data) + throws NumberFormatException + { + DataItem def = data.getDefault(); + String defValue = def != null ? def.getStringValue() : null; + + return Double.valueOf(defValue); + } + + + protected void initHelperPanel() { + distancesTable = new RangeTable(); + locationsTable = new LocationsTable(); + + Config config = Config.getInstance(); + String url = config.getServerUrl(); + String river = getRiverName(); + + distancesTable.setAutoFetchData(true); + locationsTable.setAutoFetchData(true); + distancesTable.setDataSource(new DistanceInfoDataSource( + url, river, "distances")); + locationsTable.setDataSource(new DistanceInfoDataSource( + url, river, "locations")); + + distancesTable.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(RecordClickEvent e) { + Record r = e.getRecord(); + + String from = r.getAttribute("from"); + String to = r.getAttribute("to"); + + try { + distancePanel.setFrom(Double.valueOf(from)); + distancePanel.setTo(Double.valueOf(to)); + } + catch (NumberFormatException nfe) { + SC.warn(MSG.wrongFormat()); + } + } + }); + + locationsTable.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(RecordClickEvent e) { + Record r = e.getRecord(); + int field = e.getFieldNum(); + + try { + String value = r.getAttribute("from"); + + switch (field) { + case 0: + distancePanel.setFrom(Double.valueOf(value)); + break; + case 1: + distancePanel.setTo(Double.valueOf(value)); + break; + } + } + catch (NumberFormatException nfe) { + SC.warn(MSG.wrongFormat()); + } + } + }); + + tabs = new TabSet(); + tabs.setWidth100(); + tabs.setHeight100(); + + Tab locations = new Tab(MSG.locations()); + Tab distances = new Tab(MSG.distance()); + + locations.setPane(locationsTable); + distances.setPane(distancesTable); + + tabs.addTab(locations, 0); + tabs.addTab(distances, 1); + + filterResultCount = new StaticTextItem(MSG.resultCount()); + filterResultCount.setTitleAlign(Alignment.LEFT); + filterResultCount.setTitleStyle("color: #000"); + + filterDescription = new TableFilter(); + filterDescription.setHeight("30px"); + filterDescription.addFilterHandler(this); + + filterRange = new RangeTableFilter(); + filterRange.setHeight("30px"); + filterRange.addFilterHandler(this); + filterRange.setVisible(false); + + SelectItem filterCriteria = new SelectItem(); + filterCriteria.setShowTitle(false); + filterCriteria.setWidth(100); + filterCriteria.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent e) { + if(e.getValue().toString().equals("range")) { + filterRange.setVisible(true); + filterDescription.setVisible(false); + filterDescription.clear(); + } + else { + filterRange.setVisible(false); + filterRange.clear(); + filterDescription.setVisible(true); + } + } + }); + + LinkedHashMap filterMap = + new LinkedHashMap(); + filterMap.put("description", MSG.description()); + filterMap.put("range", MSG.range()); + filterCriteria.setValueMap(filterMap); + filterCriteria.setValue("description"); + + DynamicForm form = new DynamicForm(); + form.setFields(filterCriteria); + + DynamicForm form2 = new DynamicForm(); + form2.setFields(filterResultCount); + + HLayout filterLayout = new HLayout(); + filterLayout.addMember(form); + filterLayout.addMember(filterDescription); + filterLayout.addMember(filterRange); + filterLayout.setHeight(30); + tabs.addTabSelectedHandler(new TabSelectedHandler() { + @Override + public void onTabSelected(TabSelectedEvent evt) { + filterDescription.clear(); + filterRange.clear(); + filterResultCount.setValue(""); + + Canvas c = evt.getTabPane(); + if(c instanceof ListGrid) { + currentFiltered = (ListGrid)c; + } + } + }); + + helperContainer.addMember(tabs); + helperContainer.addMember(filterLayout); + helperContainer.addMember(form2); + } + + + @Override + public void onFilterCriteriaChanged(StringFilterEvent event) { + String search = event.getFilter(); + + if (search != null && search.length() > 0) { + Criteria c = new Criteria("description", search); + locationsTable.filterData(c); + distancesTable.filterData(c); + filterResultCount.setValue(currentFiltered.getRecords().length); + } + else { + locationsTable.clearCriteria(); + distancesTable.clearCriteria(); + filterResultCount.setValue(""); + } + } + + + @Override + public void onFilterCriteriaChanged(RangeFilterEvent event) { + Float from = event.getFrom() - 0.001f; + Float to = event.getTo() + 0.001f; + + Criterion combinedFilter = null; + Criterion locationFilter = null; + if (from.equals(Float.NaN) && to.equals(Float.NaN)) { + locationsTable.clearCriteria(); + distancesTable.clearCriteria(); + filterResultCount.setValue(""); + return; + } + else if (from.equals(Float.NaN)) { + combinedFilter = new Criterion("to", OperatorId.LESS_OR_EQUAL, to); + locationFilter = + new Criterion("from", OperatorId.LESS_OR_EQUAL, to); + locationsTable.filterData(locationFilter); + distancesTable.filterData(combinedFilter); + filterResultCount.setValue(currentFiltered.getRecords().length); + return; + } + else if (to.equals(Float.NaN)) { + combinedFilter = + new Criterion("from", OperatorId.GREATER_OR_EQUAL, from); + } + else { + AdvancedCriteria c1 = + new AdvancedCriteria(OperatorId.AND, new Criterion[] { + new Criterion("from", OperatorId.GREATER_OR_EQUAL, from), + new Criterion("from", OperatorId.LESS_OR_EQUAL, to) + }); + + AdvancedCriteria c2 = + new AdvancedCriteria(OperatorId.AND, new Criterion[] { + new Criterion("to", OperatorId.GREATER_OR_EQUAL, from), + new Criterion("to", OperatorId.LESS_OR_EQUAL, to) + }); + + AdvancedCriteria c3 = + new AdvancedCriteria(OperatorId.AND, new Criterion[] { + new Criterion("from", OperatorId.LESS_OR_EQUAL, to), + new Criterion("to", OperatorId.GREATER_OR_EQUAL, from) + }); + + combinedFilter = + new AdvancedCriteria(OperatorId.OR, new Criterion[] { + c1, c2, c3 + }); + } + locationsTable.filterData(combinedFilter); + distancesTable.filterData(combinedFilter); + filterResultCount.setValue(currentFiltered.getRecords().length); + + } + + + protected String getRiverName() { + ArtifactDescription adescr = artifact.getArtifactDescription(); + return adescr.getRiver(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleArrayPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleArrayPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,280 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.TitleOrientation; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.FocusHandler; + +import org.dive4elements.river.client.client.FLYSConstants; + +import java.util.Map; + +public class DoubleArrayPanel +extends DynamicForm +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected TextItem ti; + + private String title; + + /** The constant input field name. */ + public static final String FIELD_NAME = "doublearray"; + + + public DoubleArrayPanel( + String title, + double[] values, + BlurHandler handler) + { + this(title, values, handler, null, TitleOrientation.RIGHT); + } + + + /** + * Creates a new form with a single input field that displays an array of + * double values. + * + * @param name The name of the TextItem. + * @param title The title of the TextItem. + * @param values The double values that should be displayed initially. + * @param blurHandler The BlurHandler that is used to valide the input. + * @param focusHandler The FocueHandler that is used to valide the input. + */ + public DoubleArrayPanel( + String title, + double[] values, + BlurHandler blurHandler, + FocusHandler focusHandler, + TitleOrientation titleOrientation) + { + this.title = title; + ti = new TextItem(FIELD_NAME); + StaticTextItem sti = new StaticTextItem("staticarray"); + + ti.setShowTitle(false); + sti.setShowTitle(false); + sti.setValue(title); + + ti.addBlurHandler(blurHandler); + if (focusHandler != null) { + ti.addFocusHandler(focusHandler); + } + + if (titleOrientation == TitleOrientation.RIGHT) { + setFields(ti, sti); + } + else { + setFields(sti, ti); + } + + setTitleOrientation(titleOrientation); + setNumCols(2); + + if (values == null) { + return; + } + + NumberFormat f = NumberFormat.getDecimalFormat(); + + StringBuilder text = new StringBuilder(); + boolean firstItem = true; + + for (double val: values) { + if (!firstItem) { + text.append(" "); + } + + text.append(f.format(val)); + + firstItem = false; + } + + ti.setValue(text.toString()); + } + + + /** + * This method takes the double array to set the values to the textbox. + * + * @param values The double values. + */ + public void setValues(double[] values) { + NumberFormat f = NumberFormat.getDecimalFormat(); + + if(values == null || values.length == 0) { + ti.clearValue(); + return; + } + StringBuilder text = new StringBuilder(); + boolean firstItem = true; + if (values != null) { + for (double val: values) { + if (!firstItem) { + text.append(" "); + } + + text.append(f.format(val)); + + firstItem = false; + } + } + + ti.clearValue(); + ti.setValue(text.toString()); + } + + + /** + * This method appends a double value to the current list of values. + * + * @param value A new value. + */ + public void addValue(double value) { + NumberFormat f = NumberFormat.getDecimalFormat(); + + String current = ti.getValueAsString(); + + if (current == null || current.length() == 0) { + current = f.format(value); + } + else { + current += " " + f.format(value); + } + + ti.setValue(current); + } + + + protected boolean validateForm() { + return validateForm(ti); + } + + + /** + * This method validates the entered text in the location input field. If + * there are values that doesn't represent a valid location, an error is + * displayed. + * + * @param item The FormItem. + */ + @SuppressWarnings("unchecked") + protected boolean validateForm(FormItem item) { + if (item instanceof StaticTextItem) { + return true; + } + + boolean valid = true; + String value = (String) item.getValue(); + + if (value == null) { + return valid; + } + + String[] parts = value.split("\\s+"); + + if (parts == null) { + return valid; + } + + NumberFormat nf = NumberFormat.getDecimalFormat(); + @SuppressWarnings("rawtypes") + Map errors = getErrors(); + + try { + for (String part: parts) { + + if (part.length() == 0) { + continue; + } + + nf.parse(part); + } + + errors.remove(item.getFieldName()); + } + catch (NumberFormatException nfe) { + errors.put(item.getFieldName(), MESSAGES.wrongFormat()); + + valid = false; + } + + setErrors(errors, true); + + return valid; + } + + + /** + * This method returns the double array that has been entered in + * item. + * + * @param item The item that contains the desired values. + * + * @return the values as double array. + */ + public double[] getInputValues(FormItem item) { + String value = (String) item.getValue(); + + if (value == null) { + return null; + } + + String[] parts = value.split("\\s+"); + + if (parts == null) { + return null; + } + + NumberFormat f = NumberFormat.getDecimalFormat(); + + double[] values = new double[parts.length]; + + int i = 0; + OUTER: for (String part: parts) { + if (part.length() == 0) { + continue; + } + + try { + double x = f.parse(part); + for (int j = 0; j < i; ++j) { + if (values[j] == x) { + continue OUTER; + } + } + values[i++] = x; + } + catch (NumberFormatException nfe) { + // do nothing + } + } + + double [] out = new double[i]; + System.arraycopy(values, 0, out, 0, i); + + return out; + } + + + /** + * Returns the double values of this panel. + * + * @return the double values of this panel. + */ + public double[] getInputValues() { + return getInputValues(ti); + } + + public String getItemTitle() { + return this.title; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleInputPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleInputPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,176 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +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.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +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 java.util.ArrayList; +import java.util.List; + +/** + * This UIProvider creates a panel for location or distance input. + * + * @author Raimund Renkert + */ +public class DoubleInputPanel +extends AbstractUIProvider +{ + + private static final long serialVersionUID = 2006773072352563622L; + + /** The message class that provides i18n strings. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + private TextItem inputPanel; + + private double value; + + protected String dataName; + + + public DoubleInputPanel() { + dataName = "outliers"; + } + + + public DoubleInputPanel(String dataName) { + this.dataName = dataName; + } + + + @Override + public Canvas create(DataList list) { + VLayout layout = new VLayout(); + + Canvas helper = createHelper(); + this.helperContainer.addMember(helper); + + Canvas submit = getNextButton(); + Canvas widget = createWidget(list); + + layout.addMember(widget); + layout.addMember(submit); + return layout; + } + + + /** Create a labelled input-panel. */ + public Canvas createWidget(DataList data) { + VLayout layout = new VLayout(); + + Label title = new Label(data.get(0).getDescription()); + title.setHeight("25px"); + + DataItem defaultItem = data.get(0).getDefault(); + + DynamicForm form = new DynamicForm(); + inputPanel = new TextItem(); + inputPanel.setTitle(dataName); + inputPanel.setShowTitle(false); + + if (defaultItem != null) { + inputPanel.setValue(defaultItem.getStringValue()); + } + + form.setFields(inputPanel); + + layout.addMember(title); + layout.addMember(form); + + return layout; + } + + + protected Canvas createHelper() { + return new VLayout(); + } + + + /** Create canvas to show previously entered value. */ + @Override + public Canvas createOld(DataList dataList) { + List items = dataList.getAll(); + + Data d = getData(items, dataName); + DataItem[] item = d.getItems(); + + String v = item[0].getLabel(); + + Label old = new Label(v); + old.setWidth(130); + + 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; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + @Override + public Data[] getData() { + List data = new ArrayList(); + + boolean valid = saveDataValues(); + if(valid) { + + String vs = Double.valueOf(this.value).toString(); + DataItem item = new DefaultDataItem(dataName, dataName, vs); + data.add(new DefaultData( + dataName, + null, + null, + new DataItem[] { item })); + } + + return data.toArray(new Data[data.size()]); + } + + + protected boolean saveDataValues() { + String st = inputPanel.getValueAsString(); + if (st == null) { + SC.warn("fehler... TODO"); + return false; + } + + try { + NumberFormat nf = NumberFormat.getDecimalFormat(); + double d = nf.parse(st); + this.value = d; + } + catch(NumberFormatException nfe) { + SC.warn("fehler... nfe... TODO"); + return false; + } + return true; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleRangeOnlyPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleRangeOnlyPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,88 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.widgets.form.fields.FloatItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; + + +public class DoubleRangeOnlyPanel extends DoubleRangePanel { + + public DoubleRangeOnlyPanel( + String titleFrom, + String titleTo, + double from, + double to, + int width, + BlurHandler handler + ) { + this(titleFrom, titleTo, from, to, width, handler, "right"); + } + + + public DoubleRangeOnlyPanel( + String titleFrom, + String titleTo, + double from, + double to, + int width, + BlurHandler handler, + String labelOrientation + ) { + super(); + + fromItem = new FloatItem(FIELD_FROM); + toItem = new FloatItem(FIELD_TO); + stepItem = new FloatItem(FIELD_WIDTH); + + fromItem.addBlurHandler(handler); + toItem.addBlurHandler(handler); + + NumberFormat nf = NumberFormat.getDecimalFormat(); + + fromItem.setValue(nf.format(from)); + toItem.setValue(nf.format(to)); + + StaticTextItem fromText = new StaticTextItem("staticFrom"); + fromText.setValue(titleFrom); + fromText.setShowTitle(false); + fromItem.setShowTitle(false); + + StaticTextItem toText = new StaticTextItem("staticTo"); + toText.setValue(titleTo); + toText.setShowTitle(false); + toItem.setShowTitle(false); + + int itemWidth = width / 4; + fromItem.setWidth(itemWidth); + fromText.setWidth(itemWidth); + toItem.setWidth(itemWidth); + toText.setWidth(itemWidth); + + if (labelOrientation.equals("right")) { + setFields(fromItem, fromText, toItem, toText); + } + else { + setFields(fromText, fromItem, toText, toItem); + } + + setFixedColWidths(false); + setNumCols(4); + setWidth(width); + setAlign(Alignment.CENTER); + } + + + @Override + public boolean validateForm() { + return validateForm(fromItem) && validateForm(toItem); + } + + + @Override + public double getStep() { + return -1; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleRangePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleRangePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,296 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.FloatItem; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; + +import org.dive4elements.river.client.client.FLYSConstants; + +import java.util.Map; + + +/** + * This class creates a DynamicForm with three input fields. + * + * @author Ingo Weinzierl + */ +public class DoubleRangePanel +extends DynamicForm +{ + /** The message class that provides i18n strings.*/ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + + /** The constant name of the input field to enter the start of a distance.*/ + public static final String FIELD_FROM = "from"; + + /** The constant name of the input field to enter the end of a distance.*/ + public static final String FIELD_TO = "to"; + + /** The constant name of the input field to enter the step width of a + * distance.*/ + public static final String FIELD_WIDTH = "step"; + + /** The textboxes */ + protected FloatItem fromItem; + protected FloatItem toItem; + protected FloatItem stepItem; + + + public DoubleRangePanel() { + } + + + /** + * Creates a new form with a single input field that displays an array of + * double values. + * + * @param name The name of the TextItem. + * @param title The title of the TextItem. + * @param values The double values that should be displayed initially. + * @param handler The BlurHandler that is used to valide the input. + */ + public DoubleRangePanel( + String titleFrom, String titleTo, String titleStep, + double from, double to, double step, + int width, + BlurHandler handler) + { + this( + titleFrom, titleTo, titleStep, + from, to, step, + width, + handler, + "right"); + } + + + public DoubleRangePanel( + String titleFrom, String titleTo, String titleStep, + double from, double to, double step, + int width, + BlurHandler handler, + String labelOrientation) + { + fromItem = new FloatItem(FIELD_FROM); + toItem = new FloatItem(FIELD_TO); + stepItem = new FloatItem(FIELD_WIDTH); + + fromItem.addBlurHandler(handler); + toItem.addBlurHandler(handler); + stepItem.addBlurHandler(handler); + + NumberFormat f = NumberFormat.getDecimalFormat(); + + fromItem.setValue(f.format(from)); + toItem.setValue(f.format(to)); + stepItem.setValue(f.format(step)); + + StaticTextItem fromText = new StaticTextItem("staticFrom"); + fromText.setValue(titleFrom); + fromText.setShowTitle(false); + fromItem.setShowTitle(false); + + StaticTextItem toText = new StaticTextItem("staticTo"); + toText.setValue(titleTo); + toText.setShowTitle(false); + toItem.setShowTitle(false); + + StaticTextItem stepText = new StaticTextItem("staticStep"); + stepText.setValue(titleStep); + stepText.setShowTitle(false); + stepItem.setShowTitle(false); + + int itemWidth = width / 6; + fromItem.setWidth(itemWidth); + fromText.setWidth(itemWidth); + toItem.setWidth(itemWidth); + toText.setWidth(itemWidth); + stepItem.setWidth(itemWidth); + stepText.setWidth(itemWidth); + + if (labelOrientation.equals("right")) { + setFields(fromItem, fromText, toItem, toText, stepItem, stepText); + } + else { + setFields(fromText, fromItem, toText, toItem, stepText, stepItem); + } + + setFixedColWidths(false); + setNumCols(6); + setWidth(width); + setAlign(Alignment.CENTER); + } + + + /** + * This method takes distances values and sets them to the textboxes + * visualizied by this widget. + * + * @param from The from value. + * @param to The to value. + * @param steps The max steps. + */ + public void setValues(double from, double to, double steps) { + NumberFormat f = NumberFormat.getDecimalFormat(); + + fromItem.setValue(f.format(from)); + toItem.setValue(f.format(to)); + stepItem.setValue(f.format(steps)); + } + + + public boolean validateForm() { + try { + return + validateForm(fromItem) && + validateForm(toItem) && + validateForm(stepItem); + } + catch (NumberFormatException nfe) { + return false; + } + } + + /** + * This method validates the entered text in the input fields. If + * there are values that doesn't represent a valid float, an error is + * displayed. + * + * @param item The FormItem. + */ + @SuppressWarnings("unchecked") + protected boolean validateForm(FormItem item) { + if (item instanceof StaticTextItem) { + return true; + } + + boolean valid = true; + + String v = (String) item.getValue(); + + NumberFormat f = NumberFormat.getDecimalFormat(); + @SuppressWarnings("rawtypes") + Map errors = getErrors(); + + try { + if (v == null) { + throw new NumberFormatException("empty"); + } + + f.parse(v); + + errors.remove(item.getFieldName()); + } + catch (NumberFormatException nfe) { + errors.put(item.getFieldName(), MESSAGES.wrongFormat()); + + item.focusInItem(); + + valid = false; + } + + setErrors(errors, true); + + return valid; + } + + + /** + * Returns the double value of value. + * + * @return the double value of value. + */ + protected double getDouble(String value) { + NumberFormat f = NumberFormat.getDecimalFormat(); + + String[] splitted = value.split(" "); + + return f.parse(splitted[0]); + } + + + /** + * Returns the start value. + * + * @return the start value. + */ + public double getFrom() throws NullPointerException { + String v = getValueAsString(FIELD_FROM); + + return getDouble(v); + } + + + /** + * Returns the end value. + * + * @return the end value. + */ + public double getTo() throws NullPointerException { + String v = getValueAsString(FIELD_TO); + + return getDouble(v); + } + + + /** + * Returns the step width. + * + * @return the step width. + */ + public double getStep() throws NullPointerException { + String v = getValueAsString(FIELD_WIDTH); + + return getDouble(v); + } + + + /** + * Sets the value of the field with name fieldname. + * + * @param value The new value. + * @param fieldname The name of the field. + */ + public void setDoubleValue(double value, String fieldname) { + NumberFormat f = NumberFormat.getDecimalFormat(); + setValue(fieldname, f.format(value)); + } + + + /** + * Sets a new start value. + * + * @param value The new start value. + */ + public void setFrom(double value) { + setDoubleValue(value, FIELD_FROM); + } + + + /** + * Sets a new end value. + * + * @param value The new end value. + */ + public void setTo(double value) { + setDoubleValue(value, FIELD_TO); + } + + + /** + * Sets a new step width. + * + * @param value The new step width. + */ + public void setStep(double value) { + setDoubleValue(value, FIELD_WIDTH); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ExportPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ExportPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,168 @@ +package org.dive4elements.river.client.client.ui; + +import java.util.List; +import java.util.MissingResourceException; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.ExportMode; +import org.dive4elements.river.client.shared.model.Facet; +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; + + +/** + * A panel that displays an download icon for all available export modes of a + * Collection. + * + * @author Ingo Weinzierl + */ +public class ExportPanel extends VLayout { + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected Collection c; + protected List exports; + + /** This layout will store a list of available export types.*/ + protected HLayout container; + + + public ExportPanel(Collection c, List exports) { + super(); + + this.c = c; + this.exports = exports; + this.container = new HLayout(); + + Label title = new Label(MSG.dataexport()); + title.setHeight(15); + title.setStyleName("fontNormalSmallUnderlined"); + + addMember(title); + addMember(createExportItems()); + + setHeight(45); + setMembersMargin(5); + } + + + /** + * This method is used to create an item (created by createExportButton) for + * each facet for each export mode. + * + * @return a horizontal list of buttons. + */ + protected HLayout createExportItems() { + HLayout layout = new HLayout(); + + for (ExportMode mode: exports) { + String name = mode.getName(); + List facets = mode.getFacets(); + + for (Facet facet: facets) { + if (name.equals("fix_wq_curve_at_export")) { + continue; + } + String filename = name; + if (name.equals("computed_dischargecurve_at_export")) { + filename = "dischargecurve"; + } + layout.addMember(createExportButton( + name, + facet.getName(), + filename)); + } + } + + return layout; + } + + + /** + * This method is used to create a button (with click handler) for a + * concrete export mode / type. + * + * @param name The name of the export. + * @param facet The name of the export type (e.g. CSV, WST). + * + * @return an image with click handler. + */ + protected Canvas createExportButton( + String name, + String facet, + String filename + ) { + String url = getExportUrl(name, facet, filename); + String imgUrl = GWT.getHostPageBaseURL(); + if (facet.equals("pdf")) { + imgUrl += MSG.downloadPDF(); + } + else if (facet.equals("at")) { + imgUrl += MSG.downloadAT(); + } + else if (facet.equals("wst")) { + imgUrl += MSG.downloadWST(); + } + else if (facet.equals("csv")) { + imgUrl += MSG.downloadCSV(); + } + else { + imgUrl += MSG.imageSave(); + } + ImgLink link = new ImgLink(imgUrl, url, 30, 30); + link.setTooltip(getTooltipText(name, facet)); + + return link; + } + + + /** + * Creates the URL used to trigger an export. + * + * @param name The name of the export. + * @param facet The name of the export type (e.g. CSV, WST). + * + * @return the export URL. + */ + protected String getExportUrl(String name, String facet, String filename) { + Config config = Config.getInstance(); + + String url = GWT.getModuleBaseURL(); + url += "export"; + url += "?uuid=" + c.identifier(); + url += "&name=" + filename; + url += "&mode=" + name; + url += "&type=" + facet; + url += "&server=" + config.getServerUrl(); + url += "&locale=" + config.getLocale(); + + return url; + } + + + /** + * Creates a text used as tooltip for a specific export and type. + * + * @param name The name of the export. + * @param facet The name of the export type (e.g. CSV, WST). + * + * @return a tooltip text. + */ + protected String getTooltipText(String name, String facet) { + try { + return MSG.getString(name) + " | " + MSG.getString(facet); + } + catch (MissingResourceException mre) { + return name + " | " + facet; + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSHeader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSHeader.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,291 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.LocaleInfo; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.util.BooleanCallback; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; + +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.UserService; +import org.dive4elements.river.client.client.services.UserServiceAsync; +import org.dive4elements.river.client.shared.model.User; + + +/** + * @author Ingo Weinzierl + */ +public class FLYSHeader extends HLayout { + + /** The interface that provides the message resources. */ + private FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + /** The height used for this header.*/ + public static final int HEIGHT = 56; + + /** The height used for the images.*/ + public static final int IMG_HEIGHT = 50; + + /** The user that is currently logged in. */ + private User currentUser; + + /** The label that displays the current logged in user. */ + private Label userText; + + /** The button to log the current user out.*/ + private Button logout; + + /** The button to open the project list.*/ + private Button projectList; + + /** The button to switch between the english and german version.*/ + private Button language; + + /** The button to open an info panel.*/ + private Button info; + + private UserServiceAsync userService = + GWT.create(UserService.class); + + /** An instance to FLYS.*/ + private FLYS flys; + + + public FLYSHeader(FLYS flys) { + this.flys = flys; + + String guest = MESSAGES.user() + " " + MESSAGES.guest(); + + userText = new Label(guest); + projectList = new Button(MESSAGES.manage_projects()); + logout = new Button(MESSAGES.logout()); + language = new Button(MESSAGES.switch_language()); + info = new Button(MESSAGES.info()); + + projectList.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + GWT.log("Clicked 'Open ProjectList' button."); + getFlys().openProjectList(); + } + }); + + logout.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + GWT.log("Clicked 'logout' button."); + userService.logoutCurrentUser(new AsyncCallback() { + public void onFailure(Throwable caught) { + } + + public void onSuccess(Void result) { + /* Just reload the page. GGInAFilter is goint to redirect + * to the correct login page */ + Window.Location.reload(); + } + }); + + } + }); + + language.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + LocaleInfo info = LocaleInfo.getCurrentLocale(); + final String currentLocale = info.getLocaleName(); + final String newLocale = currentLocale.equals("de") + ? "en" + : "de"; + + SC.confirm(MESSAGES.warning(), MESSAGES.warning_language(), + new BooleanCallback() { + @Override + public void execute(Boolean value) { + if (value) { + switchLanguage(currentLocale, newLocale); + } + } + }); + } + }); + + info.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + GWT.log("Clicked 'info' button."); + GWT.log("IMPLEMENT the 'open info panel' function."); + } + }); + init(); + } + + public void init() { + setStyleName("header"); + setWidth100(); + setHeight(HEIGHT); + setBackgroundColor("#a9c9e6"); + setLayoutLeftMargin(5); + setLayoutRightMargin(5); + + String baseUrl = GWT.getHostPageBaseURL(); + + Img flys = new Img( + baseUrl + MESSAGES.flysLogo(), + 50, + IMG_HEIGHT); + + Img bfg = new Img( + baseUrl + MESSAGES.bfgLogoSmall(), + 150, + IMG_HEIGHT); + + Label fullname = new Label(MESSAGES.fullname()); + fullname.setHeight(HEIGHT - IMG_HEIGHT); + fullname.setStyleName("fontBlackMid"); + + HLayout left = new HLayout(); + left.setDefaultLayoutAlign(VerticalAlignment.CENTER); + left.setMembersMargin(3); + left.addMember(flys); + left.addMember(fullname); + + HLayout right = new HLayout(); + right.setAlign(Alignment.RIGHT); + right.setDefaultLayoutAlign(Alignment.RIGHT); + right.setDefaultLayoutAlign(VerticalAlignment.CENTER); + right.setMembersMargin(3); + right.setLayoutRightMargin(5); + + projectList.setStyleName("manageProjects"); + userText.setStyleName("fontBlackSmall"); + logout.setStyleName("fontLightSmall"); + language.setStyleName("fontLightSmall"); + info.setStyleName("fontLightSmall"); + + userText.setAlign(Alignment.RIGHT); + userText.setWidth(200); + logout.setWidth(70); + info.setWidth(40); + language.setWidth(70); + + left.addMember(projectList); + if (this.flys.isProjectListVisible()) { + hideProjectButton(); + } + else { + showProjectButton(); + } + + right.addMember(userText); + right.addMember(logout); + right.addMember(language); + right.addMember(info); + right.addMember(bfg); + + addMember(left); + addMember(right); + } + + /** + * Returns the FLYS instance stored in this class. + * + * @return the flys instance. + */ + private FLYS getFlys() { + return flys; + } + + /** + * This method triggers the language switch between the currentLocale + * and the newLocale. The switch is done by replacing a "locale=" + * parameter in the url of the application. We could use the GWT UrlBuilder + * class to create a new URL, but - in my eyes - this class is a bit + * inconsistens in its implementation. + * + * @param currentLocale The current locale string (e.g. "en"). + * @param newLocale The new locale string (e.g. "de"). + */ + private void switchLanguage(String currentLocale, String newLocale) { + String newLocation = Window.Location.getHref(); + + if (newLocation.endsWith("/")) { + newLocation = newLocation.substring(0, newLocation.length()-1); + } + + String replace = null; + String replaceWith = null; + + if (newLocation.indexOf("&locale=") >= 0) { + replace = currentLocale.equals("de") + ? "&locale=de" + : "&locale=en"; + + replaceWith = "&locale=" + newLocale; + } + else if (newLocation.indexOf("?locale=") >= 0) { + replace = currentLocale.equals("de") + ? "?locale=de" + : "?locale=en"; + + replaceWith = "?locale=" + newLocale; + } + else { + newLocation += newLocation.indexOf("?") >= 0 + ? "&locale=" + newLocale + : "?locale=" + newLocale; + } + + if (replace != null && replaceWith != null) { + newLocation = newLocation.replace(replace, replaceWith); + } + + Window.open(newLocation, "_self", ""); + } + + /** + * Update the text field that shows the current user. If no user is + * currently logged in, the text will display {@link FLYSConstants.guest()}. + */ + private void updateCurrentUser() { + String name = currentUser != null + ? currentUser.getName() + : MESSAGES.guest(); + + GWT.log("Update the current user: " + name); + + String username = MESSAGES.user() + " " + name; + userText.setContents(username); + } + + /** + * Set the current {@link User} and call {@link updateCurrentUser()} + * afterwards. + * + * @param user the new user. + */ + public void setCurrentUser(User currentUser) { + this.currentUser = currentUser; + + updateCurrentUser(); + } + + public void hideProjectButton() { + this.projectList.hide(); + } + + public void showProjectButton() { + this.projectList.show(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSView.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSView.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,81 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.layout.HLayout; + + +/** + * Vertically speaking the main part of the ui (containing projectlist + * and workspace). + * @author Ingo Weinzierl + */ +public class FLYSView extends Canvas { + + /** The project list displaying the projects of a user.*/ + protected ProjectList projectList; + + /** The workspace that handles the artifact collection views.*/ + protected FLYSWorkspace workspace; + + /** The layout provided by this widget.*/ + protected HLayout layout; + + + /** + * The default constructor for creating a new empty FLYSView. After creating + * the components, {@link init()} is called to do the layout work. + */ + public FLYSView() { + layout = new HLayout(); + + init(); + } + + + /** + * This method is called to do the layout work. + */ + protected void init() { + setWidth("100%"); + setHeight("*"); + + setStyleName("bgWhite"); + setBorder("1px solid #808080"); + + layout.setHeight("100%"); + layout.setWidth("100%"); + + addChild(layout); + } + + + /** + * Set the current project list. Previous ProjectLists are replaced by the + * new one. + */ + public void setProjectList(ProjectList projectList) { + if (this.projectList != null) { + removeChild(this.projectList); + } + + this.projectList = projectList; + layout.addMember(this.projectList); + } + + + /** + * Set the current FLYSWorkspace. Previous workspaces are replaced by the + * new one. + * + * @param workspaces The new FLYSWorkspace. + */ + public void setFLYSWorkspace(FLYSWorkspace workspace) { + if (this.workspace != null) { + removeChild(this.workspace); + } + + this.workspace = workspace; + layout.addMember(this.workspace); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSWorkspace.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSWorkspace.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,179 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Img; +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.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.client.FLYSConstants; + +import java.util.HashMap; +import java.util.Map; + + +/** + * "Workspace" canvas showing the CollectionViews (subwindows). + * @author Ingo Weinzierl + */ +public class FLYSWorkspace extends Canvas { + + /** The maximal number of windows that fit into the browser view when an + * offset is used to move windows initially.*/ + public static int MAX_WINDOWS = 10; + + /** The number of pixels used to move windows.*/ + public static int WINDOW_OFFSET = 20; + + /** A map that contains the open CollectionViews. */ + protected Map views; + + /** The interface that provides the message resources. */ + private FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + /** Application instance. */ + private FLYS flys; + + + /** + * The default constructor creates an empty FLYSWorkspace with no + * CollectionViews opened. + */ + public FLYSWorkspace(FLYS flys) { + this.flys = flys; + views = new HashMap(); + + setWidth("100%"); + setHeight("100%"); + + addBackgroundWorkspace(); + } + + + /** + * This method adds a new CollectionView to this workspace and stores a + * reference in {@link views}. + * + * @param collectionView A new CollectionView. + */ + public void addView(String uuid, CollectionView collectionView) { + collectionView.moveTo(0, 0); + collectionView.setMaximized(true); + + views.put(uuid, collectionView); + addChild(collectionView); + } + + + public void removeProject(String uuid) { + views.remove(uuid); + } + + + public void bringUp(String uuid) { + CollectionView view = views.get(uuid); + + if (view != null) { + view.show(); + view.restore(); + } + else { + GWT.log("FLYSWorkspace.bringUp() failed!"); + } + } + + + /** + * Removes a project from workspace (view) and clears its reference from + * hash map. + * + * @param uuid The project's uuid. + */ + public void destroyProject(String uuid) { + CollectionView project = views.get(uuid); + + if (project != null) { + removeProject(uuid); + project.destroy(); + } + } + + + public void updateTitle(String uuid, String title) { + CollectionView view = views.get(uuid); + view.setTitle(title); + } + + + public boolean hasView(String uuid) { + if(views.get(uuid) != null) { + return true; + } + return false; + } + + private void addBackgroundWorkspace() { + String baseUrl = GWT.getHostPageBaseURL(); + Img bfg = new Img( + baseUrl + MESSAGES.bfgLogo()); + bfg.setWidth(150); + bfg.setHeight(100); + bfg.setLayoutAlign(Alignment.RIGHT); + + HLayout backgroundlayout = new HLayout(); + backgroundlayout.setHeight100(); + backgroundlayout.setWidth100(); + backgroundlayout.setDefaultLayoutAlign(Alignment.CENTER); + backgroundlayout.setDefaultLayoutAlign(VerticalAlignment.CENTER); + + Canvas spacer = new Canvas(); + spacer.setWidth("33%"); + + VLayout infobox = new VLayout(); + infobox.setHeight("*"); + infobox.setWidth("*"); + infobox.setDefaultLayoutAlign(Alignment.CENTER); + + Label welcome = new Label(MESSAGES.welcome()); + welcome.setAlign(Alignment.CENTER); + welcome.setStyleName("fontNormalBig"); + + Label lcreate = new Label(MESSAGES.welcome_open_or_create()); + lcreate.setStyleName("welcomeCreateText"); + lcreate.setWidth100(); + lcreate.setAlign(Alignment.CENTER); + + Button addbutton = new Button(MESSAGES.new_project()); + addbutton.setStyleName("projectsAddButton"); + addbutton.setAlign(Alignment.CENTER); + addbutton.setTitle(MESSAGES.new_project()); + addbutton.setAutoFit(true); + addbutton.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + flys.newProject(); + } + }); + + + infobox.addMember(welcome); + infobox.addMember(lcreate); + infobox.addMember(addbutton); + + backgroundlayout.addMember(spacer); + backgroundlayout.addMember(infobox); + backgroundlayout.addMember(spacer); + + addChild(backgroundlayout); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/GaugeTimeRangePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/GaugeTimeRangePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,405 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; + +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.DateRangeItem; +import com.smartgwt.client.widgets.grid.CellFormatter; +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; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.ui.range.DischargeInfoDataSource; +import org.dive4elements.river.client.client.widgets.DischargeTablesChart; +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.LongRangeData; +import org.dive4elements.river.client.shared.model.RangeData; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author Raimund Renkert + */ +public class GaugeTimeRangePanel extends RangePanel { + + private static final long serialVersionUID = -157571967010594739L; + + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected ListGrid yearTable; + + protected DateRangeItem dateRange; + + protected Long maxUpper; + protected Long maxLower; + + + public GaugeTimeRangePanel() { + GWT.log("Creating YearInputPanel"); + yearTable = new ListGrid(); + yearTable.setAutoFetchData(true); + yearTable.setShowHeaderContextMenu(false); + } + + protected void setMaxUpper(DataList dataList) { + LongRangeData range = (LongRangeData) dataList.get(0); + setMaxUpper((Long) range.getUpper()); + } + + protected void setMaxUpper(Long maxUpper) { + this.maxUpper = maxUpper; + } + + protected void setMaxLower(DataList dataList) { + LongRangeData range = (LongRangeData) dataList.get(0); + setMaxLower((Long) range.getLower()); + } + + protected void setMaxLower(Long maxLower) { + this.maxLower = maxLower; + } + + @Override + public Canvas create(DataList data) { + setDataName(data); + + VLayout root = new VLayout(); + + root.addMember(createLabel(data)); + root.addMember(createForm(data)); + root.addMember(getNextButton()); + + initDefaults(data); + + initYearTable(); + + long gauge = getGaugeNumber(); + + Config config = Config.getInstance(); + String url = config.getServerUrl(); + yearTable.setDataSource(new DischargeInfoDataSource(url, gauge)); + + helperContainer.addMember(createHelperPanel()); + + setMaxUpper(data); + setMaxLower(data); + + return root; + } + + + protected Canvas createHelperPanel() { + TabSet tabs = new TabSet(); + + Tab table = new Tab(MSG.discharge_timeranges()); + Tab chart = new Tab(MSG.discharge_chart()); + + table.setPane(yearTable); + chart.setPane(new DischargeTablesChart(artifact)); + + tabs.addTab(table, 0); + tabs.addTab(chart, 1); + + return tabs; + } + + + /** Put defaults in form. */ + @Override + protected void initDefaults(DataList dataList) { + RangeData data = findRangeData(dataList); + + if (data != null) { + dateRange.setFromDate(new Date((Long)data.getLower())); + } + + dateRange.setToDate(new Date()); + } + + + @Override + public Canvas createOld(DataList dataList) { + GWT.log("create old date."); + Data data = dataList.get(0); + HLayout layout = new HLayout(); + + Label label = new Label(dataList.getLabel()); + label.setWidth(200); + label.setHeight(20); + + Date dl = new Date((Long)((LongRangeData)data).getLower()); + Date du = new Date((Long)((LongRangeData)data).getUpper()); + + @SuppressWarnings("deprecation") + DateTimeFormat dtf = DateTimeFormat.getMediumDateFormat(); + Label value = new Label(dtf.format(dl) + " - " + dtf.format(du)); + value.setHeight(20); + + layout.addMember(label); + layout.addMember(value); + layout.addMember(getBackButton(dataList.getState())); + + return layout; + } + + + @Override + protected Data[] getData() { + long lo = getLowerAsLong(); + long up = getUpperAsLong(); + + return new Data[] { new LongRangeData(getDataName(), null, lo, up) }; + } + + + @Override + protected Canvas createForm(DataList dataList) { + HLayout layout = new HLayout(); + DynamicForm form = new DynamicForm(); + dateRange = new DateRangeItem(); + dateRange.setToTitle(MESSAGES.to()); + dateRange.setFromTitle(MESSAGES.from()); + dateRange.setShowTitle(false); + form.setFields(dateRange); + + layout.addMember(form); + return layout; + + } + + + @Override + public Object getMaxLower() { + return maxLower; + } + + + protected long getLowerAsLong() { + Date d = dateRange.getFromDate(); + return d.getTime(); + } + + + protected long getUpperAsLong() { + Date d = dateRange.getToDate(); + return d.getTime(); + } + + + @Override + public Object getMaxUpper() { + Date d = dateRange.getToDate(); + return new Long(d.getTime()); + } + + + @Override + public void setLower(String lower) { + try { + long value = Long.valueOf(lower); + dateRange.setFromDate(new Date(value)); + } + catch (NumberFormatException nfe) { + GWT.log("could not parse lower date."); + SC.warn(MESSAGES.warning_cannot_parse_date()); + } + } + + + @Override + public void setUpper(String upper) { + try { + long value = Long.valueOf(upper); + dateRange.setToDate(new Date(value)); + } + catch (NumberFormatException nfe) { + GWT.log("could not parse upper date."); + SC.warn(MESSAGES.warning_cannot_parse_date()); + } + } + + + protected String buildDateString(String raw) { + if (raw == null || raw.length() == 0) { + return ""; + } + + long value = Long.valueOf(raw); + Date date = new Date(value); + @SuppressWarnings("deprecation") + DateTimeFormat dtf = DateTimeFormat.getMediumDateFormat(); + + return dtf.format(date); + } + + + protected ListGrid initYearTable() { + String baseUrl = GWT.getHostPageBaseURL(); + + yearTable.setWidth100(); + yearTable.setHeight100(); + yearTable.setShowRecordComponents(true); + yearTable.setShowRecordComponentsByCell(true); + yearTable.setEmptyMessage(MESSAGES.empty_filter()); + yearTable.setCanReorderFields(false); + + CellFormatter cf = new CellFormatter() { + @Override + public String format( + Object value, + ListGridRecord record, + int rowNum, int colNum + ) { + if (value == null) { + return null; + } + else if (value.toString().equals("-1")) { + return ""; + } + else if (colNum == 3 || colNum == 4) { + return buildDateString(value.toString()); + } + else { + return value.toString(); + } + } + }; + + + ListGridField addstart = new ListGridField ("", MESSAGES.from()); + addstart.setType (ListGridFieldType.ICON); + addstart.setWidth (20); + addstart.setCellIcon(baseUrl + MESSAGES.markerGreen()); + addstart.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(RecordClickEvent e) { + Record r = e.getRecord(); + if (r.getAttribute("start").equals("-1")) { + return; + } + else { + setLower(r.getAttribute("start")); + } + } + }); + + ListGridField addend = new ListGridField ("", MESSAGES.to()); + addend.setType (ListGridFieldType.ICON); + addend.setWidth (20); + addend.setCellIcon(baseUrl + MESSAGES.markerRed()); + addend.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(RecordClickEvent e) { + Record r = e.getRecord(); + if (r.getAttribute("end").equals("-1")) { + return; + } + else { + setUpper(r.getAttribute("end")); + } + } + }); + + ListGridField desc = + new ListGridField("description", MESSAGES.discharge_curve_gaugeless()); + desc.setType(ListGridFieldType.TEXT); + desc.setWidth("*"); + + ListGridField start = + new ListGridField("start", MESSAGES.start_year()); + start.setType(ListGridFieldType.INTEGER); + start.setWidth(100); + start.setCellFormatter(cf); + + ListGridField end = + new ListGridField("end", MESSAGES.end_year()); + end.setType(ListGridFieldType.INTEGER); + end.setWidth(100); + end.setCellFormatter(cf); + + yearTable.setFields(addstart, addend, desc, start, end); + + return yearTable; + } + + + protected long getGaugeNumber() { + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList[] data = adescr.getOldData(); + + String gauge = ""; + if (data != null && data.length > 0) { + for (int i = 0; i < data.length; i++) { + DataList dl = data[i]; + if (dl.getState().equals("state.winfo.historicalq.reference_gauge")) { + for (int j = 0; j < dl.size(); j++) { + Data d = dl.get(j); + DataItem[] di = d.getItems(); + if (di != null && di.length == 1) { + gauge = d.getItems()[0].getStringValue(); + } + } + } + } + } + try { + return Long.parseLong(gauge); + } + catch (NumberFormatException nfe) { + GWT.log("Error parsing gauge."); + return 0; + } + } + + + /** Return List of error messages, if not validated. */ + @Override + public List validate() { + List errors = new ArrayList(); + + Date from = dateRange.getFromDate(); + Date to = dateRange.getToDate(); + + if (from == null || to == null) { + String msg = MSG.error_validate_date_range(); + errors.add(msg); + } + + long maxLow = (Long) getMaxLower(); + long maxUpper = (Long) getMaxUpper(); + long inLow = from.getTime(); + long inUpper = to.getTime(); + + if (inLow < maxLow) { + errors.add(MSG.error_validate_date_range_invalid()); + } + else if (inUpper > maxUpper) { + errors.add(MSG.error_validate_date_range_invalid()); + } + else if (inLow > inUpper) { + errors.add(MSG.error_validate_date_range_invalid()); + } + + return errors; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/HWSDatacagePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/HWSDatacagePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,128 @@ +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.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +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.User; + +import java.util.ArrayList; +import java.util.List; + + +public class HWSDatacagePanel +extends DatacagePanel +{ + public static final String OUT = "floodmap-hws"; + public static final String PARAMETERS = "hws:true;load-system:true"; + + + public HWSDatacagePanel() { + super(); + } + + + public HWSDatacagePanel(User user) { + super(user); + } + + + @Override + protected void createWidget() { + super.createWidget(); + widget.setIsMutliSelectable(true); + } + + + @Override + public String getOuts() { + return OUT; + } + + + @Override + public String getParameters() { + return PARAMETERS; + } + + + @Override + public List validate() { + List errors = new ArrayList(); + + return errors; + } + + @Override + public Canvas createOld(DataList dataList) { + GWT.log("old datacage##########################################"); + HLayout layout = new HLayout(); + VLayout vLayout = new VLayout(); + layout.setWidth("400px"); + + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + + int size = dataList.size(); + for (int i = 0; i < size; i++) { + Data data = dataList.get(i); + DataItem[] items = data.getItems(); + + for (DataItem item: items) { + HLayout hLayout = new HLayout(); + + hLayout.addMember(label); + hLayout.addMember(new Label(item.getLabel())); + + vLayout.addMember(hLayout); + vLayout.setWidth("130px"); + } + } + + Canvas back = getBackButton(dataList.getState()); + + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + + @Override + protected Data[] getData() { + String[] selection = this.widget.getSelectionTitles(); + String result = ""; + boolean first = true; + if (selection != null) { + for (String record: selection) { + if (first) { + result += record; + first = false; + } + else { + result += ";" + record; + } + } + } + if (result.length() == 0) { + result = MSG.notselected(); + } + Data[] data = new Data[1]; + DataItem item = new DefaultDataItem( + "uesk.hws", "uesk.hws", result); + data[0] = new DefaultData("uesk.hws", null, null, new DataItem[] {item}); + + return data; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ImgLink.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ImgLink.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,53 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.types.Overflow; +import com.smartgwt.client.widgets.HTMLPane; + + +public class ImgLink extends HTMLPane { + + private int width; + private int height; + + private String href; + private String imgUrl; + + private boolean newTab; + + + public ImgLink(String imgUrl, String href, int width, int height) { + super(); + + this.width = width; + this.height = height; + this.href = href; + this.imgUrl = imgUrl; + this.newTab = false; + + update(); + } + + + public ImgLink(String imgUrl, String href, int w, int h, boolean newTab) { + this(imgUrl, href, w, h); + this.newTab = newTab; + + update(); + } + + + protected void update() { + String target = newTab ? "_blank" : "_self"; + + setContents(""); + setWidth(width); + setHeight(height); + setOverflow(Overflow.VISIBLE); + } + + + public void setSource(String href) { + this.href = href; + update(); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/IntegerRangePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/IntegerRangePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,160 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.IntegerItem; +import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator; +import com.smartgwt.client.widgets.form.validator.Validator; + +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.IntegerRangeData; + + +public class IntegerRangePanel extends RangePanel { + + private static final long serialVersionUID = -7471199535764887461L; + + protected Integer maxLower; + protected Integer maxUpper; + + + @Override + protected Data[] getData() { + Integer lo = getLowerAsInt(); + Integer up = getUpperAsInt(); + + return new Data[] { new IntegerRangeData(getDataName(), null, lo, up) }; + } + + + @Override + protected FormItem newFormItem(String name) { + IntegerItem item = new IntegerItem(name, ""); + item.setShowTitle(false); + + return item; + } + + + @Override + protected Validator[] createLowerValidators(DataList dataList) { + setMaxLower(dataList); + setMaxUpper(dataList); + + Validator validator = newRangeValidator(); + + if (validator != null) { + return new Validator[] { validator }; + } + + return null; + } + + + @Override + protected Validator[] createUpperValidators(DataList dataList) { + setMaxLower(dataList); + setMaxUpper(dataList); + + Validator validator = newRangeValidator(); + + if (validator != null) { + return new Validator[] { validator }; + } + + return null; + } + + + @Override + public Object getMaxLower() { + return maxLower; + } + + + @Override + public Object getMaxUpper() { + return maxUpper; + } + + + public Integer getLowerAsInt() { + String raw = getLower(); + + if (raw != null && raw.length() > 0) { + try { + return Integer.valueOf(raw); + } + catch (NumberFormatException nfe) { + // do nothing + } + } + + return null; + } + + + public Integer getUpperAsInt() { + String raw = getUpper(); + + if (raw != null && raw.length() > 0) { + try { + return Integer.valueOf(raw); + } + catch (NumberFormatException nfe) { + // do nothing + } + } + + return null; + } + + + protected Validator newRangeValidator() { + Integer maxLower = getMaxLowerAsInt(); + Integer maxUpper = getMaxUpperAsInt(); + + if (maxLower != null && maxUpper != null) { + IntegerRangeValidator validator = new IntegerRangeValidator(); + validator.setMax(maxUpper); + validator.setMin(maxLower); + + return validator; + } + + return null; + } + + + public Integer getMaxLowerAsInt() { + return maxLower; + } + + + protected void setMaxLower(DataList dataList) { + IntegerRangeData range = (IntegerRangeData) dataList.get(0); + setMaxLower((Integer) range.getLower()); + } + + + public void setMaxLower(Integer maxLower) { + this.maxLower = maxLower; + } + + + public Integer getMaxUpperAsInt() { + return maxUpper; + } + + + protected void setMaxUpper(DataList dataList) { + IntegerRangeData range = (IntegerRangeData) dataList.get(0); + setMaxUpper((Integer) range.getUpper()); + } + + + public void setMaxUpper(Integer maxUpper) { + this.maxUpper = maxUpper; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,181 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.LinkItem; +import com.smartgwt.client.widgets.form.fields.events.ClickEvent; +import com.smartgwt.client.widgets.form.fields.events.ClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.StepForwardEvent; +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; + + +/** + * This UIProvider displays the DataItems of the Data object in a list of links. + * + * @author Raimund Renkert + */ +public class LinkSelection +extends MapSelection +{ + + private static final long serialVersionUID = -7138270638349711024L; + + /** The message class that provides i18n strings.*/ + protected FLYSConstants messages = GWT.create(FLYSConstants.class); + + /** The selected river*/ + protected Data river; + + /** + * This method currently returns a + * {@link com.smartgwt.client.widgets.form.DynamicForm} that contains all + * data items in a list of links stored in data. + * + * @param data The {@link Data} object. + * + * @return a combobox. + */ + @Override + public Canvas create(DataList data) { + VLayout v = new VLayout(); + v.setMembersMargin(10); + v.setAlign(VerticalAlignment.TOP); + if (data.getState() == null) { + Canvas module = super.createWidget(data); + v.addMember(module); + } + Canvas content = createWidget(data); + v.addMember(content); + + return v; + } + + + @Override + public Canvas createOld(DataList dataList) { + HLayout layout = new HLayout(); + VLayout vLayout = new VLayout(); + layout.setWidth("400px"); + + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + + int size = dataList.size(); + for (int i = 0; i < size; i++) { + Data data = dataList.get(i); + DataItem[] items = data.getItems(); + + for (DataItem item: items) { + HLayout hLayout = new HLayout(); + + hLayout.addMember(label); + hLayout.addMember(new Label(item.getLabel())); + + vLayout.addMember(hLayout); + vLayout.setWidth("130px"); + } + } + + Canvas back = getBackButton(dataList.getState()); + + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + + /** + * This method creates the content of the widget. + * + * @param data The {@link Data} object. + * + * @return a list of links + */ + @Override + protected Canvas createWidget(DataList data) { + GWT.log("LinkSelection - create()"); + + VLayout layout = new VLayout(); + layout.setAlign(VerticalAlignment.TOP); + layout.setHeight(25); + + VLayout formLayout = new VLayout(); + + formLayout.setLayoutLeftMargin(60); + int size = data.size(); + + for (int i = 0; i < size; i++) { + Data d = data.get(i); + + Label label = new Label(d.getDescription()); + label.setValign(VerticalAlignment.TOP); + label.setHeight(20); + + for (DataItem item: d.getItems()) { + LinkItem link = new LinkItem("river"); + link.setLinkTitle(item.getLabel()); + link.setTarget(item.getStringValue()); + link.setShowTitle(false); + DynamicForm f = new DynamicForm(); + f.setItems(link); + formLayout.addMember(f); + link.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + DataItem item = new DefaultDataItem( + ((LinkItem)event.getItem()).getLinkTitle(), + null, + ((LinkItem)event.getItem()).getLinkTitle()); + + river = new DefaultData( + "river", + null, + null, + new DataItem [] {item}); + fireStepForwardEvent (new StepForwardEvent (getData())); + } + }); + + } + label.setWidth(50); + + layout.addMember(label); + layout.addMember(formLayout); + } + layout.setAlign(VerticalAlignment.TOP); + + String baseUrl = GWT.getHostPageBaseURL(); + Img map = new Img(baseUrl + messages.riverMap(), 494, 582); + helperContainer.addMember(map); + + return layout; + } + + + @Override + protected Data[] getData() { + Data[] module = super.getData(); + if (module != null) { + return new Data[] {module[0], river}; + } + else { + return new Data[] {river}; + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LoadingPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LoadingPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,257 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.Positioning; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Img; +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.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.HasStepBackHandlers; +import org.dive4elements.river.client.client.event.StepBackEvent; +import org.dive4elements.river.client.client.event.StepBackHandler; +import org.dive4elements.river.client.client.services.DescribeArtifactService; +import org.dive4elements.river.client.client.services.DescribeArtifactServiceAsync; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.CalculationMessage; +import org.dive4elements.river.client.shared.model.DataList; + +import java.util.ArrayList; +import java.util.List; + + +public class LoadingPanel extends Canvas implements HasStepBackHandlers { + + private static final long serialVersionUID = -7806425431408987601L; + + public static final int UPDATE_INTERVAL = 1000 * 3; + + public static final DescribeArtifactServiceAsync describe = + GWT.create(DescribeArtifactService.class); + + private FLYSConstants MSG = GWT.create(FLYSConstants.class); + + + protected List handlers; + + protected CollectionView parent; + protected Artifact artifact; + + protected VLayout dialog; + protected HLayout cancelRow; + protected Label msg; + protected Label title; + + protected int i; + + + public LoadingPanel(CollectionView parent, Artifact artifact) { + super(); + + this.handlers = new ArrayList(); + this.parent = parent; + this.artifact = artifact; + this.msg = new Label(""); + this.title = new Label(""); + this.dialog = createDialog(); + + this.i = 0; + + initLayout(); + startTimer(); + } + + + private void initLayout() { + setWidth("100%"); + setHeight("98%"); + setBackgroundColor("#7f7f7f"); + setOpacity(50); + setPosition(Positioning.RELATIVE); + + parent.addChild(this); + parent.addChild(dialog); + dialog.moveTo(0, 20); + moveTo(0, 7); + } + + + public void setArtifact(Artifact artifact) { + this.artifact = artifact; + } + + + public Artifact getArtifact() { + return artifact; + } + + + @Override + public void addStepBackHandler(StepBackHandler handler) { + if (handler != null) { + handlers.add(handler); + } + } + + + /** + * This method is called after the user has clicked the button to cancel the + * current process. + * + * @param e The StepBackEvent. + */ + protected void fireStepBackEvent(StepBackEvent e) { + for (StepBackHandler handler: handlers) { + handler.onStepBack(e); + } + } + + + protected VLayout createDialog() { + + String baseUrl = GWT.getHostPageBaseURL(); + + title.setStyleName("loading-title"); + title.setHeight(25); + title.setWidth100(); + + msg.setStyleName("loading-message"); + msg.setValign(VerticalAlignment.TOP); + msg.setWidth100(); + msg.setHeight(100); + + Img img = new Img(baseUrl + MSG.loadingImg(), 25, 25); + + Label cancelLabel = new Label(MSG.cancelCalculationLabel()); + Img cancel = new Img(baseUrl + MSG.cancelCalculation(), 25, 25); + cancel.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + cancel(); + } + }); + + cancelRow = new HLayout(); + cancelRow.setHeight(27); + cancelRow.setWidth100(); + cancelRow.addMember(cancel); + cancelRow.addMember(cancelLabel); + + VLayout box = new VLayout(); + box.setStyleName("loading-box"); + box.setAlign(VerticalAlignment.TOP); + box.setDefaultLayoutAlign(VerticalAlignment.TOP); + box.addMember(title); + box.addMember(msg); + box.addMember(cancelRow); + box.setMembersMargin(0); + box.setHeight(125); + box.setWidth(275); + + dialog = new VLayout(); + dialog.setAlign(Alignment.CENTER); + dialog.setDefaultLayoutAlign(Alignment.CENTER); + dialog.setMembersMargin(5); + dialog.setHeight100(); + dialog.setWidth100(); + + dialog.addMember(img); + dialog.addMember(box); + + return dialog; + } + + + public String getTargetState() { + ArtifactDescription desc = getArtifact().getArtifactDescription(); + DataList[] oldData = desc.getOldData(); + + return oldData[oldData.length -1].getState(); + } + + + private void startTimer() { + Timer t = new Timer() { + @Override + public void run() { + update(); + } + }; + t.schedule(UPDATE_INTERVAL); + } + + + protected void update() { + updateMessage(); + + final Config config = Config.getInstance(); + final String locale = config.getLocale(); + + describe.describe(locale, artifact, new AsyncCallback() { + @Override + public void onFailure(Throwable t) { + GWT.log("Error while DESCRIBE artifact: " + t.getMessage()); + + startTimer(); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully DESCRIBE artifact."); + + setArtifact(artifact); + + if (artifact.isInBackground()) { + startTimer(); + } + else { + finish(); + } + } + }); + } + + + protected void updateMessage() { + List messages = artifact.getBackgroundMessages(); + if (messages != null && messages.size() > 0) { + CalculationMessage calcMsg = messages.get(0); + title.setContents(getStepTitle(calcMsg)); + msg.setContents(calcMsg.getMessage()); + } + else { + title.setContents(MSG.calculationStarted()); + } + } + + + protected String getStepTitle(CalculationMessage msg) { + return MSG.step() + " " + msg.getCurrentStep() + "/" + msg.getSteps(); + } + + + private void cancel() { + fireStepBackEvent(new StepBackEvent(getTargetState())); + parent.removeChild(dialog); + parent.removeChild(this); + } + + + private void finish() { + parent.removeChild(dialog); + parent.removeChild(this); + parent.setArtifact(artifact); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LocationDistancePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LocationDistancePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,1439 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.data.AdvancedCriteria; +import com.smartgwt.client.data.Criteria; +import com.smartgwt.client.data.Criterion; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.types.OperatorId; +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.FormItem; +import com.smartgwt.client.widgets.form.fields.RadioGroupItem; +import com.smartgwt.client.widgets.form.fields.SelectItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.grid.CellFormatter; +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.CellClickEvent; +import com.smartgwt.client.widgets.grid.events.CellClickHandler; +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; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; +import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; +import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.FilterHandler; +import org.dive4elements.river.client.client.event.RangeFilterEvent; +import org.dive4elements.river.client.client.event.StringFilterEvent; +import org.dive4elements.river.client.client.services.DistanceInfoService; +import org.dive4elements.river.client.client.services.DistanceInfoServiceAsync; +import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource; +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.DistanceInfoObject; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + + +/** + * This UIProvider creates a widget to enter locations or a distance. + * + * @author Ingo Weinzierl + */ +public class LocationDistancePanel +extends AbstractUIProvider +implements ChangeHandler, BlurHandler, FilterHandler +{ + private static final long serialVersionUID = -10820092176039372L; + + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + /** The DistanceInfoService used to retrieve locations about rivers. */ + protected DistanceInfoServiceAsync distanceInfoService = + GWT.create(DistanceInfoService.class); + + public static final String FIELD_MODE = "mode"; + + /** The constant name of the input field to enter the start of a distance.*/ + public static final String FIELD_FROM = "from"; + + /** The constant name of the input field to enter the end of a distance.*/ + public static final String FIELD_TO = "to"; + + /** The constant name of the input field to enter locations.*/ + public static final String FIELD_VALUE_LOCATION = "location"; + + /** The constant name of the input field to enter distance.*/ + public static final String FIELD_VALUE_DISTANCE = "distance"; + + /** The constant name of the input field to enter the step width of a + * distance.*/ + public static final String FIELD_WIDTH = "width"; + + public static final int WIDTH = 250; + + + /** The radio group for input mode selection.*/ + protected DynamicForm mode; + + /** A container that will contain the location or the distance panel.*/ + protected HLayout container; + + /** The min value for a distance.*/ + protected double min; + + /** The max value for a distance.*/ + protected double max; + + /** The 'from' value entered in the distance mode.*/ + protected double from; + + /** The 'to' value entered in the distance mode.*/ + protected double to; + + /** The 'step' value entered in the distance mode.*/ + protected double step; + + /** The values entered in the location mode.*/ + protected double[] values; + + /** The input panel for locations. */ + protected DoubleArrayPanel locationPanel; + + /** The input panel for distances. */ + protected DoubleRangePanel distancePanel; + + /** The tab set containing the location and distance table. */ + protected TabSet inputTables; + + /** The distance table. */ + protected ListGrid distanceTable; + + /** The locations table. */ + protected ListGrid locationsTable; + + /** The locations table for distance input. */ + protected ListGrid locationDistanceTable; + + /** The table data. */ + protected DistanceInfoObject[] tableData; + + /** The table filter.*/ + protected TableFilter filterDescription; + protected RangeTableFilter filterRange; + + /** The Combobox for table filter criteria. */ + protected SelectItem filterCriteria; + protected StaticTextItem filterResultCount; + protected ListGrid currentFiltered; + + /** + * Creates a new LocationDistancePanel instance. + */ + public LocationDistancePanel() { + distanceTable = new ListGrid(); + distanceTable.setAutoFetchData(true); + + locationsTable = new ListGrid(); + locationsTable.setAutoFetchData(true); + + locationDistanceTable = new ListGrid(); + locationDistanceTable.setAutoFetchData(true); + + locationDistanceTable.setShowHeaderContextMenu(false); + distanceTable.setShowHeaderContextMenu(false); + locationsTable.setShowHeaderContextMenu(false); + } + + + /** + * This method creates a widget that contains a label, a panel with + * checkboxes to switch the input mode between location and distance input, + * and a the mode specific panel. + * + * @param data The data that might be inserted. + * + * @return a panel. + */ + @Override + public Canvas create(DataList data) { + VLayout layout = new VLayout(); + layout.setMembersMargin(10); + + Label label = new Label(MESSAGES.location_distance_state()); + Canvas widget = createWidget(data); + Canvas submit = getNextButton(); + createDistanceInputPanel(); + + initDefaults(data); + + createLocationTableDistance (); + createDistanceTable(); + createLocationTable(); + + widget.setHeight(50); + label.setHeight(25); + + layout.addMember(label); + layout.addMember(widget); + layout.addMember(submit); + + return layout; + } + + + /** + * This method creates a table that contains the distance values. + */ + protected void createDistanceTable() { + + String baseUrl = GWT.getHostPageBaseURL(); + + distanceTable.setWidth100(); + distanceTable.setShowRecordComponents(true); + distanceTable.setShowRecordComponentsByCell(true); + distanceTable.setHeight100(); + distanceTable.setEmptyMessage(MESSAGES.empty_filter()); + distanceTable.setCanReorderFields(false); + + CellFormatter cf = new CellFormatter() { + @Override + public String format( + Object value, + ListGridRecord record, + int rowNum, int colNum) { + if (value == null) return null; + try { + NumberFormat nf; + double v = Double.parseDouble((String)value); + nf = NumberFormat.getFormat("###0.00##"); + return nf.format(v); + } + catch (Exception e) { + return value.toString(); + } + } + }; + + ListGridField addDistance = new ListGridField ("", ""); + addDistance.setType (ListGridFieldType.ICON); + addDistance.setWidth (20); + addDistance.addRecordClickHandler (new RecordClickHandler () { + @Override + public void onRecordClick (RecordClickEvent e) { + if (!isLocationMode ()) { + Record r = e.getRecord(); + try { + double min = Double.parseDouble(r.getAttribute("from")); + double max = Double.parseDouble(r.getAttribute("to")); + setDistanceValues(min, max); + } + catch(NumberFormatException nfe) { + // Is there anything to do? + } + } + else { + double[] selected; + Record r = e.getRecord(); + double min = 0, max = 0; + try { + min = Double.parseDouble(r.getAttribute("from")); + max = Double.parseDouble(r.getAttribute("to")); + } + catch(NumberFormatException nfe) { + // Is there anything to do? + } + if (getLocationValues() != null) { + double[] val = getLocationValues(); + selected = new double[val.length + 2]; + for(int i = 0; i < val.length; i++){ + selected[i] = val[i]; + } + selected[val.length] = min; + selected[val.length + 1] = max; + } + else { + selected = new double[2]; + selected[0] = min; + selected[1] = max; + } + setLocationValues(selected); + } + } + }); + addDistance.setCellIcon(baseUrl + MESSAGES.markerGreen()); + + ListGridField ddescr = new ListGridField("description", + MESSAGES.description()); + ddescr.setType(ListGridFieldType.TEXT); + ddescr.setWidth("*"); + ListGridField from = new ListGridField("from", MESSAGES.from()); + from.setCellFormatter(cf); + + from.setWidth("12%"); + ListGridField to = new ListGridField("to", MESSAGES.to()); + to.setType(ListGridFieldType.FLOAT); + to.setCellFormatter(cf); + + to.setWidth("12%"); + to.setAlign(Alignment.LEFT); + ListGridField dside = new ListGridField("riverside", + MESSAGES.riverside()); + dside.setType(ListGridFieldType.TEXT); + dside.setWidth("12%"); + + ListGridField bottom = + new ListGridField("bottom", MESSAGES.bottom_edge()); + bottom.setType(ListGridFieldType.TEXT); + bottom.setWidth("10%"); + bottom.setCellFormatter(cf); + + ListGridField top = + new ListGridField("top", MESSAGES.top_edge()); + top.setType(ListGridFieldType.TEXT); + top.setWidth("10%"); + top.setCellFormatter(cf); + + distanceTable.setFields( + addDistance, ddescr, from, to, dside, bottom, top); + } + + + /** + * This method creates a table that contains the location values. + */ + protected void createLocationTable() { + + String baseUrl = GWT.getHostPageBaseURL(); + + locationsTable.setWidth100(); + locationsTable.setShowRecordComponents(true); + locationsTable.setShowRecordComponentsByCell(true); + locationsTable.setHeight100(); + locationsTable.setEmptyMessage(MESSAGES.empty_filter()); + locationsTable.setCanReorderFields(false); + + CellFormatter cf = new CellFormatter() { + @Override + public String format( + Object value, + ListGridRecord record, + int rowNum, int colNum) { + if (value == null) return null; + try { + NumberFormat nf; + double v = Double.parseDouble((String)value); + nf = NumberFormat.getFormat("###0.00##"); + return nf.format(v); + } + catch (Exception e) { + return value.toString(); + } + } + }; + + + + ListGridField addLocation = new ListGridField ("", ""); + addLocation.setType (ListGridFieldType.ICON); + addLocation.setWidth (20); + + addLocation.addRecordClickHandler (new RecordClickHandler () { + @Override + public void onRecordClick (RecordClickEvent e) { + Record record = e.getRecord(); + double[] selected; + if (getLocationValues() != null) { + double[] val = getLocationValues(); + selected = new double[val.length + 1]; + for(int i = 0; i < val.length; i++){ + selected[i] = val[i]; + } + try { + selected[val.length] = + Double.parseDouble(record.getAttribute("from")); + } + catch(NumberFormatException nfe) { + // Is there anything to do here? + } + } + else { + selected = new double[1]; + selected[0] = + Double.parseDouble(record.getAttribute("from")); + } + setLocationValues(selected); + } + }); + addLocation.setCellIcon (baseUrl + MESSAGES.markerGreen ()); + + ListGridField ldescr = new ListGridField("description", + MESSAGES.description()); + ldescr.setType(ListGridFieldType.TEXT); + ldescr.setWidth("*"); + ListGridField lside = new ListGridField("riverside", + MESSAGES.riverside()); + lside.setType(ListGridFieldType.TEXT); + lside.setWidth("12%"); + ListGridField loc = new ListGridField("from", MESSAGES.locations()); + loc.setAlign(Alignment.LEFT); + loc.setType(ListGridFieldType.FLOAT); + loc.setWidth("12%"); + loc.setCellFormatter(cf); + + ListGridField bottom = + new ListGridField("bottom", MESSAGES.bottom_edge()); + bottom.setType(ListGridFieldType.TEXT); + bottom.setWidth("10%"); + bottom.setCellFormatter(cf); + + ListGridField top = + new ListGridField("top", MESSAGES.top_edge()); + top.setType(ListGridFieldType.TEXT); + top.setWidth("10%"); + top.setCellFormatter(cf); + + locationsTable.setFields(addLocation, ldescr, loc, lside, bottom, top); + } + + + /** + * This method creates a table that contains the location values. + */ + protected void createLocationTableDistance (){ + + String baseUrl = GWT.getHostPageBaseURL(); + + locationDistanceTable.setWidth100(); + locationDistanceTable.setShowRecordComponents(true); + locationDistanceTable.setShowRecordComponentsByCell(true); + locationDistanceTable.setHeight100(); + locationDistanceTable.setEmptyMessage(MESSAGES.empty_filter()); + locationDistanceTable.setCanReorderFields(false); + + CellFormatter cf = new CellFormatter() { + @Override + public String format( + Object value, + ListGridRecord record, + int rowNum, int colNum) { + if (value == null) return null; + try { + NumberFormat nf; + double v = Double.parseDouble((String)value); + nf = NumberFormat.getFormat("###0.00##"); + return nf.format(v); + } + catch (Exception e) { + return value.toString(); + } + } + }; + + ListGridField addfrom = new ListGridField ("from", MESSAGES.from()); + addfrom.setType (ListGridFieldType.ICON); + addfrom.setWidth (30); + addfrom.setCellIcon(baseUrl + MESSAGES.markerGreen()); + + ListGridField addto2 = new ListGridField ("to", MESSAGES.to()); + addto2.setType (ListGridFieldType.ICON); + addto2.setWidth (30); + addto2.setCellIcon(baseUrl + MESSAGES.markerRed()); + + locationDistanceTable.addCellClickHandler (new CellClickHandler () { + @Override + public void onCellClick (CellClickEvent e) { + if (e.getColNum() == 0) { + Record r = e.getRecord (); + try { + double fromvalue = + Double.parseDouble(r.getAttribute("from")); + double tovalue = getTo (); + setDistanceValues (fromvalue, tovalue); + } + catch(NumberFormatException nfe) { + // Is there anything to do in here? + } + } + else if (e.getColNum() == 1) { + Record r = e.getRecord (); + try { + double fromvalue = getFrom (); + double tovalue = + Double.parseDouble(r.getAttribute("from")); + setDistanceValues (fromvalue, tovalue); + } + catch(NumberFormatException nfe) { + // Is there anything to do in here? + } + } + } + }); + ListGridField bottom = + new ListGridField("bottom", MESSAGES.bottom_edge()); + bottom.setType(ListGridFieldType.TEXT); + bottom.setWidth("10%"); + bottom.setCellFormatter(cf); + + ListGridField top = + new ListGridField("top", MESSAGES.top_edge()); + top.setType(ListGridFieldType.TEXT); + top.setWidth("10%"); + top.setCellFormatter(cf); + + ListGridField ldescr = new ListGridField("description", + MESSAGES.description()); + ldescr.setType(ListGridFieldType.TEXT); + ldescr.setWidth("*"); + ListGridField lside = new ListGridField("riverside", + MESSAGES.riverside()); + lside.setType(ListGridFieldType.TEXT); + lside.setWidth("12%"); + ListGridField loc = new ListGridField("from", MESSAGES.locations()); + loc.setType(ListGridFieldType.FLOAT); + loc.setAlign(Alignment.LEFT); + loc.setWidth("12%"); + loc.setCellFormatter(cf); + + locationDistanceTable.setFields( + addfrom, addto2, ldescr, loc, lside, bottom, top); + } + + + @Override + public Canvas createOld(DataList dataList) { + List items = dataList.getAll(); + + Data dMode = getData(items, "ld_mode"); + DataItem[] dItems = dMode.getItems(); + + boolean rangeMode = true; + if (dItems != null && dItems[0] != null) { + rangeMode = FIELD_VALUE_DISTANCE.equals(dItems[0].getStringValue()); + } + + HLayout layout = new HLayout(); + layout.setWidth("400px"); + + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + + Canvas back = getBackButton(dataList.getState()); + + layout.addMember(label); + + if (rangeMode) { + layout.addMember(getOldRangeSelection(dataList)); + } + else { + layout.addMember(getOldLocationSelection(dataList)); + } + + layout.addMember(back); + + return layout; + } + + + /** + * Creates a label for the selected range. + * + * @param dataList The DataList containing all values for this state. + * + * @return A label displaying the selected values. + */ + protected Label getOldRangeSelection(DataList dataList) { + List items = dataList.getAll(); + + Data dFrom = getData(items, "ld_from"); + Data dTo = getData(items, "ld_to"); + Data dStep = getData(items, "ld_step"); + + DataItem[] from = dFrom.getItems(); + DataItem[] to = dTo.getItems(); + DataItem[] step = dStep.getItems(); + + StringBuilder sb = new StringBuilder(); + sb.append(from[0].getLabel()); + sb.append(" " + MESSAGES.unitFrom() + " "); + sb.append(to[0].getLabel()); + sb.append(" " + MESSAGES.unitTo() + " "); + sb.append(step[0].getLabel()); + sb.append(" " + MESSAGES.unitWidth()); + + Label selected = new Label(sb.toString()); + selected.setWidth("130px"); + + return selected; + } + + + /** + * Creates a label for the selected locations. + * + * @param dataList The DataList containing all values for this state. + * + * @return A label displaying the selected values. + */ + protected Label getOldLocationSelection(DataList dataList) { + List items = dataList.getAll(); + + Data dLocations = getData(items, "ld_locations"); + DataItem[] lItems = dLocations.getItems(); + + String[] splitted = lItems[0].getStringValue().split(" "); + String value = ""; + for (int i = 0; i < splitted.length; i++) { + try { + NumberFormat nf = NumberFormat.getDecimalFormat(); + double dv = Double.parseDouble(splitted[i]); + value += nf.format(dv) + " "; + } + catch(NumberFormatException nfe) { + value += splitted[i] + " "; + } + } + + Label selected = new Label(value); + selected.setWidth(130); + + return selected; + } + + + /** + * This method reads the default values defined in the DataItems of the Data + * objects in list. + * + * @param list The DataList container that stores the Data objects. + */ + protected void initDefaults(DataList list) { + Data m = getData(list.getAll(), "ld_mode"); + Data l = getData(list.getAll(), "ld_locations"); + Data f = getData(list.getAll(), "ld_from"); + Data t = getData(list.getAll(), "ld_to"); + Data s = getData(list.getAll(), "ld_step"); + + DataItem[] fItems = f.getItems(); + DataItem[] tItems = t.getItems(); + DataItem[] sItems = s.getItems(); + + min = Double.valueOf(fItems[0].getStringValue()); + max = Double.valueOf(tItems[0].getStringValue()); + step = Double.valueOf(sItems[0].getStringValue()); + + DataItem mDef = m.getDefault(); + DataItem lDef = l.getDefault(); + DataItem fDef = f.getDefault(); + DataItem tDef = t.getDefault(); + DataItem sDef = s.getDefault(); + + String mDefValue = mDef != null ? mDef.getStringValue() : null; + String theMode = mDefValue != null && mDefValue.length() > 0 + ? mDef.getStringValue() + : FIELD_VALUE_DISTANCE; + + mode.setValue(FIELD_MODE, theMode); + + String fDefValue = fDef != null ? fDef.getStringValue() : null; + setFrom(fDefValue != null && fDefValue.length() > 0 + ? Double.valueOf(fDef.getStringValue()) + : min); + + String tDefValue = tDef != null ? tDef.getStringValue() : null; + setTo(tDefValue != null && tDefValue.length() > 0 + ? Double.valueOf(tDef.getStringValue()) + : max); + + String sDefValue = sDef != null ? sDef.getStringValue() : null; + setStep(sDefValue != null && sDefValue.length() > 0 + ? Double.valueOf(sDef.getStringValue()) + : step); + + if (lDef != null) { + String lDefValue = lDef != null ? lDef.getStringValue() : null; + + if (lDefValue != null && lDefValue.length() > 0) { + setLocationValues(lDef.getStringValue()); + } + } + + if (theMode.equals(FIELD_VALUE_DISTANCE)) { + enableDistancePanel(); + inputTables.selectTab(1); + } + currentFiltered = (ListGrid)inputTables.getSelectedTab().getPane(); + } + + + protected Canvas createWidget(DataList data) { + VLayout layout = new VLayout(); + container = new HLayout(); + Canvas checkboxPanel = createRadioButtonPanel(); + + // the initial view will display the location input mode + locationPanel = new DoubleArrayPanel( + MESSAGES.unitLocation(), + getLocationValues(), + this); + container.addMember(locationPanel); + + layout.addMember(checkboxPanel); + layout.addMember(container); + + container.setMembersMargin(30); + + inputTables = new TabSet(); + inputTables.addTabSelectedHandler(new TabSelectedHandler() { + @Override + public void onTabSelected(TabSelectedEvent evt) { + filterDescription.clear(); + filterRange.clear(); + filterResultCount.setValue(""); + + Canvas c = evt.getTabPane(); + if(c instanceof ListGrid) { + currentFiltered = (ListGrid)c; + } + } + }); + + Tab locations = new Tab(MESSAGES.locations()); + Tab distances = new Tab(MESSAGES.distance()); + + inputTables.setWidth100(); + inputTables.setHeight100(); + + locations.setPane(locationDistanceTable); + distances.setPane(distanceTable); + + inputTables.addTab(locations); + inputTables.addTab(distances); + + filterResultCount = new StaticTextItem(MESSAGES.resultCount()); + filterResultCount.setTitleAlign(Alignment.LEFT); + filterResultCount.setTitleStyle("color: #000"); + + filterDescription = new TableFilter(); + filterDescription.setHeight("30px"); + filterDescription.addFilterHandler(this); + + filterRange = new RangeTableFilter(); + filterRange.setHeight("30px"); + filterRange.addFilterHandler(this); + filterRange.setVisible(false); + + filterCriteria = new SelectItem(); + filterCriteria.setShowTitle(false); + filterCriteria.setWidth(100); + filterCriteria.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent e) { + if(e.getValue().toString().equals("range")) { + filterRange.setVisible(true); + filterDescription.setVisible(false); + filterDescription.clear(); + filterResultCount.setValue(""); + } + else { + filterRange.setVisible(false); + filterRange.clear(); + filterDescription.setVisible(true); + filterResultCount.setValue(""); + } + } + }); + + LinkedHashMap filterMap = + new LinkedHashMap(); + filterMap.put("description", MESSAGES.description()); + filterMap.put("range", MESSAGES.range()); + filterCriteria.setValueMap(filterMap); + filterCriteria.setValue("description"); + + DynamicForm form = new DynamicForm(); + form.setFields(filterCriteria); + inputTables.setHeight("*"); + DynamicForm form2 = new DynamicForm(); + form2.setFields(filterResultCount); + + VLayout helper = new VLayout(); + HLayout filterLayout = new HLayout(); + + filterLayout.addMember(form); + filterLayout.addMember(filterDescription); + filterLayout.addMember(filterRange); + filterLayout.setHeight("30px"); + helper.addMember(inputTables); + helper.addMember(filterLayout); + helper.addMember(form2); + helper.setHeight100(); + helper.setWidth100(); + + helperContainer.addMember(helper); + filterLayout.setWidth("200"); + + return layout; + } + + + @Override + public void onFilterCriteriaChanged(StringFilterEvent event) { + String search = event.getFilter(); + + if (search != null && search.length() > 0) { + Criteria c = new Criteria("description", search); + + locationsTable.filterData(c); + distanceTable.filterData(c); + locationDistanceTable.filterData(c); + filterResultCount.setValue(currentFiltered.getRecords().length); + } + else { + locationsTable.clearCriteria(); + distanceTable.clearCriteria(); + locationDistanceTable.clearCriteria(); + filterResultCount.setValue(""); + } + } + + + @Override + public void onFilterCriteriaChanged(RangeFilterEvent event) { + Float from = event.getFrom() - 0.001f; + Float to = event.getTo() + 0.001f; + GWT.log("filtering range: " + from + " to " + to); + + + Criterion combinedFilter = null; + Criterion locationFilter = null; + if (from.equals(Float.NaN) && to.equals(Float.NaN)) { + locationsTable.clearCriteria(); + distanceTable.clearCriteria(); + locationDistanceTable.clearCriteria(); + filterResultCount.setValue(""); + return; + } + else if (from.equals(Float.NaN)) { + combinedFilter = new Criterion("to", OperatorId.LESS_OR_EQUAL, to); + locationFilter = + new Criterion("from", OperatorId.LESS_OR_EQUAL, to); + locationsTable.filterData(locationFilter); + distanceTable.filterData(combinedFilter); + locationDistanceTable.filterData(combinedFilter); + filterResultCount.setValue(currentFiltered.getRecords().length); + return; + } + else if (to.equals(Float.NaN)) { + combinedFilter = + new Criterion("from", OperatorId.GREATER_OR_EQUAL, from); + locationsTable.filterData(combinedFilter); + distanceTable.filterData(combinedFilter); + locationDistanceTable.filterData(combinedFilter); + } + else { + AdvancedCriteria c1 = + new AdvancedCriteria(OperatorId.AND, new Criterion[] { + new Criterion("from", OperatorId.GREATER_OR_EQUAL, from), + new Criterion("from", OperatorId.LESS_OR_EQUAL, to) + }); + + AdvancedCriteria c2 = + new AdvancedCriteria(OperatorId.AND, new Criterion[] { + new Criterion("to", OperatorId.GREATER_OR_EQUAL, from), + new Criterion("to", OperatorId.LESS_OR_EQUAL, to) + }); + + AdvancedCriteria c3 = + new AdvancedCriteria(OperatorId.AND, new Criterion[] { + new Criterion("from", OperatorId.LESS_OR_EQUAL, to), + new Criterion("to", OperatorId.GREATER_OR_EQUAL, from) + }); + + combinedFilter = + new AdvancedCriteria(OperatorId.OR, new Criterion[] { + c1, c2, c3 + }); + } + locationsTable.filterData(combinedFilter); + distanceTable.filterData(combinedFilter); + locationDistanceTable.filterData(combinedFilter); + filterResultCount.setValue(currentFiltered.getRecords().length); + } + + + @Override + public List validate() { + if (isLocationMode()) { + return validateLocations(); + } + else { + return validateRange(); + } + } + + + protected List validateLocations() { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + try { + saveLocationValues(locationPanel); + } + catch (Exception e) { + errors.add(MESSAGES.wrongFormat()); + } + + double[] values = getLocationValues(); + double[] good = new double[values.length]; + int idx = 0; + + for (double value: values) { + if (value < min || value > max) { + String tmp = MESSAGES.error_validate_range(); + tmp = tmp.replace("$1", nf.format(value)); + tmp = tmp.replace("$2", nf.format(min)); + tmp = tmp.replace("$3", nf.format(max)); + errors.add(tmp); + } + else { + good[idx++] = value; + } + } + + double[] justGood = new double[idx]; + for (int i = 0; i < justGood.length; i++) { + justGood[i] = good[i]; + } + + if (!errors.isEmpty()) { + locationPanel.setValues(justGood); + } + + return errors; + } + + + protected List validateRange() { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + try { + saveDistanceValues(distancePanel); + } + catch (Exception e) { + errors.add(MESSAGES.wrongFormat()); + } + + double from = getFrom(); + double to = getTo(); + double step = getStep(); + + if (from < min || from > max) { + String tmp = MESSAGES.error_validate_lower_range(); + tmp = tmp.replace("$1", nf.format(from)); + tmp = tmp.replace("$2", nf.format(min)); + errors.add(tmp); + from = min; + } + + if (to < min || to > max) { + String tmp = MESSAGES.error_validate_upper_range(); + tmp = tmp.replace("$1", nf.format(to)); + tmp = tmp.replace("$2", nf.format(max)); + errors.add(tmp); + to = max; + } + + if (!errors.isEmpty()) { + distancePanel.setValues(from, to, step); + } + + return errors; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + @Override + public Data[] getData() { + List data = new ArrayList(); + + // If we have entered a value and click right afterwards on the + // 'next' button, the BlurEvent is not fired, and the values are not + // saved. So, we gonna save those values explicitly. + if (isLocationMode()) { + Canvas member = container.getMember(0); + if (member instanceof DoubleArrayPanel) { + DoubleArrayPanel form = (DoubleArrayPanel) member; + saveLocationValues(form); + } + + Data dLocations = getDataLocations(); + DataItem dFrom = new DefaultDataItem("ld_from", "ld_from", ""); + DataItem dTo = new DefaultDataItem("ld_to", "ld_to", ""); + DataItem dStep = new DefaultDataItem("ld_step", "ld_step", ""); + + data.add(dLocations); + data.add(new DefaultData( + "ld_from", null, null, new DataItem[] { dFrom } )); + data.add(new DefaultData( + "ld_to", null, null, new DataItem[] { dTo } )); + data.add(new DefaultData( + "ld_step", null, null, new DataItem[] { dStep } )); + } + else { + Canvas member = container.getMember(0); + if (member instanceof DoubleRangePanel) { + DoubleRangePanel form = (DoubleRangePanel) member; + saveDistanceValues(form); + } + + Data dFrom = getDataFrom(); + Data dTo = getDataTo(); + Data dStep = getDataStep(); + DataItem loc = new DefaultDataItem("ld_locations", "ld_locations",""); + + data.add(dFrom); + data.add(dTo); + data.add(dStep); + data.add(new DefaultData( + "ld_locations", null, null, new DataItem[] { loc } )); + } + + Data dMode = getDataMode(); + if (dMode != null) { + data.add(dMode); + } + + return data.toArray(new Data[data.size()]); + } + + + /** + * Returns the Data object for the 'mode' attribute. + * + * @return the Data object for the 'mode' attribute. + */ + protected Data getDataMode() { + String value = mode.getValueAsString(FIELD_MODE); + DataItem item = new DefaultDataItem("ld_mode", "ld_mode", value); + return new DefaultData("ld_mode", null, null, new DataItem[] { item }); + } + + + protected Data getDataLocations() { + double[] locations = getLocationValues(); + boolean first = true; + + if (locations == null) { + return null; + } + + StringBuilder sb = new StringBuilder(); + + for (double l: locations) { + if (!first) { + sb.append(" "); + } + + sb.append(l); + + first = false; + } + + DataItem item = new DefaultDataItem( + "ld_locations", + "ld_locations", + sb.toString()); + + return new DefaultData( + "ld_locations", + null, + null, + new DataItem[] { item }); + } + + + /** + * Returns the Data object for the 'from' attribute. + * + * @return the Data object for the 'from' attribute. + */ + protected Data getDataFrom() { + String value = Double.valueOf(getFrom()).toString(); + DataItem item = new DefaultDataItem("ld_from", "ld_from", value); + return new DefaultData( + "ld_from", null, null, new DataItem[] { item }); + } + + + /** + * Returns the Data object for the 'to' attribute. + * + * @return the Data object for the 'to' attribute. + */ + protected Data getDataTo() { + String value = Double.valueOf(getTo()).toString(); + DataItem item = new DefaultDataItem("ld_to", "ld_to", value); + return new DefaultData( + "ld_to", null, null, new DataItem[] { item }); + } + + + /** + * Returns the Data object for the 'step' attribute. + * + * @return the Data object for the 'step' attribute. + */ + protected Data getDataStep() { + String value = Double.valueOf(getStep()).toString(); + DataItem item = new DefaultDataItem("ld_step","ld_step", value); + return new DefaultData( + "ld_step", null, null, new DataItem[] { item }); + } + + + /** + * Determines the current input mode. + * + * @return true, if 'location' is the current input mode, otherwise false. + */ + public boolean isLocationMode() { + String inputMode = mode.getValueAsString(FIELD_MODE); + + return inputMode.equals(FIELD_VALUE_LOCATION) ? true : false; + } + + + /** + * Activates the location panel. + */ + protected void enableLocationPanel() { + locationPanel = new DoubleArrayPanel( + MESSAGES.unitLocation(), + getLocationValues(), + this); + + container.removeMembers(container.getMembers()); + container.addMember(locationPanel); + } + + + /** + * Activates the distance panel. + */ + protected void enableDistancePanel() { + distancePanel = new DoubleRangePanel( + MESSAGES.unitFrom(), MESSAGES.unitTo(), MESSAGES.unitWidth(), + getFrom(), getTo(), getStep(), + 400, + this); + + container.removeMembers(container.getMembers()); + container.addMember(distancePanel); + } + + + /** + * This method switches the input mode between location and distance input. + * + * @param event The click event fired by a RadioButtonGroupItem. + */ + @Override + public void onChange(ChangeEvent event) { + String value = (String) event.getValue(); + + if (value == null) { + return; + } + if (value.equals(FIELD_VALUE_LOCATION)) { + enableLocationPanel(); + filterDescription.clear(); + filterRange.clear(); + filterResultCount.setValue(""); + + // Remove the tab containing the locationDistanceTable. + // The 'updateTab()' avoids the tab content to be destroyed. + inputTables.updateTab(0, null); + inputTables.removeTab(0); + + // Create a new tab containing the locationTable + Tab t1 = new Tab (MESSAGES.locations()); + t1.setPane(locationsTable); + inputTables.addTab(t1, 0); + + // Bring this tab to front. + inputTables.selectTab(0); + } + else { + enableDistancePanel(); + filterDescription.clear(); + filterRange.clear(); + filterResultCount.setValue(""); + + // Remove the tab containing the locationTable. + // The 'updateTab()' avoids the tab content to be destroyed. + inputTables.updateTab(0, null); + inputTables.removeTab(0); + + // Create a new tab containing the locationDistanceTable. + Tab t1 = new Tab(MESSAGES.locations()); + t1.setPane(locationDistanceTable); + inputTables.addTab(t1, 0); + + // Bring the distanceTable tab to front. + inputTables.selectTab(1); + } + } + + + /** + * This method is used to validate the inserted data in the form fields. + * + * @param event The BlurEvent that gives information about the FormItem that + * has been modified and its value. + */ + @Override + public void onBlur(BlurEvent event) { + FormItem item = event.getItem(); + String field = item.getFieldName(); + + if (field == null) { + return; + } + + if (field.equals(DoubleArrayPanel.FIELD_NAME)) { + DoubleArrayPanel p = (DoubleArrayPanel) event.getForm(); + + saveLocationValue(p, item); + } + else { + DoubleRangePanel p = (DoubleRangePanel) event.getForm(); + + saveDistanceValue(p, item); + } + } + + + + /** + * Validates and stores all values entered in the location mode. + * + * @param p The DoubleArrayPanel. + */ + protected void saveLocationValues(DoubleArrayPanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + if (item.getFieldName().equals(DoubleArrayPanel.FIELD_NAME)) { + saveLocationValue(p, item); + } + } + } + + + /** + * Validates and stores all values entered in the distance mode. + * + * @param p The DoubleRangePanel. + */ + protected void saveDistanceValues(DoubleRangePanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + saveDistanceValue(p, item); + } + } + + + /** + * Validates and stores a value entered in the location mode. + * + * @param p The DoubleArrayPanel. + * @param item The item that needs to be validated. + */ + protected void saveLocationValue(DoubleArrayPanel p, FormItem item) { + if (p.validateForm(item)) { + setLocationValues(p.getInputValues(item)); + } + } + + + /** + * Validates and stores value entered in the distance mode. + * + * @param p The DoubleRangePanel. + * @param item The item that needs to be validated. + */ + protected void saveDistanceValue(DoubleRangePanel p, FormItem item) { + if (p.validateForm(item)) { + setFrom(p.getFrom()); + setTo(p.getTo()); + setStep(p.getStep()); + } + } + + + /** + * This method creates the panel that contains the checkboxes to switch + * between the input mode 'location' and 'distance'. + * + * @return the checkbox panel. + */ + protected Canvas createRadioButtonPanel() { + mode = new DynamicForm(); + + RadioGroupItem radio = new RadioGroupItem(FIELD_MODE); + radio.setShowTitle(false); + radio.setVertical(false); + radio.setWrap(false); + + LinkedHashMap values = new LinkedHashMap(); + values.put(FIELD_VALUE_LOCATION, MESSAGES.location()); + values.put(FIELD_VALUE_DISTANCE, MESSAGES.distance()); + + LinkedHashMap initial = new LinkedHashMap(); + initial.put(FIELD_MODE, FIELD_VALUE_DISTANCE); + + radio.setValueMap(values); + radio.addChangeHandler(this); + + mode.setFields(radio); + mode.setValues(initial); + + return mode; + } + + + protected void createDistanceInputPanel() { + Config config = Config.getInstance(); + String url = config.getServerUrl(); + String river = ""; + + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList[] data = adescr.getOldData(); + + if (data != null && data.length > 0) { + for (int i = 0; i < data.length; i++) { + DataList dl = data[i]; + if (dl.getState().endsWith("river")) { + for (int j = 0; j < dl.size(); j++) { + Data d = dl.get(j); + DataItem[] di = d.getItems(); + if (di != null && di.length == 1) { + river = d.getItems()[0].getStringValue(); + } + } + } + } + } + + distanceTable.setDataSource(new DistanceInfoDataSource( + url, river, "distances")); + locationsTable.setDataSource(new DistanceInfoDataSource( + url, river, "locations")); + locationDistanceTable.setDataSource(new DistanceInfoDataSource( + url, river, "locations")); + } + + + protected double getFrom() { + return from; + } + + + protected void setFrom(double from) { + this.from = from; + } + + + protected double getTo() { + return to; + } + + + protected void setTo(double to) { + this.to = to; + } + + + protected double getStep() { + return step; + } + + + protected void setStep(double step) { + this.step = step; + } + + + protected double[] getLocationValues() { + return values; + } + + + protected void setLocationValues(double[] values) { + this.values = values; + locationPanel.setValues(values); + } + + + protected void setLocationValues(String values) { + String[] vs = values.split(" "); + + if (vs == null) { + return; + } + + double[] ds = new double[vs.length]; + int idx = 0; + + for (String s: vs) { + try { + ds[idx++] = Double.valueOf(s); + } + catch (NumberFormatException nfe) { + // do nothing + } + } + + setLocationValues(ds); + } + + + protected void setDistanceValues (double from, double to) { + setFrom(from); + setTo(to); + distancePanel.setValues(from, to, getStep()); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LocationPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LocationPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,328 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.data.Record; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.grid.events.RecordClickEvent; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +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 java.util.ArrayList; +import java.util.List; + +/** + * This UIProvider serves as base for UI Providers to enter a single location (km). + */ +public abstract class LocationPanel +extends AbstractUIProvider +{ + private static final long serialVersionUID = -5306604428440015046L; + + /** A container that will contain the location or the distance panel. */ + protected HLayout inputLayout; + + /** The minimal value that the user is allowed to enter. */ + protected double min; + + /** The maximal value that the user is allowed to enter. */ + protected double max; + + /** The values entered in the location mode. */ + protected double[] values; + + /** Name of the data item that keeps this location(s). */ + protected String dataItemName; + + /** The input panel for locations. */ + protected DoubleArrayPanel locationPanel; + + + /** + * Creates a new LocationDistancePanel instance. + */ + public LocationPanel() { + values = new double[0]; + } + + + /** + * This method creates a widget that contains a label, a panel with + * checkboxes to switch the input mode between location and distance input, + * and a mode specific panel. + * + * @param data The data that might be inserted. + * + * @return a panel. + */ + @Override + public Canvas create(DataList data) { + findDataItemName(data); + + VLayout layout = new VLayout(); + layout.setMembersMargin(10); + + // Subclass uses translated data items name as label. + Label label = new Label(MSG.location()); + Canvas widget = createWidget(data); + Canvas submit = getNextButton(); + + initDefaults(data); + + widget.setHeight(50); + label.setHeight(25); + + layout.addMember(label); + layout.addMember(widget); + layout.addMember(submit); + + return layout; + } + + + /** Store label of first data item in list. */ + public void findDataItemName(DataList list) { + this.dataItemName = list.getAll().get(0).getLabel(); + } + + + /** Get label of first data item that this uiprovider has seen. */ + public String getDataItemName() { + return this.dataItemName; + } + + + /** + * This method creates a Canvas element showing the old Data objects in the + * DataList data. + */ + @Override + public Canvas createOld(DataList dataList) { + findDataItemName(dataList); + + List items = dataList.getAll(); + Data dLocation = getData(items, getDataItemName()); + DataItem[] loc = dLocation.getItems(); + + HLayout layout = new HLayout(); + layout.setWidth("400px"); + + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + + Canvas back = getBackButton(dataList.getState()); + + // TODO evaluate: isn't this what findDataItemName is doing? + Label selected = new Label(loc[0].getLabel()); + selected.setWidth("130px"); + + layout.addMember(label); + layout.addMember(selected); + layout.addMember(back); + + return layout; + } + + + /** + * This method reads the default values defined in the DataItems of the Data + * objects in list. + * + * @param list The DataList container that stores the Data objects. + */ + protected void initDefaults(DataList list) { + Data data = list.get(0); + + DataItem[] items = data.getItems(); + DataItem iMin = getDataItem(items, "min"); + DataItem iMax = getDataItem(items, "max"); + + try { + min = Double.parseDouble(iMin.getStringValue()); + max = Double.parseDouble(iMax.getStringValue()); + } + catch (NumberFormatException nfe) { + SC.warn(MSG.error_read_minmax_values()); + min = -Double.MAX_VALUE; + max = Double.MAX_VALUE; + } + + DataItem def = data.getDefault(); + String value = def.getStringValue(); + + try { + double d = Double.parseDouble(value); + setLocationValues(new double[] { d } ); + } + catch (NumberFormatException nfe) { + // could not parse, don't know what else to do + GWT.log("LocationPanel", nfe); + } + } + + + /** + * This method grabs the Data with name name from the list and + * returns it. + * + * @param items A list of Data. + * @param name The name of the Data that we are searching for. + * + * @return the Data with the name name. + */ + @Override + protected Data getData(List data, String name) { + for (Data d: data) { + if (name.equals(d.getLabel())) { + return d; + } + } + + return null; + } + + + protected Canvas createWidget(DataList data) { + VLayout layout = new VLayout(); + inputLayout = new HLayout(); + + // The initial view will display the location input mode. + locationPanel = new DoubleArrayPanel( + MSG.unitLocation(), + getLocationValues(), + new BlurHandler(){@Override + public void onBlur(BlurEvent be) {}}); + + // TODO Remove picker references, refactor such that subclasses can + // easily use their picker if they want. + //picker.getLocationTable().setAutoFetchData(true); + + inputLayout.addMember(locationPanel); + + layout.addMember(inputLayout); + + inputLayout.setMembersMargin(30); + + /* + //picker.prepareFilter(); + helperContainer.addMember(picker.getLocationTable()); + helperContainer.addMember(picker.getFilterLayout()); + helperContainer.addMember(picker.getResultCountForm()); + */ + return layout; + } + + + @Override + public List validate() { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + saveLocationValues(locationPanel); + + if (!locationPanel.validateForm()) { + errors.add(MSG.wrongFormat()); + return errors; + } + + double[] values = getLocationValues(); + double[] good = new double[values.length]; + int idx = 0; + + for (double value: values) { + if (value < min || value > max) { + String tmp = MSG.error_validate_range(); + tmp = tmp.replace("$1", nf.format(value)); + tmp = tmp.replace("$2", nf.format(min)); + tmp = tmp.replace("$3", nf.format(max)); + errors.add(tmp); + } + else { + good[idx++] = value; + } + } + + double[] justGood = new double[idx]; + for (int i = 0; i < justGood.length; i++) { + justGood[i] = good[i]; + } + + if (!errors.isEmpty()) { + locationPanel.setValues(justGood); + } + + return errors; + } + + + /** + * Validates and stores all values entered in the location mode. + * + * @param p The DoubleArrayPanel. + */ + protected void saveLocationValues(DoubleArrayPanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + if (item.getFieldName().equals(DoubleArrayPanel.FIELD_NAME)) { + saveLocationValue(p, item); + } + } + } + + + /** + * Validates and stores a value entered in the location mode. + * + * @param p The DoubleArrayPanel. + * @param item The item that needs to be validated. + */ + protected void saveLocationValue(DoubleArrayPanel p, FormItem item) { + if (p.validateForm(item)) { + setLocationValues(p.getInputValues(item)); + } + } + + + /** Get the location values. */ + protected double[] getLocationValues() { + return values; + } + + + /** Sets Location values and updates the panel. */ + protected void setLocationValues(double[] values) { + this.values = values; + locationPanel.setValues(values); + } + + + /** + * Callback when an item from the input helper was clicked. + * Set the respective km-value in the location value field. + * @param e event passed. + */ + public void onRecordClick (RecordClickEvent e) { + Record record = e.getRecord(); + double[] selected = new double[1]; + try { + selected[0] = + Double.parseDouble(record.getAttribute("from")); + } + catch(NumberFormatException nfe) { + GWT.log("onRecordClick", nfe); + } + setLocationValues(selected); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LocationPicker.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LocationPicker.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,267 @@ +package org.dive4elements.river.client.client.ui; + +import java.util.LinkedHashMap; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; +import com.smartgwt.client.data.AdvancedCriteria; +import com.smartgwt.client.data.Criteria; +import com.smartgwt.client.data.Criterion; +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.types.OperatorId; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.SelectItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.grid.CellFormatter; +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.CellClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.FilterHandler; +import org.dive4elements.river.client.client.event.RangeFilterEvent; +import org.dive4elements.river.client.client.event.StringFilterEvent; + +/** + * Bundle widgets and handler for a lacation input helper. + * + * Note that the construction is weird and driven by issues that arose due to + * reasons not understood. + */ +public class LocationPicker +implements FilterHandler +{ + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** The locations table. */ + protected ListGrid locationTable; + + protected HLayout filterLayout; + + DynamicForm resultCountForm; + + CellClickHandler handler; + + boolean isDistance = false; + + /** Text to show number of matched items when filtered. */ + protected StaticTextItem filterResultCount; + + + public LocationPicker(CellClickHandler handler) { + locationTable = new ListGrid(); + locationTable.setShowHeaderContextMenu(false); + this.handler = handler; + } + + public void prepareFilter() { + + filterResultCount = new StaticTextItem(MSG.resultCount()); + filterResultCount.setTitleAlign(Alignment.LEFT); + filterResultCount.setTitleStyle("color: #000"); + + final TableFilter filter = new TableFilter(); + filter.setHeight("30px"); + filter.addFilterHandler(this); + + final RangeTableFilter filterRange = new RangeTableFilter(); + filterRange.setHeight("30px"); + filterRange.addFilterHandler(this); + filterRange.setVisible(false); + + SelectItem filterCriteria = new SelectItem(); + filterCriteria.setShowTitle(false); + filterCriteria.setWidth(100); + filterCriteria.addChangedHandler(new ChangedHandler() { + public void onChanged(ChangedEvent e) { + if(e.getValue().toString().equals("range")) { + filterRange.setVisible(true); + filter.setVisible(false); + filter.clear(); + filterResultCount.setValue(""); + } + else { + filterRange.setVisible(false); + filterRange.clear(); + filter.setVisible(true); + filterResultCount.setValue(""); + } + } + }); + + LinkedHashMap filterMap = + new LinkedHashMap(); + filterMap.put("description", MSG.description()); + filterMap.put("range", MSG.range()); + filterCriteria.setValueMap(filterMap); + filterCriteria.setValue("description"); + + DynamicForm form = new DynamicForm(); + form.setFields(filterCriteria); + + resultCountForm = new DynamicForm(); + resultCountForm.setFields(filterResultCount); + + filterLayout = new HLayout(); + filterLayout.addMember(form); + filterLayout.addMember(filter); + filterLayout.addMember(filterRange); + } + + + /** Access the main widget, a table in which locations can be chosen. */ + public ListGrid getLocationTable() { + return locationTable; + } + + + /** Access the 'form' that shows the filter result count. */ + public DynamicForm getResultCountForm() { + return resultCountForm; + } + + + /** Access the layout containing filter stuff. */ + public HLayout getFilterLayout() { + return filterLayout; + } + + + /** + * This method creates a table that contains the location values. + */ + public void createLocationTable(/*RecordClickHandler handler*/) { + GWT.log("Create Location Table in LocationPicker"); + + String baseUrl = GWT.getHostPageBaseURL(); + + locationTable.setWidth100(); + locationTable.setShowRecordComponents(true); + locationTable.setShowRecordComponentsByCell(true); + locationTable.setHeight100(); + locationTable.setEmptyMessage(MSG.empty_filter()); + locationTable.setCanReorderFields(false); + + ListGridField addLocation = new ListGridField ("", ""); + addLocation.setType (ListGridFieldType.ICON); + addLocation.setWidth (20); + addLocation.setCellIcon (baseUrl + MSG.markerGreen()); + ListGridField addTo = new ListGridField ("", ""); + addTo.setType (ListGridFieldType.ICON); + addTo.setWidth (20); + addTo.setCellIcon (baseUrl + MSG.markerRed()); + + ListGridField ldescr = new ListGridField("description", + MSG.description()); + ldescr.setType(ListGridFieldType.TEXT); + ldescr.setWidth("*"); + ListGridField lside = new ListGridField("riverside", + MSG.riverside()); + lside.setType(ListGridFieldType.TEXT); + lside.setWidth("10%"); + + ListGridField loc = new ListGridField("from", MSG.location()); + loc.setCellFormatter(new CellFormatter() { + public String format( + Object value, + ListGridRecord record, + int rowNum, int colNum) { + if (value == null) return null; + try { + NumberFormat nf; + double v = Double.parseDouble((String)value); + nf = NumberFormat.getFormat("###0.00##"); + return nf.format(v); + } + catch (Exception e) { + return value.toString(); + } + } + } + ); + loc.setType(ListGridFieldType.FLOAT); + + loc.setWidth("10%"); + + ListGridField bottom = + new ListGridField("bottom", MSG.bottom_edge()); + bottom.setType(ListGridFieldType.TEXT); + bottom.setWidth("10%"); + + ListGridField top = + new ListGridField("top", MSG.top_edge()); + top.setType(ListGridFieldType.TEXT); + top.setWidth("10%"); + locationTable.addCellClickHandler(handler); + if (isDistance) { + locationTable.setFields( + addLocation, addTo, ldescr, loc, lside, bottom, top); + } + else { + locationTable.setFields( + addLocation, ldescr, loc, lside, bottom, top); + } + } + + + @Override + public void onFilterCriteriaChanged(StringFilterEvent event) { + String search = event.getFilter(); + + if (search != null && search.length() > 0) { + Criteria c = new Criteria("description", search); + locationTable.filterData(c); + filterResultCount.setValue(locationTable.getRecords().length); + } + else { + locationTable.clearCriteria(); + filterResultCount.setValue(""); + } + } + + + @Override + public void onFilterCriteriaChanged(RangeFilterEvent event) { + Float from = event.getFrom() - 0.001f; + Float to = event.getTo() + 0.001f; + + Criterion combinedFilter = null; + if (from.equals(Float.NaN) && to.equals(Float.NaN)) { + locationTable.clearCriteria(); + filterResultCount.setValue(""); + return; + } + else if (from.equals(Float.NaN)) { + combinedFilter = + new Criterion("from", OperatorId.LESS_OR_EQUAL, to); + } + else if (to.equals(Float.NaN)) { + combinedFilter = + new Criterion("from", OperatorId.GREATER_OR_EQUAL, from); + } + else { + combinedFilter = + new AdvancedCriteria(OperatorId.AND, new Criterion[] { + new Criterion("from", OperatorId.GREATER_OR_EQUAL, from), + new Criterion("from", OperatorId.LESS_OR_EQUAL, to) + }); + } + locationTable.filterData(combinedFilter); + filterResultCount.setValue(locationTable.getRecords().length); + } + + public void setIsDistance(boolean value) { + this.isDistance = value; + } + + public boolean isDistance() { + return this.isDistance; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/MapSelection.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/MapSelection.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,72 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; + + +/** + * This UIProvider displays the DataItems contained in the Data object in a + * combo box as SelectProvider does. Furthermore, there is a map displayed that + * lets the user choose a river by selecting it on the map. + * + * @author Ingo Weinzierl + */ +public class MapSelection extends SelectProvider { + + private static final long serialVersionUID = 1261822454641198692L; + + protected ModuleSelection moduleSelection; + + public MapSelection() { + } + + + /** + * This method currently returns a + * {@link com.smartgwt.client.widgets.form.DynamicForm} that contains all + * data items in a combobox stored in data.
    + * + * TODO: The map panel for the river selection needs to be + * implemented! + * + * @param data The {@link DataList} object. + * + * @return a combobox. + */ + @Override + protected Canvas createWidget(DataList data) { + GWT.log("MapSelection - create()"); + + HLayout h = new HLayout(); + h.setAlign(VerticalAlignment.TOP); + h.setHeight(100); + moduleSelection = new ModuleSelection(); + + Canvas form = moduleSelection.create(data); + form.setWidth(400); + form.setLayoutAlign(VerticalAlignment.TOP); + + // TODO implement event handling in the river map (here? or in LinkSelection) + + h.addMember(form); + + return h; + } + + @Override + protected Data[] getData() { + if (moduleSelection != null) { + return moduleSelection.getData(); + } + else { + return null; + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ModuleSelection.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ModuleSelection.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,176 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.VerticalAlignment; +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.RadioGroupItem; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.ModuleService; +import org.dive4elements.river.client.client.services.ModuleServiceAsync; +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.Module; + +import java.util.LinkedHashMap; + +/** + * The ModuleSelection combines the river selection and the module selection in + * one widget. It will display a vertical splitted widget - the upper part will + * render checkboxes for each module, the lower one will display a combobox at + * the left and a map panel on the right to choose the river. + * + * @author Ingo Weinzierl + */ +public class ModuleSelection extends MapSelection { + + private static final long serialVersionUID = -5634831815175543328L; + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + /** The module checkboxes.*/ + protected RadioGroupItem radio; + + /** */ + protected Module[] modules; + + /** The ModuleService used to retrieve the available modules of a user.*/ + protected ModuleServiceAsync moduleService = GWT.create(ModuleService.class); + + + /** + * The default constructor. + */ + public ModuleSelection() { + readModules(); + } + + + /** + * This method returns a widget that renders the checkboxes for each module + * and the MapSelection that lets the user choose the river. + * + * @param data The provided rivers. + * + * @return the module selection combined with the river selection. + */ + @Override + public Canvas create(DataList data) { + GWT.log("ModuleSelection - create()"); + VLayout newLayout = new VLayout(); + newLayout.setMembersMargin(10); + newLayout.setAlign(VerticalAlignment.TOP); + Canvas moduleSelection = createWidget(); + + moduleSelection.setHeight(100); + newLayout.setHeight(70); + newLayout.addMember(moduleSelection); + + return newLayout; + } + + private void readModules() { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + moduleService.list(locale, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not recieve a list of modules."); + SC.warn(MSG.getString(caught.getMessage())); + } + + @Override + public void onSuccess(Module[] newmodules) { + GWT.log("Retrieved " + newmodules.length + " modules."); + modules = newmodules; + setModules(); + } + }); + } + + private void setModules() { + LinkedHashMap values = new LinkedHashMap(); + + if (this.modules!= null) { + for(Module module : this.modules) { + values.put(module.getName(), module.getLocalizedName()); + if (module.isSelected()) { + GWT.log("Module " + module.getName() + " is selected."); + if (radio != null) { + radio.setDefaultValue(module.getName()); + GWT.log("Setting " + module.getName() + " as selected."); + } + } + } + } + if (radio != null) { + radio.setValueMap(values); + } + } + + /** + * Creates a widget that displays a checkbox for each module. + * + * @return a widget with checkboxes. + */ + protected Canvas createWidget() { + HLayout layout = new HLayout(); + + Label label = new Label(MESSAGES.module_selection()); + DynamicForm form = new DynamicForm(); + + radio = new RadioGroupItem("plugin"); + + label.setWidth(50); + label.setHeight(25); + + + radio.setShowTitle(false); + radio.setVertical(true); + + setModules(); + + form.setFields(radio); + + layout.addMember(label); + layout.addMember(form); + + return layout; + } + + + /** + * This method prepares the data of two widgets - the module selection and + * the river selection. The returning field will contain the Data that + * represents the module selection at first position, the second position + * stores the Data object that represents the river selection. + * + * @return the Data that was chosen in this widget. + */ + @Override + protected Data[] getData() { + + String module = radio.getValueAsString(); + + DataItem[] items = new DefaultDataItem[1]; + items[0] = new DefaultDataItem(module, module, module); + + Data data = new DefaultData("module", null, null, items); + + return new Data[] {data}; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/MultiPeriodPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/MultiPeriodPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,242 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; + +import com.smartgwt.client.types.ListGridFieldType; +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.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; + +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 java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * This UIProvider creates a panel for location or distance input. + * + * @author Raimund Renkert + */ +public class MultiPeriodPanel +extends PeriodPanel +{ + + private static final long serialVersionUID = 1811025931934462457L; + + protected ListGrid elements; + + protected String values; + + public MultiPeriodPanel() { + this("", ""); + } + + public MultiPeriodPanel(String startName, String endName) { + super(startName, endName); + } + + @Override + public Canvas createWidget(DataList data) { + HLayout input = new HLayout(); + VLayout root = new VLayout(); + VLayout grid = new VLayout(); + VLayout layout = (VLayout) super.createWidget(data); + Button add = new Button(MSG.add_date()); + elements = new ListGrid(); + + add.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent ce) { + Date f = inputPanel.getFromDate(); + Date t = inputPanel.getToDate(); + if (f == null || t == null) { + return; + } + DateRangeRecord drr = new DateRangeRecord(f, t); + elements.addData(drr); + } + }); + layout.addMember(add); + + Label sel = new Label(MSG.select()); + sel.setHeight(25); + elements.setWidth(185); + elements.setHeight(120); + elements.setShowHeaderContextMenu(false); + elements.setCanReorderFields(false); + elements.setCanSort(false); + elements.setCanEdit(false); + ListGridField from = new ListGridField("from", MSG.from()); + ListGridField to = new ListGridField("to", MSG.to()); + from.setWidth(70); + to.setWidth(70); + + final ListGridField removeField = + new ListGridField("_removeRecord", "Remove Record"){{ + setType(ListGridFieldType.ICON); + setIcon(GWT.getHostPageBaseURL() + MSG.removeFeature()); + setCanEdit(false); + setCanFilter(false); + setCanSort(false); + setCanGroupBy(false); + setCanFreeze(false); + setWidth(25); + }}; + + 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()); + } + }); + + elements.setFields(from, to, removeField); + + grid.addMember(sel); + grid.addMember(elements); + input.addMember(layout); + input.addMember(grid); + root.addMember(input); + + return root; + } + + @SuppressWarnings("deprecation") + @Override + public Canvas createOld(DataList dataList) { + GWT.log("old............................"); + HLayout layout = new HLayout(); + layout.setWidth("400px"); + VLayout vLayout = new VLayout(); + vLayout.setWidth(130); + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + label.setHeight(25); + + List items = dataList.getAll(); + Data str = getData(items, "periods"); + DataItem[] strItems = str.getItems(); + + String[] pairs = strItems[0].getLabel().split(";"); + for (int i = 0; i < pairs.length; i++) { + String[] vals = pairs[i].split(","); + long f = Long.valueOf(vals[0]).longValue(); + long t = Long.valueOf(vals[1]).longValue(); + Date from = new Date(f); + Date to = new Date(t); + String fromString = + DateTimeFormat.getMediumDateFormat().format(from); + String toString = + DateTimeFormat.getMediumDateFormat().format(to); + + Label dateLabel = new Label(fromString + " - " + toString); + dateLabel.setHeight(20); + vLayout.addMember(dateLabel); + } + Canvas back = getBackButton(dataList.getState()); + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + @Override + public Data[] getData() { + List data = new ArrayList(); + + boolean valid = saveDateValues(); + if(valid) { + DataItem item = new DefaultDataItem("periods", null, this.values); + data.add(new DefaultData( + "periods", + null, + null, + new DataItem[] { item })); + } + return data.toArray(new Data[data.size()]); + } + + + @Override + protected boolean saveDateValues() { + ListGridRecord[] lgr = elements.getRecords(); + if (lgr.length == 0) { + return false; + } + String data = ""; + for (int i = 0; i < lgr.length; i++) { + DateRangeRecord drr = (DateRangeRecord) lgr[i]; + data += drr.getFrom() + "," + drr.getTo(); + data += ";"; + } + values = data; + return true; + } + + + protected static class DateRangeRecord extends ListGridRecord { + protected Date from; + protected Date to; + + protected final static String FROM_FIELD = "from"; + protected final static String TO_FIELD = "to"; + + public DateRangeRecord (Date from, Date to) { + setFrom(from); + setTo(to); + } + + @SuppressWarnings("deprecation") + public void setFrom(Date from) { + this.from = from; + setAttribute( + FROM_FIELD, + DateTimeFormat.getMediumDateFormat().format(from)); + } + + + @SuppressWarnings("deprecation") + public void setTo(Date to) { + this.to = to; + setAttribute( + TO_FIELD, + DateTimeFormat.getMediumDateFormat().format(to)); + } + + + public long getFrom() { + return this.from.getTime(); + } + + + public long getTo() { + return this.to.getTime(); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/MultipleLocationPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/MultipleLocationPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,354 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.data.Record; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.grid.events.CellClickEvent; +import com.smartgwt.client.widgets.grid.events.CellClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.services.DistanceInfoService; +import org.dive4elements.river.client.client.services.DistanceInfoServiceAsync; +import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource; +import org.dive4elements.river.client.shared.DoubleUtils; +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.DistanceInfoObject; +import org.dive4elements.river.client.shared.model.RangeData; + +import java.util.ArrayList; +import java.util.List; + + +/** + * This UIProvider creates a widget to enter a single location (km). + * + * @author Raimund Renkert + */ +public class MultipleLocationPanel +extends LocationPanel +implements CellClickHandler +{ + private static final long serialVersionUID = -3359966826794082718L; + + /** The DistanceInfoService used to retrieve locations about rivers. */ + protected DistanceInfoServiceAsync distanceInfoService = + GWT.create(DistanceInfoService.class); + + /** The table data. */ + protected DistanceInfoObject[] tableData; + + /** The input helper (usually right side, table to click on, values are + * then entered in the texfield. */ + protected LocationPicker picker; + + + /** + * Creates a new LocationDistancePanel instance. + */ + public MultipleLocationPanel() { + picker = new LocationPicker(this); + } + + + /** + * This method creates a widget that contains a label, a panel with + * checkboxes to switch the input mode between location and distance input, + * and a mode specific panel. + * + * @param data The data that might be inserted. + * + * @return a panel. + */ + @Override + public Canvas create(DataList data) { + findDataItemName(data); + + VLayout layout = new VLayout(); + layout.setMembersMargin(10); + + // Take translated data item name as label, if translation available. + String labelString; + try { + labelString = MSG.getString(getDataItemName()); + } + catch(java.util.MissingResourceException mre) { + GWT.log("Cannot find translation for data item name : " + getDataItemName()); + labelString = getLabelString(); + } + Label label = new Label(labelString); + Canvas widget = createWidget(data); + Canvas submit = getNextButton(); + + initDefaults(data); + + picker.createLocationTable(); + + widget.setHeight(50); + label.setHeight(25); + + layout.addMember(label); + layout.addMember(widget); + layout.addMember(submit); + + return layout; + } + + + /** + * This method reads the default values defined in the DataItems of the Data + * objects in list. + * + * @param list The DataList container that stores the Data objects. + */ + @Override + protected void initDefaults(DataList list) { + Data data = list.get(0); + + // Compatibility with MinMax- DataItems: + RangeData rangeData = null; + + for (int i = 0, n = list.size(); i < n; i++) { + Data tmp = list.get(i); + + if (tmp instanceof RangeData) { + rangeData = (RangeData) tmp; + } + } + + if (rangeData != null) { + min = Double.parseDouble(rangeData.getDefaultLower().toString()); + max = Double.parseDouble(rangeData.getDefaultUpper().toString()); + // catch ..? + } + else { + DataItem[] items = data.getItems(); + DataItem iMin = getDataItem(items, "min"); + DataItem iMax = getDataItem(items, "max"); + + try { + min = Double.parseDouble(iMin.getStringValue()); + max = Double.parseDouble(iMax.getStringValue()); + } + catch (NumberFormatException nfe) { + SC.warn(MSG.error_read_minmax_values()); + min = -Double.MAX_VALUE; + max = Double.MAX_VALUE; + } + } + + DataItem def = data.getDefault(); + if (def != null) { + String value = def.getStringValue(); + + try { + double d = Double.parseDouble(value); + setLocationValues(new double[] { d } ); + } + catch (NumberFormatException nfe) { + // could not parse, dont know what to do else + } + } + } + + + @Override + protected Canvas createWidget(DataList data) { + VLayout layout = new VLayout(); + inputLayout = new HLayout(); + + // The initial view will display the location input mode. + locationPanel = new DoubleArrayPanel( + MSG.unitLocation(), + getLocationValues(), + new BlurHandler(){@Override + public void onBlur(BlurEvent be) {validate();}}); + + picker.getLocationTable().setAutoFetchData(true); + + inputLayout.addMember(locationPanel); + + layout.addMember(inputLayout); + + inputLayout.setMembersMargin(30); + + picker.prepareFilter(); + + helperContainer.addMember(picker.getLocationTable()); + helperContainer.addMember(picker.getFilterLayout()); + helperContainer.addMember(picker.getResultCountForm()); + setPickerDataSource(); + return layout; + } + + + /** Overridden to restrict to one entered value. */ + @Override + public List validate() { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + DataList[] ref = artifact.getArtifactDescription().getOldData(); + String mode = ref[1].get(0).getStringValue(); + + saveLocationValues(locationPanel); + + if (!locationPanel.validateForm()) { + errors.add(MSG.wrongFormat()); + return errors; + } + + double[] lValues = getLocationValues(); + double[] good = new double[lValues.length]; + int idx = 0; + + double reference = + Double.valueOf(ref[2].get(0).getStringValue()).doubleValue(); + for (double value: lValues) { + if (mode.equals("calc.reference.curve") && + value == reference) { + errors.add(MSG.error_contains_same_location()); + return errors; + } + if (value < min || value > max) { + String tmp = MSG.error_validate_range(); + tmp = tmp.replace("$1", nf.format(value)); + tmp = tmp.replace("$2", nf.format(min)); + tmp = tmp.replace("$3", nf.format(max)); + errors.add(tmp); + } + else { + good[idx++] = value; + } + } + + double[] justGood = new double[idx]; + for (int i = 0; i < justGood.length; i++) { + justGood[i] = good[i]; + } + + if (!errors.isEmpty()) { + locationPanel.setValues(justGood); + } + + return errors; + } + + + /** + * This method returns the selected data (to feed). + * + * @return the selected/inserted data in feedable form. + */ + @Override + public Data[] getData() { + saveLocationValues(locationPanel); + double[] lValues = getLocationValues(); + Data[] data = new Data[2]; + boolean first = true; + String valueString = ""; + + for (int i = 0; i < lValues.length; i++) { + if (!first) valueString += " "; + else first = false; + valueString += Double.valueOf(lValues[i]).toString(); + } + + data[0] = createDataArray(getDataItemName(), valueString); + + data[1] = createDataArray("ld_mode", "locations"); + + return data; + } + + + /** Hook service to the listgrid with possible input values. */ + protected void setPickerDataSource() { + Config config = Config.getInstance(); + String url = config.getServerUrl(); + String river = ""; + + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList[] data = adescr.getOldData(); + + // Try to find a "river" data item to set the source for the + // list grid. + String dataFilter = "locations"; + if (data != null && data.length > 0) { + for (int i = 0; i < data.length; i++) { + DataList dl = data[i]; + if (dl.getState().equals("state.minfo.river")) { + dataFilter = "measuringpoint"; + } + if (dl.getState().equals("state.winfo.river") || + dl.getState().equals("state.chart.river") || + dl.getState().equals("state.minfo.river")) { + for (int j = 0; j < dl.size(); j++) { + Data d = dl.get(j); + DataItem[] di = d.getItems(); + if (di != null && di.length == 1) { + river = d.getItems()[0].getStringValue(); + break; + } + } + } + } + } + + picker.getLocationTable().setDataSource(new DistanceInfoDataSource( + url, river, dataFilter)); + } + + + // TODO allow multiple selections here or in LocationPanel + /** + * Callback when an item from the input helper was clicked. + * Set the respective km-value in the location value field. + * @param e event passed. + */ + @Override + public void onCellClick (CellClickEvent e) { + Record record = e.getRecord(); + double[] old = getLocationValues(); + double[] selected = DoubleUtils.copyOf(old, old.length + 1); + try { + selected[old.length] = + Double.parseDouble(record.getAttribute("from")); + } + catch(NumberFormatException nfe) { + // Is there anything else to do here? + GWT.log(nfe.getMessage()); + } + + // compare reference location and target location. + DataList[] ref = artifact.getArtifactDescription().getOldData(); + String mode = ref[1].get(0).getStringValue(); + if (mode.equals("calc.reference.curve") && + ref[2].get(0).getStringValue().equals(record.getAttribute("from"))) + { + SC.warn(MSG.error_same_location()); + return; + } + + setLocationValues(selected); + } + + + /** + * Returns the label string for the input panel. + */ + protected String getLabelString() { + return MSG.location(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/NoInputPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/NoInputPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,32 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.widgets.Canvas; + +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; + + +public class NoInputPanel +extends AbstractUIProvider +{ + private static final long serialVersionUID = -8789143404415288132L; + + + @Override + public Canvas create(DataList data) { + return new Canvas(); + } + + + @Override + public Canvas createOld(DataList dataList) { + return new Canvas(); + } + + + @Override + protected Data[] getData() { + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/OutputTab.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/OutputTab.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,71 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.tab.Tab; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.OutputMode; + + +public class OutputTab extends Tab { + + /** The OutputMode that should be displayed in this tab.*/ + protected OutputMode mode; + + /** The Collection that should be displayed in this tab.*/ + protected Collection collection; + + /** The CollectionView containing this tab. */ + protected CollectionView collectionView; + + + /** + * The default constructor that creates a new Tab for displaying a specific + * OutputMode of a Collection. + * + * @param title The title of the tab. + * @param collection The collection that need to be displayed. + * @param outputmode The OutputMode that need to be displayed. + */ + public OutputTab( + String title, + Collection collection, + CollectionView collectionView, + OutputMode mode + ) { + super(title); + + this.collection = collection; + this.mode = mode; + this.collectionView = collectionView; + + setPane(new Label("Implement concrete subclasses to vary the output.")); + } + + + public CollectionView getCollectionView() { + return collectionView; + } + + + public String getOutputName() { + return mode.getName(); + } + + + public Artifact getArtifact() { + return getCollectionView().getArtifact(); + } + + + public Collection getCollection() { + return collection; + } + + + public OutputMode getMode() { + return mode; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterList.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterList.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,1023 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.types.VisibilityMode; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.SectionStack; +import com.smartgwt.client.widgets.layout.SectionStackSection; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.AdvanceHandler; +import org.dive4elements.river.client.client.event.CollectionChangeEvent; +import org.dive4elements.river.client.client.event.CollectionChangeHandler; +import org.dive4elements.river.client.client.event.HasParameterChangeHandler; +import org.dive4elements.river.client.client.event.HasStepBackHandlers; +import org.dive4elements.river.client.client.event.HasStepForwardHandlers; +import org.dive4elements.river.client.client.event.OutputModesChangeEvent; +import org.dive4elements.river.client.client.event.OutputModesChangeHandler; +import org.dive4elements.river.client.client.event.ParameterChangeEvent; +import org.dive4elements.river.client.client.event.ParameterChangeHandler; +import org.dive4elements.river.client.client.event.StepBackEvent; +import org.dive4elements.river.client.client.event.StepBackHandler; +import org.dive4elements.river.client.client.event.StepForwardEvent; +import org.dive4elements.river.client.client.event.StepForwardHandler; +import org.dive4elements.river.client.client.services.AdvanceService; +import org.dive4elements.river.client.client.services.AdvanceServiceAsync; +import org.dive4elements.river.client.client.services.ArtifactService; +import org.dive4elements.river.client.client.services.ArtifactServiceAsync; +import org.dive4elements.river.client.client.services.ReportService; +import org.dive4elements.river.client.client.services.ReportServiceAsync; +import org.dive4elements.river.client.client.services.StepForwardService; +import org.dive4elements.river.client.client.services.StepForwardServiceAsync; +import org.dive4elements.river.client.client.ui.stationinfo.GaugePanel; +import org.dive4elements.river.client.client.ui.stationinfo.InfoPanel; +import org.dive4elements.river.client.client.ui.stationinfo.MeasurementStationPanel; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.Collection; +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.ExportMode; +import org.dive4elements.river.client.shared.model.FixAnalysisArtifact; +import org.dive4elements.river.client.shared.model.MINFOArtifact; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.ReportMode; +import org.dive4elements.river.client.shared.model.River; +import org.dive4elements.river.client.shared.model.WINFOArtifact; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + + +public class ParameterList +extends Tab +implements StepBackHandler, StepForwardHandler, ParameterChangeHandler, + HasParameterChangeHandler, CollectionChangeHandler, + OutputModesChangeHandler, AdvanceHandler +{ + private static final long serialVersionUID = 5204784727239299980L; + + public static final String STYLENAME_OLD_PARAMETERS = "oldParameters"; + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** The ArtifactService used to communicate with the Artifact server. */ + protected ArtifactServiceAsync artifactService = + GWT.create(ArtifactService.class); + + /** The StepForwardService used to put data into an existing artifact. */ + protected StepForwardServiceAsync forwardService = + GWT.create(StepForwardService.class); + + /** The StepForwardService used to put data into an existing artifact. */ + protected AdvanceServiceAsync advanceService = + GWT.create(AdvanceService.class); + + + protected ReportServiceAsync reportService = + GWT.create(ReportService.class); + + + /** The list of ParameterizationChangeHandler.*/ + protected List parameterHandlers; + + protected FLYS flys; + + protected CollectionView cView; + + protected Artifact artifact; + + protected List old; + protected Map oldStorage; + protected DataList current; + + protected UIProvider uiProvider; + + protected VLayout topLayout; + protected VLayout oldItems; + protected VLayout currentItems; + protected VLayout exportModes; + protected VLayout report; + protected VLayout helperPanel; + protected VLayout tablePanel; + protected InfoPanel infoPanel; + protected Canvas reportPanel; + + private SectionStack stack; + + public ParameterList(FLYS flys, CollectionView cView, String title) { + super(title); + + this.cView = cView; + this.flys = flys; + + parameterHandlers = new ArrayList(); + old = new ArrayList(); + oldStorage = new TreeMap(); + topLayout = new VLayout(); + oldItems = new VLayout(); + currentItems = new VLayout(); + exportModes = new VLayout(); + report = new VLayout(); + + addParameterChangeHandler(this); + + init(); + } + + + public ParameterList( + FLYS flys, + CollectionView cView, + String title, + Artifact artifact) + { + super(title); + + this.cView = cView; + this.flys = flys; + this.artifact = artifact; + + parameterHandlers = new ArrayList(); + old = new ArrayList(); + oldStorage = new TreeMap(); + topLayout = new VLayout(); + oldItems = new VLayout(); + currentItems = new VLayout(); + exportModes = new VLayout(); + report = new VLayout(); + + init(); + + addParameterChangeHandler(this); + + setArtifact(artifact, false); + } + + + protected void init() { + HLayout rootLayout = new HLayout(); + rootLayout.setMembersMargin(20); + + VLayout left = new VLayout(); + + if (old == null || old.size() == 0) { + oldItems.setHeight(1); + } + + oldItems.setMembersMargin(10); + oldItems.setStyleName(STYLENAME_OLD_PARAMETERS); + currentItems.setAlign(VerticalAlignment.TOP); + + left.setMembersMargin(20); + left.setWidth(300); + + left.addMember(oldItems); + left.addMember(currentItems); + left.addMember(exportModes); + left.addMember(report); + + reportPanel = new Canvas(); + reportPanel.setHeight("*"); + report.addMember(reportPanel); + + rootLayout.addMember(left); + rootLayout.addMember(createSectionStack()); + + topLayout.addMember(rootLayout); + if (artifact == null) { + Canvas moduleSelection = renderNew(); + moduleSelection.setLayoutAlign(VerticalAlignment.TOP); + currentItems.addMember(moduleSelection); + } + + setPane(topLayout); + } + + + protected SectionStack createSectionStack() { + stack = new SectionStack(); + stack.setHeight100(); + stack.setCanResizeSections(true); + stack.setVisibilityMode(VisibilityMode.MULTIPLE); + + // This canvas is used to render helper widgets. + final SectionStackSection helperSection = new SectionStackSection(); + helperSection.setExpanded(false); + helperSection.setTitle(MSG.helperPanelTitle()); + helperPanel = new VLayout() { + @Override + public void addMember(Canvas component) { + super.addMember(component); + stack.expandSection(helperSection.getID()); + } + + @Override + public void removeMembers(Canvas[] components) { + super.removeMembers(components); + helperSection.setExpanded(false); + } + }; + helperPanel.setWidth100(); + helperPanel.setHeight100(); + helperSection.setItems(helperPanel); + + // This canvas is used to render calculation results. + final SectionStackSection tableSection = new SectionStackSection(); + tableSection.setExpanded(false); + tableSection.setTitle(MSG.calcTableTitle()); + tablePanel = new VLayout() { + @Override + public void addMember(Canvas component) { + super.addMember(component); + tableSection.setExpanded(true); + } + + @Override + public void removeMembers(Canvas[] components) { + super.removeMembers(components); + tableSection.setExpanded(false); + } + }; + tablePanel.setHeight100(); + tablePanel.setWidth100(); + tableSection.setItems(tablePanel); + + stack.setSections(helperSection, tableSection); + + return stack; + } + + + /** Sets and forwards artifact. */ + protected void setArtifact(Artifact artifact) { + setArtifact(artifact, true); + } + + + protected void setArtifact(Artifact artifact, boolean forward) { + Artifact tmp = this.artifact; + this.artifact = artifact; + + if (forward) { + fireParameterChangeEvent( + tmp, this.artifact, ParameterChangeEvent.Type.FORWARD); + } + else { + fireParameterChangeEvent( + tmp, this.artifact, ParameterChangeEvent.Type.BACK); + } + } + + + /** + * This method registers a new ParameterChangeHandler. + * + * @param handler The new ParameterChangeHandler. + */ + @Override + public void addParameterChangeHandler(ParameterChangeHandler handler) { + if (handler != null) { + parameterHandlers.add(handler); + } + } + + + /** + * This method calls the onParameterChange() method of all + * registered ParameterChangeHandler. + */ + protected void fireParameterChangeEvent( + Artifact old, + Artifact newArt, + ParameterChangeEvent.Type type) + { + ParameterChangeEvent e = new ParameterChangeEvent(old, newArt, type); + + for (ParameterChangeHandler handler: parameterHandlers) { + handler.onParameterChange(e); + } + } + + + /** + * This method creates a Canvas displaying the plugins of FLYS combined with + * a widget to select a river. + * + * @return a Canvas that displays the supported plugins and rivers of FLYS. + */ + protected Canvas renderNew() { + River[] rivers = flys.getRivers(); + DataItem[] items = new DataItem[rivers.length]; + + int i = 0; + for (River river: rivers) { + String name = river.getName(); + items[i++] = new DefaultDataItem(name, null, name); + } + + Data data = new DefaultData( + "river", + MSG.river_selection(), + null, + items); + + LinkSelection widget = new LinkSelection(); + HasStepForwardHandlers handler = widget; + + widget.setContainer(helperPanel); + + handler.addStepForwardHandler(new StepForwardHandler() { + private static final long serialVersionUID = -6210719844707004860L; + + @Override + public void onStepForward(StepForwardEvent event) { + lockUI(); + Data[] data = event.getData(); + + DataItem[] moduleItems = data[0].getItems(); + DataItem[] riversItems = data[1].getItems(); + + String module = moduleItems[0].getStringValue(); + String river = riversItems[0].getStringValue(); + + if (module == null || river == null) { + GWT.log("ParameterList.renderNew(): module == null || river == null"); + unlockUI(); + return; + } + + String newTitle = MSG.getString(module); + setTitle(newTitle); + + Config config = Config.getInstance(); + final String locale = config.getLocale(); + + final Data[] feedData = new Data[] { data[1] }; + + artifactService.create( + locale, module.toLowerCase(), null, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + unlockUI(); + GWT.log("Could not create the new artifact."); + SC.warn(FLYS.getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully created a new artifact."); + + forwardService.go(locale, artifact, feedData, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + unlockUI(); + GWT.log("Could not feed the artifact."); + SC.warn(caught.getMessage()); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully feed the artifact."); + old.clear(); + cView.addArtifactToCollection(artifact); + setArtifact(artifact); + unlockUI(); + } + }); + } + }); + } + }); + + DataList list = new DataList(); + list.add(data); + + return widget.create(list); + } + + + protected void clearOldData() { + old.clear(); + } + + + public void addOldData(DataList old) { + addOldData(old, true); + } + + + public void addOldData(DataList old, boolean redraw) { + if (old != null) { + this.old.add(old); + } + + refreshOld(redraw); + } + + + public void addOldDatas(DataList[] old) { + addOldDatas(old, true); + } + + + public void addOldDatas(DataList[] old, boolean redraw) { + if (old != null && old.length > 0) { + for (DataList o: old) { + if (o == null) { + continue; + } + + if (!exists(o)) { + GWT.log("Data '" + o.getLabel() + "' is new."); + addOldData(o, false); + } + } + + if (redraw) { + addOldData(null, true); + } + + return; + } + + addOldData(null, true); + } + + + public boolean exists(DataList data) { + if (data == null) { + return false; + } + + String stateName = data.getState(); + + for (DataList o: old) { + if (stateName.equals(o.getState())) { + return true; + } + } + + return false; + } + + + public void setCurrentData(DataList current, UIProvider uiProvider) { + this.current = current; + this.uiProvider = uiProvider; + + refreshCurrent(); + } + + + public void refreshOld(boolean redrawAll) { + if (redrawAll) { + refreshAllOld(); + } + else { + DataList dataList = old.get(old.size()-1); + String state = dataList.getState(); + + if (oldStorage.get(state) == null) { + String provider = dataList.getUIProvider(); + UIProvider uiprovider = UIProviderFactory.getProvider( + provider, + flys.getCurrentUser()); + ((HasStepBackHandlers) uiprovider).addStepBackHandler(this); + + Canvas c = uiprovider.createOld(dataList); + if (c != null) { + oldStorage.put(dataList.getState(), c); + oldItems.addMember(c); + } + } + } + + updateOldHeight(); + } + + + protected void refreshAllOld() { + List not = new ArrayList(); + + for (DataList data: old) { + String state = data.getState(); + + Canvas c = oldStorage.get(state); + + if (c != null) { + not.add(state); + } + } + + Map newOld = new TreeMap(); + + Set> entries = oldStorage.entrySet(); + for (Map.Entry entry: entries) { + String state = entry.getKey(); + Canvas value = entry.getValue(); + + if (not.indexOf(state) < 0) { + oldItems.removeMember(value); + } + else { + newOld.put(state, value); + } + } + + oldStorage = newOld; + } + + + protected void updateOldHeight() { + int minHeight = oldItems.getMinHeight(); + if (minHeight <= 20) { + oldItems.setHeight(20); + } + else { + oldItems.setHeight(minHeight); + } + } + + + /** + * This method refreshes the part displaying the data of the current state. + * The UI is created using the UIProvider stored in the Data object. + */ + public void refreshCurrent() { + currentItems.removeMembers(currentItems.getMembers()); + + if (current != null && uiProvider != null) { + Canvas c = uiProvider.create(current); + Canvas h = uiProvider.createHelpLink(current, null); + + HLayout wrapper = new HLayout(); + wrapper.addMember(h); + wrapper.addMember(c); + + currentItems.addMember(wrapper); + } + else if (uiProvider != null) { + Canvas c = uiProvider.create(null); + c.setLayoutAlign(VerticalAlignment.TOP); + + currentItems.addMember(c); + } + else { + currentItems.setHeight(1); + } + + Canvas[] members = currentItems.getMembers(); + if (members == null || members.length == 0) { + currentItems.setHeight(1); + } + else { + int height = 0; + + for (Canvas member: members) { + height += member.getHeight(); + } + + currentItems.setHeight(height); + } + } + + + /** + * This method is called if the user clicks on the 'next' button to advance + * to the next state. + * + * @param event The StepForwardEvent. + */ + @Override + public void onStepForward(StepForwardEvent event) { + GWT.log("CollectionView - onStepForward()"); + lockUI(); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + forwardService.go(locale, artifact, event.getData(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + unlockUI(); + GWT.log("Could not feed the artifact."); + SC.warn(FLYS.getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully feed the artifact."); + old.clear(); + + setArtifact(artifact, true); + unlockUI(); + } + }); + } + + + /** + * This method is used to remove all old items from this list after the user + * has clicked the step back button. + * + * @param e The StepBackEvent that holds the identifier of the target state. + */ + @Override + public void onStepBack(StepBackEvent e) { + lockUI(); + final String target = e.getTarget(); + + Config config = Config.getInstance(); + final String locale = config.getLocale(); + + advanceService.advance(locale, artifact, target, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + unlockUI(); + GWT.log("Could not go back to '" + target + "'"); + SC.warn(FLYS.getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully step back to '" + target + "'"); + + old.clear(); + + setArtifact(artifact, false); + unlockUI(); + } + } + ); + } + + + @Override + public void onAdvance(final String target) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + + advanceService.advance(locale, artifact, target, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not go to '" + target + "'"); + SC.warn(FLYS.getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully advanced to '" + target + "'"); + + old.clear(); + + setArtifact(artifact, true); + } + } + ); + } + + + /** + * Implements the onCollectionChange() method to do update the GUI after the + * parameterization has changed. + * + * @param event The ParameterChangeEvent. + */ + @Override + public void onParameterChange(ParameterChangeEvent event) { + GWT.log("ParameterList.onParameterChange"); + + Canvas[] c = helperPanel.getMembers(); + if (c != null && c.length > 0) { + helperPanel.removeMembers(c); + } + + Artifact art = event.getNewValue(); + ArtifactDescription desc = art.getArtifactDescription(); + + DataList currentData = desc.getCurrentData(); + if (currentData != null) { + // the user has to enter some attributes + String uiProvider = currentData.getUIProvider(); + UIProvider provider = UIProviderFactory.getProvider( + uiProvider, + flys.getCurrentUser()); + + provider.setContainer(helperPanel); + provider.setArtifact(art); + provider.setCollection(cView.getCollection()); + provider.setParameterList(this); + + ((HasStepForwardHandlers) provider).addStepForwardHandler(this); + ((HasStepBackHandlers) provider).addStepBackHandler(this); + + setCurrentData(currentData, provider); + } + else { + String[] reachable = desc.getReachableStates(); + if (reachable != null && reachable.length > 0) { + // We have reached a final state with the option to step to + // further to a next state. But in the current state, no user + // data is required. + UIProvider ui = UIProviderFactory.getProvider("continue", null); + ui.setArtifact(art); + ui.setCollection(cView.getCollection()); + ui.setParameterList(this); + + ((ContinuePanel) ui).addAdvanceHandler(this); + + setCurrentData(null, ui); + } + else { + // we have reached a final state with no more user input + setCurrentData(null, null); + } + } + if (art instanceof WINFOArtifact + || art instanceof FixAnalysisArtifact) { + createGaugePanel(); + renderInfo(desc.getRiver(), desc.getOldData()); + } + else if (art instanceof MINFOArtifact) { + createMeasurementStationPanel(); + renderInfo(desc.getRiver(), desc.getOldData()); + } + else { + removeInfoPanel(); + } + + addOldDatas( + desc.getOldData(), + event.getType() == ParameterChangeEvent.Type.BACK); + } + + + @Override + public void onCollectionChange(CollectionChangeEvent event) { + Collection c = event.getNewValue(); + Map outs = c.getOutputModes(); + Set keys = outs.keySet(); + + OutputMode[] outputs = new OutputMode[outs.size()]; + + int idx = 0; + for (String outname: keys) { + outputs[idx++] = outs.get(outname); + } + + updateExportModes(c, getExportModes(outputs)); + updateReportModes(c, getReportModes(outputs)); + } + + + @Override + public void onOutputModesChange(OutputModesChangeEvent event) { + + Collection c = cView.getCollection(); + + if (c != null) { + OutputMode [] outs = event.getOutputModes(); + updateExportModes(c, getExportModes(outs)); + updateReportModes(c, getReportModes(outs)); + } + } + + + protected List getReportModes(OutputMode [] outs) { + + List reports = new ArrayList(); + + if (outs == null || outs.length == 0) { + return reports; + } + + for (OutputMode out: outs) { + if (out instanceof ReportMode) { + reports.add((ReportMode)out); + } + } + + return reports; + } + + + protected List getExportModes(OutputMode[] outs) { + List exports = new ArrayList(); + + if (outs == null || outs.length == 0) { + return exports; + } + + for (OutputMode out: outs) { + if (out instanceof ExportMode) { + exports.add((ExportMode) out); + } + } + + return exports; + } + + + protected void updateExportModes(Collection c, List exports) { + int num = exports != null ? exports.size() : 0; + GWT.log("Update export modes: " + num); + + exportModes.removeMembers(exportModes.getMembers()); + + if (exports.size() > 0) { + exportModes.addMember(new ExportPanel(c, exports)); + } + else { + exportModes.setHeight(1); + } + } + + protected void updateReportModes(Collection c, List reports) { + int num = reports != null ? reports.size() : 0; + GWT.log("Update report modes: " + num); + + if (num == 0) { + reportPanel.setContents(""); + return; + } + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + String cid = c.identifier(); + + for (ReportMode report: reports) { + GWT.log("report '" + report.toString() + "'"); + + reportService.report(cid, locale, report.getName(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + SC.warn(FLYS.getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(String msg) { + setReportMessage(msg); + } + }); + } + } + + + /** Sets content of reportPanel. */ + protected void setReportMessage(String msg) { + GWT.log("returned from service: " + msg); + if (msg == null) { + msg = ""; + } + reportPanel.setContents(msg); + } + + + /** + * Adds a table to the parameterlist to show calculated data. + * + * @param table The table data panel. + */ + public void setTable(TableDataPanel table) { + removeTable(); + + Canvas c = table.create(); + c.setHeight100(); + c.setWidth100(); + + tablePanel.addMember(c); + } + + + public boolean hasTable() { + Canvas[] members = tablePanel.getMembers(); + + return members != null && members.length > 0; + } + + + /** + * Removes the table from the parameter list. + */ + public void removeTable() { + Canvas[] members = tablePanel.getMembers(); + + if (members != null && members.length > 0) { + tablePanel.removeMembers(members); + } + } + + + public void registerCollectionViewTabHandler(TabSelectedHandler tsh) { + this.cView.registerTabHandler(tsh); + } + + + protected void lockUI() { + cView.lockUI(); + } + + + protected void unlockUI() { + cView.unlockUI(); + } + + + private void createGaugePanel() { + GWT.log("ParameterList - createGaugePanel"); + if (infoPanel == null) { + infoPanel = new GaugePanel(flys); + infoPanel.setWidth100(); + infoPanel.setHeight100(); + } + } + + private void createMeasurementStationPanel() { + GWT.log("ParameterList - createMeasurementStationPanel"); + if (infoPanel == null) { + infoPanel = new MeasurementStationPanel(flys); + infoPanel.setWidth100(); + infoPanel.setHeight100(); + } + } + + private void showInfoPanel() { + GWT.log("ParameterList - showInfoPanel"); + + /* Don't add InfoPanel twice */ + SectionStackSection exists = stack.getSection(InfoPanel.SECTION_ID); + if (exists == null) { + stack.addSection(infoPanel.getSection(), 0); + } + + infoPanel.show(); + } + + private void hideInfoPanel() { + GWT.log("ParameterList - hideInfoPanel"); + + if (infoPanel != null) { + infoPanel.hide(); + } + } + + private void removeInfoPanel() { + GWT.log("ParameterList - removeInfoPanel"); + SectionStackSection exists = stack.getSection(InfoPanel.SECTION_ID); + if (exists != null) { + stack.removeSection(InfoPanel.SECTION_ID); + } + } + + + private void renderInfo(String river, DataList[] data) { + GWT.log("ParameterList - renderInfo"); + + if (river != null) { + showInfoPanel(); + infoPanel.setRiver(river); + infoPanel.setData(data); + } + else { + GWT.log("ParameterList - renderInfo no river"); + hideInfoPanel(); + } + } + + /** + * Allow to close all folds of the info panel. + * This is necessary e.g. if a csv result should be shown. + */ + public void contractInfoPanel() { + if (infoPanel != null) { + infoPanel.contract(); + } + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrix.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrix.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,285 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.Widget; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.IntegerOptionsData; +import org.dive4elements.river.client.shared.model.StringOptionsData; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * Some parameters take the form of on/off options that can also be seen + * as a matrix. + * + * This class helps to survive the underlying objects and create a visual + * representation of this matrix. Later can happen in two ways to overcome + * shortcomings of GWT/SmartGWT combination. + */ +public class ParameterMatrix { + + protected ListGrid listGrid = null; + + public static class Column implements Serializable { + + private static final long serialVersionUID = -3493426383086860118L; + + protected String name; + protected Map values; + + private Column() { + this.values = new HashMap(); + } + + public Column(String name) { + this(); + this.name = name; + } + + public void addValue(String label, String value) { + values.put(label, value); + } + + public String getValue(String label) { + return values.get(label); + } + } // end of class Column + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); + + public static final int CELL_HEIGHT = 25; + + private Map columns; + private List columnNames; + private List valueNames; + + /** Maps column names to list of rows' first fields. */ + private Map> selected; + + public ParameterMatrix() { + super(); + this.columns = new HashMap(); + this.columnNames = new ArrayList(); + this.valueNames = new ArrayList(); + this.selected = new HashMap>(); + } + + + public void addColumn(IntegerOptionsData group) { + String groupTitle = group.getLabel(); + + Column col = new Column(groupTitle); + DataItem[] items = group.getItems(); + + if (items == null) { + GWT.log("No items found in StringOptionsData '" + groupTitle + "'"); + return; + } + + for (DataItem item: items) { + String title = item.getLabel(); + + if (valueNames.indexOf(title) < 0) { + valueNames.add(title); + } + + col.addValue(item.getLabel(), item.getStringValue()); + } + + columnNames.add(groupTitle); + columns.put(groupTitle, col); + } + + + public void addColumn(StringOptionsData options) { + String groupTitle = options.getLabel(); + + Column col = new Column(groupTitle); + DataItem[] items = options.getItems(); + + if (items == null) { + GWT.log("No items found in StringOptionsData '" + groupTitle + "'"); + return; + } + + for (DataItem item: items) { + String title = item.getLabel(); + + if (valueNames.indexOf(title) < 0) { + valueNames.add(title); + } + + col.addValue(item.getLabel(), item.getStringValue()); + } + + columnNames.add(groupTitle); + columns.put(groupTitle, col); + } + + + public Widget createParameterGrid() { + listGrid = new ListGrid(); + listGrid.setShowAllRecords(true); + listGrid.setWrapCells(true); + listGrid.setShowHeaderContextMenu(false); + listGrid.setCanReorderFields(false); + listGrid.setCanSort(false); + //listGrid.setAutoFitData(Autofit.VERTICAL); + listGrid.setFixedRecordHeights(false); + // TODO: Then also need "autofit" (when wrapping) + + ListGridField itemNameField = new ListGridField("itemname", " "); + ArrayList fields = new ArrayList(); + fields.add(itemNameField); + + for (int i = 0, n = columnNames.size(); i < n; i++) { + ListGridField field = new ListGridField(columnNames.get(i), MESSAGE.getString(columnNames.get(i))); + field.setType(ListGridFieldType.BOOLEAN); + field.setCanEdit(true); + fields.add(field); + selected.put(columnNames.get(i), new ArrayList()); + } + + ListGridField[] fieldsArray = fields.toArray(new ListGridField[fields.size()]); + listGrid.setFields(fieldsArray); + + int nVals = valueNames.size(); + + ArrayList records = new ArrayList(); + for (int j = 0; j < nVals; j++) { + String valueName = valueNames.get(j); + ListGridRecord record = new ListGridRecord(); + record.setAttribute("itemname", valueName); + for (int i = 0, n = columnNames.size(); i < n; i++) { + String columnName = columnNames.get(i); + Column col = columns.get(columnName); + String value = col.getValue(valueName); + record.setAttribute(columnName, false); + record.setAttribute(columnName+"-value", value); + } + records.add(record); + } + + listGrid.setData(records.toArray(new ListGridRecord[records.size()])); + + return listGrid; + + } + + + /** + * Returns a widget with matrix of checkboxes and labels. + * @param asListGrid if true, use a ListGrid (for inclusion in SmartGWT + * containers, avoiding scrollbar-issues. + */ + public Widget create(boolean asListGrid) { + if (asListGrid) { + return createParameterGrid(); + } + Grid grid = new Grid(valueNames.size() + 1, columnNames.size() + 1); + + for (int i = 0, n = columnNames.size(); i < n; i++) { + String columnName = columnNames.get(i); + Column col = columns.get(columnName); + + selected.put(columnName, new ArrayList()); + + grid.setWidget(0, i+1, createLabel(MESSAGE.getString(columnName))); + + for (int j = 0, o = valueNames.size(); j < o; j++) { + String valueName = valueNames.get(j); + String value = col.getValue(valueName); + + if (i == 0) { + grid.setWidget(j+1, 0, createLabel(valueName)); + } + + if (value != null && value.length() > 0) { + grid.setWidget(j+1, i+1, createCheckBox(columnName, value)); + } + } + } + + return grid; + } + + + /** Creates label with given text. */ + protected Label createLabel(String text) { + Label label = new Label(text); + label.setHeight(CELL_HEIGHT); + + return label; + } + + + /** Create Checkbox for column/value. */ + protected Canvas createCheckBox(final String colName, final String value) { + CheckBox box = new CheckBox(); + box.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + Map> selection = getSelection(); + + List values = selection.get(colName); + if (values.indexOf(value) >= 0) { + values.remove(value); + } + else { + values.add(value); + } + } + }); + + Canvas c = new Canvas(); + c.addChild(box); + return c; + } + + + public Map> getSelection() { + if (listGrid == null) { + return selected; + } + + ListGridRecord[] records = listGrid.getRecords(); + Map> result = new HashMap>(); + for (ListGridRecord record : records) { + for (int i = 0, n = columnNames.size(); i < n; i++) { + String columnName = columnNames.get(i); + if (Boolean.valueOf(record.getAttribute(columnName)) == true) { + if (result.containsKey(columnName)) { + result.get(columnName).add(record.getAttribute(columnName + "-value")); + } + else { + List items = new ArrayList(); + items.add(record.getAttribute(columnName + "-value")); + result.put(columnName, items); + } + } + } + } + return result; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrixPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrixPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,197 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.HTML; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +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.IntegerOptionsData; +import org.dive4elements.river.client.shared.model.StringOptionsData; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author Ingo Weinzierl + */ +public class ParameterMatrixPanel extends AbstractUIProvider { + + private static final long serialVersionUID = -5827445025768340371L; + + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + private ParameterMatrix matrix; + + @Override + protected Data[] getData() { + Map> selection = matrix.getSelection(); + Set>> entries = selection.entrySet(); + + Data[] list = new Data[selection.size()]; + + int i = 0; + + for (Map.Entry> entry: entries) { + String value = buildValueString(entry.getValue()); + + DataItem item = new DefaultDataItem( + entry.getKey(), + null, + value); + + list[i++] = new DefaultData( + entry.getKey(), null, null, new DataItem[] { item }); + } + + return list; + } + + + protected String buildValueString(List values) { + StringBuilder sb = new StringBuilder(); + + boolean first = true; + + for (String value: values) { + if (!first) { + sb.append(";"); + } + + sb.append(value); + + first = false; + } + + return sb.toString(); + } + + + /** Canvas to show in non-edit mode. */ + @Override + public Canvas createOld(DataList dataList) { + HLayout layout = new HLayout(); + VLayout vLayout = new VLayout(); + + layout.setWidth(300); + vLayout.setWidth(280); + + for (int i = 0, n = dataList.size(); i < n; i++) { + HLayout row = new HLayout(); + VLayout cols = new VLayout(); + + row.setWidth(300); + cols.setWidth(100); + + Data data = dataList.get(i); + DataItem[] items = data.getItems(); + + Label parameter = new Label(data.getDescription()); + parameter.setWidth(200); + + for (int j = 0, m = items.length; j < m; j++) { + DataItem item = items[j]; + Label value = new Label(item.getLabel()); + + value.setValign(com.smartgwt.client.types.VerticalAlignment.TOP); + value.setWidth(130); + value.setHeight(20); + + cols.addMember(value); + HTML hr = new HTML("
    "); + hr.setHeight("3px"); + cols.addMember(hr); + } + + row.addMember(parameter); + row.addMember(cols); + + vLayout.addMember(row); + } + + Canvas back = getBackButton(dataList.getState()); + + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + + /** Create the main canvas in the "editing" mode. */ + @Override + public Canvas create(DataList dataList) { + VLayout v = new VLayout(); + v.addMember(createTitle(dataList)); + + matrix = new ParameterMatrix(); + + for (Data data: dataList.getAll()) { + if (data instanceof IntegerOptionsData) { + matrix.addColumn((IntegerOptionsData) data); + } + else if (data instanceof StringOptionsData) { + matrix.addColumn((StringOptionsData) data); + } + } + + // If too many items are shown, show it in the helper Panel. + // TODO its not about the datalist, but about the "rows" in the data. + if (dataList.getAll().size() > 5) { + v.addMember(matrix.create(false)); + } + else { + helperContainer.addMember(matrix.create(true)); + } + v.addMember(getNextButton()); + + return v; + } + + + /** Reaturns a label with description of first Data. */ + protected Canvas createTitle(DataList dataList) { + Data data = dataList.get(0); + Label label = new Label(data.getDescription()); + label.setHeight(35); + + return label; + } + + + /** Selection shall not be empty. */ + @Override + public List validate() { + GWT.log ("validation. validation. validation. "); + List errors = new ArrayList(); + // Early stop on one (only) error. + boolean ok = false; + for (Map.Entry> entry : matrix.getSelection().entrySet()) { + /* single entries are allowed!! + if (entry.getValue() == null || entry.getValue().size() == 0) { + errors.add(MESSAGES.error_values_needed()); + return errors; + } + */ + if (entry.getValue() != null && entry.getValue().size() > 0) { + ok = true; + } + } + if (!ok) { + errors.add(MESSAGES.error_values_needed()); + } + return errors; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/PeriodPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/PeriodPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,194 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; + +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.DateRangeItem; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +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 java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * This UIProvider creates a panel for location or distance input. + * + * @author Raimund Renkert + */ +public class PeriodPanel +extends AbstractUIProvider +{ + private static final long serialVersionUID = -5249560815807538821L; + + /** The message class that provides i18n strings. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + DateRangeItem inputPanel; + + long start; + long end; + + protected String startName; + protected String endName; + + public PeriodPanel() { + this("start", "end"); + } + + public PeriodPanel(String startName, String endName) { + this.startName = startName; + this.endName = endName; + } + + + @Override + public Canvas create(DataList list) { + VLayout layout = new VLayout(); + + Canvas helper = createHelper(); + this.helperContainer.addMember(helper); + + Canvas submit = getNextButton(); + Canvas widget = createWidget(list); + + layout.addMember(widget); + layout.addMember(submit); + return layout; + } + + + public Canvas createWidget(DataList data) { + VLayout layout = new VLayout(); + + Label title = new Label(data.get(0).getDescription()); + title.setHeight("25px"); + + DynamicForm form = new DynamicForm(); + inputPanel = new DateRangeItem(); + inputPanel.setToTitle(MSG.to()); + inputPanel.setFromTitle(MSG.from()); + inputPanel.setShowTitle(false); + form.setFields(inputPanel); + + layout.addMember(title); + layout.addMember(form); + + return layout; + } + + protected Canvas createHelper() { + return new VLayout(); + } + + @Override + public Canvas createOld(DataList dataList) { + List items = dataList.getAll(); + + Data start = getData(items, startName); + Data end = getData(items, endName); + DataItem[] startItem = start.getItems(); + DataItem[] endItem = end.getItems(); + + String v1 = startItem[0].getStringValue(); + String v2 = endItem[0].getStringValue(); + + long v1l = 0; + long v2l = 0; + try { + v1l = Long.parseLong(v1); + v2l = Long.parseLong(v2); + } + catch(NumberFormatException nfe) { + GWT.log(nfe.toString()); + } + Date d1 = new Date(v1l); + Date d2 = new Date(v2l); + + DateTimeFormat f = + DateTimeFormat.getFormat( + DateTimeFormat.PredefinedFormat.DATE_MEDIUM); + StringBuilder sb = new StringBuilder(); + sb.append(f.format(d1) + " - "); + sb.append(f.format(d2)); + + Label old = new Label(sb.toString()); + old.setWidth(130); + + 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; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + @Override + public Data[] getData() { + List data = new ArrayList(); + + boolean valid = saveDateValues(); + if(valid) { + String start = Long.valueOf(this.start).toString(); + String end = Long.valueOf(this.end).toString(); + DataItem startItem = new DefaultDataItem(startName, startName, start); + DataItem endItem = new DefaultDataItem(endName, endName, end); + data.add(new DefaultData( + startName, + null, + null, + new DataItem[] { startItem })); + data.add(new DefaultData( + endName, + null, + null, + new DataItem[] { endItem })); + } + + return data.toArray(new Data[data.size()]); + } + + + protected boolean saveDateValues() { + Date st = inputPanel.getFromDate(); + Date en = inputPanel.getToDate(); + if (st == null || en == null) { + SC.warn(MSG.error_wrong_date()); + return false; + } + + long start = st.getTime(); + long end = en.getTime(); + + if (start <= end) { + this.start = start; + this.end = end; + return true; + } + return false; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ProjectList.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ProjectList.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,956 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.Autofit; +import com.smartgwt.client.types.ListGridEditEvent; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.types.Overflow; +import com.smartgwt.client.types.SelectionStyle; +import com.smartgwt.client.types.SortArrow; +import com.smartgwt.client.types.SortDirection; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.util.BooleanCallback; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.IconButton; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.VisibilityChangedEvent; +import com.smartgwt.client.widgets.events.VisibilityChangedHandler; +import com.smartgwt.client.widgets.grid.CellFormatter; +import com.smartgwt.client.widgets.grid.HoverCustomizer; +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.CellClickEvent; +import com.smartgwt.client.widgets.grid.events.CellClickHandler; +import com.smartgwt.client.widgets.grid.events.CellDoubleClickEvent; +import com.smartgwt.client.widgets.grid.events.CellDoubleClickHandler; +import com.smartgwt.client.widgets.grid.events.EditCompleteEvent; +import com.smartgwt.client.widgets.grid.events.EditCompleteHandler; +import com.smartgwt.client.widgets.grid.events.HeaderDoubleClickEvent; +import com.smartgwt.client.widgets.grid.events.HeaderDoubleClickHandler; +import com.smartgwt.client.widgets.grid.events.RowContextClickEvent; +import com.smartgwt.client.widgets.grid.events.RowContextClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.menu.Menu; +import com.smartgwt.client.widgets.menu.MenuItem; +import com.smartgwt.client.widgets.menu.MenuItemSeparator; +import com.smartgwt.client.widgets.menu.events.ClickHandler; +import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.CollectionChangeEvent; +import org.dive4elements.river.client.client.event.CollectionChangeHandler; +import org.dive4elements.river.client.client.event.FilterHandler; +import org.dive4elements.river.client.client.event.RangeFilterEvent; +import org.dive4elements.river.client.client.event.StringFilterEvent; +import org.dive4elements.river.client.client.services.AddArtifactService; +import org.dive4elements.river.client.client.services.AddArtifactServiceAsync; +import org.dive4elements.river.client.client.services.ArtifactService; +import org.dive4elements.river.client.client.services.ArtifactServiceAsync; +import org.dive4elements.river.client.client.services.CreateCollectionService; +import org.dive4elements.river.client.client.services.CreateCollectionServiceAsync; +import org.dive4elements.river.client.client.services.DeleteCollectionService; +import org.dive4elements.river.client.client.services.DeleteCollectionServiceAsync; +import org.dive4elements.river.client.client.services.DescribeCollectionService; +import org.dive4elements.river.client.client.services.DescribeCollectionServiceAsync; +import org.dive4elements.river.client.client.services.GetArtifactService; +import org.dive4elements.river.client.client.services.GetArtifactServiceAsync; +import org.dive4elements.river.client.client.services.SetCollectionNameService; +import org.dive4elements.river.client.client.services.SetCollectionNameServiceAsync; +import org.dive4elements.river.client.client.services.SetCollectionTTLService; +import org.dive4elements.river.client.client.services.SetCollectionTTLServiceAsync; +import org.dive4elements.river.client.client.services.UserCollectionsService; +import org.dive4elements.river.client.client.services.UserCollectionsServiceAsync; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItem; +import org.dive4elements.river.client.shared.model.CollectionRecord; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.User; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.MissingResourceException; + + +/** + * The project list shows a list of projects of a specific user. + * + * @author Ingo Weinzierl + */ +public class ProjectList +extends VLayout +implements CollectionChangeHandler, EditCompleteHandler, FilterHandler, + VisibilityChangedHandler +{ + /** Interval to refresh the user's projects.*/ + public static final int UPDATE_INTERVAL = 30000; + + /** Min Interval to refresh the user's projects.*/ + public static final int MIN_UPDATE_INTERVAL = 5000; + + /** The initial width of this panel.*/ + public static final int MIN_WIDTH = 300; + + /** The max length for new project names.*/ + public static final int MAX_NAME_LENGTH = 50; + + public static final String COLUMN_DATE_WIDTH = "100px"; + + public static final String COLUMN_TITLE_WIDTH = "*"; + + public static final String COLUMN_FAVORITE_WIDTH = "75px"; + + /** The interface that provides i18n messages. */ + private final FLYSConstants messages = GWT.create(FLYSConstants.class); + + /** The UserService used to retrieve information about the current user. */ + protected UserCollectionsServiceAsync userCollectionsService = + GWT.create(UserCollectionsService.class); + + /** The service used to set the name of a project.*/ + protected SetCollectionNameServiceAsync nameService = + GWT.create(SetCollectionNameService.class); + + /** The service used to set the name of a project.*/ + protected SetCollectionTTLServiceAsync ttlService = + GWT.create(SetCollectionTTLService.class); + + /** The service used to set the name of a project.*/ + protected DeleteCollectionServiceAsync deleteService = + GWT.create(DeleteCollectionService.class); + + /** The DescribeCollectionService used to update the existing collection. */ + protected DescribeCollectionServiceAsync describeCollectionService = + GWT.create(DescribeCollectionService.class); + + /** The ArtifactService used to communicate with the Artifact server. */ + protected ArtifactServiceAsync createArtifactService = + GWT.create(ArtifactService.class); + + /** The ArtifactService used to communicate with the Artifact server. */ + protected CreateCollectionServiceAsync createCollectionService = + GWT.create(CreateCollectionService.class); + + /** The AddArtifactService used to add an artifact to a collection. */ + protected AddArtifactServiceAsync addArtifactService = + GWT.create(AddArtifactService.class); + + /** The GetArtifactService used to open an existing collection. */ + protected GetArtifactServiceAsync getArtifactService = + GWT.create(GetArtifactService.class); + + /** A pointer to the FLYS instance.*/ + protected FLYS flys; + + /** The user whose projects should be displayed.*/ + protected User user; + + /** The grid that contains the project rows.*/ + protected ListGrid grid; + + /** All user collections.*/ + protected List collections; + + /** The collection to clone*/ + protected Collection cloneCollection; + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + private String filter; + + + /** + * The default constructor that creates a new ProjectList for a specific + * user. + * + * @param user The user. + */ + public ProjectList(FLYS flys, User user) { + super(); + this.flys = flys; + this.user = user; + + collections = new ArrayList(); + grid = new ListGrid(); + initGrid(); + init(); + initTimer(); + + grid.addEditCompleteHandler(this); + + addVisibilityChangedHandler(this); + + updateUserCollections(); + } + + + protected void initGrid() { + grid.setWidth100(); + grid.setAutoFitData(Autofit.VERTICAL); + grid.setAutoFitMaxWidth(500); + grid.setEmptyMessage(messages.no_projects()); + grid.setLoadingDataMessage(messages.load_projects()); + grid.setCanEdit(false); + grid.setEditEvent(ListGridEditEvent.NONE); + grid.setShowHeaderContextMenu(false); + grid.setShowSortArrow(SortArrow.NONE); + grid.setSortDirection(SortDirection.DESCENDING); + grid.setSortField(0); + grid.setSelectionType(SelectionStyle.SINGLE); + grid.setCanReorderFields(false); + grid.setLeaveScrollbarGap(false); + grid.setBorder("0px"); + + ListGridField date = buildDateField(); + ListGridField name = buildNameField(); + ListGridField fav = buildFavoriteField(); + + grid.setFields(date, name, fav); + + grid.addHeaderDoubleClickHandler(new HeaderDoubleClickHandler() { + @Override + public void onHeaderDoubleClick(HeaderDoubleClickEvent event) { + // Cancel the event. + return; + } + }); + + // Add a handler to set / unset the favorite state of a project. + grid.addCellClickHandler(new CellClickHandler() { + @Override + public void onCellClick(CellClickEvent event) { + if (event.getColNum() != 2) { + return; + } + + CollectionRecord r = (CollectionRecord) event.getRecord(); + Collection c = r.getCollection(); + + c.setTTL(c.getTTL() == 0 ? -1 : 0); + updateCollectionTTL(c); + } + }); + + // Add a handler to open a project. + grid.addCellDoubleClickHandler(new CellDoubleClickHandler() { + @Override + public void onCellDoubleClick(CellDoubleClickEvent e) { + CollectionRecord record = (CollectionRecord) e.getRecord(); + String uuid = record != null + ? record.getCollection().identifier() + : ""; + getFlys().openProject(uuid); + } + }); + + // Add a handler to open a context menu. + grid.addRowContextClickHandler(new RowContextClickHandler() { + @Override + public void onRowContextClick(RowContextClickEvent event) { + CollectionRecord record = (CollectionRecord) event.getRecord(); + + Menu menu = createContextMenu(record); + grid.setContextMenu(menu); + menu.showContextMenu(); + + event.cancel(); + } + }); + } + + + /** + * Initializes a repeating timer that updates the user's collections. The + * interval is specified by the constant UPDATE_INTERVAL. + */ + protected void initTimer() { + Config config = Config.getInstance(); + int interval = config.getProjectListUpdateInterval(); + + interval = interval > MIN_UPDATE_INTERVAL ? interval : UPDATE_INTERVAL; + + GWT.log("Update project list every " + interval + " milliseconds."); + + Timer t = new Timer() { + @Override + public void run() { + updateUserCollections(); + } + }; + + t.scheduleRepeating(interval); + } + + + public FLYS getFlys() { + return flys; + } + + + /** + * Creates a new context menu that interacts with a CollectionRecord. + * + * @param record The selected record. + * + * @return the context menu with operations that interact with + * record. + */ + protected Menu createContextMenu(final CollectionRecord record) { + Menu menu = new Menu(); + + MenuItem open = new MenuItem(messages.open_project()); + open.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + getFlys().openProject(record.getCollection().identifier()); + } + }); + + MenuItem del = new MenuItem(messages.delete_project()); + del.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + SC.ask(messages.really_delete(), new BooleanCallback() { + @Override + public void execute(Boolean value) { + if (value) { + deleteCollection(record.getCollection()); + } + } + }); + } + }); + + MenuItem rename = new MenuItem(messages.rename_project()); + rename.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + int row = grid.getRecordIndex(record); + grid.startEditing(row, 1, false); + } + }); + + MenuItem clone = new MenuItem(messages.clone_project()); + clone.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + cloneProject(record.getCollection()); + } + }); + + menu.addItem(open); + menu.addItem(rename); + menu.addItem(clone); + menu.addItem(new MenuItemSeparator()); + menu.addItem(del); + + return menu; + } + + + /** + * The init() method handles the layout stuff for this widget. + */ + protected void init() { + setWidth(MIN_WIDTH); + setMinWidth(MIN_WIDTH); + setHeight100(); + setShowResizeBar(true); + setShowEdges(false); + setLayoutMargin(0); + setLayoutAlign(VerticalAlignment.TOP); + setOverflow(Overflow.AUTO); + + Label title = new Label(messages.projects()); + title.setHeight("20"); + title.setMargin(5); + title.setWidth100(); + title.setStyleName("projectHeader"); + + HLayout buttonWrapper = new HLayout(); + + IconButton addButton = new IconButton(""); + addButton.setIcon(messages.projectListAdd()); + addButton.setTooltip(messages.new_project()); + addButton.setWidth("30px"); + + IconButton closeButton = new IconButton(""); + closeButton.setIcon(messages.projectListMin()); + closeButton.setTooltip(messages.projectlist_close()); + closeButton.setWidth("30px"); + + buttonWrapper.addMember(addButton); + buttonWrapper.addMember(closeButton); + buttonWrapper.setAlign(Alignment.RIGHT); + buttonWrapper.setAutoWidth(); + + HLayout titleWrapper = new HLayout(); + titleWrapper.setStyleName("bgBlueMid"); + titleWrapper.setWidth100(); + titleWrapper.setHeight("20px"); + titleWrapper.addMember(title); + titleWrapper.addMember(buttonWrapper); + + Canvas gridWrapper = new Canvas(); + gridWrapper.setPadding(0); + titleWrapper.setWidth100(); + gridWrapper.addChild(grid); + + TableFilter filterpanel = new TableFilter(); + filterpanel.setHeight("30px"); + filterpanel.addFilterHandler(this); + filterpanel.setBorder("1px solid gray"); + + addMember(titleWrapper); + addMember(gridWrapper); + addMember(filterpanel); + + addButton.addClickHandler( + new com.smartgwt.client.widgets.events.ClickHandler() { + + @Override + public void onClick(ClickEvent ev) { + flys.newProject(); + } + }); + + closeButton.addClickHandler( + new com.smartgwt.client.widgets.events.ClickHandler() { + + @Override + public void onClick(ClickEvent ev) { + hide(); + } + }); + } + + + @Override + public void onFilterCriteriaChanged(StringFilterEvent event) { + String search = event.getFilter(); + // Filter the records. + setFilter(search); + updateGrid(); + } + + + @Override + public void onFilterCriteriaChanged(RangeFilterEvent event) { + //Empty. No Ranges to filter. + } + + + /** On collection change, update list (probably name change or similar). */ + @Override + public void onCollectionChange(CollectionChangeEvent event) { + if (event.getOldValue() == null) { + updateUserCollections(); + } + } + + + @Override + public void onEditComplete(EditCompleteEvent event) { + if (event.getColNum() != 1) { + return; + } + + int row = event.getRowNum(); + + CollectionRecord r = (CollectionRecord) grid.getRecord(row); + Collection c = r.getCollection(); + + Map newValues = event.getNewValues(); + String name = (String) newValues.get("name"); + + int maxLength = getMaxNameLength(); + int length = name != null ? name.length() : 0; + + if (length <= 0 || length > maxLength) { + String msg = messages.project_name_too_long(); + msg = msg.replace("$LEN", String.valueOf(maxLength)); + SC.warn(msg); + + ListGridRecord[] rs = grid.getRecords(); + rs[row] = (ListGridRecord) event.getOldRecord(); + grid.setRecords(rs); + + return; + } + + updateCollectionName(c, name); + } + + + /** + * Set the name of the collection c to a new value. If the update + * process succeeded, the project list is refreshed. + * + * @param c The Collection with a new name. + * @param name Name to set on the collection + */ + private void updateCollectionName(final Collection c, String name) { + if (c == null) { + return; + } + + c.setName(name); + + GWT.log("Update Collection name: " + c.identifier()); + GWT.log("=> New name = " + c.getName()); + + nameService.setName(c, new AsyncCallback(){ + @Override + public void onFailure(Throwable caught) { + String msg = caught.getMessage(); + + try { + SC.warn(messages.getString(msg)); + } + catch (MissingResourceException mre) { + SC.warn(msg); + } + } + + @Override + public void onSuccess(Void v) { + updateUserCollections(); + if(flys.getWorkspace().hasView(c.identifier())) { + flys.getWorkspace().updateTitle(c.identifier(), c.getName()); + } + } + }); + } + + + /** + * Set the ttl of the collection c to a new value. If the update + * process succeeded, the project list is refreshed. + * + * @param c The Collection with a new ttl. + */ + protected void updateCollectionTTL(Collection c) { + if (c == null) { + return; + } + + GWT.log("Update Collection TTL: " + c.identifier()); + GWT.log("=> New ttl = " + c.getTTL()); + + ttlService.setTTL(c, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + String msg = caught.getMessage(); + + try { + SC.warn(messages.getString(msg)); + } + catch (MissingResourceException mre) { + SC.warn(msg); + } + } + + @Override + public void onSuccess(Void v) { + updateUserCollections(); + } + }); + } + + + /** + * Delete the collection c. + * + * @param c The Collection that should be deleted. + */ + public void deleteCollection(final Collection c) { + if (c == null) { + return; + } + + GWT.log("Delete Collection: " + c.identifier()); + + deleteService.delete(c, new AsyncCallback(){ + @Override + public void onFailure(Throwable caught) { + String msg = caught.getMessage(); + + try { + SC.warn(messages.getString(msg)); + } + catch (MissingResourceException mre) { + SC.warn(msg); + } + } + + @Override + public void onSuccess(Void v) { + flys.getWorkspace().destroyProject(c.identifier()); + updateUserCollections(); + } + }); + } + + + public void updateUserCollections() { + GWT.log("==> ProjectList updates user collections!"); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + userCollectionsService.getUserCollections(locale, user.identifier(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + String msg = caught.getMessage(); + + try { + SC.warn(messages.getString(msg)); + } + catch (MissingResourceException mre) { + SC.warn(msg); + } + } + + @Override + public void onSuccess(Collection[] collections) { + int num = collections != null ? collections.length : 0; + + GWT.log("Received " + num + " user collections."); + + updateGridDataSource(collections); + } + } + ); + } + + + /** + * Delete all entries in the ListGrid. + */ + private void clearGrid() { + ListGridRecord[] records = grid.getRecords(); + + for (ListGridRecord record: records) { + grid.removeData(record); + } + } + + + /** + * Update the collections data source. + * + * First removes all collections to avoid duplicates, then add new entries. + * + * @param c Collections to set to the data source. + */ + private void updateGridDataSource(Collection[] c) { + collections.clear(); + if(c == null) { + clearGrid(); + return; + } + for (Collection coll : c) { + this.collections.add(coll); + } + updateGrid(); + } + + + /** + * Updates the ListGrid. + */ + private void updateGrid() { + clearGrid(); + + if (collections == null || collections.isEmpty()) { + return; + } + + for (Collection col: collections) { + String name; + + name = col.getDisplayName().toLowerCase(); + + // Add a collection to the filtered list if the search string + // matches. + if (filter == null || filter.isEmpty() || + name.contains(filter.toLowerCase())) { + grid.addData(new CollectionRecord(col)); + } + } + } + + public int getMaxNameLength() { + return MAX_NAME_LENGTH; + } + + + /** + * Builds the field in the grid that displays the creation time of a + * project. + * + * @return the grid field. + */ + protected ListGridField buildDateField() { + ListGridField date = new ListGridField( + "creationTime", messages.projectlist_creationTime()); + + date.setType(ListGridFieldType.DATE); + date.setCanEdit(false); + + date.setCellFormatter(new CellFormatter() { + @Override + public String format(Object value, ListGridRecord rec, int r, int c) { + if (value == null) { + return null; + } + + DateTimeFormat dtf = DateTimeFormat.getFormat( + messages.datetime_format()); + + return dtf.format((Date)value); + } + }); + + date.setWidth(COLUMN_DATE_WIDTH); + date.setAlign(Alignment.CENTER); + + return date; + } + + + /** + * Builds the field in the grid that displays the name of a project. + * + * @return the grid field. + */ + protected ListGridField buildNameField() { + ListGridField name = new ListGridField( + "name", messages.projectlist_title()); + + name.setType(ListGridFieldType.TEXT); + name.setShowHover(true); + name.setHoverCustomizer(new HoverCustomizer() { + @Override + public String hoverHTML( + Object value, + ListGridRecord record, + int row, + int col) + { + CollectionRecord r = (CollectionRecord) record; + Collection c = r.getCollection(); + + String name = r.getName(); + + return name != null && name.length() > 0 + ? name + : c.identifier(); + } + }); + + name.setWidth(COLUMN_TITLE_WIDTH); + name.setAlign(Alignment.LEFT); + + return name; + } + + + protected ListGridField buildFavoriteField() { + ListGridField fav = new ListGridField( + "ttl", messages.projectlist_favorite()); + + fav.setType(ListGridFieldType.IMAGE); + String base = GWT.getHostPageBaseURL(); + fav.setImageURLPrefix(base + "images/"); + fav.setImageURLSuffix(".png"); + fav.setWidth(COLUMN_FAVORITE_WIDTH); + fav.setAlign(Alignment.CENTER); + fav.setCanEdit(false); + + return fav; + } + + + protected void cloneProject(Collection c) { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + cloneCollection = c; + + describeCollectionService.describe(c.identifier(), locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not DESCRIBE collection."); + SC.warn(messages.getString(caught.getMessage())); + } + + + @Override + public void onSuccess(Collection newCollection) { + GWT.log("Successfully DESCRIBED collection."); + String uuid = getMasterArtifact(newCollection); + cloneArtifact(uuid, newCollection); + } + } + ); + } + + + /** Get master artifacts UUID of a collection. */ + protected String getMasterArtifact(Collection newCollection) { + String uuid = newCollection.getItem(0).identifier(); + // The master artifact uuid. + return uuid; + } + + + /** Clone artifact/create collection, using the refArtifacts factory. */ + protected void cloneArtifact(String uuid, Artifact refArtifact, + final String locale) { + Recommendation recommendation = new Recommendation( + refArtifact.getName(), + null, + uuid, + null); + + String factory = recommendation.getFactory(); + createArtifactService.create( + locale, factory, recommendation, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Error loading recommendations: " + + caught.getMessage()); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Created new artifact: " + artifact.getUuid()); + createClonedCollection(artifact); + } + } + ); + } + + + /** + * Clone a project (collection). + */ + private void cloneArtifact(final String uuid, Collection newCollection) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + + // Find out which factory to use for cloning. + CollectionItem master = newCollection.getItem(0); + getArtifactService.getArtifact( + locale, + master.identifier(), + master.hash(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + SC.warn(MSG.getString(caught.getMessage())); + } + + @Override + public void onSuccess(Artifact artifact) { + cloneArtifact(uuid, artifact, locale); + } + }); + } + + + /** + * Creates a {@link Collection} with the passed {@link Artifact} + * @param artifact {@link Artifact} to add to the new {@link Collection} + */ + private void createClonedCollection(final Artifact artifact) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + final String ownerid = user.identifier(); + + createCollectionService.create( + locale, + ownerid, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not create the new collection."); + SC.warn(messages.getString(caught.getMessage())); + } + + @Override + public void onSuccess(Collection collection) { + GWT.log("Successfully created a new collection."); + addArtifactToClonedCollection(artifact, collection); + } + } + ); + } + + + private void addArtifactToClonedCollection(Artifact a, Collection c) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + + addArtifactService.add( + c, a, locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("An error occured while adding artifact."); + SC.warn(messages.getString(caught.getMessage())); + } + + @Override + public void onSuccess(Collection newColl) { + String name = cloneCollection.getName(); + if(name == null || name.equals("")) { + name = cloneCollection.identifier(); + } + + String colname = messages.copy_of() + ": " + name; + + updateCollectionName(newColl, colname); + if(cloneCollection.getTTL() == 0) { + newColl.setTTL(0); + updateCollectionTTL(newColl); + } + } + } + ); + } + + + @Override + public void onVisibilityChanged(VisibilityChangedEvent event) { + if (event.getIsVisible()) { + this.flys.hideHeaderProjectButton(); + } + else { + this.flys.shoHeaderProjectButton(); + } + } + + private void setFilter(String filter) { + this.filter = filter; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/PropertyEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/PropertyEditor.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.client.ui; + +import java.io.Serializable; + +/** + * @author Raimund Renkert + */ +public interface PropertyEditor extends Serializable { + + String getI18NString(String name); + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/QSegmentedInputPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/QSegmentedInputPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,490 @@ +package org.dive4elements.river.client.client.ui; + +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.types.TitleOrientation; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.WQInfoService; +import org.dive4elements.river.client.client.services.WQInfoServiceAsync; +import org.dive4elements.river.client.client.ui.wq.QDTable; +import org.dive4elements.river.client.client.ui.wq.WTable; +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.WQDataItem; +import org.dive4elements.river.client.shared.model.WQInfoObject; +import org.dive4elements.river.client.shared.model.WQInfoRecord; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + + +/** + * This UIProvider creates a widget to enter Q values per segment. + */ +public class QSegmentedInputPanel +extends AbstractUIProvider +implements ChangeHandler, BlurHandler +{ + + private static final long serialVersionUID = -8627825064071479905L; + + public static final String FIELD_WQ_MODE = "wq_isq"; + public static final String FIELD_WQ_Q = "Q"; + + public static final String GAUGE_SEPARATOR = ":"; + + public static final String GAUGE_PART_SEPARATOR = ";"; + + public static final String VALUE_SEPARATOR = ","; + + public static final int ROW_HEIGHT = 20; + + /** The constant field name for choosing single values or range.*/ + public static final String FIELD_MODE = "mode"; + + /** The constant field value for range input mode.*/ + public static final String FIELD_MODE_RANGE = "range"; + + protected WQInfoServiceAsync wqInfoService = + GWT.create(WQInfoService.class); + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** Stores the input panels related to their keys.*/ + protected Map wqranges; + + /** Stores the min/max values for each q range.*/ + protected Map qranges; + + protected QDTable qdTable; + + protected WTable wTable; + + protected TabSet tabs; + + + public QSegmentedInputPanel() { + wqranges = new HashMap(); + qranges = new HashMap(); + qdTable = new QDTable(); + wTable = new WTable(); + } + + + /** Create main UI Canvas. */ + @Override + public Canvas create(DataList data) { + initHelperPanel(); + + Canvas submit = getNextButton(); + Canvas widget = createWidget(data); + Label label = new Label(MSG.wqadaptedTitle()); + + label.setHeight(25); + + VLayout layout = new VLayout(); + layout.setMembersMargin(10); + layout.setWidth(350); + + layout.addMember(label); + layout.addMember(widget); + layout.addMember(submit); + + return layout; + } + + + protected void initHelperPanel() { + tabs = new TabSet(); + tabs.setWidth100(); + tabs.setHeight100(); + + // TODO i18n + Tab qTab = new Tab("Q / D"); + + qTab.setPane(qdTable); + qdTable.hideIconFields(); + + tabs.addTab(qTab, 1); + + helperContainer.addMember(tabs); + + // TODO Q only would suffice. + fetchWQData(); + } + + + /** Create display for passive mode. */ + @Override + public Canvas createOld(DataList dataList) { + List all = dataList.getAll(); + Data wqData = getData(all, "ranges"); + + Canvas back = getBackButton(dataList.getState()); + + HLayout valLayout = new HLayout(); + VLayout vlayout = new VLayout(); + Label wqLabel = new Label(dataList.getLabel()); + + wqLabel.setValign(VerticalAlignment.TOP); + + wqLabel.setWidth(200); + wqLabel.setHeight(25); + + valLayout.addMember(wqLabel); + valLayout.addMember(createOldWQValues(wqData)); + valLayout.addMember(back); + + vlayout.addMember(valLayout); + + return vlayout; + } + + + /** Create canvas showing previously entered values. */ + protected Canvas createOldWQValues(Data wqData) { + VLayout layout = new VLayout(); + + //TODO: Sort by first field, numerically. + + DataItem item = wqData.getItems()[0]; + String value = item.getStringValue(); + + String[] gauges = value.split(GAUGE_SEPARATOR); + + for (String gauge: gauges) { + HLayout h = new HLayout(); + + String[] parts = gauge.split(GAUGE_PART_SEPARATOR); + String[] values = parts[3].split(VALUE_SEPARATOR); + + Label l = new Label(parts[0] + " - " + parts[1] + ": "); + + StringBuilder sb = new StringBuilder(); + boolean first = true; + + for (String v: values) { + if (!first) { + sb.append(", "); + } + + sb.append(v); + + first = false; + } + + Label v = new Label(sb.toString()); + + l.setWidth(65); + v.setWidth(65); + + h.addMember(l); + h.addMember(v); + + layout.addMember(h); + } + + return layout; + } + + + protected Canvas createWidget(DataList dataList) { + VLayout layout = new VLayout(); + + Canvas list = createList(dataList); + + DataItem[] items = getWQItems(dataList); + int listHeight = ROW_HEIGHT * items.length; + + layout.addMember(list); + + layout.setHeight(25 + listHeight); + layout.setWidth(350); + + return layout; + } + + + @Override + public List validate() { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + Iterator iter = wqranges.keySet().iterator(); + + while (iter.hasNext()) { + List tmpErrors = new ArrayList(); + + String key = iter.next(); + DoubleArrayPanel dap = wqranges.get(key); + + if (!dap.validateForm()) { + errors.add(MSG.error_invalid_double_value()); + return errors; + } + + double[] mm = qranges.get(key); + if (mm == null) { + SC.warn(MSG.error_read_minmax_values()); + continue; + } + + double[] values = dap.getInputValues(); + // might geht npe here if one field not filled + double[] good = new double[values.length]; + + int idx = 0; + + for (double value: values) { + if (value < mm[0] || value > mm[1]) { + String tmp = MSG.error_validate_range(); + tmp = tmp.replace("$1", nf.format(value)); + tmp = tmp.replace("$2", nf.format(mm[0])); + tmp = tmp.replace("$3", nf.format(mm[1])); + tmpErrors.add(tmp); + } + else { + good[idx++] = value; + } + } + + double[] justGood = new double[idx]; + for (int i = 0; i < justGood.length; i++) { + justGood[i] = good[i]; + } + + if (!tmpErrors.isEmpty()) { + dap.setValues(justGood); + + errors.addAll(tmpErrors); + } + } + + return errors; + } + + + protected Canvas createList(DataList dataList) { + VLayout layout = new VLayout(); + + DataItem[] items = getWQItems(dataList); + + for (DataItem item: items) { + String title = item.getLabel(); + + DoubleArrayPanel dap = new DoubleArrayPanel( + createLineTitle(title), null, this, null, TitleOrientation.LEFT); + + wqranges.put(title, dap); + + if (item instanceof WQDataItem) { + WQDataItem wq = (WQDataItem) item; + double[] mmQ = wq.getQRange(); + + qranges.put(title, mmQ); + } + + layout.addMember(dap); + } + + layout.setHeight(items.length * ROW_HEIGHT); + + return layout; + } + + + protected DataItem[] getWQItems(DataList dataList) { + List data = dataList.getAll(); + + for (Data d: data) { + String name = d.getLabel(); + + // TODO to be gone + if (name.equals(FIELD_WQ_MODE)) { + continue; + } + + return d.getItems(); + } + + return null; + } + + + + public String createLineTitle(String key) { + String[] splitted = key.split(";"); + + return splitted[0] + " - " + splitted[1]; + } + + + @Override + public Data[] getData() { + Data values = getWQValues(); + + return new Data[] { values }; + } + + + protected Data getWQValues() { + String wqvalue = null; + + Iterator iter = wqranges.keySet().iterator(); + while (iter.hasNext()) { + String key = iter.next(); + DoubleArrayPanel dap = wqranges.get(key); + + double[] values = dap.getInputValues(); + if (wqvalue == null) { + wqvalue = createValueString(key + "; ", values); + } + else { + wqvalue += GAUGE_SEPARATOR + createValueString(key + "; ", values); + } + } + + // TODO probably ranges + DataItem valueItem = new DefaultDataItem( + "ranges", "ranges", wqvalue); + Data values = new DefaultData( + "ranges", null, null, new DataItem[] { valueItem }); + + return values; + } + + + protected String createValueString(String key, double[] values) { + StringBuilder sb = new StringBuilder(); + + boolean first = true; + + for (double value: values) { + if (!first) { + sb.append(","); + } + + sb.append(Double.toString(value)); + + first = false; + } + + return key + ";" + sb.toString(); + } + + + @Override + public void onChange(ChangeEvent event) { + // TODO IMPLEMENT ME + } + + + @Override + public void onBlur(BlurEvent event) { + DoubleArrayPanel dap = (DoubleArrayPanel) event.getForm(); + dap.validateForm(event.getItem()); + } + + + protected void fetchWQData() { + Config config = Config.getInstance(); + String locale = config.getLocale (); + + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList[] data = adescr.getOldData(); + + double[] mm = getMinMaxKM(data); + String river = getRiverName(data); + + wqInfoService.getWQInfo(locale, river, mm[0], mm[0], + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not recieve wq informations."); + SC.warn(caught.getMessage()); + } + + @Override + public void onSuccess(WQInfoObject[] wqi) { + int num = wqi != null ? wqi.length :0; + GWT.log("Recieved " + num + " wq informations."); + + if (num == 0) { + return; + } + + addWQInfo(wqi); + + } + } + ); + } + + + protected void addWQInfo (WQInfoObject[] wqi) { + for(WQInfoObject wi: wqi) { + WQInfoRecord rec = new WQInfoRecord(wi); + + if (wi.getType().equals("W")) { + wTable.addData(rec); + } + else { + qdTable.addData(rec); + } + } + } + + + /** + * Determines the min and max kilometer value selected in a former state. A + * bit silly, but we need to run over each value of the "old data" to find + * such values because it is not available here. + * + * @param data The DataList which contains the whole data inserted for the + * current artifact. + * + * @return a double array with [min, max]. + */ + protected double[] getMinMaxKM(DataList[] data) { + ArtifactDescription adesc = artifact.getArtifactDescription(); + return adesc.getKMRange(); + } + + + /** + * Returns the name of the selected river. + * + * @param data The DataList with all data. + * + * @return the name of the current river. + */ + protected String getRiverName(DataList[] data) { + ArtifactDescription adesc = artifact.getArtifactDescription(); + return adesc.getRiver(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RadioPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RadioPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,94 @@ +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 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 java.util.LinkedHashMap; + +public class RadioPanel extends AbstractUIProvider { + + private static final long serialVersionUID = 3357071563224461043L; + + protected String dataName; + protected DynamicForm form; + + @Override + public Canvas createOld(DataList dataList) { + Data data = dataList.get(0); + DataItem[] items = data.getItems(); + + HLayout layout = new HLayout(); + Label label = new Label(dataList.getLabel()); + Label value = new Label(items[0].getLabel()); + + layout.setHeight(35); + layout.setWidth(400); + label.setWidth(200); + + layout.addMember(label); + layout.addMember(value); + layout.addMember(getBackButton(dataList.getState())); + + return layout; + } + + @Override + public Canvas create(DataList dataList) { + Data data = dataList.get(0); + DataItem[] items = data.getItems(); + + this.dataName = data.getLabel(); + + VLayout layout = new VLayout(); + Label label = new Label(data.getDescription()); + RadioGroupItem rgi = new RadioGroupItem("selection"); + rgi.setShowTitle(false); + GWT.log("items: " + items.length); + LinkedHashMap elems = new LinkedHashMap(); + for (int i = 0; i < items.length; i++) { + GWT.log(items[i].getStringValue() + "; " + items[i].getLabel()); + elems.put(items[i].getStringValue(), items[i].getLabel()); + } + rgi.setValueMap(elems); + rgi.setDefaultValue(items[0].getStringValue()); + + form = new DynamicForm(); + form.setFields(rgi); + layout.setMembersMargin(10); + layout.setHeight(35); + label.setHeight(35); + + layout.addMember(label); + layout.addMember(form); + layout.addMember(getNextButton()); + layout.setMembersMargin(10); + + //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})}; + } + + protected String getTitle(DataItem item) { + return item.getLabel(); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RangePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RangePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,282 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.Alignment; +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.FormItem; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.validator.Validator; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +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.RangeData; + +import java.util.ArrayList; +import java.util.List; + + +/** + * An UIProvider for inserting ranges. + * + * @author Ingo Weinzierl + */ +public abstract class RangePanel extends AbstractUIProvider { + + private static final long serialVersionUID = -9213089589150335651L; + + public static final String FIELD_LOWER = "field_lower"; + public static final String FIELD_UPPER = "field_upper"; + + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected DynamicForm lowerForm; + protected DynamicForm upperForm; + + protected String dataName; + + + public abstract Object getMaxLower(); + + public abstract Object getMaxUpper(); + + + + @Override + public Canvas create(DataList data) { + setDataName(data); + + VLayout root = new VLayout(); + + root.addMember(createLabel(data)); + root.addMember(createForm(data)); + root.addMember(getNextButton()); + + initDefaults(data); + + return root; + } + + + @Override + public Canvas createOld(DataList dataList) { + Data data = dataList.get(0); + DataItem[] items = data.getItems(); + + HLayout layout = new HLayout(); + + Label label = new Label(dataList.getLabel()); + label.setWidth(200); + label.setHeight(20); + + Label value = new Label(items[0].getLabel()); + value.setHeight(20); + + layout.addMember(label); + layout.addMember(value); + layout.addMember(getBackButton(dataList.getState())); + + return layout; + } + + + @Override + public List validate() { + List errors = new ArrayList(); + + if (!lowerForm.validate()) { + String msg = MSG.error_validate_range(); + msg = msg.replace("$1", getLower()); + msg = msg.replace("$2", String.valueOf(getMaxLower())); + msg = msg.replace("$3", String.valueOf(getMaxLower())); + errors.add(msg); + } + + if (!upperForm.validate()) { + String msg = MSG.error_validate_range(); + msg = msg.replace("$1", getUpper()); + msg = msg.replace("$2", String.valueOf(getMaxLower())); + msg = msg.replace("$3", String.valueOf(getMaxUpper())); + errors.add(msg); + } + + return errors; + } + + + @Override + protected Data[] getData() { + return new Data[0]; + } + + + protected void initDefaults(DataList dataList) { + RangeData data = findRangeData(dataList); + + if (data != null) { + setLower(String.valueOf(data.getDefaultLower())); + setUpper(String.valueOf(data.getDefaultUpper())); + } + } + + + protected RangeData findRangeData(DataList dataList) { + for (int i = 0, n = dataList.size(); i < n; i++) { + Data tmp = dataList.get(i); + + if (tmp instanceof RangeData) { + return (RangeData) tmp; + } + } + return null; + } + + + protected void setDataName(DataList dataList) { + Data data = dataList.get(0); + + this.dataName = data.getLabel(); + } + + + public String getDataName() { + return dataName; + } + + + public String getLower() { + return lowerForm.getValueAsString(FIELD_LOWER); + } + + + public void setLower(String lower) { + lowerForm.setValue(FIELD_LOWER, lower); + } + + + public String getUpper() { + return upperForm.getValueAsString(FIELD_UPPER); + } + + + public void setUpper(String upper) { + upperForm.setValue(FIELD_UPPER, upper); + } + + + protected Canvas createLabel(DataList dataList) { + RangeData rangeData = findRangeData(dataList); + + if (rangeData == null) { + return new Canvas(); + } + + Label label = new Label(rangeData.getDescription()); + + label.setWidth100(); + label.setHeight(25); + + return label; + } + + + protected Canvas createForm(DataList dataList) { + lowerForm = createLowerForm(dataList); + upperForm = createUpperForm(dataList); + + HLayout formLayout = new HLayout(); + formLayout.addMember(lowerForm); + formLayout.addMember(createSpacer()); + formLayout.addMember(upperForm); + + return formLayout; + } + + + protected DynamicForm newForm() { + DynamicForm form = new DynamicForm(); + form.setTitlePrefix(""); + form.setTitleSuffix(""); + form.setTitle(""); + form.setTitleField(""); + + return form; + } + + + protected FormItem newFormItem(String name) { + TextItem item = new TextItem(name, ""); + item.setShowTitle(false); + + return item; + } + + + protected DynamicForm createLowerForm(DataList dataList) { + DynamicForm lowerForm = newForm(); + FormItem lower = createLowerField(dataList); + + lowerForm.setFields(lower); + + return lowerForm; + } + + + protected DynamicForm createUpperForm(DataList dataList) { + DynamicForm upperForm = newForm(); + FormItem upper = createUpperField(dataList); + + upperForm.setFields(upper); + + return upperForm; + } + + + protected Canvas createSpacer() { + Label spacer = new Label("-"); + spacer.setWidth(25); + spacer.setHeight(25); + spacer.setAlign(Alignment.CENTER); + + return spacer; + } + + + protected FormItem createLowerField(DataList dataList) { + return createField(FIELD_LOWER, createLowerValidators(dataList)); + } + + + protected FormItem createUpperField(DataList dataList) { + return createField(FIELD_UPPER, createUpperValidators(dataList)); + } + + + protected FormItem createField(String name, Validator[] validators) { + FormItem field = newFormItem(name); + + if (validators != null && validators.length > 0) { + field.setValidators(validators); + } + + return field; + } + + + protected Validator[] createLowerValidators(DataList dataList) { + return null; + } + + + protected Validator[] createUpperValidators(DataList dataList) { + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RangeTableFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RangeTableFilter.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,136 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.form.fields.events.KeyUpEvent; +import com.smartgwt.client.widgets.form.fields.events.KeyUpHandler; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.FilterHandler; +import org.dive4elements.river.client.client.event.RangeFilterEvent; +import org.dive4elements.river.client.client.utils.DoubleValidator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author Raimund Renkert + */ +public class RangeTableFilter +extends HLayout +implements ChangedHandler, KeyUpHandler +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected List handlers; + + protected TextItem fromField; + protected TextItem toField; + protected DynamicForm filterForm; + + public RangeTableFilter() { + super(); + fromField = new TextItem(); + fromField.setTitle(MESSAGES.from()); + fromField.setWidth(60); + toField = new TextItem(); + toField.setTitle(MESSAGES.to()); + toField.setWidth(60); + + + handlers = new ArrayList(); + + fromField.addChangedHandler(this); + fromField.addKeyUpHandler(this); + toField.addChangedHandler(this); + toField.addKeyUpHandler(this); + + filterForm = new DynamicForm(); + filterForm.setNumCols(4); + filterForm.setFields(fromField, toField); + + addMember(filterForm); + } + + + @Override + public void onChanged(ChangedEvent event) { + // This event handler is to slow... +// fireFilterCriteriaChanged(getSearchString()); + } + + + @Override + public void onKeyUp(KeyUpEvent event) { + DoubleValidator validator = new DoubleValidator(); + Map errors = filterForm.getErrors(); + if(event.getItem().getValue() != null && + !validator.validate(event.getItem(), errors)) { + filterForm.setErrors(errors, true); + GWT.log("no valid input!"); + return; + } + else { + errors.clear(); + filterForm.setErrors(errors, true); + } + //To deactivate "As you type" filter add + // ' && event.getKeyName().equals("Enter")' + // to the if-clause. + if (event != null) { + fireFilterCriteriaChanged(getFrom(), getTo()); + } + } + + + public String getFrom() { + if (fromField.getValueAsString() == null) { + return ""; + } + else { + return fromField.getValueAsString(); + } + } + + + public String getTo() { + if (toField.getValueAsString() == null) { + return ""; + } + else { + return toField.getValueAsString(); + } + } + + + public void addFilterHandler(FilterHandler handler) { + if (handler != null) { + handlers.add(handler); + } + } + + + protected void fireFilterCriteriaChanged(String from, String to) { + RangeFilterEvent filter = new RangeFilterEvent(from, to); + + for (FilterHandler handler: handlers) { + handler.onFilterCriteriaChanged(filter); + } + } + + + @Override + public void clear() { + fromField.clearValue(); + toField.clearValue(); + fireFilterCriteriaChanged("", ""); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RecommendationPairRecord.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RecommendationPairRecord.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,129 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.dive4elements.river.client.shared.model.Recommendation; + + +/** + * Two strings to be displayed in a GridList, derived from two + * Recommendations. + */ +public class RecommendationPairRecord extends ListGridRecord { + + /** First attribute-name for StringPairRecord. */ + protected static final String ATTRIBUTE_FIRST = "first"; + + /** Second attribute-name for StringPairRecord. */ + protected static final String ATTRIBUTE_SECOND = "second"; + + /** The "first" recommendation (typically the minuend). */ + Recommendation first; + + /** The "second" recommendation (typically the subtrahend). */ + Recommendation second; + + /** + * Whether the RecommendationPairRecord was restored from data and thus + * already loaded (usually cloned) in an ArtifactCollection or not. + */ + boolean alreadyLoaded; + + + /** Trivial, blocked constructor. */ + @SuppressWarnings("unused") + private RecommendationPairRecord() { + } + + + /** + * Create a new RecommendationPairRecord. + * + * @param first The first recommendation (typically the minuend). + * @param second The second recommendation (typically the subtrahend). + */ + public RecommendationPairRecord( + Recommendation first, + Recommendation second) + { + setFirst(first); + setSecond(second); + alreadyLoaded = false; + } + + + /** + * Sets the first recommendation with info (minuend). + * @param first Recommendation to store. + */ + public void setFirst(Recommendation first) { + this.first = first; + setAttribute(ATTRIBUTE_FIRST, first.getDisplayName()); + } + + + /** + * Sets the second recommendation with info (subtrahend). + * @param second Recommendation to store. + */ + public void setSecond(Recommendation second) { + this.second = second; + setAttribute(ATTRIBUTE_SECOND, second.getDisplayName()); + } + + + /** + * Get first recommendation (typically the minuend). + * @return first recommendation (typically the minuend). + */ + public Recommendation getFirst() { + return first; + } + + + /** + * Get second recommendation (typically the subtrahend). + * @return second recommendation (typically the subtrahend). + */ + public Recommendation getSecond() { + return second; + } + + + /** + * Get name of first recommendation (typically the minuend). + * @return name of first recommendation (typically the minuend). + */ + public String getFirstName() { + return first.getDisplayName(); + } + + + /** + * Get name of second recommendation (typically the subtrahend). + * @return name of second recommendation (typically the subtrahend). + */ + public String getSecondName() { + return second.getDisplayName(); + } + + + /** + * Sets whether or not the Recommendation is already loaded (in contrast + * to not yet loaded). + * @param isAlreadyLoaded new value. + */ + public void setIsAlreadyLoaded(boolean isAlreadyLoaded) { + this.alreadyLoaded = isAlreadyLoaded; + } + + + /** + * Whether or not this pair of recommendations is already laoded (usually + * cloned) in an ArtifactCollection. + * @return whether pair of recommendations is already loaded. + */ + public boolean isAlreadyLoaded() { + return this.alreadyLoaded; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RiverInfoPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RiverInfoPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,115 @@ +package org.dive4elements.river.client.client.ui; + +import java.util.Iterator; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.Widget; + +import org.dive4elements.river.client.client.FLYSConstants; + +import org.dive4elements.river.client.shared.model.RiverInfo; + +/** + * Panel to display information about a river. + * @author Björn Ricks + */ +public class RiverInfoPanel extends HorizontalPanel { + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + public final static int HEIGHT = 30; + public final static int BORDER_WIDTH = 3; + public final static int PADDING = 8; + public final static int MARGIN = 10; + + public RiverInfoPanel(RiverInfo riverinfo) { + setStyleName("riverinfopanel"); + setHeight("" + HEIGHT + "px"); + setVerticalAlignment(ALIGN_MIDDLE); + + setRiverInfo(riverinfo); + } + + public void setRiverInfo(RiverInfo riverinfo) { + GWT.log("RiverInfoPanel - setRiverInfo"); + + NumberFormat nf = NumberFormat.getDecimalFormat(); + + removeAllLabels(); + + addLabel(riverinfo.getName(), false); + + String kmtext = ""; + Double start = riverinfo.getKmStart(); + Double end = riverinfo.getKmEnd(); + + if (!riverinfo.isKmUp()) { + Double tmp = end; + end = start; + start = tmp; + } + if (end != null) { + kmtext += nf.format(end); + kmtext += " - "; + } + if (start != null) { + kmtext += nf.format(start); + } + kmtext += " km"; + + addLabel(kmtext, false); + + String qtext = ""; + Double qmin = riverinfo.getMinQ(); + Double qmax = riverinfo.getMaxQ(); + if (qmin != null) { + qtext += nf.format(qmin); + qtext += " " + MSG.gauge_q_unit(); + qtext += " - "; + } + if (qmax != null) { + qtext += nf.format(qmax); + qtext += " " + MSG.gauge_q_unit(); + } + + addLabel(qtext, false); + + Long number = riverinfo.getOfficialNumber(); + String url = number != null ? + MSG.gauge_river_url() + number : + MSG.gauge_river_url(); + Anchor anchor = new Anchor(MSG.gauge_river_info_link(), url, "_blank"); + add(anchor); + } + + public static int getStaticHeight() { + return RiverInfoPanel.HEIGHT + + (2 * RiverInfoPanel.BORDER_WIDTH) + + (2 * RiverInfoPanel.PADDING) + + (2 * RiverInfoPanel.MARGIN); + } + + private void addLabel(String text, boolean wordwrap) { + Label label = new Label(text, wordwrap); + add(label); + setCellHeight(label, "" + HEIGHT + "px"); + } + + private void removeAllLabels() { + GWT.log("RiverInfoPanel - removeAllLabels"); + + Iterator it = this.iterator(); + while(it.hasNext()) { + it.next(); + it.remove(); + } + /* for (Widget wid: this) { */ + /* this.remove(wid); */ + /* } */ + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ScreenLock.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ScreenLock.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,55 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.Layout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; + +/** Basic static functionality to show spinning wheel. */ +public class ScreenLock { + + /** The message class that provides i18n strings. */ + protected static FLYSConstants messages = GWT.create(FLYSConstants.class); + + /** Disables input, grey out, show spinning wheel of joy. */ + public static VLayout lockUI(Layout layout, VLayout lockScreen) { + if (lockScreen == null) { + lockScreen = new VLayout(); + lockScreen.setWidth100(); + lockScreen.setHeight100(); + lockScreen.setBackgroundColor("#7f7f7f"); + lockScreen.setOpacity(50); + lockScreen.setAlign(VerticalAlignment.CENTER); + lockScreen.setDefaultLayoutAlign(VerticalAlignment.CENTER); + + HLayout inner = new HLayout(); + inner.setAlign(Alignment.CENTER); + inner.setDefaultLayoutAlign(Alignment.CENTER); + inner.setOpacity(100); + + Img img = new Img( + GWT.getHostPageBaseURL() + messages.loadingImg(), + 25, 25); + + inner.addMember(img); + + lockScreen.addMember(inner); + } + + layout.addChild(lockScreen); + return lockScreen; + } + + /** Enable input, remove grey, remove spinning wheel of joy. */ + public static void unlockUI(Layout layout, VLayout lockScreen) { + layout.removeChild(lockScreen); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/SelectProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/SelectProvider.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,273 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.types.VerticalAlignment; +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.FormItem; +import com.smartgwt.client.widgets.form.fields.LinkItem; +import com.smartgwt.client.widgets.form.fields.SelectItem; +import com.smartgwt.client.widgets.form.fields.SpacerItem; +import com.smartgwt.client.widgets.form.fields.events.ClickEvent; +import com.smartgwt.client.widgets.form.fields.events.ClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.StepForwardEvent; +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 java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + + +/** + * This UIProvider displays the DataItems of the Data object in a combo box. + * + * @author Ingo Weinzierl + */ +public class SelectProvider +extends AbstractUIProvider +{ + private static final long serialVersionUID = 4696637534424070726L; + + /** The message class that provides i18n strings.*/ + protected FLYSConstants messages = GWT.create(FLYSConstants.class); + + /** The combobox.*/ + protected DynamicForm form = new DynamicForm(); + + public static final int COMBOBOX_THRESHOLD = 20; + + + /** + * This method currently returns a + * {@link com.smartgwt.client.widgets.form.DynamicForm} that contains all + * data items in a combobox stored in data. + * + * @param data The {@link Data} object. + * + * @return a combobox. + */ + @Override + public Canvas create(DataList data) { + VLayout v = new VLayout(); + v.setMembersMargin(10); + v.addMember(createWidget(data)); + if(data.size() > COMBOBOX_THRESHOLD) { + v.addMember(getNextButton()); + } + return v; + } + + + protected Canvas createWidget(DataList data) { + if (data.size() > COMBOBOX_THRESHOLD) { + return createComboboxWidget(data); + } + else { + return createListWidget(data); + } + } + + + @Override + public Canvas createOld(DataList dataList) { + HLayout layout = new HLayout(); + VLayout vLayout = new VLayout(); + layout.setWidth("400px"); + + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + + int size = dataList.size(); + for (int i = 0; i < size; i++) { + Data data = dataList.get(i); + DataItem[] items = data.getItems(); + + for (DataItem item: items) { + HLayout hLayout = new HLayout(); + + hLayout.addMember(label); + hLayout.addMember(new Label(item.getLabel())); + + vLayout.addMember(hLayout); + vLayout.setWidth("130px"); + } + } + + Canvas back = getBackButton(dataList.getState()); + + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + + protected Canvas createListWidget(DataList data) { + VLayout layout = new VLayout(); + layout.setAlign(VerticalAlignment.TOP); + layout.setHeight(25); + layout.setWidth("100%"); + + VLayout formLayout = new VLayout(); + formLayout.setLayoutTopMargin(20); + formLayout.setLayoutLeftMargin(50); + + ClickHandler handler = new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + LinkItem li = (LinkItem)event.getItem(); + String attr = li.getAttribute(li.getName()); + GWT.log("li.getTarget: " + attr + " " + li.getName()); + DataItem item = new DefaultDataItem( + attr, + null, + attr); + + Data d = new DefaultData( + li.getName(), + null, + null, + new DataItem [] { item }); + + Data [] odata = getData(); + Data [] ndata = new Data[odata.length+1]; + System.arraycopy(odata, 0, ndata, 0, odata.length); + ndata[odata.length] = d; + + fireStepForwardEvent(new StepForwardEvent(ndata)); + } + }; + + for (int i = 0, size = data.size(); i < size; i++) { + Data d = data.get(i); + + Label label = new Label(d.getDescription()); + label.setValign(VerticalAlignment.TOP); + label.setHeight(20); + label.setWidth(400); + + LinkedHashMap initial = new LinkedHashMap(); + ArrayList formItems = new ArrayList(); + + for (DataItem item: d.getItems()) { + initial.put(item.getLabel().replace(' ', '_'), item.getStringValue()); + GWT.log("put: " + item.getLabel().replace(' ', '_') + "=" + item.getStringValue()); + + LinkItem link = new LinkItem(d.getLabel()); + link.setLinkTitle(item.getLabel()); // i18n text of the link + link.setAttribute(d.getLabel(), item.getStringValue()); // e.g. "calculation_mode":"foo" + link.setShowTitle(false); + link.setEndRow(true); + link.setWidth("350px"); + + SpacerItem space = new SpacerItem(); + space.setWidth(15); + formItems.add(space); + formItems.add(link); + + link.addClickHandler(handler); + } + + form.setFields(formItems.toArray(new FormItem[0])); + form.setValues(initial); + + layout.addMember(label); + layout.addMember(form); + } + return layout; + } + + protected Canvas createComboboxWidget(DataList data) { + GWT.log("SelectProvider.createComboboxWidget()"); + + VLayout layout = new VLayout(); + layout.setAlign(VerticalAlignment.TOP); + layout.setHeight(25); + + LinkedHashMap initial = new LinkedHashMap(); + + int size = data.size(); + + for (int i = 0; i < size; i++) { + Data d = data.get(i); + + Label label = new Label(d.getDescription()); + label.setValign(VerticalAlignment.TOP); + label.setHeight(20); + label.setWidth(400); + + SelectItem combobox = new SelectItem(d.getLabel()); + combobox.setWidth(250); + + LinkedHashMap it = new LinkedHashMap(); + + boolean defaultSet = false; + boolean first = true; + + DataItem def = d.getDefault(); + String defValue = def != null ? def.getStringValue() : null; + + if (defValue != null && defValue.length() > 0) { + initial.put(d.getLabel(), def.getStringValue()); + defaultSet = true; + } + + for (DataItem item: d.getItems()) { + if (!defaultSet && first) { + initial.put(d.getLabel(), item.getStringValue()); + first = false; + } + + it.put(item.getStringValue(), item.getLabel()); + } + + label.setWidth(50); + combobox.setValueMap(it); + combobox.setShowTitle(false); + form.setItems(combobox); + + layout.addMember(label); + layout.addMember(form); + } + + form.setValues(initial); + + layout.setAlign(VerticalAlignment.TOP); + + return layout; + } + + + @Override + protected Data[] getData() { + Map values = form.getValues(); + Iterator keys = values.keySet().iterator(); + + Data[] list = new Data[values.size()]; + int i = 0; + + while (keys.hasNext()) { + String fieldname = ((String) keys.next()).replace('_', ' '); + String selection = (String) values.get(fieldname); + + DataItem item = new DefaultDataItem(fieldname, null, selection); + + list[i++] = new DefaultData( + fieldname, null, null, new DataItem[] { item }); + } + + return list; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/SingleLocationPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/SingleLocationPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,128 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.data.Record; + +import com.smartgwt.client.widgets.grid.events.CellClickEvent; + +import org.dive4elements.river.client.shared.model.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * This UIProvider creates a widget to enter a single location (km). + */ +public class SingleLocationPanel +extends MultipleLocationPanel +{ + private static final long serialVersionUID = -300641333561787454L; + + + /** + * Creates a new SingleLocationPanel instance. + */ + public SingleLocationPanel() { + picker = new LocationPicker(this); + } + + + /** Overridden to restrict to one entered value. */ + @Override + public List validate() { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + saveLocationValues(locationPanel); + + if (!locationPanel.validateForm()) { + errors.add(MSG.wrongFormat()); + return errors; + } + + double[] values = getLocationValues(); + double[] good = new double[values.length]; + int idx = 0; + + // We want just one value to be allowed. + if (values.length > 1) { + errors.add(MSG.too_many_values()); + } + + for (double value: values) { + if (value < min || value > max) { + String tmp = MSG.error_validate_range(); + tmp = tmp.replace("$1", nf.format(value)); + tmp = tmp.replace("$2", nf.format(min)); + tmp = tmp.replace("$3", nf.format(max)); + errors.add(tmp); + } + else { + good[idx++] = value; + } + } + + double[] justGood = new double[idx]; + for (int i = 0; i < justGood.length; i++) { + justGood[i] = good[i]; + } + + if (!errors.isEmpty()) { + locationPanel.setValues(justGood); + } + + return errors; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + @Override + public Data[] getData() { + saveLocationValues(locationPanel); + double[] values = getLocationValues(); + Data[] data = new Data[values.length+1]; + + for (int i = 0; i < values.length; i++) { + data[i] = createDataArray(getDataItemName(), + Double.valueOf(values[i]).toString()); + } + + data[values.length] = createDataArray("ld_mode", "locations"); + + return data; + } + + + /* This is a copy of super.super.onRecordClick. Straighten out + this weird family. */ + /** + * Callback when an item from the input helper was clicked. + * Set the respective km-value in the location value field. + * @param e event passed. + */ + @Override + public void onCellClick (CellClickEvent e) { + Record record = e.getRecord(); + double[] selected = new double[1]; + try { + selected[0] = + Double.parseDouble(record.getAttribute("from")); + } + catch(NumberFormatException nfe) { + // Is there anything else to do here? + } + setLocationValues(selected); + } + + + @Override + protected String getLabelString() { + return MSG.single_location(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/StaticDataPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/StaticDataPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,68 @@ +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.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DataList; + + +/** + * This UIProvider displays the old DataItems of GaugeDischargeCurveArtifact + * + * @author Björn Ricks + */ +public class StaticDataPanel +extends AbstractUIProvider +{ + private static final long serialVersionUID = 7411866539525588336L; + + /** The message class that provides i18n strings.*/ + protected FLYSConstants messages = GWT.create(FLYSConstants.class); + + /** The combobox.*/ + protected DynamicForm form; + + @Override + public Canvas create(DataList data) { + VLayout layout = new VLayout(); + return layout; + } + + @Override + public Canvas createOld(DataList dataList) { + VLayout vLayout = new VLayout(); + vLayout.setWidth("400px"); + + int size = dataList.size(); + for (int i = 0; i < size; i++) { + Data data = dataList.get(i); + DataItem[] items = data.getItems(); + + for (DataItem item: items) { + HLayout hLayout = new HLayout(); + + hLayout.addMember(new Label(item.getLabel())); + hLayout.addMember(new Label(item.getStringValue())); + + vLayout.addMember(hLayout); + vLayout.setWidth("130px"); + } + } + + return vLayout; + } + + @Override + protected Data[] getData() { + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/StyleEditorWindow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/StyleEditorWindow.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,700 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Window; +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.events.ItemChangedEvent; +import com.smartgwt.client.widgets.form.events.ItemChangedHandler; +import com.smartgwt.client.widgets.form.fields.CheckboxItem; +import com.smartgwt.client.widgets.form.fields.ColorPickerItem; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.SelectItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.form.validator.IsFloatValidator; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.CollectionItemAttributeService; +import org.dive4elements.river.client.client.services.CollectionItemAttributeServiceAsync; +import org.dive4elements.river.client.client.services.ThemeListingService; +import org.dive4elements.river.client.client.services.ThemeListingServiceAsync; +import org.dive4elements.river.client.client.utils.DoubleValidator; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItemAttribute; +import org.dive4elements.river.client.shared.model.FacetRecord; +import org.dive4elements.river.client.shared.model.Style; +import org.dive4elements.river.client.shared.model.StyleSetting; +import org.dive4elements.river.client.shared.model.Theme; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +/** + * Editor window for styles. + * @author Raimund Renkert + */ +public class StyleEditorWindow +extends Window +implements ClickHandler +{ + /** The interface that provides i18n messages. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** The collection. */ + protected Collection collection; + + /** The parent ThemePanel. */ + protected ThemePanel panel; + + /** The attributes. */ + protected CollectionItemAttribute attributes; + + /** The selected facet. */ + protected FacetRecord facet; + + /** Main layout. */ + protected VLayout layout; + + /** The form that contains all the input widgets. */ + protected DynamicForm df; + + protected VLayout properties; + + protected Canvas container; + + protected Map styleGroups; + + protected Style current; + + protected SelectItem styleChooser; + + /** The service used to set collection item attributes. */ + protected CollectionItemAttributeServiceAsync itemAttributeService = + GWT.create(CollectionItemAttributeService.class); + + /** The service used to request a list of themes. */ + protected ThemeListingServiceAsync themeListingService = + GWT.create(ThemeListingService.class); + + + /** + * Setup editor dialog. + * @param collection The collection the current theme belongs to. + * @param attributes The collection attributes. + * @param facet The selected facet. + */ + public StyleEditorWindow ( + Collection collection, + CollectionItemAttribute attributes, + FacetRecord facet) + { + this.collection = collection; + this.attributes = attributes; + this.facet = facet; + this.layout = new VLayout(); + this.properties = new VLayout(); + this.container = new Canvas(); + this.styleChooser = new SelectItem("style", "Style"); + + styleChooser.setTitleStyle("color:#000;"); + styleChooser.setTitleAlign(Alignment.LEFT); + styleChooser.setValue("aktuell"); + styleChooser.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent ce) { + String value = ce.getValue().toString(); + Style s = null; + if (value.equals("aktuell")) { + s = current; + } + else if (styleGroups.containsKey(value)) { + s = styleGroups.get(value); + } + + if (s != null) { + setNewStyle(s); + properties.removeMember(container); + container = createPropertyGrid(s); + properties.addMember(container); + } + } + }); + + DynamicForm f = new DynamicForm(); + f.setFields(styleChooser); + f.setColWidths("40%", "60%"); + + layout.addMember(f); + init(); + initPanels(); + } + + + /** + * Initialize the window and set the layout. + */ + protected void init() { + setTitle(MSG.properties()); + setCanDragReposition(true); + setCanDragResize(true); + layout.setMargin(10); + + layout.setWidth100(); + layout.setHeight100(); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + Theme theme = facet.getTheme(); + Style style = attributes.getStyle(theme.getFacet(), theme.getIndex()); + if(style == null) { + GWT.log("StyleEditorWindow.init(): style == null"); + return; + } + String name = style.getName(); + this.current = style; + + themeListingService.list( + locale, + name, + new AsyncCallback >() { + @Override + public void onFailure(Throwable caught) { + GWT.log("No listloaded."); + } + @Override + public void onSuccess(Map list) { + GWT.log("Successfully loaded list."); + + styleGroups = list; + Set keys = list.keySet(); + LinkedHashMap valueMap = + new LinkedHashMap(); + valueMap.put("aktuell", "Aktuell"); + Iterator iter = keys.iterator(); + while (iter.hasNext()) { + String s = iter.next().toString(); + Style tmp = styleGroups.get(s); + tmp.setFacet(current.getFacet()); + tmp.setIndex(current.getIndex()); + valueMap.put(s, s); + } + styleChooser.setValueMap(valueMap); + } + }); + } + + + /** + * Initialize the static window content like buttons and main layout. + */ + protected void initPanels() { + HLayout buttons = new HLayout(); + Button accept = new Button(MSG.label_ok()); + Button cancel = new Button(MSG.label_cancel()); + cancel.addClickHandler(this); + accept.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + // TODO Fix this, for whatever reason it doesnt work + // (always valid). + if (df == null) { + return; + } + if (!df.hasErrors() && df.validate()) { + saveStyle(); + } + } + }); + + buttons.addMember(accept); + buttons.addMember(cancel); + buttons.setAlign(Alignment.CENTER); + buttons.setHeight(30); + + Theme theme = facet.getTheme(); + Style style = attributes.getStyle(theme.getFacet(), theme.getIndex()); + + container = createPropertyGrid(style); + properties.addMember(container); + layout.addMember(properties); + layout.addMember(buttons); + addItem(layout); + setWidth(400); + setHeight(410); + } + + + /** + * Setter for the parent panel. + * @param panel The panel. + */ + public void setThemePanel (ThemePanel panel) { + this.panel = panel; + } + + + /** + * this method is called when the user aborts theming. + * @param event The event. + */ + @Override + public void onClick(ClickEvent event) { + this.hide(); + } + + + /** + * This method creates the property grid for available styling attributes. + * @return The layout containing the UI elements. + */ + protected VLayout createPropertyGrid(Style style) { + VLayout vl = new VLayout(); + + StaticTextItem name = new StaticTextItem("name", "Name"); + name.setValue(facet.getName()); + name.setTitleStyle("color:#000;"); + name.setTitleAlign(Alignment.LEFT); + name.setDisabled(true); + name.setShowDisabled(false); + + DynamicForm form = new DynamicForm(); + form.setFields(name); + form.setColWidths("40%", "60%"); + + + vl.addMember(form); + + if (style == null) { + SC.warn("No style found."); + return vl; + } + + // Done via array to keep the order. + String[] sets = {"showlines", + "showpoints", + "linetype", + "linesize", + "linecolor", + "font", + "textstyle", + "textsize", + "pointcolor", + "pointsize", + "showpointlabel", + "textcolor", + "backgroundcolor", + "showbackground", + "showlinelabel", + "labelfontface", + "labelfontcolor", + "labelfontsize", + "labelfontstyle", + "textorientation", + "labelshowbg", + "labelbgcolor", + "bandwidth", + "bandwidthcolor", + "transparency", + "showminimum", + "showmaximum"}; + + for (String settingName: sets) { + StyleSetting set = style.getSetting(settingName); + + if (set == null || set.isHidden()) { + continue; + } + + DynamicForm property = createPropertyUI( + set.getDisplayName(), + set.getName(), + set.getType(), + set.getDefaultValue()); + if (property != null) { + vl.addMember(property); + } + } + + // Add settings not in whitelist above. + for (StyleSetting set: style.getSettings()) { + + if (Arrays.asList(sets).contains(set.getName()) || + set == null || + set.isHidden() + ) { + continue; + } + + DynamicForm property = createPropertyUI( + set.getDisplayName(), + set.getName(), + set.getType(), + set.getDefaultValue()); + if (property != null) { + vl.addMember(property); + } + } + + return vl; + } + + + /** + * Create a property form. + * @param dname The display name. + * @param name The property name. + * @param type The property type. + * @param value The current value. + * + * @return The dynamic form for the attribute property. + */ + protected DynamicForm createPropertyUI( + String dname, + String name, + String type, + String value) + { + df = new DynamicForm(); + df.setColWidths("40%", "60%"); + + FormItem f; + if(type.equals("int")) { + f = new SelectItem(name, MSG.getString(name)); + if (name.equals("linesize")) { + f = createLineSizeUI(f); + f.setValue(value); + } + else if (name.equals("labelfontsize")) { + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("3", "3"); + valueMap.put("5", "5"); + valueMap.put("8", "8"); + valueMap.put("10", "10"); + valueMap.put("12", "12"); + valueMap.put("14", "14"); + valueMap.put("18", "18"); + valueMap.put("24", "24"); + f.setValueMap(valueMap); + f.setValue(value); + } + else if (name.equals("bandwidth")) { + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("0", "0"); + valueMap.put("1", "1"); + valueMap.put("2", "2"); + valueMap.put("3", "3"); + valueMap.put("4", "4"); + valueMap.put("5", "5"); + valueMap.put("6", "6"); + valueMap.put("7", "7"); + valueMap.put("8", "8"); + valueMap.put("9", "9"); + valueMap.put("10", "10"); + valueMap.put("11", "11"); + f.setValueMap(valueMap); + f.setValue(value); + } + else if (name.equals("pointsize")) { + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("1", "1"); + valueMap.put("2", "2"); + valueMap.put("3", "3"); + valueMap.put("4", "4"); + valueMap.put("5", "5"); + valueMap.put("6", "6"); + valueMap.put("7", "7"); + f.setValueMap(valueMap); + f.setValue(value); + } + else if (name.equals("numclasses")) { + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("5", "5"); + valueMap.put("6", "6"); + valueMap.put("7", "7"); + valueMap.put("8", "8"); + valueMap.put("9", "9"); + valueMap.put("10", "10"); + valueMap.put("12", "12"); + valueMap.put("14", "14"); + valueMap.put("16", "16"); + valueMap.put("18", "18"); + valueMap.put("20", "20"); + f.setValueMap(valueMap); + f.setValue(value); + // FIXME: Make that work again + return null; + } + else if (name.contains("transparency")) { + LinkedHashMap valueMap = new LinkedHashMap(); + for (int n = 10; n < 100; n += 10) { + valueMap.put(Integer.toString(n), n + "%"); + } + f.setValueMap(valueMap); + f.setValue(value); + } + } + else if (type.equals("boolean")) { + if(name.equals("textorientation")) { + f = new SelectItem(name, MSG.getString(name)); + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("true", MSG.getString("horizontal")); + valueMap.put("false", MSG.getString("vertical")); + f.setValueMap(valueMap); + f.setValue(value); + } + else { + CheckboxItem c = new CheckboxItem(name, MSG.getString(name)); + if(value.equals("true")) { + c.setValue(true); + } + else { + c.setValue(false); + } + c.setLabelAsTitle(true); + f = c; + } + } + else if (type.equals("Color")) { + ColorPickerItem c = new ColorPickerItem(name, MSG.getString(name)); + c.setValue(rgbToHtml(value)); + f = c; + } + else if (type.equals("double")) { + f = new FormItem(name); + IsFloatValidator fpv = new IsFloatValidator(); + + f.setValidators(fpv); + f.setValidateOnChange(true); + f.setTitle(MSG.getString(name)); + f.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + DoubleValidator validator = new DoubleValidator(); + Map errors = e.getForm().getErrors(); + if(validator.validate(e.getItem(), errors)) { + e.getForm().setErrors(errors, true); + } + else { + e.getForm().setErrors(errors, true); + } + } + }); + f.setValue(value); + } + else if (type.equals("Dash")) { + f = new SelectItem(name, MSG.getString(name)); + LinkedHashMap valueIcons = new LinkedHashMap(); + f.setImageURLPrefix(GWT.getHostPageBaseURL() + "images/linestyle-dash-"); + f.setImageURLSuffix(".png"); + f.setValueIconHeight(20); + f.setValueIconWidth(80); + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("10", ""); + valueMap.put("10,5", ""); + valueMap.put("20,10", ""); + valueMap.put("30,10", ""); + valueMap.put("20,5,15,5", ""); + valueIcons.put("10", "10"); + valueIcons.put("10,5", "10-5"); + valueIcons.put("20,10", "20-10"); + valueIcons.put("30,10", "30-10"); + valueIcons.put("20,5,15,5", "20-5-15-5"); + f.setValueIcons(valueIcons); + f.setValueMap(valueMap); + f.setValue(value); + } + else if (type.equals("Font")) { + f = new SelectItem(name, MSG.getString(name)); + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("arial", "Arial"); + valueMap.put("courier", "Courier"); + valueMap.put("verdana", "Verdana"); + valueMap.put("times", "Times"); + f.setValueMap(valueMap); + f.setValue(value); + } + else if (type.equals("Style")) { + f = new SelectItem(name, MSG.getString(name)); + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("standard", "Normal"); + valueMap.put("bold", "Bold"); + valueMap.put("italic", "Italic"); + f.setValueMap(valueMap); + f.setValue(value); + } + else if (type.equals("Symbol")) { + //create an empty element as long as this property can not be + //changed. + f = new StaticTextItem(""); + } + else { + f = new FormItem(); + } + f.setTitleStyle("color:#000;"); + f.setTitleAlign(Alignment.LEFT); + df.setFields(f); + df.addItemChangedHandler(new ItemChangedHandler() { + @Override + public void onItemChanged(ItemChangedEvent e) { + String name = e.getItem().getName(); + String newValue = e.getNewValue().toString(); + setNewValue(name, newValue); + } + }); + + return df; + } + + + protected FormItem createLineSizeUI(FormItem f) { + LinkedHashMap valueIcons = new LinkedHashMap(); + f.setImageURLPrefix(GWT.getHostPageBaseURL() + "images/linestyle-"); + f.setImageURLSuffix("px.png"); + f.setValueIconHeight(20); + f.setValueIconWidth(80); + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("1", ""); + valueMap.put("2", ""); + valueMap.put("3", ""); + valueMap.put("4", ""); + valueMap.put("5", ""); + valueMap.put("6", ""); + valueMap.put("7", ""); + valueMap.put("8", ""); + valueIcons.put("1", "1"); + valueIcons.put("2", "2"); + valueIcons.put("3", "3"); + valueIcons.put("4", "4"); + valueIcons.put("5", "5"); + valueIcons.put("6", "6"); + valueIcons.put("7", "7"); + valueIcons.put("8", "8"); + f.setValueIcons(valueIcons); + f.setValueMap(valueMap); + return f; + } + + + /** + * Static method to convert a color from RGB to HTML notation. + * @param rgb String in RGB notation. + * + * @return String in HTML notation. + */ + protected static String rgbToHtml(String rgb) { + String[] parts = rgb.split(","); + int values[] = new int[parts.length]; + for (int i = 0; i < parts.length; i++) { + parts[i] = parts[i].trim(); + try { + values[i] = Integer.parseInt(parts[i]); + } + catch(NumberFormatException nfe) { + return "#000000"; + } + } + String hex = "#"; + for (int i = 0; i < values.length; i++) { + if (values[i] < 16) { + hex += "0"; + } + hex += Integer.toHexString(values[i]); + } + return hex; + } + + + /** + * Static method to convert a color from HTML to RGB notation. + * @param html String in HTML notation. + * + * @return String in RGB notation. + */ + protected static String htmlToRgb(String html) { + if (!html.startsWith("#")) { + return "0, 0, 0"; + } + + int r = Integer.valueOf(html.substring(1, 3), 16); + int g = Integer.valueOf(html.substring(3, 5), 16); + int b = Integer.valueOf(html.substring(5, 7), 16); + + return r + ", " + g + ", " + b; + } + + + /** + * Saves the current style attributes and requests a redraw. + */ + protected void saveStyle () { + GWT.log("StyleEditorWindow.saveStyle()"); + Config config = Config.getInstance(); + String locale = config.getLocale(); + + itemAttributeService.setCollectionItemAttribute( + this.collection, + attributes.getArtifact(), + locale, + attributes, + new AsyncCallback() { + @Override + public void onFailure (Throwable caught) { + GWT.log("Could not set Collection item attributes."); + } + @Override + public void onSuccess(Void v) { + GWT.log("Successfully saved collection item attributes."); + panel.requestRedraw(); + } + }); + + + this.hide(); + } + + + /** + * Sets a new value for an attribute. + * @param name Attribute name. + * @param value The new value. + */ + protected final void setNewValue(String name, String value) { + Theme t = facet.getTheme(); + Style s = attributes.getStyle(t.getFacet(), t.getIndex()); + StyleSetting set = s.getSetting(name); + String type = set.getType(); + + if(name.indexOf("color") != -1 + || (type != null && type.toLowerCase().indexOf("color") > -1)) { + value = htmlToRgb(value); + } + set.setDefaultValue(value); + } + + + protected final void setNewStyle(Style style) { + Theme t = facet.getTheme(); + Style s = attributes.getStyle(t.getFacet(), t.getIndex()); + attributes.removeStyle(s.getName()); + attributes.appendStyle(style); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TableDataPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TableDataPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,166 @@ +package org.dive4elements.river.client.client.ui; + +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.types.ListGridFieldType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +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.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.CSVExportService; +import org.dive4elements.river.client.client.services.CSVExportServiceAsync; +import org.dive4elements.river.client.shared.model.DataList; + +import java.util.List; + +/** + * This UIProvider creates a widget that displays calculated data in a table. + * + * @author Raimund Renkert + */ +public class TableDataPanel +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected CSVExportServiceAsync exportService = + GWT.create(CSVExportService.class); + + /** A container that will contain the location or the distance panel. */ + protected VLayout container; + + /** The export type. */ + protected String name; + + /** The UUID of the collection. */ + protected String uuid; + + /** The table. */ + protected ListGrid dataTable; + + + /** + * Creates a new LocationDistancePanel instance. + */ + public TableDataPanel() { + container = new VLayout(); + dataTable = new ListGrid(); + name = ""; + } + + + /** + * This method creates a widget that contains a table. + * + * @return a panel. + */ + public Canvas create() { + Config config = Config.getInstance(); + String locale = config.getLocale (); + dataTable.setEmptyMessage(MESSAGES.empty_table()); + dataTable.setShowHeaderContextMenu(false); + dataTable.setCanDragSelectText(true); + + exportService.getCSV(locale, uuid, name, + new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not recieve csv."); + SC.warn(caught.getMessage()); + } + + @Override + public void onSuccess(List l) { + GWT.log("Recieved csv with " + l.size() + " lines."); + setData(l); + } + } + ); + + container.addMember(dataTable); + + return container; + } + + + public void setName(String name) { + this.name = name; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + + public Canvas createOld(DataList dataList) { + return null; + } + + + protected Canvas createWidget(DataList data) { + return null; + } + + + /** + * This method sets the data to a dynamic table. + * + * @param list List if String[] containing the data. + */ + public void setData(List list) { + if (list == null || list.size() < 2) { + dataTable.setEmptyMessage(MESSAGES.error_no_calc_result()); + dataTable.redraw(); + return; + } + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + NumberFormat nf; + if (locale.equals("de")) { + nf = NumberFormat.getFormat("#,##"); + } + else { + nf = NumberFormat.getFormat("#.##"); + } + + String[] header = list.get(0); + String[] firstValues = list.get(1); + + ListGridField[] fields = new ListGridField[header.length]; + + for(int i = 0; i < header.length; i++) { + ListGridField f = new ListGridField(String.valueOf(i)); + fields[i] = f; + f.setTitle(header[i]); + + try { + nf.parse(firstValues[i]); + f.setType(ListGridFieldType.FLOAT); + } + catch (NumberFormatException nfe) { + f.setType(ListGridFieldType.TEXT); + } + } + + dataTable.setFields(fields); + + for(int i = 1; i < list.size(); i++) { + String[] sItem = list.get(i); + ListGridRecord r = new ListGridRecord(); + for(int j = 0; j < sItem.length; j++) { + r.setAttribute(String.valueOf(j), sItem[j]); + } + dataTable.addData(r); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TableFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TableFilter.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,99 @@ +package org.dive4elements.river.client.client.ui; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.form.fields.events.KeyUpEvent; +import com.smartgwt.client.widgets.form.fields.events.KeyUpHandler; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.dive4elements.river.client.client.event.FilterHandler; +import org.dive4elements.river.client.client.event.StringFilterEvent; +import org.dive4elements.river.client.client.FLYSConstants; + + +/** + * @author Ingo Weinzierl + */ +public class TableFilter +extends HLayout +implements ChangedHandler, KeyUpHandler +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected List handlers; + + protected TextItem searchfield; + + + public TableFilter() { + super(); + searchfield = new TextItem(MESSAGES.search()); + handlers = new ArrayList(); + + searchfield.addChangedHandler(this); + searchfield.addKeyUpHandler(this); + searchfield.setWidth(120); + + DynamicForm form = new DynamicForm(); + form.setFields(searchfield); + + addMember(form); + } + + + public void onChanged(ChangedEvent event) { + // This event handler is to slow... +// fireFilterCriteriaChanged(getSearchString()); + } + + + public void onKeyUp(KeyUpEvent event) { + //To deactivate "As you type" filter add + // ' && event.getKeyName().equals("Enter")' + // to the if-clause. + if (event != null) { + fireFilterCriteriaChanged(getSearchString()); + } + } + + + public String getSearchString() { + if (searchfield.getValueAsString() == null) { + return ""; + } + else { + return searchfield.getValueAsString(); + } + } + + + public void addFilterHandler(FilterHandler handler) { + if (handler != null) { + handlers.add(handler); + } + } + + + protected void fireFilterCriteriaChanged(String searchstring) { + StringFilterEvent filter = new StringFilterEvent(searchstring); + + for (FilterHandler handler: handlers) { + handler.onFilterCriteriaChanged(filter); + } + } + + + public void clear() { + searchfield.clearValue(); + fireFilterCriteriaChanged(""); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TextProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TextProvider.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,198 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.data.DataSource; +import com.smartgwt.client.data.DataSourceField; +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.FieldType; +import com.smartgwt.client.types.TitleOrientation; +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.events.ItemChangedEvent; +import com.smartgwt.client.widgets.form.events.ItemChangedHandler; +import com.smartgwt.client.widgets.form.validator.Validator; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +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 java.util.ArrayList; +import java.util.List; + + +/** + * @author Ingo Weinzierl + */ +public class TextProvider +extends AbstractUIProvider +implements ItemChangedHandler +{ + private static final long serialVersionUID = -6868303464989138497L; + + public static final String FIELD_NAME = "textprovider_inputfield"; + public static final int FORM_WIDTH = 400; + public static final int TITLE_WIDTH = 75; + + + protected static FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected DynamicForm form; + + + @Override + public Canvas create(DataList dataList) { + Canvas form = createForm(); + + initDefaultValues(dataList); + + return form; + } + + + protected Canvas createForm() { + return createForm(null); + } + + + protected Canvas createForm(String title) { + form = new DynamicForm(); + form.addItemChangedHandler(this); + form.setTitlePrefix(""); + form.setTitleSuffix(": "); + form.setTitleAlign(Alignment.LEFT); + form.setTitleOrientation(TitleOrientation.LEFT); + form.setTitleWidth(getTitleWidth()); + form.setWidth(getFormWidth()); + + DataSourceField item = createField(); + item.setTitle(title); + + Validator validator = getValidator(); + if (validator != null) { + item.setValidators(validator); + } + + DataSource source = new DataSource(); + source.setFields(item); + + form.setDataSource(source); + + return form; + } + + + protected void initDefaultValues(DataList dataList) { + Data data = dataList.get(0); + DataItem item = data.getDefault(); + + String value = item.getStringValue(); + + form.setValue(getFieldName(), value); + } + + + protected DataSourceField createField() { + return new DataSourceField(getFieldName(), getFieldType()); + } + + + /** + * Get field name. + * @return fields name (developer-centric). + */ + protected String getFieldName() { + return FIELD_NAME; + } + + + /** + * Get field type. + * @return fields type. + */ + protected FieldType getFieldType() { + return FieldType.TEXT; + } + + + protected Validator getValidator() { + return null; + } + + + protected int getFormWidth() { + return FORM_WIDTH; + } + + + protected int getTitleWidth() { + return TITLE_WIDTH; + } + + + /** @return null. */ + protected String getDataName() { + return null; + } + + + protected String getValueAsString() { + return (String) form.getValue(getFieldName()); + } + + + @Override + public Canvas createOld(DataList dataList) { + Data data = dataList.get(0); + DataItem[] items = data.getItems(); + + HLayout layout = new HLayout(); + Label label = new Label(dataList.getLabel()); + Label value = new Label(items[0].getLabel()); + + layout.setHeight(35); + layout.setWidth(400); + label.setWidth(200); + + layout.addMember(label); + layout.addMember(value); + layout.addMember(getBackButton(dataList.getState())); + + return layout; + } + + + @Override + public List validate() { + List errors = new ArrayList(); + + if (!form.validate()) { + errors.add(MSG.wrongFormat()); + } + + return errors; + } + + + @Override + protected Data[] getData() { + String value = getValueAsString(); + String name = getDataName(); + + DataItem item = new DefaultDataItem(name, name, value); + return new Data[] { new DefaultData( + name, null, null, new DataItem[] { item }) }; + } + + + @Override + public void onItemChanged(ItemChangedEvent event) { + form.validate(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ThemeNavigationPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ThemeNavigationPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,120 @@ +package org.dive4elements.river.client.client.ui; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.ImgButton; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.OnMoveEvent; +import org.dive4elements.river.client.client.event.OnMoveHandler; + + +/** + * @author Ingo Weinzierl + */ +public class ThemeNavigationPanel extends Canvas { + + public static final int PANEL_MARGIN = 5; + public static final int BUTTON_HEIGHT = 20; + public static final int BUTTON_MARGIN = 5; + private static final int BOTTON_WIDTH = 20; + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected List handlers; + + + public ThemeNavigationPanel() { + this.handlers = new ArrayList(); + + setWidth100(); + setHeight(BUTTON_HEIGHT); + setMargin(PANEL_MARGIN); + + HLayout layout = new HLayout(); + layout.setWidth100(); + layout.setHeight(BUTTON_HEIGHT); + layout.setMembersMargin(BUTTON_MARGIN); + layout.setDefaultLayoutAlign(VerticalAlignment.CENTER); + layout.setDefaultLayoutAlign(Alignment.CENTER); + + Canvas cu = createButton(MSG.theme_top(), OnMoveEvent.TOP); + Canvas u = createButton(MSG.theme_up(), OnMoveEvent.UP); + Canvas d = createButton(MSG.theme_down(), OnMoveEvent.DOWN); + Canvas cd = createButton(MSG.theme_bottom(), OnMoveEvent.BOTTOM); + + HLayout left = new HLayout(); + left.setMembersMargin(BUTTON_MARGIN); + left.setLayoutAlign(Alignment.LEFT); + left.setDefaultLayoutAlign(Alignment.LEFT); + left.setAlign(Alignment.LEFT); + left.addMember(cu); + left.addMember(u); + + HLayout right = new HLayout(); + right.setMembersMargin(BUTTON_MARGIN); + right.setLayoutAlign(Alignment.RIGHT); + right.setDefaultLayoutAlign(Alignment.RIGHT); + right.setAlign(Alignment.RIGHT); + right.addMember(d); + right.addMember(cd); + + layout.addMember(left); + layout.addMember(right); + + addChild(layout); + } + + + protected Canvas createButton(final String title, final int moveType) { + String url = GWT.getHostPageBaseURL() + title; + + ImgButton b = new ImgButton(); + b.setSrc(url); + b.setWidth(BOTTON_WIDTH); + b.setHeight(BUTTON_HEIGHT); + b.setIconHeight(BUTTON_HEIGHT); + b.setIconWidth(BOTTON_WIDTH); + b.setShowDown(false); + b.setShowRollOver(false); + b.setShowDisabled(false); + b.setShowDisabledIcon(true); + b.setShowDownIcon(false); + b.setShowFocusedIcon(false); + b.setValign(VerticalAlignment.CENTER); + + b.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + fireOnMoveEvent(moveType); + } + }); + + return b; + } + + + protected void addOnMoveHandler(OnMoveHandler handler) { + if (handler != null) { + handlers.add(handler); + } + } + + + protected void fireOnMoveEvent(int type) { + OnMoveEvent event = new OnMoveEvent(type); + + for (OnMoveHandler handler: handlers) { + handler.onMove(event); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ThemePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ThemePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,671 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.util.BooleanCallback; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.grid.events.EditCompleteEvent; +import com.smartgwt.client.widgets.grid.events.EditCompleteHandler; +import com.smartgwt.client.widgets.grid.events.RowContextClickEvent; +import com.smartgwt.client.widgets.grid.events.RowContextClickHandler; +import com.smartgwt.client.widgets.menu.Menu; +import com.smartgwt.client.widgets.menu.MenuItem; +import com.smartgwt.client.widgets.menu.events.ClickHandler; +import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.HasOutputParameterChangeHandlers; +import org.dive4elements.river.client.client.event.HasRedrawRequestHandlers; +import org.dive4elements.river.client.client.event.OnMoveEvent; +import org.dive4elements.river.client.client.event.OnMoveHandler; +import org.dive4elements.river.client.client.event.OutputParameterChangeEvent; +import org.dive4elements.river.client.client.event.OutputParameterChangeHandler; +import org.dive4elements.river.client.client.event.RedrawRequestEvent; +import org.dive4elements.river.client.client.event.RedrawRequestEvent.Type; +import org.dive4elements.river.client.client.event.RedrawRequestHandler; +import org.dive4elements.river.client.client.services.CollectionAttributeService; +import org.dive4elements.river.client.client.services.CollectionAttributeServiceAsync; +import org.dive4elements.river.client.client.services.CollectionItemAttributeService; +import org.dive4elements.river.client.client.services.CollectionItemAttributeServiceAsync; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItemAttribute; +import org.dive4elements.river.client.shared.model.FacetRecord; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.Theme; +import org.dive4elements.river.client.shared.model.ThemeList; + +import java.util.ArrayList; +import java.util.List; + +/** + * ThemePanel on the left in CollectionView. + * Contains control widgets for "themes", which are plotted in a diagram (chart). + * + * @author Ingo Weinzierl + */ +public abstract class ThemePanel +extends Canvas +implements OnMoveHandler, + EditCompleteHandler, + HasOutputParameterChangeHandlers, + HasRedrawRequestHandlers +{ + protected CollectionAttributeServiceAsync updater = + GWT.create(CollectionAttributeService.class); + + /** The service used to get collection item attributes. */ + protected CollectionItemAttributeServiceAsync itemAttributeService = + GWT.create(CollectionItemAttributeService.class); + + /** i18ner. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** List of OutParameterChangedHandler. */ + protected List outHandlers; + + /** List of ChartShallRedrawHandler. */ + protected List redrawRequestHandlers; + + protected OutputMode mode; + + protected ThemeNavigationPanel navigation; + protected ListGrid list; + + /** The collection view*/ + protected CollectionView view; + + /** + * Setup Grid, navigation bar. + * @param collection Collection for which to show themes. + */ + public ThemePanel( + OutputMode mode, + CollectionView view + ) { + this.mode = mode; + this.list = createGrid(); + this.view = view; + list.addRowContextClickHandler(new RowContextClickHandler() { + @Override + public void onRowContextClick(RowContextClickEvent event) { + ListGridRecord[] records = list.getSelectedRecords(); + + Menu menu = null; + + if (records == null || records.length == 0) { + return; + } + else if (records.length == 1) { + menu = getSingleContextMenu(records); + } + else if (records.length > 1) { + menu = getMultiContextMenu(records); + } + + if (menu != null) { + list.setContextMenu(menu); + menu.showContextMenu(); + + event.cancel(); + } + } + }); + + this.redrawRequestHandlers = new ArrayList(); + this.outHandlers = new ArrayList(); + this.navigation = new ThemeNavigationPanel(); + this.navigation.addOnMoveHandler(this); + + this.setShowResizeBar(true); + } + + + public abstract void activateTheme(Theme theme, boolean active); + + + /** + * Replace the current collection with a new one. NOTE: this operation + * triggers updateGrid() which modifies the themes in the grid. + * + * @param collection The new collection object. + */ + protected void setCollection(Collection collection) { + // Set collection of view, but do not trigger event shooting. + this.view.setCollection(collection, true); + + updateGrid(); + } + + + /** Get Collection. */ + public Collection getCollection() { + return view.getCollection(); + } + + + /** + * Returns the ThemeList of the current collection and output mode. + * + * @return the current ThemeList. + */ + public ThemeList getThemeList() { + return getCollection().getThemeList(mode.getName()); + } + + public ListGridRecord[] getSelectedRecords() { + return list.getSelectedRecords(); + } + + /** + * Registers a new OutputParameterChangeHandler. + * + * @param h The new handler. + */ + @Override + public void addOutputParameterChangeHandler(OutputParameterChangeHandler h){ + if (h != null) { + outHandlers.add(h); + } + } + + + /** + * Registers a RedrawRequestHandler. + * + * @param h The new handler. + */ + @Override + public void addRedrawRequestHandler(RedrawRequestHandler h){ + if (h != null) { + redrawRequestHandlers.add(h); + } + } + + + /** + * Request a redraw of e.g. a Chart. + */ + final public void requestRedraw() { + for (RedrawRequestHandler handler: redrawRequestHandlers) { + handler.onRedrawRequest(new RedrawRequestEvent(Type.DEFAULT)); + } + } + + + /** + * Called when the attribution of an output changed. It informs the + * registered handlers about the changes. + */ + protected void fireOutputParameterChanged() { + OutputParameterChangeEvent evt = new OutputParameterChangeEvent(); + + for (OutputParameterChangeHandler handler: outHandlers) { + handler.onOutputParameterChanged(evt); + } + } + + + /** Registers the CollectionView associated to this ThemePanel. */ + public void setCollectionView(CollectionView view) { + this.view = view; + } + + + /** + * This method is used to clear the current theme grid and add new updated + * data. + */ + protected void updateGrid() { + GWT.log("ThemePanel.updateGrid"); + + ListGridRecord[] selected = list.getSelectedRecords(); + + clearGrid(); + + ThemeList themeList = getThemeList(); + + if (themeList == null) { + GWT.log("ERROR: No theme list."); + return; + } + + int count = themeList.getThemeCount(); + + for (int i = 1; i <= count; i++) { + Theme theme = themeList.getThemeAt(i); + + if (theme == null) { + continue; + } + + if (theme.getFacet().equals("empty.facet")) { + theme.setVisible(0); + } + + if (theme.getVisible() == 0) { + continue; + } + + FacetRecord newRecord = createRecord(theme); + addFacetRecord(newRecord); + + String newArtifact = theme.getArtifact(); + String newFacet = theme.getFacet(); + int newIndex = theme.getIndex(); + + for (ListGridRecord r: selected) { + FacetRecord sel = (FacetRecord) r; + Theme oldTheme = sel.getTheme(); + + if (oldTheme.getArtifact().equals(newArtifact) + && oldTheme.getFacet().equals(newFacet) + && oldTheme.getIndex() == newIndex) { + list.selectRecord(newRecord); + } + } + } + + fireOutputParameterChanged(); + } + + + /** Adds given Record to the list (table). */ + protected void addFacetRecord(FacetRecord rec) { + list.addData(rec); + } + + + /** Create a FacetRecord that wraps given theme. */ + protected FacetRecord createRecord(Theme theme) { + return new FacetRecord(theme); + } + + + /** + * This method triggers the CollectionAttributeService. Based on the current + * collectin settings, the attribute of the collection is modified or not. + * But in every case, we will get a new collection object - which might be + * the same as the current one. + */ + public void updateCollection() { + final Config config = Config.getInstance(); + final String loc = config.getLocale(); + + GWT.log("ThemePanel.updateCollection via RPC now"); + + // Don't forget to enable the panel after the request has finished! + disable(); + + updater.update(getCollection(), loc, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not update collection attributes."); + SC.warn(MSG.getString(caught.getMessage())); + + enable(); + } + + + @Override + public void onSuccess(Collection collection) { + setCollection(collection); + + enable(); + } + }); + } + + + /** + * Create and configure the Grid to display. + */ + protected ListGrid createGrid() { + ListGrid grid = createNewGrid(); + grid.setLeaveScrollbarGap(false); + + return grid; + } + + + protected ListGrid createNewGrid() { + return new ListGrid(); + } + + + /** + * A method that removes all records from theme grid. + */ + protected void clearGrid() { + ListGridRecord[] records = list.getRecords(); + + if (records == null || records.length == 0) { + return; + } + + for (ListGridRecord record: records) { + list.removeData(record); + } + } + + /** Return 'separator'- menu-item. */ + protected MenuItem createSeparator() { + MenuItem separator = new MenuItem(); + separator.setIsSeparator(true); + return separator; + } + + + /** + * Get the context menu for a (right mouse button)click on a single item. + */ + protected Menu getSingleContextMenu(final ListGridRecord[] records) { + Menu menu = new Menu(); + + menu.addItem(createActivateItem(records)); + menu.addItem(createDeactivateItem(records)); + menu.addItem(createRemoveItem(records)); + menu.addItem(createSeparator()); + menu.addItem(createPropertiesItem(records)); + + return menu; + } + + + protected Menu getMultiContextMenu(final ListGridRecord[] records) { + Menu menu = new Menu(); + + menu.addItem(createActivateItem(records)); + menu.addItem(createDeactivateItem(records)); + menu.addItem(createRemoveItem(records)); + + return menu; + } + + + /** The properties menu item (opens style editor on click). */ + protected MenuItem createPropertiesItem(final ListGridRecord[] records) { + MenuItem properties = new MenuItem(MSG.properties()); + + properties.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + GWT.log("clicked properties"); + for (ListGridRecord record: records) { + openStyleEditor((FacetRecord) record); + } + } + }); + + return properties; + } + + + protected MenuItem createActivateItem(final ListGridRecord[] records) { + MenuItem activate = new MenuItem(MSG.activateTheme()); + + activate.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + for (ListGridRecord record: records) { + FacetRecord facet = (FacetRecord) record; + activateTheme(facet.getTheme(), true); + } + + updateCollection(); + } + }); + + return activate; + } + + + protected MenuItem createDeactivateItem(final ListGridRecord[] records) { + MenuItem deactivate = new MenuItem(MSG.deactivateTheme()); + + deactivate.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + for (ListGridRecord record: records) { + FacetRecord facet = (FacetRecord) record; + activateTheme(facet.getTheme(), false); + } + + updateCollection(); + } + }); + + return deactivate; + } + + + /** Remove given themes (not asking for confirmation). */ + protected void removeThemes(final ListGridRecord[] records) { + for (ListGridRecord record: records) { + FacetRecord facet = (FacetRecord) record; + Theme theme = facet.getTheme(); + theme.setVisible(0); + theme.setActive(0); + updateCollection(); + } + } + + + /** Create menu item for removing theme(s). Will ask for confirmation. */ + protected MenuItem createRemoveItem(final ListGridRecord[] records) { + MenuItem remove = new MenuItem(MSG.removeTheme()); + + remove.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + SC.ask(MSG.askThemeRemove(), new BooleanCallback() { + @Override + public void execute(Boolean value) { + if (value) { + removeThemes(records); + } + } + }); + } + }); + + return remove; + } + + + /** + * This method is called after a cell in the theme grid has been modified. + * + * @param event The event that stores information about the modified record. + */ + @Override + public void onEditComplete(EditCompleteEvent event) { + GWT.log("Edited record."); + + int row = event.getRowNum(); + FacetRecord rec = (FacetRecord) list.getRecord(row); + + Theme theme = rec.getTheme(); + + theme.setDescription(rec.getName()); + activateTheme(theme, rec.getActive()); + + updateCollection(); + } + + + /** + * This method should be defined in subclasses that wants to listen to this + * event. + * + * @param theme The theme that is moved. + * @param oldIdx The index of the theme before it was moved. + * @param newIdx The index of the theme after it was moved. + */ + protected void fireThemeMoved(Theme theme, int oldIdx, int newIdx) { + // Do nothing + } + + + @Override + public void onMove(OnMoveEvent event) { + int type = event.getType(); + + GWT.log("ThemePanel.onMove: " + type); + + ListGridRecord[] records = list.getSelectedRecords(); + + if (records == null || records.length == 0) { + GWT.log("ThemePanel.onMove: No records selected."); + return; + } + + switch (type) { + case 0: moveRecordsTop(records); break; + case 1: moveRecordsUp(records); break; + case 2: moveRecordsDown(records); break; + case 3: moveRecordsBottom(records); break; + } + + updateCollection(); + } + + + /** + * Moves the selected grid records (themes) to the top of the grid. + * + * @param records The selected themes in the list. Null not permitted. + */ + protected void moveRecordsTop(ListGridRecord[] records) { + ThemeList themeList = getThemeList(); + + int idx = 1; + + for (ListGridRecord record: records) { + Theme theme = ((FacetRecord) record).getTheme(); + fireThemeMoved(theme, theme.getPosition(), idx); + themeList.setThemePosition(theme, idx++); + } + + updateGrid(); + } + + + /** + * Moves the selected grid records (themes) one step up. + * + * @param records The selected themes in the list. Null not permitted. + */ + protected void moveRecordsUp(ListGridRecord[] records) { + ThemeList themeList = getThemeList(); + + int[] newPos = new int[records.length]; + + for (int i = 0; i < records.length ; i++) { + Theme theme = ((FacetRecord) records[i]).getTheme(); + newPos[i] = theme.getPosition() - 1; + } + + for (int i = 0; i < records.length ; i++) { + Theme theme = ((FacetRecord) records[i]).getTheme(); + fireThemeMoved(theme, theme.getPosition(), newPos[i]); + themeList.setThemePosition(theme, newPos[i]); + } + + updateGrid(); + } + + + /** + * Moves the selected grid records (themes) one step down. + * + * @param records The selected themes in the list. Null not permitted. + */ + protected void moveRecordsDown(ListGridRecord[] records) { + ThemeList themeList = getThemeList(); + + int[] newPos = new int[records.length]; + + for (int i = records.length-1; i >= 0; i--) { + Theme theme = ((FacetRecord) records[i]).getTheme(); + newPos[i] = theme.getPosition()+1; + } + + for (int i = records.length-1; i >= 0; i--) { + Theme theme = ((FacetRecord) records[i]).getTheme(); + fireThemeMoved(theme, theme.getPosition(), newPos[i]); + themeList.setThemePosition(theme, newPos[i]); + } + + updateGrid(); + } + + + /** + * Moves the selected grid records (themes) to the bottom of the grid. + * + * @param records The selected themes in the list. Null not permitted. + */ + protected void moveRecordsBottom(ListGridRecord[] records) { + ThemeList themeList = getThemeList(); + + int idx = themeList.getThemeCount(); + + for (int i = records.length-1; i >= 0; i--) { + Theme theme = ((FacetRecord) records[i]).getTheme(); + fireThemeMoved(theme, theme.getPosition(), idx); + themeList.setThemePosition(theme, idx--); + } + + updateGrid(); + } + + + protected void openStyleEditor(final FacetRecord record) { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + String artifact = record.getTheme().getArtifact(); + + itemAttributeService.getCollectionItemAttribute( + this.getCollection(), + artifact, + locale, + new AsyncCallback() { + @Override + public void onFailure (Throwable caught) { + SC.warn(MSG.getString(caught.getMessage())); + } + @Override + public void onSuccess(CollectionItemAttribute cia) { + GWT.log("Successfully loaded collectionitem attributes."); + showStyleEditor(cia, record); + } + }); + } + + + protected void showStyleEditor( + CollectionItemAttribute cia, + FacetRecord record) + { + StyleEditorWindow win = new StyleEditorWindow( + getCollection(), + cia, + record); + win.setThemePanel(this); + win.centerInPage(); + win.show(); + } + + + /** Get OutputMode of this Panel. */ + public OutputMode getMode() { + return this.mode; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/Toolbar.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/Toolbar.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,61 @@ +package org.dive4elements.river.client.client.ui; + +import com.smartgwt.client.types.Overflow; +import com.smartgwt.client.widgets.events.CloseClickEvent; +import com.smartgwt.client.widgets.events.CloseClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.dive4elements.river.client.client.event.RedrawRequestHandler; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.User; + + +public abstract class Toolbar extends HLayout { + + protected OutputTab outputTab; + + + public Toolbar(OutputTab outputTab) { + super(); + + // Set overflow to hidden in order to prevent nasty scrollbars in IE + setOverflow(Overflow.HIDDEN); + + this.outputTab = outputTab; + } + + + public OutputTab getOutputTab() { + return outputTab; + } + + + public Artifact getArtifact() { + return outputTab.getCollectionView().getArtifact(); + } + + + public User getUser() { + return outputTab.getCollectionView().getUser(); + } + + + protected void openDatacageWindow(RedrawRequestHandler handler) { + Artifact artifact = getArtifact(); + User user = getUser(); + + String outs = getOutputTab().getOutputName(); + + final DatacageWindow dc = new DatacageWindow( + artifact, user, outs, outputTab.getCollectionView()); + dc.addRedrawRequestHandler(handler); + dc.addCloseClickHandler(new CloseClickHandler() { + @Override + public void onCloseClick(CloseClickEvent event) { + dc.destroy(); + } + }); + dc.show(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/UIProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/UIProvider.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,69 @@ +package org.dive4elements.river.client.client.ui; + +import java.io.Serializable; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; + +/** + * This interface describes a method that creates a Canvas element displaying + * DataItems for a current state of the artifact. + * + * @author Ingo Weinzierl + */ +public interface UIProvider extends Serializable { + + /** + * This method creates a Canvas element showing the DataItems in + * data. + * + * @param data The DataList object. + * + * @return the Canvas showing the Data. + */ + public Canvas create(DataList data); + + + /** + * This method creates a Canvas element showing the old Data objects in the + * DataList data. + * + * @param dataList The DataList which elements should be displayed. + * + * @return a Canvas displaying the Data. + */ + public Canvas createOld(DataList dataList); + + + public Canvas createHelpLink(DataList dataList, Data data); + + + /** + * This method injects a container that is used to position helper widgets. + * + * @param container A container that is used to position helper widgets. + */ + public void setContainer(VLayout container); + + + /** + * Sets an artifact that contains the status data information for a project. + * + * @param artifact The artifact containing status information. + */ + public void setArtifact(Artifact artifact); + + + /** + * Sets the parent Collection of the Artifact. + */ + public void setCollection(Collection collection); + + public void setParameterList(ParameterList list); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/UIProviderFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/UIProviderFactory.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,195 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import org.dive4elements.river.client.client.ui.fixation.FixEventSelect; +import org.dive4elements.river.client.client.ui.fixation.FixFunctionSelect; +import org.dive4elements.river.client.client.ui.fixation.FixGaugeSelectPanel; +import org.dive4elements.river.client.client.ui.fixation.FixLocationPanel; +import org.dive4elements.river.client.client.ui.fixation.FixMultiPeriodPanel; +import org.dive4elements.river.client.client.ui.fixation.FixPeriodPanel; +import org.dive4elements.river.client.client.ui.fixation.FixQSelectPanel; +import org.dive4elements.river.client.client.ui.minfo.BedHeightsDatacagePanel; +import org.dive4elements.river.client.client.ui.minfo.BedMultiPeriodPanel; +import org.dive4elements.river.client.client.ui.minfo.CheckboxPanel; +import org.dive4elements.river.client.client.ui.minfo.SedLoadDistancePanel; +import org.dive4elements.river.client.client.ui.minfo.SedLoadEpochPanel; +import org.dive4elements.river.client.client.ui.minfo.SedLoadOffEpochPanel; +import org.dive4elements.river.client.client.ui.minfo.SedLoadPeriodPanel; +import org.dive4elements.river.client.client.ui.sq.SQPeriodPanel; +import org.dive4elements.river.client.shared.model.User; + +/** + * Depending on the provider the state declared, return a UIProvider. + * + * A UIProvider provides widgets and input helpers to guide input to an + * artifacts state. + */ +public class UIProviderFactory { + + private UIProviderFactory() { + } + + /** @param uiProvider uiprovider demanded for by state. */ + public static UIProvider getProvider(String uiProvider, User user) { + if (uiProvider == null || uiProvider.equals("")) { + return new SelectProvider(); + } + else if (uiProvider.equals("select_with_map")) { + return new MapSelection(); + } + else if (uiProvider.equals("location_distance_panel")) { + return new LocationDistancePanel(); + } + else if (uiProvider.equals("location_panel")) { + return new SingleLocationPanel(); + } + else if (uiProvider.equals("multi_location_panel")) { + return new MultipleLocationPanel(); + } + else if (uiProvider.equals("distance_panel")) { + return new DistancePanel(); + } + else if (uiProvider.equals("distance_only_panel")) { + return new DistanceOnlyPanel(); + } + else if (uiProvider.equals("waterlevel_ground_panel")) { + return new WaterlevelGroundPanel(); + } + else if (uiProvider.equals("wq_panel")) { + return new WQInputPanel(); + } + else if (uiProvider.equals("wq_panel_adapted")) { + return new WQAdaptedInputPanel(); + } + else if (uiProvider.equals("q_segmented_panel")) { + return new QSegmentedInputPanel(); + } + else if (uiProvider.equals("river_panel")) { + return new LinkSelection(); + } + else if (uiProvider.equals("continue")) { + return new ContinuePanel(); + } + else if (uiProvider.equals("wsp_datacage_panel")) { + return new WspDatacagePanel(user); + } + else if (uiProvider.equals("dgm_datacage_panel")) { + return new DemDatacagePanel(user); + } + else if (uiProvider.equals("datacage_twin_panel")) { + return new DatacageTwinPanel(user); + } + else if (uiProvider.equals("auto_integer")) { + return new AutoIntegerPanel(); + } + else if (uiProvider.equals("boolean_panel")) { + return new BooleanPanel(); + } + else if (uiProvider.equals("noinput")) { + return new NoInputPanel(); + } + else if (uiProvider.equals("map_digitize")) { + return new DigitizePanel(); + } + else if (uiProvider.equals("timerange")) { + return new IntegerRangePanel(); + } + else if (uiProvider.equals("wq_simple_array")) { + return new WQSimpleArrayPanel(); + } + else if (uiProvider.equals("gaugetimerange")) { + return new GaugeTimeRangePanel(); + } + else if (uiProvider.equals("fix.location_panel")) { + return new FixLocationPanel(); + } + else if (uiProvider.equals("fix.period_panel")) { + return new FixPeriodPanel(); + } + else if (uiProvider.equals("fix.period_ref_panel")) { + return new FixPeriodPanel("ref_start", "ref_end"); + } + else if (uiProvider.equals("fix.period_ana_panel")) { + return new FixMultiPeriodPanel(); + } + else if (uiProvider.equals("fix.qselect_panel")) { + return new FixQSelectPanel(); + } + else if (uiProvider.equals("fix.gaugeselect_panel")) { + return new FixGaugeSelectPanel(); + } + else if (uiProvider.equals("fix.event_panel")) { + return new FixEventSelect(); + } + else if (uiProvider.equals("fix.preprocessing_panel")) { + return new BooleanPanel(); + } + else if (uiProvider.equals("fix.functionselect")) { + return new FixFunctionSelect(); + } + else if (uiProvider.equals("period_select")) { + return new PeriodPanel(); + } + else if (uiProvider.equals("periods_select")) { + return new MultiPeriodPanel(); + } + else if (uiProvider.equals("sq.period.select")) { + return new SQPeriodPanel(); + } + else if (uiProvider.equals("outliers_input")) { + return new DoubleInputPanel(); + } + else if (uiProvider.equals("percent_input")) { + return new DoubleInputPanel("percent"); + } + else if (uiProvider.equals("parameter-matrix")) { + return new ParameterMatrixPanel(); + } + else if (uiProvider.equals("minfo.bed.year_epoch")) { + return new RadioPanel(); + } + else if (uiProvider.equals("bedquality_periods_select")) { + return new BedMultiPeriodPanel(); + } + else if (uiProvider.equals("bedheights_twin_panel")) { + return new BedHeightsDatacagePanel(user); + } + else if (uiProvider.equals("minfo.bed.char_diameter")) { + return new CheckboxPanel(); + } + else if (uiProvider.equals("minfo.sedimentload_unit_select")) { + return new RadioPanel(); + } + else if (uiProvider.equals("gauge_discharge_curve")) { + return new StaticDataPanel(); + } + else if (uiProvider.equals("minfo.sedimentload_distance_select")) { + return new SedLoadDistancePanel(); + } + else if (uiProvider.equals("minfo.sedimentload_year_select")) { + return new SedLoadPeriodPanel(); + } + else if (uiProvider.equals("minfo.sedimentload_epoch_select")) { + return new SedLoadEpochPanel(); + } + else if (uiProvider.equals("minfo.sedimentload_offepoch_select")) { + return new SedLoadOffEpochPanel(); + } + else if (uiProvider.equals("hws_datacage_panel")) { + return new HWSDatacagePanel(user); + } + else if (uiProvider.equals("user_rgd_panel")) { + return new UserRGDProvider(); + } + else if (uiProvider.equals("static_sqrelation")) { + return new StaticDataPanel(); + } + else { + //GWT.log("Picked default provider."); + return new SelectProvider(); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/UserRGDProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/UserRGDProvider.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,133 @@ +package org.dive4elements.river.client.client.ui; + +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.types.Encoding; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.HTMLPane; +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.UploadItem; +import com.smartgwt.client.widgets.layout.VLayout; + +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; + + +public class UserRGDProvider +extends SelectProvider +{ + + private HTMLPane uploadTargetFrame; + private String uploadFile; + + public UserRGDProvider() { + uploadTargetFrame = new HTMLPane(); + } + + @Override + public Canvas create(DataList list) { + List data = list.getAll(); + + //Canvas selectBox = super.create(clone); + Canvas widget = createWidget(list); + + return widget; + } + + + /** + * This method creates the content of the widget. + * + * @param data The {@link DataList} object. + * + * @return a combobox. + */ + @Override + protected Canvas createWidget(DataList data) { + GWT.log("DigitizePanel - createWidget()"); + + VLayout layout = new VLayout(); + layout.setAlign(VerticalAlignment.TOP); + layout.setHeight(25); + + int size = data.size(); + + for (int i = 0; i < size; i++) { + Data d = data.get(i); + + Label label = new Label(d.getDescription()); + label.setValign(VerticalAlignment.TOP); + label.setHeight(20); + label.setWidth(400); + + uploadTargetFrame.setWidth("200px"); + uploadTargetFrame.setHeight("50px"); + uploadTargetFrame.setContents( + ""); + uploadTargetFrame.setBorder("0px"); + uploadTargetFrame.setScrollbarSize(0); + + final DynamicForm uploadForm = new DynamicForm(); + uploadForm.setAction("flys/fileupload?uuid=" + artifact.getUuid()); + uploadForm.setTarget("uploadTarget"); + uploadForm.setEncoding(Encoding.MULTIPART); + Label uploadLabel = new Label(MSG.shape_file_upload()); + uploadLabel.setHeight(20); + final UploadItem uploadItem = new UploadItem(); + uploadItem.setShowTitle(false); + uploadForm.setFields(uploadItem); + Button submit = new Button(MSG.upload_file()); + submit.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + uploadFile = uploadItem.getValueAsString(); + uploadForm.submitForm(); + } + }); + + layout.addMember(label); + layout.addMember(form); + layout.addMember(uploadLabel); + layout.addMember(uploadForm); + layout.addMember(submit); + layout.addMember(getNextButton()); + + layout.setMembersMargin(10); + layout.addMember(uploadTargetFrame); + } + + layout.setAlign(VerticalAlignment.TOP); + + return layout; + } + + @Override + protected Data[] getData() { + Data[] total = new Data[1]; + + if (uploadFile != null && uploadFile.length() > 0) { + DataItem item = new DefaultDataItem( + "uesk.user-rgd", "uesk.user-rgd", uploadFile); + total[0] = new DefaultData( + "uesk.user-rgd", null, null, new DataItem[] { item }); + } + else { + // Happens when OpenLayers is missing + DataItem item = new DefaultDataItem( + "uesk.user-rgd", "uesk.user-rgd", MSG.notselected()); + total[0] = new DefaultData( + "uesk.user-rgd", null, null, new DataItem[] { item }); + } + + return total; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQAdaptedInputPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQAdaptedInputPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,828 @@ +package org.dive4elements.river.client.client.ui; + +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.TitleOrientation; +import com.smartgwt.client.types.VerticalAlignment; +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.RadioGroupItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; +import com.smartgwt.client.widgets.form.fields.events.FocusEvent; +import com.smartgwt.client.widgets.form.fields.events.FocusHandler; +import com.smartgwt.client.widgets.grid.events.CellClickEvent; +import com.smartgwt.client.widgets.grid.events.CellClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.WQInfoService; +import org.dive4elements.river.client.client.services.WQInfoServiceAsync; +import org.dive4elements.river.client.client.ui.wq.QDTable; +import org.dive4elements.river.client.client.ui.wq.WTable; +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.WQDataItem; +import org.dive4elements.river.client.shared.model.WQInfoObject; +import org.dive4elements.river.client.shared.model.WQInfoRecord; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + + +/** + * This UIProvider creates a widget to enter W or Q data for discharge + * longitudinal section computations. + * + * @author Ingo Weinzierl + */ +public class WQAdaptedInputPanel +extends AbstractUIProvider +implements ChangeHandler, BlurHandler, FocusHandler +{ + private static final long serialVersionUID = -3218827566805476423L; + + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); + + public static final String FIELD_WQ_MODE = "wq_isq"; + public static final String FIELD_WQ_W = "W"; + public static final String FIELD_WQ_Q = "Q"; + + public static final String GAUGE_SEPARATOR = ":"; + + public static final String GAUGE_PART_SEPARATOR = ";"; + + public static final String VALUE_SEPARATOR = ","; + + public static final int ROW_HEIGHT = 20; + + /** The constant field name for choosing w or q mode. */ + public static final String FIELD_WQ = "wq"; + + /** The constant field name for choosing single values or range. */ + public static final String FIELD_MODE = "mode"; + + /** The constant field value for range input mode. */ + public static final String FIELD_MODE_RANGE = "range"; + + /** Service to fetch W/Q MainValues. */ + protected WQInfoServiceAsync wqInfoService = + GWT.create(WQInfoService.class); + + /** The message class that provides i18n strings. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** Stores the input panels related to their keys. */ + protected Map wqranges; + + /** List of doubleArrayPanels shown. */ + protected ArrayList doubleArrayPanels; + + /** [startkm,endkm] per gauge in selected range. */ + protected double[][] gaugeRanges; + + /** Stores the min/max values for each q range (gauge). */ + protected Map qranges; + + /** Stores the min/max values for each w range (gauge). */ + protected Map wranges; + + /** The RadioGroupItem that determines the w/q input mode. */ + protected DynamicForm modes; + + /** List of wTables in inputhelper section. */ + protected List wTables; + + /** List of QDTables in inputhelper section. */ + protected List qdTables; + + /** Tabs in inputhelper area. */ + protected TabSet tabs; + + /** The currently focussed Input element. */ + protected DoubleArrayPanel itemWithFocus; + + + public WQAdaptedInputPanel() { + wqranges = new HashMap(); + doubleArrayPanels = new ArrayList(); + qranges = new HashMap(); + wranges = new HashMap(); + wTables = new ArrayList(); + qdTables = new ArrayList(); + } + + + @Override + public Canvas create(DataList data) { + readGaugeRanges(data); + initHelperPanel(); + + Canvas submit = getNextButton(); + Canvas widget = createWidget(data); + Label label = new Label(MSG.wqadaptedTitle()); + + label.setHeight(25); + + VLayout layout = new VLayout(); + layout.setMembersMargin(10); + layout.setWidth(350); + + layout.addMember(label); + layout.addMember(widget); + layout.addMember(submit); + + fetchWQData(); + + initTableListeners(); + + return layout; + } + + + /** Inits the helper panel. */ + // TODO duplicate in WQInputPanel + protected void initHelperPanel() { + tabs = new TabSet(); + tabs.setWidth100(); + tabs.setHeight100(); + + // For each gauge, add two tabs with helper tables. + + for (int i = 0; i< gaugeRanges.length; i++) { + // Later the tabs title will get adjusted to include gauges name. + // TODO the tabs title becomes rather long through that (i18n). + Tab wTab = new Tab(MESSAGE.wq_table_w()); + Tab qTab = new Tab(MESSAGE.wq_table_q()); + + QDTable qdTable = new QDTable(); + WTable wTable = new WTable(); + + wTables.add(wTable); + qdTables.add(qdTable); + + qdTable.showSelect(); + //wTable.showSelect(); + wTab.setPane(wTable); + qTab.setPane(qdTable); + + tabs.addTab(wTab, i*2+0); + tabs.addTab(qTab, i*2+1); + } + + helperContainer.addMember(tabs); + } + + + /** + * Initializes the listeners of the WQD tables. + */ + // TODO dupe from WQInputPanel + protected void initTableListeners() { + int i = 0; + for (QDTable qdTable: qdTables) { + // Register listener such that values are filled in on click. + final QDTable table = qdTable; + final int fi = i; + CellClickHandler handler = new CellClickHandler() { + @Override + public void onCellClick(CellClickEvent e) { + if (isWMode() || table.isLocked()) { + return; + } + + int idx = e.getColNum(); + Record r = e.getRecord(); + double val = r.getAttributeAsDouble("value"); + + doubleArrayPanels.get(fi).setValues(new double[]{val}); + // If a named value for first gauge is chosen, try to find and set + // the values to the other panels too. + if (fi == 0) { + String valueName = r.getAttribute("name"); + int oi = 0; + // TODO instead of oi use random access. + for (QDTable otherQDTable: qdTables) { + if (oi == 0) { + oi++; + continue; + } + Double value = otherQDTable.findRecordValue(valueName); + if (value == null) { + // TODO i18n + SC.warn("No Value for at "); + } + else { + doubleArrayPanels.get(oi).setValues(new double[]{value}); + } + oi++; + } + } + else { + // Focus next. + if (fi != doubleArrayPanels.size()-1) { + doubleArrayPanels.get(fi+1).focusInItem(1); + } + } + } + }; + + qdTable.addCellClickHandler(handler); + i++; + } + } + + + @Override + public Canvas createOld(DataList dataList) { + List all = dataList.getAll(); + Data wqData = getData(all, "wq_values"); + Data wqMode = getData(all, "wq_isq"); + boolean isQ = wqMode.getItems()[0].getStringValue().equals("true"); + Canvas back = getBackButton(dataList.getState()); + + HLayout valLayout = new HLayout(); + HLayout modeLayout = new HLayout(); + VLayout vlayout = new VLayout(); + + Label wqLabel = new Label(dataList.getLabel()); + Label modeLabel = new Label(""); + + wqLabel.setValign(VerticalAlignment.TOP); + + wqLabel.setWidth(200); + wqLabel.setHeight(25); + modeLabel.setHeight(25); + modeLabel.setWidth(200); + + valLayout.addMember(wqLabel); + valLayout.addMember(createOldWQValues(wqData, isQ)); + + valLayout.addMember(back); + modeLayout.addMember(modeLabel); + + vlayout.addMember(valLayout); + vlayout.addMember(modeLayout); + + return vlayout; + } + + + /** Create area showing previously entered w or q data. */ + protected Canvas createOldWQValues(Data wqData, boolean isQ) { + VLayout layout = new VLayout(); + + DataItem item = wqData.getItems()[0]; + String value = item.getStringValue(); + + String[] gauges = value.split(GAUGE_SEPARATOR); + + String unit = isQ ? "m³/s" : "cm"; + + for (String gauge: gauges) { + HLayout h = new HLayout(); + + String[] parts = gauge.split(GAUGE_PART_SEPARATOR); + String[] values = parts[3].split(VALUE_SEPARATOR); + + Label l = new Label(parts[2] + ": "); + + StringBuilder sb = new StringBuilder(); + boolean first = true; + + for (String v: values) { + if (!first) { + sb.append(", "); + } + + sb.append(v); + sb.append(" "); + sb.append(unit); + + first = false; + } + + Label v = new Label(sb.toString()); + + l.setWidth(65); + v.setWidth(65); + + h.addMember(l); + h.addMember(v); + + layout.addMember(h); + } + + return layout; + } + + + /** Create non-input helper part of the UI. */ + protected Canvas createWidget(DataList dataList) { + VLayout layout = new VLayout(); + + Canvas mode = createMode(dataList); + Canvas list = createList(dataList); + + DataItem[] items = getWQItems(dataList); + int listHeight = ROW_HEIGHT * items.length; + + mode.setHeight(25); + mode.setWidth(200); + + layout.addMember(mode); + layout.addMember(list); + + layout.setHeight(25 + listHeight); + layout.setWidth(350); + + initUserDefaults(dataList); + + return layout; + } + + + @Override + public List validate() { + if (isWMode()) { + return validateW(); + } + else { + return validateQ(); + } + } + + + protected List validateRange(Map ranges) { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + Iterator iter = wqranges.keySet().iterator(); + + while (iter.hasNext()) { + List tmpErrors = new ArrayList(); + + String key = iter.next(); + DoubleArrayPanel dap = wqranges.get(key); + + if (!dap.validateForm()) { + errors.add(MSG.error_invalid_double_value()); + return errors; + } + + double[] mm = ranges.get(key); + if (mm == null) { + SC.warn(MSG.error_read_minmax_values()); + continue; + } + + double[] values = dap.getInputValues(); + double[] good = new double[values.length]; + + int idx = 0; + + for (double value: values) { + if (value < mm[0] || value > mm[1]) { + String tmp = MSG.error_validate_range(); + tmp = tmp.replace("$1", nf.format(value)); + tmp = tmp.replace("$2", nf.format(mm[0])); + tmp = tmp.replace("$3", nf.format(mm[1])); + tmpErrors.add(tmp); + } + else { + good[idx++] = value; + } + } + + double[] justGood = new double[idx]; + for (int i = 0; i < justGood.length; i++) { + justGood[i] = good[i]; + } + + if (!tmpErrors.isEmpty()) { + dap.setValues(justGood); + + errors.addAll(tmpErrors); + } + } + + return errors; + } + + + protected List validateW() { + return validateRange(wranges); + } + + + protected List validateQ() { + return validateRange(qranges); + } + + + protected void initUserDefaults(DataList dataList) { + initUserWQValues(dataList); + initUserWQMode(dataList); + } + + + protected void initUserWQMode(DataList dataList) { + List allData = dataList.getAll(); + + Data dDef = getData(allData, "wq_mode"); + DataItem def = dDef != null ? dDef.getDefault() : null; + String value = def != null ? def.getStringValue() : null; + + if (value != null && value.equals(FIELD_WQ_W)) { + modes.setValue(FIELD_WQ_MODE, FIELD_WQ_W); + } + else { + modes.setValue(FIELD_WQ_MODE, FIELD_WQ_Q); + } + } + + + protected void initUserWQValues(DataList dataList) { + List allData = dataList.getAll(); + + Data dDef = getData(allData, "wq_values"); + DataItem def = dDef != null ? dDef.getDefault() : null; + String value = def != null ? def.getStringValue() : null; + + if (value == null || value.length() == 0) { + return; + } + + String[] lines = value.split(GAUGE_SEPARATOR); + + if (lines == null || lines.length == 0) { + return; + } + + for (String line: lines) { + String[] cols = line.split(GAUGE_PART_SEPARATOR); + String title = createLineTitle(line); + + if (cols == null || cols.length < 3) { + continue; + } + + String[] strValues = cols[2].split(VALUE_SEPARATOR); + double[] values = new double[strValues.length]; + + int idx = 0; + + for (String strValue: strValues) { + try { + values[idx++] = Double.valueOf(strValue); + } + catch (NumberFormatException nfe) { + // do nothing + } + } + + String key = cols[0] + GAUGE_PART_SEPARATOR + cols[1]; + DoubleArrayPanel dap = wqranges.get(key); + + if (dap == null) { + continue; + } + + dap.setValues(values); + } + } + + /** Populate Gauge Ranges array. */ + private void readGaugeRanges(DataList dataList) { + DataItem[] items = getWQItems(dataList); + gaugeRanges = new double[items.length][2]; + + int i = 0; + + for (DataItem item: items) { + String[] startEndKm = item.getLabel().split(";"); + + gaugeRanges[i][0] = Double.parseDouble(startEndKm[0]); + gaugeRanges[i][1] = Double.parseDouble(startEndKm[1]); + i++; + } + } + + + protected Canvas createList(DataList dataList) { + VLayout layout = new VLayout(); + + DataItem[] items = getWQItems(dataList); + + int i = 0; + + for (DataItem item: items) { + String title = item.getLabel(); // of form: 70.5;112.0 + String label = item.getStringValue(); + + // Rename W and Q tab to include gauges name. + tabs.getTab(i*2).setTitle(tabs.getTab(i*2).getTitle() + + " (" + label + ")"); + tabs.getTab(i*2+1).setTitle(tabs.getTab(i*2+1).getTitle() + + " (" + label + ")"); + + DoubleArrayPanel dap = new DoubleArrayPanel( + label, null, this, this, TitleOrientation.LEFT); + + wqranges.put(title, dap); + doubleArrayPanels.add(dap); + + if (item instanceof WQDataItem) { + WQDataItem wq = (WQDataItem) item; + double[] mmQ = wq.getQRange(); + double[] mmW = wq.getWRange(); + + qranges.put(title, mmQ); + wranges.put(title, mmW); + } + + layout.addMember(dap); + i++; + } + + layout.setHeight(items.length * ROW_HEIGHT); + + return layout; + } + + + /** Get items which are not WQ_MODE. */ + protected DataItem[] getWQItems(DataList dataList) { + List data = dataList.getAll(); + + for (Data d: data) { + String name = d.getLabel(); + + if (name.equals(FIELD_WQ_MODE)) { + continue; + } + + return d.getItems(); + } + + return null; + } + + + /** + * Create radio button for switching w and q input. + * Radiobutton-change also triggers helper panel tab selection. + */ + protected Canvas createMode(DataList dataList) { + RadioGroupItem wq = new RadioGroupItem(FIELD_WQ_MODE); + wq.setShowTitle(false); + wq.setVertical(false); + wq.setWidth(200); + + LinkedHashMap wqValues = new LinkedHashMap(); + wqValues.put(FIELD_WQ_W, MSG.wqW()); + wqValues.put(FIELD_WQ_Q, MSG.wqQatGauge()); + + wq.setValueMap(wqValues); + + modes = new DynamicForm(); + modes.setFields(wq); + modes.setWidth(200); + wq.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent e) { + DynamicForm form = e.getForm(); + + if(form.getValueAsString(FIELD_WQ_MODE).contains("Q")) { + tabs.selectTab(0); + } + else { + tabs.selectTab(1); + } + } + }); + + + LinkedHashMap initial = new LinkedHashMap(); + initial.put(FIELD_WQ_MODE, FIELD_WQ_Q); + modes.setValues(initial); + tabs.selectTab(1); + return modes; + } + + + public String createLineTitle(String key) { + String[] splitted = key.split(";"); + + return splitted[0] + " - " + splitted[1]; + } + + + @Override + public Data[] getData() { + Data mode = getWQMode(); + Data values = getWQValues(); + + return new Data[] { mode, values }; + } + + + public boolean isWMode() { + String mode = (String) modes.getValue(FIELD_WQ_MODE); + + return FIELD_WQ_W.equals(mode); + } + + + protected Data getWQMode() { + String wqMode = modes.getValueAsString(FIELD_WQ_MODE); + String value = "false"; + if (wqMode.equals("Q")) { + value = "true"; + } + DataItem item = new DefaultDataItem("wq_isq", "wq_isq", value); + Data mode = new DefaultData( + "wq_isq", null, null, new DataItem[] { item }); + + return mode; + } + + + protected Data getWQValues() { + String wqvalue = null; + + Iterator iter = wqranges.keySet().iterator(); + while (iter.hasNext()) { + String key = iter.next(); + DoubleArrayPanel dap = wqranges.get(key); + String label = dap.getItemTitle(); + + double[] values = dap.getInputValues(); + if (wqvalue == null) { + wqvalue = createValueString(key + ";" + label, values); + } + else { + wqvalue += GAUGE_SEPARATOR + createValueString(key + ";" + label, values); + } + } + + DataItem valueItem = new DefaultDataItem( + "wq_values", "wq_values", wqvalue); + Data values = new DefaultData( + "wq_values", null, null, new DataItem[] { valueItem }); + + return values; + } + + + protected String createValueString(String key, double[] values) { + StringBuilder sb = new StringBuilder(); + + boolean first = true; + + for (double value: values) { + if (!first) { + sb.append(","); + } + + sb.append(Double.toString(value)); + + first = false; + } + + return key + ";" + sb.toString(); + } + + + @Override + public void onChange(ChangeEvent event) { + // TODO IMPLEMENT ME + } + + + /** Store the currently focussed DoubleArrayPanel and focus helper tab. */ + @Override + public void onFocus(FocusEvent event) { + itemWithFocus = (DoubleArrayPanel) event.getForm(); + // Switch to respective tab. + // TODO which makes a focus loss + int inputIndex = doubleArrayPanels.indexOf(itemWithFocus); + tabs.selectTab(inputIndex*2 + (isWMode() ? 0 : 1)); + } + + + @Override + public void onBlur(BlurEvent event) { + DoubleArrayPanel dap = (DoubleArrayPanel) event.getForm(); + dap.validateForm(event.getItem()); + } + + + /** Get the WQD data from service and stuck them up that tables. */ + protected void fetchWQData() { + Config config = Config.getInstance(); + String locale = config.getLocale (); + + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList[] data = adescr.getOldData(); + + double[] mm = getMinMaxKM(data); + String river = getRiverName(data); + + int i = 0; + + // Get Data for respective gauge. + for (double[] range : gaugeRanges){ + // Gauge ranges overlap, move start and end a bit closer to each other. + final double rDiff = (range[1] - range[0]) / 10d; + final int fi = i; + wqInfoService.getWQInfo(locale, river, range[0]+rDiff, range[1]-rDiff, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not recieve wq informations."); + SC.warn(caught.getMessage()); + } + + @Override + public void onSuccess(WQInfoObject[] wqi) { + int num = wqi != null ? wqi.length :0; + GWT.log("Received " + num + " wq informations (" + fi + "."); + + if (num == 0) { + return; + } + + addWQInfo(wqi, fi); + } + } + ); + i++; + } + } + + + /** Add Info to helper table for gauge at index gaugeIdx. */ + protected void addWQInfo (WQInfoObject[] wqi, int gaugeIdx) { + for(WQInfoObject wi: wqi) { + WQInfoRecord rec = new WQInfoRecord(wi); + + if (wi.getType().equals("W")) { + wTables.get(gaugeIdx).addData(rec); + } + else { + qdTables.get(gaugeIdx).addData(rec); + } + } + } + + + /** + * Determines the min and max kilometer value selected in a former state. A + * bit silly, but we need to run over each value of the "old data" to find + * such values because it is not available here. + * + * @param data The DataList which contains the whole data inserted for the + * current artifact. + * + * @return a double array with [min, max]. + */ + protected double[] getMinMaxKM(DataList[] data) { + ArtifactDescription adesc = artifact.getArtifactDescription(); + return adesc.getKMRange(); + } + + + /** + * Returns the name of the selected river. + * + * @param data The DataList with all data. + * + * @return the name of the current river. + */ + protected String getRiverName(DataList[] data) { + ArtifactDescription adesc = artifact.getArtifactDescription(); + return adesc.getRiver(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQInputPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQInputPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,1848 @@ +package org.dive4elements.river.client.client.ui; + +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.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.FormItem; +import com.smartgwt.client.widgets.form.fields.RadioGroupItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; +import com.smartgwt.client.widgets.grid.events.CellClickEvent; +import com.smartgwt.client.widgets.grid.events.CellClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.WQInfoService; +import org.dive4elements.river.client.client.services.WQInfoServiceAsync; +import org.dive4elements.river.client.client.ui.wq.QDTable; +import org.dive4elements.river.client.client.ui.wq.WTable; +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.WQInfoObject; +import org.dive4elements.river.client.shared.model.WQInfoRecord; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + + +/** + * This UIProvider creates a widget to enter W or Q data. + * + * @author Ingo Weinzierl + */ +public class WQInputPanel +extends AbstractUIProvider +implements ChangeHandler, BlurHandler +{ + private static final long serialVersionUID = 4797387993390350341L; + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); + + protected WQInfoServiceAsync wqInfoService = + GWT.create(WQInfoService.class); + + /** The constant field name for choosing w or q mode.*/ + public static final String FIELD_WQ_W_FREE = "WFREE"; + + /** The constant field name for choosing w or q mode.*/ + public static final String FIELD_WQ = "wq"; + + /** The constant field value for W input mode.*/ + public static final String FIELD_WQ_W = "W"; + + /** The constant field value for Q input mode.*/ + public static final String FIELD_WQ_Q = "Q"; + + /** The constant field value for Q input mode.*/ + public static final String FIELD_WQ_Q_FREE = "QFREE"; + + /** The constant field name for choosing single values or range.*/ + public static final String FIELD_MODE = "mode"; + + /** The constant field value for single input mode.*/ + public static final String FIELD_MODE_SINGLE = "single"; + + /** The constant field value for range input mode.*/ + public static final String FIELD_MODE_RANGE = "range"; + + /** The constant value that determines the width of the left panel.*/ + public static final int WIDTH_LEFT_UPPER = 400; + + public static final int WIDTH_LEFT_LOWER = 223; + + /** The container that manages the w and q panels.*/ + protected HLayout container; + + /** The RadioGroupItem that determines the w/q input mode.*/ + protected DynamicForm modes; + + /** The min values for the 'from' property in the W-Range input mode.*/ + protected double minW; + + /** The min values for the 'from' property in the Q-Range input mode.*/ + protected double minQ; + + /** The min value for the 'from' property in the free Q-Range input mode.*/ + protected double minQFree; + + /** The min value for the 'from' property in the free W-Range input mode.*/ + protected double minWFree; + + /** The max values for the 'from' property in the W-Range input mode.*/ + protected double maxW; + + /** The max values for the 'from' property in the Q-Range input mode.*/ + protected double maxQ; + + /** The max value for the 'from' property in the free Q-Range input mode.*/ + protected double maxQFree; + + /** The max value for the 'from' property in the free W-Range input mode.*/ + protected double maxWFree; + + /** The 'from' value entered in the range W mode.*/ + protected double fromW; + + /** The 'to' value entered in the range W mode.*/ + protected double toW; + + /** The 'step' value entered in the range W mode.*/ + protected double stepW; + + /** The values entered in the single W mode.*/ + protected double[] valuesW; + + /** The values entered in the single W mode.*/ + protected double[] valuesWFree; + + /** The 'from' value entered in the range Q mode.*/ + protected double fromQ; + + /** The 'from' value entered in the range free Q mode.*/ + protected double fromQFree; + + /** The 'from' value entered in the range free W mode.*/ + protected double fromWFree; + + /** The 'to' value entered in the range Q mode.*/ + protected double toQ; + + /** The 'to' value entered in the range free Q mode.*/ + protected double toQFree; + + /** The 'to' value entered in the range free W mode.*/ + protected double toWFree; + + /** The 'step' value entered in the range Q mode.*/ + protected double stepQ; + + /** The 'step' value entered in the range free Q mode.*/ + protected double stepQFree; + + /** The 'step' value entered in the range free W mode.*/ + protected double stepWFree; + + /** The values entered in the single Q mode.*/ + protected double[] valuesQ; + + /** The values entered in the single free Q mode.*/ + protected double[] valuesQFree; + + /** The input panel for W values*/ + protected DoubleArrayPanel wArrayPanel; + + /** The input panel for q values*/ + protected DoubleArrayPanel qArrayPanel; + + /** The input panel for free q values*/ + protected DoubleArrayPanel qFreeArrayPanel; + + /** The input panel for free w values*/ + protected DoubleArrayPanel wFreeArrayPanel; + + /** The input panel for w range*/ + protected DoubleRangePanel wRangePanel; + + /** The input panel for q range*/ + protected DoubleRangePanel qRangePanel; + + /** The input panel for free q range*/ + protected DoubleRangePanel qFreeRangePanel; + + /** The input panel for free w range*/ + protected DoubleRangePanel wFreeRangePanel; + + protected QDTable qdTable; + + protected WTable wTable; + + protected TabSet tabs; + + /** + * Creates a new WQInputPanel instance. + */ + public WQInputPanel() { + qdTable = new QDTable(); + wTable = new WTable(); + + initTableListeners(); + } + + + /** + * Initializes the listeners of the WQD tables. + */ + protected void initTableListeners() { + CellClickHandler handler = new CellClickHandler() { + @Override + public void onCellClick(CellClickEvent e) { + if (isWMode() || qdTable.isLocked()) { + return; + } + + int idx = e.getColNum(); + Record r = e.getRecord (); + double val = r.getAttributeAsDouble("value"); + + if (idx == 0) { + if (isRangeMode()) { + qRangePanel.setFrom(val); + } + else { + qArrayPanel.addValue(val); + } + } + else if (idx == 1) { + if (isRangeMode()) { + qRangePanel.setTo(val); + } + else { + qArrayPanel.addValue(val); + } + } + } + }; + + qdTable.addCellClickHandler(handler); + } + + + /** + * This method calls createWidget and puts a 'next' button to the bottom. + * + * @param data The data that is displayed. + * + * @return the widget. + */ + @Override + public Canvas create(DataList data) { + initDefaults(data); + + Canvas widget = createWidget(data); + Canvas submit = getNextButton(); + Label label = new Label(MESSAGE.wqTitle()); + + label.setHeight(25); + + VLayout layout = new VLayout(); + layout.setMembersMargin(10); + + layout.addMember(label); + layout.addMember(widget); + layout.addMember(submit); + + initHelperPanel(); + initUserDefaults(data); + + return layout; + } + + + /** Inits the helper panel. */ + // TODO duplicate in WQAdaptedInputPanel + protected void initHelperPanel() { + tabs = new TabSet(); + tabs.setWidth100(); + tabs.setHeight100(); + + Tab wTab = new Tab(MESSAGE.wq_table_w()); + Tab qTab = new Tab(MESSAGE.wq_table_q()); + + qdTable.showSelect(); + wTab.setPane(wTable); + qTab.setPane(qdTable); + + tabs.addTab(wTab, 0); + tabs.addTab(qTab, 1); + + helperContainer.addMember(tabs); + + fetchWQData(); + } + + + @Override + public Canvas createOld(DataList dataList) { + List items = dataList.getAll(); + + Data dMode = getData(items, "wq_isq"); + Data dFree = getData(items, "wq_isfree"); + Data dSelection = getData(items, "wq_isrange"); + Data dSingle = getData(items, "wq_single"); + Data dFrom = getData(items, "wq_from"); + Data dTo = getData(items, "wq_to"); + Data dStep = getData(items, "wq_step"); + + DataItem[] mode = dMode.getItems(); + String strMode = mode[0].getStringValue(); + boolean isQMode = Boolean.valueOf(strMode); + + DataItem[] free = dFree.getItems(); + String strFree = free[0].getStringValue(); + boolean isFree = Boolean.valueOf(strFree); + + HLayout layout = new HLayout(); + layout.setWidth("400px"); + + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + + VLayout vLabel = null; + + DataItem[] selItem = dSelection.getItems(); + boolean isRange = selItem != null + ? Boolean.valueOf(selItem[0].getStringValue()) + : false; + + if (!isRange) { + DataItem[] single = dSingle.getItems(); + + vLabel = !isQMode + ? createWString(single[0]) + : createQString(single[0]); + } + else { + DataItem[] from = dFrom.getItems(); + DataItem[] to = dTo.getItems(); + DataItem[] step = dStep.getItems(); + + vLabel = !isQMode + ? createWString(from[0], to[0], step[0]) + : createQString(from[0], to[0], step[0]); + } + + VLayout selectedLayout = new VLayout(); + String wqMode = null; + + if (!isQMode) { + wqMode = isFree ? MESSAGE.wqWFree() : MESSAGE.wqW(); + } + else { + wqMode = isFree ? MESSAGE.wqQ() : MESSAGE.wqQGauge(); + } + + Label mLabel = new Label(wqMode); + mLabel.setWidth(175); + mLabel.setHeight(20); + + selectedLayout.addMember(mLabel); + selectedLayout.addMember(vLabel); + selectedLayout.setHeight(40); + + Canvas back = getBackButton(dataList.getState()); + + layout.addMember(label); + layout.addMember(selectedLayout); + layout.addMember(back); + + return layout; + } + + + /** + * This method reads the default values defined in the DataItems of the Data + * objects in list. + * + * @param list The DataList container that stores the Data objects. + */ + protected void initDefaults(DataList list) { + Data f = getData(list.getAll(), "wq_from"); + Data t = getData(list.getAll(), "wq_to"); + Data s = getData(list.getAll(), "wq_step"); + + DataItem fQItem = getDataItem(f.getItems(), "minQ"); + DataItem fWItem = getDataItem(f.getItems(), "minW"); + DataItem tQItem = getDataItem(t.getItems(), "maxQ"); + DataItem tWItem = getDataItem(t.getItems(), "maxW"); + DataItem sQItem = getDataItem(s.getItems(), "stepQ"); + DataItem sWItem = getDataItem(s.getItems(), "stepW"); + DataItem fQFItem = getDataItem(f.getItems(), "minQFree"); + DataItem tQFItem = getDataItem(t.getItems(), "maxQFree"); + DataItem sQFItem = getDataItem(s.getItems(), "stepQFree"); + DataItem fWFItem = getDataItem(f.getItems(), "minWFree"); + DataItem tWFItem = getDataItem(t.getItems(), "maxWFree"); + DataItem sWFItem = getDataItem(s.getItems(), "stepWFree"); + + minW = Double.valueOf(fWItem.getStringValue()); + maxW = Double.valueOf(tWItem.getStringValue()); + stepW = Double.valueOf(sWItem.getStringValue()); + + minQ = Double.valueOf(fQItem.getStringValue()); + maxQ = Double.valueOf(tQItem.getStringValue()); + stepQ = Double.valueOf(sQItem.getStringValue()); + + minQFree = Double.valueOf(fQFItem.getStringValue()); + maxQFree = Double.valueOf(tQFItem.getStringValue()); + stepQFree = Double.valueOf(sQFItem.getStringValue()); + + minWFree = Double.valueOf(fWFItem.getStringValue()); + maxWFree = Double.valueOf(tWFItem.getStringValue()); + stepWFree = Double.valueOf(sWFItem.getStringValue()); + + this.fromW = minW; + this.toW = maxW; + + this.fromQ = minQ; + this.toQ = maxQ; + + this.fromQFree = minQFree; + this.toQFree = maxQFree; + + this.fromWFree = minWFree; + this.toWFree = maxWFree; + } + + + /** + * Initializes the form items with former inserted user data. + * + * @param list The DataList that contains the user data. + */ + protected void initUserDefaults(DataList list) { + List allData = list.getAll(); + + Data m = getData(allData, "wq_isq"); + DataItem modeItem = m != null ? m.getDefault() : null; + boolean isQ = modeItem != null + ? Boolean.valueOf(modeItem.getStringValue()) + : false; + + Data f = getData(allData, "wq_isfree"); + DataItem freeItem = f != null ? f.getDefault() : null; + boolean isFree = freeItem != null + ? Boolean.valueOf(freeItem.getStringValue()) + : false; + + Data s = getData(allData, "wq_isrange"); + DataItem sI = s != null ? s.getDefault() : null; + boolean isRange = sI != null + ? Boolean.valueOf(sI.getStringValue()) + : false; + + initUserSingleValues(list, isQ); + initUserRangeValues(list, isQ); + + if (isQ) { + modes.setValue(FIELD_WQ, isQ); + } + else { + modes.setValue(FIELD_WQ, isFree ? FIELD_WQ_Q_FREE : FIELD_WQ_Q); + } + + if(isRange) { + modes.setValue(FIELD_MODE, FIELD_MODE_RANGE); + } + else { + modes.setValue(FIELD_MODE, FIELD_MODE_SINGLE); + } + updatePanels(isQ, isFree, isRange); + } + + + /** + * Initializes the single values of W or Q from DataList. + * + * @param list The DataList that contains the 'wq_single' object. + * @param isQ W or Q mode? + */ + protected void initUserSingleValues(DataList list, boolean isQ) { + List allData = list.getAll(); + + + Data s = getData(allData, "wq_single"); + DataItem i = s != null ? s.getDefault() : null; + GWT.log("init values: " + i.getStringValue()); + + if (i != null) { + String value = i.getStringValue(); + String[] split = value.split(" "); + + int num = split != null ? split.length : 0; + + double[] values = new double[num]; + + for (int j = 0; j < num; j++) { + try { + values[j] = Double.valueOf(split[j]); + } + catch (NumberFormatException nfe) { + // nothing to do + } + } + + if (!isQ) { + setSingleW(values); + } + else { + setSingleQ(values); + } + } + } + + + /** + * Initializes the range values of W or Q from DataList. + * + * @param list The DataList that contains the 'wq_single' object. + * @param isQ W or Q mode? + */ + protected void initUserRangeValues(DataList list, boolean isQ) { + List allData = list.getAll(); + + // init range mode values + Data f = getData(allData, "wq_from"); + Data t = getData(allData, "wq_to"); + Data s = getData(allData, "wq_step"); + + if (f != null && t != null && s != null) { + DataItem dF = f.getDefault(); + DataItem dT = t.getDefault(); + DataItem dS = s.getDefault(); + + String fS = dF != null ? dF.getStringValue() : null; + String tS = dT != null ? dT.getStringValue() : null; + String sS = dS != null ? dS.getStringValue() : null; + + try { + double from = Double.valueOf(fS); + double to = Double.valueOf(tS); + double step = Double.valueOf(sS); + + if (!isQ) { + setWRangeValues(from, to, step); + } + else { + setQRangeValues(from, to, step); + } + } + catch (NumberFormatException nfe) { + // do nothing + } + } + } + + + protected void setQRangeValues(double f, double t, double s) { + setFromQ(f); + setToQ(t); + setStepQ(s); + } + + + protected void setWRangeValues(double f, double t, double s) { + setFromW(f); + setToW(t); + setStepW(s); + } + + + protected VLayout createWString(DataItem from, DataItem to, DataItem step) { + VLayout v = new VLayout(); + + StringBuilder sb = new StringBuilder(); + sb.append(from.getLabel()); + sb.append(" " + MESSAGE.unitWFrom() + " "); + sb.append(to.getLabel()); + sb.append(" " + MESSAGE.unitWTo() + " "); + sb.append(step.getLabel()); + sb.append(" " + MESSAGE.unitWStep()); + + v.addMember(new Label(sb.toString())); + + return v; + } + + + protected VLayout createWString(DataItem single) { + String label = single.getLabel().trim(); + String[] cols = label.split(";"); + + VLayout v = new VLayout(); + + for (String col: cols) { + Label l = new Label(col + " " + MESSAGE.unitWSingle()); + l.setHeight(20); + + v.addMember(l); + } + + return v; + } + + + protected VLayout createQString(DataItem from, DataItem to, DataItem step) { + VLayout v = new VLayout(); + + StringBuilder sb = new StringBuilder(); + sb.append(from.getLabel()); + sb.append(" " + MESSAGE.unitQFrom() + " "); + sb.append(to.getLabel()); + sb.append(" " + MESSAGE.unitQTo() + " "); + sb.append(step.getLabel()); + sb.append(" " + MESSAGE.unitQStep()); + + v.addMember(new Label(sb.toString())); + + return v; + } + + + protected VLayout createQString(DataItem single) { + String label = single.getLabel().trim(); + String[] cols = label.split(";"); + + VLayout v = new VLayout(); + + for (String col: cols) { + Label l = new Label(col + " " + MESSAGE.unitQSingle()); + l.setHeight(20); + + v.addMember(l); + } + + return v; + } + + + /** + * This method creates the whole widget. There is a panel on the left, that + * allows the user to enter values manually by keyboard. On the right, there + * is a table that allows the user to enter values by mouse click. + * + * @param data The data that is displayed in the table on the right. + * + * @return the widget. + */ + protected Canvas createWidget(DataList data) { + VLayout layout = new VLayout(); + container = new HLayout(); + Canvas modeForm = createModePanel(); + + container.setMembersMargin(30); + + // the initial panel is the Single-W panel. + double[] values = getSingleQ(); + qArrayPanel = new DoubleArrayPanel( + MESSAGE.unitQSingle(), values, this); + container.addMember(qArrayPanel); + + layout.addMember(modeForm); + layout.addMember(container); + + return layout; + } + + + /** + * This method creates the mode panel. It contains two radio button panels + * that allows the user to switch the input mode between w/q and + * single/range input. + * + * @return a panel. + */ + protected Canvas createModePanel() { + RadioGroupItem wq = new RadioGroupItem(FIELD_WQ); + wq.setShowTitle(false); + wq.setVertical(true); + wq.setWidth(WIDTH_LEFT_UPPER); + wq.setWrap(false); + + RadioGroupItem mode = new RadioGroupItem(FIELD_MODE); + mode.setShowTitle(false); + mode.setVertical(false); + mode.setWidth(WIDTH_LEFT_LOWER); + + LinkedHashMap wqValues = new LinkedHashMap(); + wqValues.put(FIELD_WQ_W, MESSAGE.wqW()); + wqValues.put(FIELD_WQ_W_FREE, MESSAGE.wqWFree()); + wqValues.put(FIELD_WQ_Q_FREE, MESSAGE.wqQ()); + wqValues.put(FIELD_WQ_Q, MESSAGE.wqQGauge()); + + LinkedHashMap modeValues = new LinkedHashMap(); + modeValues.put(FIELD_MODE_SINGLE, MESSAGE.wqSingle()); + modeValues.put(FIELD_MODE_RANGE, MESSAGE.wqRange()); + + wq.setValueMap(wqValues); + mode.setValueMap(modeValues); + + wq.addChangeHandler(this); + mode.addChangeHandler(this); + + modes = new DynamicForm(); + modes.setFields(wq, mode); + modes.setWidth(WIDTH_LEFT_UPPER); + modes.setNumCols(1); + + LinkedHashMap initial = new LinkedHashMap(); + initial.put(FIELD_WQ, FIELD_WQ_Q); + initial.put(FIELD_MODE, FIELD_MODE_SINGLE); + modes.setValues(initial); + + return modes; + } + + + @Override + public List validate() { + if (isRangeMode()) { + return validateRangeValues(); + } + else { + return validateSingleValues(); + } + } + + + protected List validateRangeValues() { + if (isWFree()) { + return validateRange(wFreeRangePanel, minWFree, maxWFree); + } + else if (isQFree()) { + return validateRange(qFreeRangePanel, minQFree, maxQFree); + } + else if (isWMode()) { + return validateRange(wRangePanel, minW, maxW); + } + else { + return validateRange(qRangePanel, minQ, maxQ); + } + } + + protected List validateSingleValues() { + if (isWFree()) { + return validateSingle(wFreeArrayPanel, minWFree, maxWFree); + } + else if (isWMode()) { + return validateSingle(wArrayPanel, minW, maxW); + //return validateSingle(wArrayPanel, 0, 100000); + } + else if (isQFree()) { + return validateSingle(qFreeArrayPanel, minQFree, maxQFree); + } + else { + return validateSingle(qArrayPanel, minQ, maxQ); + } + } + + + protected List validateRange( + DoubleRangePanel panel, + double min, double max) + { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + if (!panel.validateForm()) { + errors.add(MESSAGE.wrongFormat()); + } + + double from; + double to; + double step; + + try { + from = panel.getFrom(); + to = panel.getTo(); + step = panel.getStep(); + } + catch (NullPointerException npe) { + errors.add(MESSAGE.missingInput()); + return errors; + } + + if (from < min || from > max) { + String tmp = MESSAGE.error_validate_lower_range(); + tmp = tmp.replace("$1", nf.format(from)); + tmp = tmp.replace("$2", nf.format(min)); + errors.add(tmp); + from = min; + } + + if (to < min || to > max) { + String tmp = MESSAGE.error_validate_upper_range(); + tmp = tmp.replace("$1", nf.format(to)); + tmp = tmp.replace("$2", nf.format(max)); + errors.add(tmp); + to = max; + } + + if (!errors.isEmpty()) { + panel.setValues(from, to, step); + } + + return errors; + } + + + protected List validateSingle( + DoubleArrayPanel panel, + double min, double max) + { + List errors = new ArrayList(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + + if (!panel.validateForm()) { + errors.add(MESSAGE.wrongFormat()); + } + + double[] values = panel.getInputValues(); + + if (values == null || values.length == 0) { + errors.add(MESSAGE.atLeastOneValue()); + return errors; + } + + double[] good = new double[values.length]; + int idx = 0; + + for (double value: values) { + if (value < min || value > max) { + String tmp = MESSAGE.error_validate_range(); + tmp = tmp.replace("$1", nf.format(value)); + tmp = tmp.replace("$2", nf.format(min)); + tmp = tmp.replace("$3", nf.format(max)); + errors.add(tmp); + } + else { + good[idx++] = value; + } + } + + double[] justGood = new double[idx]; + for (int i = 0; i < justGood.length; i++) { + justGood[i] = good[i]; + } + + if (!errors.isEmpty()) { + panel.setValues(justGood); + } + + return errors; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + @Override + public Data[] getData() { + // XXX If we have entered a value and click right afterwards on the + // 'next' button, the BlurEvent is not fired, and the values are not + // saved. So, we gonna save those values explicitly. + if (!isRangeMode()) { + Canvas member = container.getMember(0); + if (member instanceof DoubleArrayPanel) { + DoubleArrayPanel form = (DoubleArrayPanel) member; + if (isWFree()) { + saveSingleWFreeValues(form); + } + else if (isWMode()) { + saveSingleWValues(form); + } + else if (isQFree()) { + saveSingleQFreeValues(form); + } + else { + saveSingleQValues(form); + } + } + + return getSingleData(); + } + else { + Canvas member = container.getMember(0); + if (member instanceof DoubleRangePanel) { + DoubleRangePanel form = (DoubleRangePanel) member; + + if (isWFree()) { + saveRangeWFreeValues(form); + } + else if (isWMode()) { + saveRangeWValues(form); + } + else if (isQFree()) { + saveRangeQFreeValues(form); + } + else { + saveRangeQValues(form); + } + } + + return getRangeData(); + } + } + + + /** + * Collects the required data for single mode and resets the data for range + * mode. + */ + protected Data[] getSingleData() { + DataItem from = new DefaultDataItem("wq_from", "wq_from", ""); + DataItem to = new DefaultDataItem("wq_to", "wq_to", ""); + DataItem step = new DefaultDataItem("wq_step", "wq_step", ""); + + return new Data[] { + getDataMode(), + getFree(), + getDataSelectionMode(), + getDataSingle(), + new DefaultData( + "wq_from", + null, + null, + new DataItem[] {from}), + new DefaultData( + "wq_to", + null, + null, + new DataItem[] {to}), + new DefaultData( + "wq_step", + null, + null, + new DataItem[] {step}) }; + } + + + /** + * Collects the required data for range mode and resets the data for single + * mode. + */ + protected Data[] getRangeData() { + DataItem item = new DefaultDataItem("wq_single", "wq_single", ""); + + return new Data[] { + getDataMode(), + getFree(), + getDataSelectionMode(), + getDataFrom(), + getDataTo(), + getDataStep(), + new DefaultData( + "wq_single", + null, + null, + new DataItem[] {item}) }; + } + + + /** + * Returns the Data object for the 'mode' attribute. + * + * @return the Data object for the 'mode' attribute. + */ + protected Data getDataMode() { + String wqMode = modes.getValueAsString(FIELD_WQ); + + String value = null; + if (wqMode.equals(FIELD_WQ_Q_FREE) || wqMode.equals(FIELD_WQ_Q)) { + GWT.log("getData: FIELD_WQ_Q || FIELD_WQ_Q_FREE"); + value = "true"; + } + else { + GWT.log("getData: FIELD_WQ_W || FIELD_WQ_W_FREE"); + value = "false"; + } + + DataItem item = new DefaultDataItem("wq_isq", "wq_isq", value); + return new DefaultData( + "wq_isq", null, null, new DataItem[] { item }); + } + + + /** + * Returns the Q mode. The Q mode can be "true" or "false". True means, the + * calculation is not based on a gauge, false means the calculation should + * be based on a gauge. + * + * @return the Data object for the 'wq_free' attribute. + */ + protected Data getFree() { + String value = ""; + if(!isWMode()) { + value = isQFree() ? "true" : "false"; + } + else { + value = isWFree() ? "true" : "false"; + } + DataItem item = new DefaultDataItem("wq_isfree", "wq_isfree", value); + return new DefaultData( + "wq_isfree", null, null, new DataItem[] { item }); + } + + + /** + * Returns the Data object for the 'mode' attribute. + * + * @return the Data object for the 'mode' attribute. + */ + protected Data getDataSelectionMode() { + String wqSelection = modes.getValueAsString(FIELD_MODE); + + String isRange = "true"; + if (wqSelection.equals(FIELD_MODE_SINGLE)) { + isRange = "false"; + } + DataItem item = new DefaultDataItem( + "wq_isrange", "wq_isrange", isRange); + + return new DefaultData( + "wq_isrange", null, null, new DataItem[] { item }); + } + + + /** + * Returns the data object for the 'single' attribute. + * + * @return the Data object for the 'single' attribute. + */ + protected Data getDataSingle() { + double[] values = getFinalSingle(); + StringBuilder sb = new StringBuilder(); + for (double value: values) { + sb.append(Double.toString(value)); + sb.append(" "); + } + + DataItem item = new DefaultDataItem( + "wq_single", "wq_single", sb.toString()); + + return new DefaultData( + "wq_single", null, null, new DataItem[] { item }); + } + + + /** + * Returns the Data object for the 'from' attribute. + * + * @return the Data object for the 'from' attribute. + */ + protected Data getDataFrom() { + String value = Double.valueOf(getFinalFrom()).toString(); + DataItem item = new DefaultDataItem("wq_from", "wq_from", value); + return new DefaultData( + "wq_from", null, null, new DataItem[] { item }); + } + + + /** + * Returns the Data object for the 'to' attribute. + * + * @return the Data object for the 'to' attribute. + */ + protected Data getDataTo() { + String value = Double.valueOf(getFinalTo()).toString(); + DataItem item = new DefaultDataItem("wq_to", "wq_to", value); + return new DefaultData( + "wq_to", null, null, new DataItem[] { item }); + } + + + /** + * Returns the Data object for the 'step' attribute. + * + * @return the Data object for the 'step' attribute. + */ + protected Data getDataStep() { + String value = Double.valueOf(getFinalStep()).toString(); + DataItem item = new DefaultDataItem("wq_step","wq_step", value); + return new DefaultData( + "wq_step", null, null, new DataItem[] { item }); + } + + + protected double[] getFinalSingle() { + if (isWFree()) { + return getSingleWFree(); + } + else if (isWMode()) { + return getSingleW(); + } + else if (isQFree()) { + return getSingleQFree(); + } + else { + return getSingleQ(); + } + } + + + /** + * Returns the value of 'from' depending on the selected input mode. + * + * @return the value of 'from' depending on the selected input mode. + */ + protected double getFinalFrom() { + if (isRangeMode()) { + if (isWFree()) { + return getFromWFree(); + } + else if (isWMode()) { + return getFromW(); + } + else if (isQFree()) { + return getFromQFree(); + } + else { + return getFromQ(); + } + } + else { + double[] values = null; + + if (isWFree()) { + values = getSingleWFree(); + } + else if (isWMode()) { + values = getSingleW(); + } + else if (isQFree()) { + values = getSingleQFree(); + } + else { + values = getSingleQ(); + } + + double value = Double.MAX_VALUE; + for (double v: values) { + value = value < v ? value : v; + } + + return value; + } + } + + + /** + * Returns the value of 'to' depending on the selected input mode. + * + * @return the value of 'to' depending on the selected input mode. + */ + protected double getFinalTo() { + if (isRangeMode()) { + if (isWFree()) { + return getToWFree(); + } + else if (isWMode()) { + return getToW(); + } + else if (isQFree()) { + return getToQFree(); + } + else { + return getToQ(); + } + } + else { + double[] values = null; + + if (isWFree()) { + values = getSingleWFree(); + } + else if (isWMode()) { + values = getSingleW(); + } + else if (isQFree()) { + values = getSingleQFree(); + } + else { + values = getSingleQ(); + } + + double value = Double.MIN_VALUE; + for (double v: values) { + value = value > v ? value : v; + } + + return value; + } + } + + + /** + * Returns the value of 'step' depending on the selected input mode. + * + * @return the value of 'step' depending on the selected input mode. + */ + protected double getFinalStep() { + if (isRangeMode()) { + if (isWFree()) { + return getStepWFree(); + } + else if (isWMode()) { + return getStepW(); + } + else if (isQFree()) { + return getStepQFree(); + } + else { + return getStepQ(); + } + } + else { + // we have no field to enter the 'step' attribute in the + // single mode + return 0d; + } + } + + + /** + * Determines the range/single mode. + * + * @return true if the range mode is activated. + */ + public boolean isRangeMode() { + String rMode = modes.getValueAsString(FIELD_MODE); + + return rMode.equals(FIELD_MODE_RANGE); + } + + + /** + * Determines the w/q mode. + * + * @return true, if the W mode is activated. + */ + public boolean isWMode() { + String wq = modes.getValueAsString(FIELD_WQ); + return wq.contains("W"); + } + + + public boolean isQFree() { + String wqMode = modes.getValueAsString(FIELD_WQ); + return wqMode.equals(FIELD_WQ_Q_FREE); + } + + protected boolean isWFree() { + String wqMode = modes.getValueAsString(FIELD_WQ); + return wqMode.equals(FIELD_WQ_W_FREE); + } + + + /** + * This method changes the lower panel with the input fields depending on + * the combination of the two radio button panels. + * + * @param event The ChangeEvent. + */ + @Override + public void onChange(ChangeEvent event) { + DynamicForm form = event.getForm(); + FormItem item = event.getItem(); + + boolean isQ = false; + boolean isFree = false; + boolean isRange = false; + + if (item.getFieldName().equals(FIELD_MODE)) { + String wq = form.getValueAsString(FIELD_WQ); + isQ = wq.contains("Q"); + isFree = wq.contains("FREE"); + isRange = ((String) event.getValue()).equals(FIELD_MODE_RANGE); + } + else { + String wq = ((String) event.getValue()); + isQ = wq.contains("Q"); + isFree = wq.contains("FREE"); + isRange = + form.getValueAsString(FIELD_MODE).equals(FIELD_MODE_RANGE); + } + + if (isQ && isFree) { + qdTable.hideIconFields(); + } + else { + qdTable.showIconFields(); + } + + if (!isRange) { + qdTable.showSelect(); + } + else { + qdTable.showIconFields(); + } + + updatePanels(isQ, isFree, isRange); + } + + + protected void updatePanels(boolean isQ, boolean isFree, boolean isRange) { + container.removeMembers(container.getMembers()); + + if (!isQ && isFree) { + if (!isRange) { + // Single W mode + double[] values = getSingleWFree(); + + wFreeArrayPanel = new DoubleArrayPanel( + MESSAGE.unitWSingle(), values, this); + + container.addMember(wFreeArrayPanel); + } + else { + // Range W mode + double from = getFromWFree(); + double to = getToWFree(); + double step = getStepWFree(); + + wFreeRangePanel = new DoubleRangePanel( + MESSAGE.unitWFrom(), MESSAGE.unitWTo(), MESSAGE.unitWStep(), + from, to, step, + 250, + this); + container.addMember(wFreeRangePanel); + } + + tabs.selectTab(0); + } + else if (!isQ) { + if (!isRange) { + // Single W mode + double[] values = getSingleW(); + + wArrayPanel = new DoubleArrayPanel( + MESSAGE.unitWSingle(), values, this); + + container.addMember(wArrayPanel); + } + else { + // Range W mode + double from = getFromW(); + double to = getToW(); + double step = getStepW(); + + wRangePanel = new DoubleRangePanel( + MESSAGE.unitWFrom(), MESSAGE.unitWTo(), MESSAGE.unitWStep(), + from, to, step, + 250, + this); + container.addMember(wRangePanel); + } + + tabs.selectTab(0); + } + else if (isQ && isFree) { + if (!isRange) { + // Single Q mode + double[] values = getSingleQFree(); + + qFreeArrayPanel = new DoubleArrayPanel( + MESSAGE.unitQSingle(), values, this); + container.addMember(qFreeArrayPanel); + } + else { + // Range Q mode + double from = getFromQFree(); + double to = getToQFree(); + double step = getStepQFree(); + + qFreeRangePanel = new DoubleRangePanel( + MESSAGE.unitQFrom(), MESSAGE.unitQTo(), MESSAGE.unitQStep(), + from, to, step, + 250, + this); + container.addMember(qFreeRangePanel); + } + + tabs.selectTab(1); + } + else { + if (!isRange) { + // Single Q mode + double[] values = getSingleQ(); + + qArrayPanel = new DoubleArrayPanel( + MESSAGE.unitQSingle(), values, this); + container.addMember(qArrayPanel); + } + else { + // Range Q mode + double from = getFromQ(); + double to = getToQ(); + double step = getStepQ(); + + qRangePanel = new DoubleRangePanel( + MESSAGE.unitQFrom(), MESSAGE.unitQTo(), MESSAGE.unitQStep(), + from, to, step, + 250, + this); + container.addMember(qRangePanel); + } + + tabs.selectTab(1); + } + } + + /** + * This method is called if the value of one of the input fields might have + * changed. The entered values are validated and stored. + * + * @param event The BlurEvent. + */ + @Override + public void onBlur(BlurEvent event) { + DynamicForm form = event.getForm(); + FormItem item = event.getItem(); + + String wqMode = (String) modes.getValue(FIELD_WQ); + String inputMode = (String) modes.getValue(FIELD_MODE); + + if (wqMode.equals(FIELD_WQ_W)) { + if (inputMode.equals(FIELD_MODE_SINGLE)) { + DoubleArrayPanel p = (DoubleArrayPanel) form; + saveSingleWValue(p, item); + } + else { + DoubleRangePanel p = (DoubleRangePanel) form; + saveRangeWValue(p, item); + } + } + else if (wqMode.equals(FIELD_WQ_W_FREE)) { + if (inputMode.equals(FIELD_MODE_SINGLE)) { + DoubleArrayPanel p = (DoubleArrayPanel) form; + saveSingleWFreeValue(p, item); + } + else { + DoubleRangePanel p = (DoubleRangePanel) form; + saveRangeWFreeValue(p, item); + } + } + else if (wqMode.equals(FIELD_WQ_Q_FREE)) { + if (inputMode.equals(FIELD_MODE_SINGLE)) { + DoubleArrayPanel p = (DoubleArrayPanel) form; + saveSingleQFreeValue(p, item); + } + else { + DoubleRangePanel p = (DoubleRangePanel) form; + saveRangeQFreeValue(p, item); + } + } + else { + if (inputMode.equals(FIELD_MODE_SINGLE)) { + DoubleArrayPanel p = (DoubleArrayPanel) form; + saveSingleQValue(p, item); + } + else { + DoubleRangePanel p = (DoubleRangePanel) form; + saveRangeQValue(p, item); + } + } + } + + + protected void saveSingleWValues(DoubleArrayPanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + if (item.getFieldName().equals(DoubleArrayPanel.FIELD_NAME)) { + saveSingleWValue(p, item); + } + } + } + + + protected void saveSingleWFreeValues(DoubleArrayPanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + if (item.getFieldName().equals(DoubleArrayPanel.FIELD_NAME)) { + saveSingleWFreeValue(p, item); + } + } + } + + + protected void saveSingleQValues(DoubleArrayPanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + if (item.getFieldName().equals(DoubleArrayPanel.FIELD_NAME)) { + saveSingleQValue(p, item); + } + } + } + + + protected void saveSingleQFreeValues(DoubleArrayPanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + if (item.getFieldName().equals(DoubleArrayPanel.FIELD_NAME)) { + saveSingleQFreeValue(p, item); + } + } + } + + + protected void saveSingleWValue(DoubleArrayPanel p, FormItem item) { + if (p.validateForm(item)) { + setSingleW(p.getInputValues(item)); + } + } + + + protected void saveSingleWFreeValue(DoubleArrayPanel p, FormItem item) { + if (p.validateForm(item)) { + setSingleWFree(p.getInputValues(item)); + } + } + + + protected void saveSingleQValue(DoubleArrayPanel p, FormItem item) { + if (p.validateForm(item)) { + setSingleQ(p.getInputValues(item)); + } + } + + + protected void saveSingleQFreeValue(DoubleArrayPanel p, FormItem item) { + if (p.validateForm(item)) { + setSingleQFree(p.getInputValues(item)); + } + } + + + protected void saveRangeWValues(DoubleRangePanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + saveRangeWValue(p, item); + } + } + + + protected void saveRangeWFreeValues(DoubleRangePanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + saveRangeWFreeValue(p, item); + } + } + + + protected void saveRangeQValues(DoubleRangePanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + saveRangeQValue(p, item); + } + } + + + protected void saveRangeQFreeValues(DoubleRangePanel p) { + FormItem[] formItems = p.getFields(); + + for (FormItem item: formItems) { + saveRangeQFreeValue(p, item); + } + } + + + protected void saveRangeWValue(DoubleRangePanel p, FormItem item) { + if (p.validateForm()) { + setFromW(p.getFrom()); + setToW(p.getTo()); + setStepW(p.getStep()); + } + } + + + protected void saveRangeWFreeValue(DoubleRangePanel p, FormItem item) { + if (p.validateForm()) { + setFromWFree(p.getFrom()); + setToWFree(p.getTo()); + setStepWFree(p.getStep()); + } + } + + + protected void saveRangeQValue(DoubleRangePanel p, FormItem item) { + if (p.validateForm()) { + setFromQ(p.getFrom()); + setToQ(p.getTo()); + setStepQ(p.getStep()); + } + } + + + protected void saveRangeQFreeValue(DoubleRangePanel p, FormItem item) { + if (p.validateForm()) { + setFromQFree(p.getFrom()); + setToQFree(p.getTo()); + setStepQFree(p.getStep()); + } + } + + + protected double[] getSingleQ() { + return valuesQ; + } + + + protected double[] getSingleQFree() { + return valuesQFree; + } + + + protected void setSingleQ(double[] values) { + valuesQ = values; + } + + + protected void setSingleQFree(double[] values) { + valuesQFree = values; + } + + + protected double getFromQ() { + return fromQ; + } + + + protected double getFromQFree() { + return fromQFree; + } + + + protected void setFromQ(double fromQ) { + this.fromQ = fromQ; + } + + + protected void setFromQFree(double fromQ) { + this.fromQFree = fromQ; + } + + + protected double getToQ() { + return toQ; + } + + + protected double getToQFree() { + return toQFree; + } + + + protected void setToQ(double toQ) { + this.toQ = toQ; + } + + + protected void setToQFree(double toQ) { + this.toQFree = toQ; + } + + + protected double getStepQ() { + return stepQ; + } + + + protected double getStepQFree() { + return stepQFree; + } + + + protected void setStepQ(double stepQ) { + this.stepQ = stepQ; + } + + + protected void setStepQFree(double stepQ) { + this.stepQFree = stepQ; + } + + protected double[] getSingleW() { + return valuesW; + } + + protected double[] getSingleWFree() { + return valuesWFree; + } + + protected void setSingleW(double[] values) { + valuesW = values; + } + + protected void setSingleWFree(double[] values) { + valuesWFree = values; + } + + protected double getFromW() { + return fromW; + } + + protected double getFromWFree() { + return fromWFree; + } + + protected void setFromW(double fromW) { + this.fromW = fromW; + } + + protected void setFromWFree(double fromW) { + this.fromW = fromW; + } + + protected double getToW() { + return toW; + } + + protected double getToWFree() { + return toWFree; + } + + protected void setToW(double toW) { + this.toW = toW; + } + + protected void setToWFree(double toW) { + this.toWFree = toW; + } + + protected double getStepW() { + return stepW; + } + + protected double getStepWFree() { + return stepWFree; + } + + protected void setStepW(double stepW) { + this.stepW = stepW; + } + + protected void setStepWFree(double stepW) { + this.stepWFree = stepW; + } + + /** + * Determines the min and max kilometer value selected in a former state. A + * bit silly, but we need to run over each value of the "old data" to find + * such values because it is not available here. + * + * @param data The DataList which contains the whole data inserted for the + * current artifact. + * + * @return a double array with [min, max]. + */ + protected double[] getMinMaxKM(DataList[] data) { + ArtifactDescription adesc = artifact.getArtifactDescription(); + return adesc.getKMRange(); + } + + + /** + * Returns the name of the selected river. + * + * @param data The DataList with all data. + * + * @return the name of the current river. + */ + protected String getRiverName() { + ArtifactDescription adesc = artifact.getArtifactDescription(); + return adesc.getRiver(); + } + + + protected void fetchWQData() { + Config config = Config.getInstance(); + String locale = config.getLocale (); + + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList[] data = adescr.getOldData(); + + double[] mm = getMinMaxKM(data); + String river = getRiverName(); + + wqInfoService.getWQInfo(locale, river, mm[0], mm[1], + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not recieve wq informations."); + SC.warn(caught.getMessage()); + } + + @Override + public void onSuccess(WQInfoObject[] wqi) { + int num = wqi != null ? wqi.length :0; + GWT.log("Recieved " + num + " wq informations."); + + if (num == 0) { + return; + } + + addWQInfo(wqi); + + String wq = (String) modes.getValue(FIELD_WQ); + String sr = (String) modes.getValue(FIELD_MODE); + GWT.log("sending: " + wq + ", " + sr); + boolean isQ = wq.contains("Q"); + boolean isFree = wq.contains("FREE"); + boolean isRange = sr.equals(FIELD_MODE_RANGE); + + updatePanels(isQ, isFree, isRange); + } + } + ); + } + + + protected void addWQInfo (WQInfoObject[] wqi) { + for(WQInfoObject wi: wqi) { + WQInfoRecord rec = new WQInfoRecord(wi); + + if (wi.getType().equals("W")) { + wTable.addData(rec); + } + else { + qdTable.addData(rec); + } + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQSimpleArrayPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQSimpleArrayPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,497 @@ +package org.dive4elements.river.client.client.ui; + +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.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.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.GaugeInfoService; +import org.dive4elements.river.client.client.services.GaugeInfoServiceAsync; +import org.dive4elements.river.client.client.services.WQInfoService; +import org.dive4elements.river.client.client.services.WQInfoServiceAsync; +import org.dive4elements.river.client.client.ui.wq.ClickableQDTable; +import org.dive4elements.river.client.client.ui.wq.ClickableWTable; +import org.dive4elements.river.client.client.ui.wq.ClickableWTable.ClickMode; +import org.dive4elements.river.client.client.widgets.DischargeTablesChart; +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.DoubleArrayData; +import org.dive4elements.river.client.shared.model.Gauge; +import org.dive4elements.river.client.shared.model.IntegerOptionsData; +import org.dive4elements.river.client.shared.model.WQInfoObject; +import org.dive4elements.river.client.shared.model.WQInfoRecord; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + + +/** + * An UIProvider for inserting a mode for W or Q and an array of values for each + * mode. + * + * @author Ingo Weinzierl + */ +public class WQSimpleArrayPanel +extends AbstractUIProvider +implements BlurHandler +{ + private static final long serialVersionUID = 3223369196267895010L; + + public static final String FIELD_MODE = "field_mode"; + public static final String FIELD_VALUES = "field_values"; + + public static final int MODE_W = 0; + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected GaugeInfoServiceAsync gaugeService = + GWT.create(GaugeInfoService.class); + + protected WQInfoServiceAsync wqInfoService = + GWT.create(WQInfoService.class); + + protected String modeName; + protected String valuesName; + + protected Canvas valuesWrapper; + + protected TabSet tabs; + + protected DynamicForm modeForm; + protected DoubleArrayPanel panelW; + protected DoubleArrayPanel panelQ; + + protected ClickableWTable wTable; + protected ClickableQDTable qTable; + + + @Override + public Canvas create(DataList data) { + VLayout rootLayout = new VLayout(); + rootLayout.addMember(createLabel(data)); + rootLayout.addMember(createModeForm(data)); + rootLayout.addMember(createValuesForm(data)); + rootLayout.addMember(getNextButton()); + + initializeMode(data); + initializeTables(); + initializeHelperPanel(); + + return rootLayout; + } + + + @Override + public Canvas createOld(DataList dataList) { + IntegerOptionsData modeData = findOptionsData(dataList); + DoubleArrayData valuesData = findValuesData(dataList); + + DataItem[] modeItems = modeData.getItems(); + + HLayout layout = new HLayout(); + VLayout valueContainer = new VLayout(); + + Label label = new Label(dataList.getLabel()); + label.setWidth(200); + label.setHeight(20); + + Label mode = new Label(modeItems[0].getLabel()); + mode.setHeight(20); + mode.setWidth(150); + + Canvas values = createOldValues(modeData, valuesData); + values.setWidth(150); + + valueContainer.addMember(mode); + valueContainer.addMember(values); + + layout.addMember(label); + layout.addMember(valueContainer); + layout.addMember(getBackButton(dataList.getState())); + + return layout; + } + + + @Override + protected Data[] getData() { + Data mode = getModeAsData(); + + if (getMode() == MODE_W) { + return new Data[] { mode, getWValuesAsData() }; + } + else { + return new Data[] { mode, getQValuesAsData() }; + } + } + + + @Override + public List validate() { + List errors = new ArrayList(); + + // TODO IMPLEMENT ME + + return errors; + } + + + @Override + public void onBlur(BlurEvent event) { + // TODO TRIGGER VALIDATION HERE + } + + + protected void initializeMode(DataList dataList) { + IntegerOptionsData data = findOptionsData(dataList); + DataItem[] items = data != null ? data.getItems() : null; + + if (items != null) { + String value = items[0].getStringValue(); + modeForm.setValue(modeName, value); + switchMode(value); + } + } + + + /** Initialize the w/q/d tables for the helper area. */ + protected void initializeTables() { + wTable = new ClickableWTable(new ClickableWTable.WClickedListener() { + @Override + public void clickedUpper(double value) { + // nothing to do here + } + + @Override + public void clickedLower(double value) { + panelW.addValue(value); + } + }, ClickMode.SINGLE, true); + + qTable = new ClickableQDTable(new ClickableQDTable.QClickedListener() { + + @Override + public void clickedUpper(double value) { + // nothing to do here + } + + @Override + public void clickedLower(double value) { + panelQ.addValue(value); + } + }, ClickableQDTable.ClickMode.SINGLE); + + fetchWQData(); + } + + + /** Put interactive tables to the helper area. */ + protected void initializeHelperPanel() { + tabs = new TabSet(); + tabs.setWidth100(); + tabs.setHeight100(); + + Tab w = new Tab(MSG.wq_table_w()); + Tab q = new Tab(MSG.wq_table_q()); + Tab c = new Tab(MSG.discharge_tables_chart()); + + w.setPane(wTable); + q.setPane(qTable); + c.setPane(new DischargeTablesChart(this.artifact)); + + tabs.addTab(w, 0); + tabs.addTab(q, 1); + tabs.addTab(c, 2); + + helperContainer.addMember(tabs); + } + + + protected void fetchWQData() { + ArtifactDescription desc = artifact.getArtifactDescription(); + + final String river = desc.getRiver(); + final String refGauge = desc.getReferenceGauge(); + + gaugeService.getGaugeInfo(river, refGauge, new AsyncCallback>() { + @Override + public void onFailure(Throwable throwable) { + GWT.log("ERROR WHILE FETCHING GAUGES!"); + } + + @Override + public void onSuccess(List gauges) { + Gauge g = gauges.get(0); + updateWQData(river, g.getLower(), g.getUpper()); + } + }); + } + + + protected void updateWQData(String river, double lower, double upper) { + GWT.log("FETCH WQ INFO FOR " + lower + " - " + upper + " now!"); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + wqInfoService.getWQInfo(locale, river, lower, upper, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not recieve wq informations."); + } + + @Override + public void onSuccess(WQInfoObject[] wqi) { + int num = wqi != null ? wqi.length :0; + GWT.log("Recieved " + num + " wq informations."); + + if (num == 0) { + return; + } + + addWQInfo(wqi); + } + } + ); + } + + + protected void addWQInfo (WQInfoObject[] wqi) { + for(WQInfoObject wi: wqi) { + WQInfoRecord rec = new WQInfoRecord(wi); + + if (wi.getType().equals("W")) { + wTable.addData(rec); + } + else { + qTable.addData(rec); + } + } + } + + + protected Canvas createLabel(DataList dataList) { + Label label = new Label(MSG.wqHistorical()); + label.setWidth100(); + label.setHeight(25); + + return label; + } + + + protected Canvas createOldValues( + IntegerOptionsData modeData, + DoubleArrayData valuesData + ) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + + DataItem[] items = modeData.getItems(); + String unit = items[0].getStringValue().equals("0") ? "cm" : "m³/s"; + + VLayout layout = new VLayout(); + + for (double val: valuesData.getValues()) { + Label tmp = new Label(nf.format(val) + " " + unit); + tmp.setHeight(20); + layout.addMember(tmp); + } + + return layout; + } + + + protected DoubleArrayData findValuesData(DataList dataList) { + for (int i = 0, n = dataList.size(); i < n; i++) { + Data tmp = dataList.get(i); + + if (tmp instanceof DoubleArrayData) { + return (DoubleArrayData) tmp; + } + } + + return null; + } + + + protected IntegerOptionsData findOptionsData(DataList dataList) { + for (int i = 0, n = dataList.size(); i < n; i++) { + Data tmp = dataList.get(i); + + if (tmp instanceof IntegerOptionsData) { + return (IntegerOptionsData) tmp; + } + } + + return null; + } + + + protected Canvas createModeForm(DataList dataList) { + IntegerOptionsData data = findOptionsData(dataList); + DataItem[] opts = data != null ? data.getItems() : null; + + if (data == null || opts == null) { + return new Label("NO MODES FOUND"); + } + + modeName = data.getLabel(); + modeForm = new DynamicForm(); + + RadioGroupItem items = new RadioGroupItem(data.getLabel()); + LinkedHashMap values = new LinkedHashMap(); + + for (DataItem opt: opts) { + values.put(opt.getStringValue(), opt.getLabel()); + } + + items.setValueMap(values); + items.setVertical(false); + items.setShowTitle(false); + items.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent event) { + switchMode((String) event.getValue()); + } + }); + + modeForm.setFields(items); + + return modeForm; + } + + + protected Canvas createValuesForm(DataList dataList) { + DoubleArrayData data = findValuesData(dataList); + + if (data == null) { + return new Label("NO VALUES GIVEN!"); + } + + valuesName = data.getLabel(); + panelW = new DoubleArrayPanel(MSG.unitWSingle(), null, this); + panelQ = new DoubleArrayPanel(MSG.unitQSingle(), null, this); + + valuesWrapper = new Canvas(); + valuesWrapper.setWidth100(); + valuesWrapper.setHeight(35); + + return valuesWrapper; + } + + + public void switchMode(String newMode) { + for (Canvas child: valuesWrapper.getChildren()) { + valuesWrapper.removeChild(child); + } + + if (newMode.equals("0")) { + valuesWrapper.addChild(panelW); + showWTable(); + } + else if (newMode.equals("1")) { + valuesWrapper.addChild(panelQ); + showQDTable(); + } + } + + public void showWTable() { + if (tabs != null) { + tabs.selectTab(0); + } + } + + public void showQDTable() { + if (tabs != null) { + tabs.selectTab(1); + } + } + + + public String getModeAsString() { + return (String) modeForm.getValue(modeName); + } + + + public int getMode() { + String modeValue = getModeAsString(); + + try { + return Integer.valueOf(modeValue); + } + catch (NumberFormatException nfe) { + // do something + } + catch (NullPointerException npe) { + // do something + } + + return -1; + } + + + public Data getModeAsData() { + String value = getModeAsString(); + DataItem item = new DefaultDataItem(value, value, value); + + return new DefaultData(modeName, null, null, new DataItem[] { item }); + } + + + public Data getWValuesAsData() { + double[] values = panelW.getInputValues(); + String valueStr = getStringValue(values); + + DataItem item = new DefaultDataItem(valueStr, valueStr, valueStr); + + return new DefaultData(valuesName, null, null, new DataItem[] { item }); + } + + + public Data getQValuesAsData() { + double[] values = panelQ.getInputValues(); + String valueStr = getStringValue(values); + + DataItem item = new DefaultDataItem(valueStr, valueStr, valueStr); + + return new DefaultData(valuesName, null, null, new DataItem[] { item }); + } + + + protected static String getStringValue(double[] values) { + StringBuilder sb = new StringBuilder(); + boolean first = true; + + for (double value: values) { + if (first) { + sb.append(String.valueOf(value)); + first = false; + } + else { + sb.append(";" + String.valueOf(value)); + } + } + + return sb.toString(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WaterlevelGroundPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WaterlevelGroundPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,119 @@ +package org.dive4elements.river.client.client.ui; + +public class WaterlevelGroundPanel extends DistancePanel { + + private static final long serialVersionUID = 6598703468619862469L; + + public static final String FIELD_LOWER = "diff_from"; + public static final String FIELD_UPPER = "diff_to"; + public static final String FIELD_STEP = "diff_diff"; + + + public WaterlevelGroundPanel() { + super("left"); + } + + + @Override + protected String getLowerField() { + return FIELD_LOWER; + } + + + @Override + protected String getUpperField() { + return FIELD_UPPER; + } + + + @Override + protected String getStepField() { + return FIELD_STEP; + } + + + @Override + protected String getLabel() { + return MSG.waterlevel_ground_state(); + } + + + @Override + protected String labelFrom() { + return getLabelFrom() + " [" + getUnitFrom() + "]"; + } + + + @Override + protected String getLabelFrom() { + return MSG.wgLabelFrom(); + } + + + @Override + protected String getUnitFrom() { + return MSG.wgUnitFrom(); + } + + + @Override + protected String labelTo() { + return getLabelTo() + " [" + getUnitTo() + "]"; + } + + + @Override + protected String getLabelTo() { + return MSG.wgLabelTo(); + } + + + @Override + protected String getUnitTo() { + return MSG.wgUnitTo(); + } + + + @Override + protected String labelStep() { + return getLabelStep() + " [" + getUnitStep() + "]"; + } + + + @Override + protected String getLabelStep() { + return MSG.wgLabelStep(); + } + + + @Override + protected String getUnitStep() { + return MSG.wgUnitStep(); + } + + + @Override + protected double getDefaultFrom() { + return 0; + } + + + @Override + protected double getDefaultTo() { + return 0; + } + + + @Override + protected double getDefaultStep() { + return 0; + } + + + @Override + protected void initHelperPanel() { + // We don't need a helper panel here. But we have to override this + // method to avoid the table creation in the parent class. + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WspDatacagePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WspDatacagePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,169 @@ +package org.dive4elements.river.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.events.ClickEvent; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.StepForwardEvent; +import org.dive4elements.river.client.client.services.LoadArtifactService; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.Recommendation.Facet; +import org.dive4elements.river.client.shared.model.Recommendation.Filter; +import org.dive4elements.river.client.shared.model.ToLoad; +import org.dive4elements.river.client.shared.model.User; + +import java.util.List; +import java.util.Map; +import java.util.Set; + + +public class WspDatacagePanel extends DatacagePanel { + + private static final long serialVersionUID = 2494432743877141135L; + + public static final String WATERLEVEL_OUTS = "waterlevels"; + + public static final FLYSConstants MSG = GWT.create(FLYSConstants.class); + + + protected LoadArtifactServiceAsync loadService = + GWT.create(LoadArtifactService.class); + + protected Recommendation recommendation; + protected Artifact artifact; + + + public WspDatacagePanel() { + super(); + } + + + public WspDatacagePanel(User user) { + super(user); + } + + + @Override + public String getOuts() { + return WATERLEVEL_OUTS; + } + + + @Override + protected void createWidget() { + super.createWidget(); + widget.setIsMutliSelectable(false); + } + + + /** + * We need to override this method (defined in AbstractUIProvider) because + * we have to create a new Artifact specified by the Datacage selection via + * Async request. + * + * @param e The ClickEvent. + */ + @Override + public void onClick(ClickEvent e) { + List errors = validate(); + if (errors == null || errors.isEmpty()) { + // 1) Fetch selected recommendation + Config config = Config.getInstance(); + final String locale = config.getLocale(); + final Collection c = this.collection; + final Recommendation r = getSelectedRecommendation(); + + + if (r == null) { + SC.warn(MSG.warning_no_wsp_selected()); + return; + } + + // 2) Create, load Artifact and fire event + loadService.load( + c, r, "winfo", locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("WspDatacagePanel", caught); + SC.warn(FLYS.getExceptionString(MSG, caught)); + } + + @Override + public void onSuccess(Artifact artifact) { + fireStepForwardEvent(new StepForwardEvent( + getData(r, artifact))); + } + } + ); + } + else { + showErrors(errors); + } + } + + + protected Recommendation getSelectedRecommendation() { + ToLoad toLoad = widget.getSelection(); + List recoms = toLoad.toRecommendations(); + + return recoms.size() > 0 ? recoms.get(0) : null; + } + + + /** + * Nothing is done in this method. It returns null, because we serve the + * Data another way! + * + * @return always null! + */ + @Override + protected Data[] getData() { + // do nothing here, the Data is fetched on another way in this panel. + return null; + } + + + protected Data[] getData(Recommendation r, Artifact newArtifact) { + String uuid = newArtifact.getUuid(); + r.setMasterArtifact(uuid); + + String value = createDataString(uuid, r.getFilter()); + + DataItem item = new DefaultDataItem(dataName, dataName, value); + return new Data[] { new DefaultData( + dataName, null, null, new DataItem[] { item }) }; + } + + + protected String createDataString(String artifact, Filter filter) { + Facet f = null; + + Map> outs = filter.getOuts(); + Set>> entries = outs.entrySet(); + + for (Map.Entry> entry: entries) { + List fs = entry.getValue(); + + f = fs.get(0); + if (f != null) { + break; + } + } + + return "[" + artifact + ";" + f.getName() + ";" + f.getIndex() + "]"; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartOutputTab.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartOutputTab.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,762 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.types.Overflow; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.events.ResizedEvent; +import com.smartgwt.client.widgets.events.ResizedHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.event.OutputParameterChangeEvent; +import org.dive4elements.river.client.client.event.OutputParameterChangeHandler; +import org.dive4elements.river.client.client.event.PanEvent; +import org.dive4elements.river.client.client.event.PanHandler; +import org.dive4elements.river.client.client.event.RedrawRequestEvent; +import org.dive4elements.river.client.client.event.RedrawRequestEvent.Type; +import org.dive4elements.river.client.client.event.RedrawRequestHandler; +import org.dive4elements.river.client.client.event.ZoomEvent; +import org.dive4elements.river.client.client.event.ZoomHandler; +import org.dive4elements.river.client.client.services.ChartInfoService; +import org.dive4elements.river.client.client.services.ChartInfoServiceAsync; +import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.OutputTab; +import org.dive4elements.river.client.shared.Transform2D; +import org.dive4elements.river.client.shared.model.Axis; +import org.dive4elements.river.client.shared.model.ChartInfo; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.ZoomObj; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Stack; + + +/** + * Tab representing and showing one Chart-output (diagram). + * + * @author Ingo Weinzierl + */ +public class ChartOutputTab +extends OutputTab +implements ResizedHandler, + OutputParameterChangeHandler, + ZoomHandler, + PanHandler, + RedrawRequestHandler +{ + public static final int DEFAULT_CHART_WIDTH = 600; + public static final int DEFAULT_CHART_HEIGHT = 500; + + public static final int THEMEPANEL_MIN_WIDTH = 250; + + /** The service that is used to fetch chart information. */ + protected ChartInfoServiceAsync info = GWT.create(ChartInfoService.class); + + /** The ChartInfo object that provides information about the current + * chart. */ + protected ChartInfo chartInfo; + + /** Transformer used to transform image pixels into chart (data) coordinates. */ + protected Transform2D[] transformer; + + /** The collection view.*/ + protected CollectionView view; + + /** The ThemePanel to expose control over themes (facettes). */ + protected ChartThemePanel ctp; + + /** The canvas that wraps the chart toolbar. */ + protected ChartToolbar tbarPanel; + + /** The canvas that wraps the theme editor. */ + protected Canvas left; + + /** The canvas that wraps the chart. */ + protected Canvas right; + + protected Img chart; + + /** Chart zoom options. */ + protected int[] xrange; + protected int[] yrange; + + /** Stack of ZoomObj to allow 'redo last zoom'-kind of actions. */ + protected Stack zoomStack; + protected Number[] zoom; + + + /** + * The default constructor to create a new ChartOutputTab. + * + * @param title The title of this tab. + * @param collection The Collection which this chart belongs to. + * @param mode The OutputMode. + * @param collectionView The shown collection. + */ + public ChartOutputTab( + String title, + Collection collection, + OutputMode mode, + CollectionView collectionView + ){ + super(title, collection, collectionView, mode); + + view = collectionView; + left = new Canvas(); + right = new Canvas(); + xrange = new int[2]; + yrange = new int[2]; + zoomStack = new Stack(); + + zoom = new Number[] { + new Double(0), new Double(1), + new Double(0), new Double(1) }; + + left.setBorder("1px solid gray"); + left.setWidth(THEMEPANEL_MIN_WIDTH); + left.setMinWidth(THEMEPANEL_MIN_WIDTH); + right.setWidth("*"); + + VLayout vLayout = new VLayout(); + vLayout.setMembersMargin(2); + + HLayout hLayout = new HLayout(); + hLayout.setWidth100(); + hLayout.setHeight100(); + hLayout.setMembersMargin(10); + + hLayout.addMember(left); + hLayout.addMember(right); + + ctp = createThemePanel(mode, collectionView); + if (ctp != null) { + ctp.addRedrawRequestHandler(this); + ctp.addOutputParameterChangeHandler(this); + left.addChild(ctp); + } + else { + left.setVisible(false); + } + + chart = createChartImg(); + right.addChild(chart); + right.setOverflow(Overflow.HIDDEN); + + left.setShowResizeBar(true); + + tbarPanel = createChartToolbar(this); + vLayout.addMember(tbarPanel); + vLayout.addMember(hLayout); + vLayout.setOverflow(Overflow.HIDDEN); + + setPane(vLayout); + + right.addResizedHandler(this); + } + + + public ChartThemePanel createThemePanel( + OutputMode mode, CollectionView view + ) { + // Output "cross_section" needs slightly modified ThemePanel + // (with action buttons). + if (mode.getName().equals("cross_section")) { + return new CrossSectionChartThemePanel(mode, view); + } + else { + return new ChartThemePanel(mode, view); + } + } + + + public ChartToolbar createChartToolbar(ChartOutputTab tab) { + return new ChartToolbar(tab); + } + + + public void toggleThemePanel() { + this.left.setVisible(!left.isVisible()); + } + + + /** + * This method is called after the chart panel has resized. It removes the + * chart - if existing - and requests a new one with adjusted size. + * + * @param event The resize event. + */ + @Override + public void onResized(ResizedEvent event) { + updateChartPanel(); + updateChartInfo(); + } + + + /** For RESET type of events, just reset the ranges, otherwise do a + * complete refresh of panel, info and collection. */ + @Override + public void onRedrawRequest(RedrawRequestEvent event) { + if (event.getType() == Type.RESET) { + resetRanges(); + } + else { + ctp.updateCollection(); + updateChartPanel(); + updateChartInfo(); + } + } + + + /** + * Listens to change event in the chart them panel and updates chart after + * receiving such an event. + * + * @param event The OutputParameterChangeEvent. + */ + @Override + public void onOutputParameterChanged(OutputParameterChangeEvent event) { + updateChartInfo(); + updateChartPanel(); + } + + + /** + * Listens to zoom events and refreshes the current chart in such case. + * + * @param evt The ZoomEvent that stores the coordinates for zooming. + */ + @Override + public void onZoom(ZoomEvent evt) { + zoomStack.push(new ZoomObj(zoom[0], zoom[1], zoom[2], zoom[3])); + + xrange[0] = evt.getStartX(); + xrange[1] = evt.getEndX(); + yrange[0] = evt.getStartY(); + yrange[1] = evt.getEndY(); + + xrange[0] = xrange[0] < xrange[1] ? xrange[0] : xrange[1]; + yrange[0] = yrange[0] < yrange[1] ? yrange[0] : yrange[1]; + + translateCoordinates(); + + updateChartInfo(); + updateChartPanel(); + } + + + protected Number[] translateCoordinates() { + if (xrange == null || (xrange[0] == 0 && xrange[1] == 0)) { + zoom[0] = 0d; + zoom[1] = 1d; + } + else { + translateXCoordinates(); + } + + if (yrange == null || (yrange[0] == 0 && yrange[1] == 0)) { + zoom[2] = 0d; + zoom[3] = 1d; + } + else { + translateYCoordinates(); + } + + return zoom; + } + + + protected void translateXCoordinates() { + Axis xAxis = chartInfo.getXAxis(0); + + Number xmin = xAxis.getMin(); + Number xmax = xAxis.getMax(); + Number xRange = subtract(xmax, xmin); + + Transform2D transformer = getTransformer(0); + + double[] start = transformer.transform(xrange[0], yrange[0]); + double[] end = transformer.transform(xrange[1], yrange[1]); + + zoom[0] = divide(subtract(start[0], xmin), xRange); + zoom[1] = divide(subtract(end[0], xmin), xRange); + } + + + protected void translateYCoordinates() { + Axis yAxis = chartInfo.getYAxis(0); + + Number ymin = yAxis.getMin(); + Number ymax = yAxis.getMax(); + Number yRange = subtract(ymax, ymin); + + Transform2D transformer = getTransformer(0); + + double[] start = transformer.transform(xrange[0], yrange[0]); + double[] end = transformer.transform(xrange[1], yrange[1]); + + zoom[2] = divide(subtract(start[1], ymin), yRange); + zoom[3] = divide(subtract(end[1], ymin), yRange); + } + + + @Override + public void onPan(PanEvent event) { + if (chartInfo == null) { + return; + } + + int[] start = event.getStartPos(); + int[] end = event.getEndPos(); + + Transform2D t = getTransformer(); + + double[] ts = t.transform(start[0], start[1]); + double[] tt = t.transform(end[0], end[1]); + + double diffX = ts[0] - tt[0]; + double diffY = ts[1] - tt[1]; + + Axis xAxis = chartInfo.getXAxis(0); + Axis yAxis = chartInfo.getYAxis(0); + + Number[] x = panAxis(xAxis, diffX); + Number[] y = panAxis(yAxis, diffY); + + // Set the zoom coordinates. + zoom[0] = x[0]; + zoom[1] = x[1]; + zoom[2] = y[0]; + zoom[3] = y[1]; + + updateChartInfo(); + updateChartPanel(); + } + + + protected Number[] panAxis(Axis axis, double diff) { + Number min = axis.getFrom(); + Number max = axis.getTo(); + + min = add(min, diff); + max = add(max, diff); + + return computeZoom(axis, min, max); + } + + + public void resetRanges() { + zoomStack.push(new ZoomObj(zoom[0], zoom[1], zoom[2], zoom[3])); + + zoom[0] = 0d; + zoom[1] = 1d; + zoom[2] = 0d; + zoom[3] = 1d; + + updateChartInfo(); + updateChartPanel(); + } + + + /** + * This method zooms the current chart out by a given factor. + * + * @param factor The factor should be between 0-100. + */ + public void zoomOut(int factor) { + if (factor < 0 || factor > 100 || chartInfo == null) { + return; + } + + zoomStack.push(new ZoomObj(zoom[0], zoom[1], zoom[2], zoom[3])); + + Axis xAxis = chartInfo.getXAxis(0); + Axis yAxis = chartInfo.getYAxis(0); + + Number[] x = zoomAxis(xAxis, factor); + Number[] y = zoomAxis(yAxis, factor); + + zoom[0] = x[0]; + zoom[1] = x[1]; + zoom[2] = y[0]; + zoom[3] = y[1]; + + updateChartInfo(); + updateChartPanel(); + } + + + /** + * This method is used to zoom out. Zooming out is realized with a stacked + * logic. Initially, you cannot zoom out. For each time you start a zoom-in + * action, the extent of the chart is stored and pushed onto a stack. A + * zoom-out will now lead you to the last extent that is popped from stack. + */ + public void zoomOut() { + if (!zoomStack.empty()) { + zoom = zoomStack.pop().getZoom(); + + updateChartInfo(); + updateChartPanel(); + } + } + + + public Number[] zoomAxis(Axis axis, int factor) { + GWT.log("Prepare Axis for zooming (factor: " + factor + ")"); + + Number min = axis.getMin(); + Number max = axis.getMax(); + Number range = isBigger(max, min) ? subtract(max, min) : subtract(min, max); + + Number curFrom = axis.getFrom(); + Number curTo = axis.getTo(); + + Number diff = isBigger(curTo, curFrom) + ? subtract(curTo, curFrom) + : subtract(curFrom, curTo); + + GWT.log(" max from : " + min); + GWT.log(" max to : " + max); + GWT.log(" max range : " + range); + GWT.log(" current from: " + curFrom); + GWT.log(" current to : " + curTo); + GWT.log(" current diff: " + diff); + + Number newFrom = subtract(curFrom, divide(multi(diff, factor), 100)); + Number newTo = add(curTo, divide(multi(diff, factor), 100)); + + GWT.log(" new from: " + newFrom); + GWT.log(" new to : " + newTo); + + return new Number[] { + divide(subtract(newFrom, min), range), + divide(subtract(newTo, min), range) + }; + } + + + public static Number[] computeZoom(Axis axis, Number min, Number max) { + Number[] hereZoom = new Number[2]; + + Number absMin = axis.getMin(); + Number absMax = axis.getMax(); + Number diff = isBigger(absMax, absMin) + ? subtract(absMax, absMin) + : subtract(absMin, absMax); + + hereZoom[0] = divide(subtract(min, absMin), diff); + hereZoom[1] = divide(subtract(max, absMin), diff); + + return hereZoom; + } + + + /** Get Collection from ChartThemePanel. .*/ + public Collection getCtpCollection() { + return this.ctp.getCollection(); + } + + + /** + * Updates the Transform2D object using the chart info service. + */ + public void updateChartInfo() { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + info.getChartInfo( + view.getCollection(), + locale, + mode.getName(), + getChartAttributes(), + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("ChartInfo ERROR: " + caught.getMessage()); + } + + @Override + public void onSuccess(ChartInfo chartInfo) { + setChartInfo(chartInfo); + } + }); + } + + + public void updateChartPanel() { + int w = right.getWidth(); + int h = right.getHeight(); + + chart.setSrc(getImgUrl(w, h)); + } + + + /** + * Returns the existing chart panel. + * + * @return the existing chart panel. + */ + public Canvas getChartPanel() { + return right; + } + + + /** Access the Canvas holding the rendered Chart. */ + public Canvas getChartImg() { + return chart; + } + + + /** Get associated ChartInfo object. */ + public ChartInfo getChartInfo() { + return chartInfo; + } + + + protected void setChartInfo(ChartInfo chartInfo) { + this.chartInfo = chartInfo; + } + + + public Transform2D getTransformer() { + return getTransformer(0); + } + + + /** + * Returns the Transform2D object used to transform image coordinates into + * chart (data) coordinates. + * + * @param pos The index of a specific transformer. + * + * @return the Transform2D object. + */ + public Transform2D getTransformer(int pos) { + if (chartInfo == null) { + return null; + } + + return chartInfo.getTransformer(pos); + } + + + /** + * Returns the Transform2D count. + * + * @return the Transformer2D count + */ + public int getTransformerCount() { + if (chartInfo == null) { + return 0; + } + + return chartInfo.getTransformerCount(); + } + + + /** + * Creates a new chart panel with default size. + * + * @return the created chart panel. + */ + protected Img createChartImg() { + return createChartImg(DEFAULT_CHART_WIDTH, DEFAULT_CHART_HEIGHT); + } + + + /** + * Creates a new chart panel with specified width and height. + * + * @param width The width for the chart panel. + * @param height The height for the chart panel. + * + * @return the created chart panel. + */ + protected Img createChartImg(int width, int height) { + Img chart = getChartImg(width, height); + chart.setWidth100(); + chart.setHeight100(); + + return chart; + } + + + /** + * Builds the chart image and returns it. + * + * @param width The chart width. + * @param height The chart height. + * + * @return the chart image. + */ + protected Img getChartImg(int width, int height) { + return new Img(getImgUrl(width, height)); + } + + + /** + * Builds the URL that points to the chart image. + * + * @param width The width of the requested chart. + * @param height The height of the requested chart. + * @param xr Optional x range (used for zooming). + * @param yr Optional y range (used for zooming). + * + * @return the URL to the chart image. + */ + protected String getImgUrl(int width, int height) { + Config config = Config.getInstance(); + + String imgUrl = GWT.getModuleBaseURL(); + imgUrl += "chart"; + imgUrl += "?uuid=" + collection.identifier(); + imgUrl += "&type=" + mode.getName(); + imgUrl += "&locale=" + config.getLocale(); + imgUrl += "×tamp=" + new Date().getTime(); + imgUrl += "&width=" + Integer.toString(width); + imgUrl += "&height=" + Integer.toString(height); + + Number[] zoom = getZoomValues(); + + if (zoom != null) { + if (zoom[0].intValue() != 0 || zoom[1].intValue() != 1) { + // a zoom range of 0-1 means displaying the whole range. In such + // case we don't need to zoom. + imgUrl += "&minx=" + zoom[0]; + imgUrl += "&maxx=" + zoom[1]; + } + + if (zoom[2].intValue() != 0 || zoom[3].intValue() != 1) { + // a zoom range of 0-1 means displaying the whole range. In such + // case we don't need to zoom. + imgUrl += "&miny=" + zoom[2]; + imgUrl += "&maxy=" + zoom[3]; + } + } + + return imgUrl; + } + + + /** Get link to export image in given dimension and format. */ + public String getExportUrl(int width, int height, String format) { + String url = getImgUrl(width, height); + url += "&format=" + format; + url += "&export=true"; + + return url; + } + + + public Map getChartAttributes() { + Map attr = new HashMap(); + + Canvas chart = getChartPanel(); + attr.put("width", chart.getWidth().toString()); + attr.put("height", chart.getHeight().toString()); + + Number[] zoom = getZoomValues(); + + if (zoom != null) { + if (zoom[0].intValue() != 0 || zoom[1].intValue() != 1) { + // a zoom range of 0-1 means displaying the whole range. In such + // case we don't need to zoom. + attr.put("minx", zoom[0].toString()); + attr.put("maxx", zoom[1].toString()); + } + if (zoom[2].intValue() != 0 || zoom[3].intValue() != 1) { + // a zoom range of 0-1 means displaying the whole range. In such + // case we don't need to zoom. + attr.put("miny", zoom[2].toString()); + attr.put("maxy", zoom[3].toString()); + } + } + + return attr; + } + + + protected Number[] getZoomValues() { + return zoom; + } + + + /** Return the 'parent' CollectionView. */ + public CollectionView getView() { + return this.view; + } + + + public static Number subtract(Number left, Number right) { + if (left instanceof Double) { + return new Double(left.doubleValue() - right.doubleValue()); + } + else if (left instanceof Long) { + return new Long(left.longValue() - right.longValue()); + } + else { + return new Integer(left.intValue() - right.intValue()); + } + } + + + /** Add two numbers, casting to Type of param left. */ + public static Number add(Number left, Number right) { + if (left instanceof Double) { + return new Double(left.doubleValue() + right.doubleValue()); + } + else if (left instanceof Long) { + return new Long(left.longValue() + right.longValue()); + } + else { + return new Integer(left.intValue() + right.intValue()); + } + } + + + /** Divde left by right. Note that Long will be casted to double. */ + public static Number divide(Number left, Number right) { + if (left instanceof Double) { + return new Double(left.doubleValue() / right.doubleValue()); + } + else if (left instanceof Long) { + return new Double(left.doubleValue() / right.doubleValue()); + } + else { + return new Integer(left.intValue() / right.intValue()); + } + } + + + public static Number multi(Number left, Number right) { + if (left instanceof Double) { + return new Double(left.doubleValue() * right.doubleValue()); + } + else if (left instanceof Long) { + return new Long(left.longValue() * right.longValue()); + } + else { + return new Integer(left.intValue() * right.intValue()); + } + } + + + public static boolean isBigger(Number left, Number right) { + if (left instanceof Double) { + return left.doubleValue() > right.doubleValue(); + } + else if (left instanceof Long) { + return left.longValue() > right.longValue(); + } + else { + return left.intValue() > right.intValue(); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartPropertiesEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartPropertiesEditor.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,601 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.Alignment; +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.Window; +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.CheckboxItem; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.SelectItem; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.CollectionAttributeService; +import org.dive4elements.river.client.client.services.CollectionAttributeServiceAsync; +import org.dive4elements.river.client.client.utils.DoubleValidator; +import org.dive4elements.river.client.client.utils.IntegerValidator; +import org.dive4elements.river.client.shared.model.BooleanProperty; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.DoubleProperty; +import org.dive4elements.river.client.shared.model.IntegerProperty; +import org.dive4elements.river.client.shared.model.OutputSettings; +import org.dive4elements.river.client.shared.model.Property; +import org.dive4elements.river.client.shared.model.PropertyGroup; +import org.dive4elements.river.client.shared.model.PropertySetting; +import org.dive4elements.river.client.shared.model.Settings; +import org.dive4elements.river.client.shared.model.StringProperty; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Dialog for the Chart-Properties, constructed from respective xml document. + * + * @author Raimund Renkert + */ +public class ChartPropertiesEditor +extends Window +implements ClickHandler +{ + /** The interface that provides i18n messages. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** CollectionAttribute Update Service. */ + protected CollectionAttributeServiceAsync updater = + GWT.create(CollectionAttributeService.class); + + /** The tab called the editor window. */ + protected ChartOutputTab tab; + + /** The tabset for chart properties. */ + protected TabSet tabs; + + /** The collection. */ + protected Collection collection; + + /** The cloned output settings. */ + protected OutputSettings settings; + + /** The original output settings. */ + protected OutputSettings origSettings; + + + + /** + * Setup editor dialog. + * @param callerTab The tab called the editor window. + */ + public ChartPropertiesEditor(ChartOutputTab callerTab) { + this.tab = callerTab; + this.tabs = new TabSet(); + + init(); + } + + + /** + * Initialize the editor window and its components. + */ + protected void init() { + setTitle(MSG.properties()); + setCanDragReposition(true); + setCanDragResize(true); + + collection = tab.getCollectionView().getCollection(); + String outputName = tab.getOutputName(); + origSettings = (OutputSettings)collection.getSettings(outputName); + + settings = (OutputSettings)origSettings.clone(); + if (settings == null) { + return; + } + List list = settings.getCategories(); + + for (int i = 0; i < list.size(); i++) { + Tab t = new Tab(MSG.getString(list.get(i))); + List props = settings.getSettings(list.get(i)); + List origProps = origSettings.getSettings(list.get(i)); + VLayout layout = new VLayout(); + for (int j = 0; j < props.size(); j++) { + if (props.get(j) instanceof PropertyGroup) { + layout.addMember(generatePropertyGroup(props.get(j), + origProps.get(j))); + } + else if (props.get(j) instanceof PropertySetting) { + PropertySetting p = (PropertySetting)props.get(j); + if (p.getAttribute("display").equals("false")) { + continue; + } + layout.addMember(generatePropertySetting(props.get(j), + origProps.get(j))); + } + } + t.setPane(layout); + tabs.addTab(t); + } + + Button accept = new Button(MSG.label_ok()); + Button cancel = new Button(MSG.label_cancel()); + cancel.addClickHandler(this); + accept.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + if(isDialogValid()) { + updateCollection(); + } + else { + GWT.log("Dialog not valid"); + SC.warn(MSG.error_dialog_not_valid()); + } + } + }); + + HLayout buttons = new HLayout(); + buttons.addMember(accept); + buttons.addMember(cancel); + buttons.setAlign(Alignment.CENTER); + buttons.setHeight(30); + + addItem(tabs); + addItem(buttons); + setWidth(380); + setHeight(470); + centerInPage(); + } + + + /** + * This method is called when the user aborts theming. + * @param event The event. + */ + @Override + public void onClick(ClickEvent event) { + this.destroy(); + } + + + /** + * Create a section from group (usually axis properties). + */ + protected Canvas generatePropertyGroup(Property group, Property orig) { + PropertyGroup pg = (PropertyGroup)group; + PropertyGroup origPg = (PropertyGroup)orig; + + if (pg.getName().equals("axis")) { + Label scale = new Label(MSG.scale() + " :"); + scale.setHeight(25); + scale.setMargin(2); + + DynamicForm form1 = new DynamicForm(); + DynamicForm form2 = new DynamicForm(); + form2.setNumCols(6); + + StringProperty label = + (StringProperty)pg.getPropertyByName("label"); + FormItem title = createStringProperty(label); + title.setValue( + ((StringProperty)origPg.getPropertyByName("label")).getValue()); + + IntegerProperty fontsize = + (IntegerProperty)pg.getPropertyByName("font-size"); + FormItem fs = createIntegerProperty(fontsize); + fs.setValue( + ((IntegerProperty) + origPg.getPropertyByName("font-size")).getValue()); + + DoubleProperty upper = + (DoubleProperty)pg.getPropertyByName("upper"); + final FormItem range1 = createDoubleProperty(upper); + range1.setName("rangeupper"); + range1.setWidth(70); + range1.setValue( + ((DoubleProperty) + origPg.getPropertyByName("upper")).toUIString()); + + DoubleProperty lower = + (DoubleProperty)pg.getPropertyByName("lower"); + final FormItem range2 = createDoubleProperty(lower); + range2.setName("rangelower"); + range2.setWidth(70); + range2.setValue( + ((DoubleProperty) + origPg.getPropertyByName("lower")).toUIString()); + + BooleanProperty fixation = + (BooleanProperty)pg.getPropertyByName("fixation"); + FormItem fix = createBooleanProperty(fixation); + fix.setValue(((BooleanProperty) + origPg.getPropertyByName("fixation")).getValue().booleanValue()); + + fix.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent e) { + if ((Boolean)e.getValue()) { + range1.enable(); + range2.enable(); + } + else { + range1.disable(); + range2.disable(); + } + } + }); + if (fix.getValue().toString().equals("true")) { + range1.enable(); + range2.enable(); + } + else { + range1.disable(); + range2.disable(); + } + + form1.setFields(title, fs); + form2.setFields(fix, range2, range1); + + HLayout scaleLayout = new HLayout(); + scaleLayout.setHeight(30); + scaleLayout.addMember(scale); + scaleLayout.addMember(form2); + scaleLayout.setStyleName("property-dialog-axis"); + + VLayout root = new VLayout(); + root.addMember(form1); + root.addMember(scaleLayout); + root.setHeight(90); + + return root; + } + return null; + } + + + /** + * Generate a form with items for the properties/settings, preset with + * values. + */ + protected DynamicForm generatePropertySetting( + Property setting, + Property orig) + { + DynamicForm form = new DynamicForm(); + FormItem item = new FormItem(); + if (setting instanceof BooleanProperty) { + item = createBooleanProperty((BooleanProperty)setting); + item.setValue(((BooleanProperty)orig).getValue().booleanValue()); + } + else if (setting instanceof DoubleProperty) { + item = createDoubleProperty((DoubleProperty)setting); + item.setValue(((DoubleProperty)orig).toUIString()); + } + else if (setting instanceof IntegerProperty) { + item = createIntegerProperty((IntegerProperty)setting); + item.setValue(((IntegerProperty)orig).getValue()); + } + else if (setting instanceof StringProperty) { + StringProperty property = (StringProperty) setting; + item = createStringProperty(property); + item.setValue(((StringProperty)orig).getValue()); + } + else { + GWT.log("generatePropertySetting: unknown setting type."); + } + form.setFields(item); + return form; + } + + + protected FormItem createStringProperty(final StringProperty sp) { + String name = sp.getName(); + if (name.contains("-")) { + name = name.replace("-", "_"); + } + + String choiceAttribute = sp.getAttribute("choice"); + + if (choiceAttribute != null && choiceAttribute.equals("logo")) { + SelectItem logoChooser = new SelectItem(); + logoChooser.setImageURLPrefix(GWT.getHostPageBaseURL() + "images/logo-"); + logoChooser.setValueIconHeight(50); + logoChooser.setValueIconWidth(100); + + LinkedHashMap valueMap = new LinkedHashMap(); + LinkedHashMap valueIcons = new LinkedHashMap(); + valueMap.put("none", MSG.getString("none")); + /* + If you want to add images, remember to change code in these places: + flys-artifacts: + XYChartGenerator.java + Timeseries*Generator.java and + in the flys-client projects Chart*Propert*Editor.java. + Also, these images have to be put in + flys-artifacts/src/main/resources/images/ + flys-client/src/main/webapp/images/ + */ + valueMap.put("BfG", ""); + valueMap.put("Intevation", ""); + valueIcons.put("BfG", "bfg.gif"); + valueIcons.put("Intevation", "intevation.png"); + logoChooser.setValueIcons(valueIcons); + logoChooser.setValueMap(valueMap); + logoChooser.setTitleStyle("color:#000;"); + logoChooser.setTitleAlign(Alignment.LEFT); + logoChooser.setTitle(MSG.getString(name)); + logoChooser.setTitleAlign(Alignment.LEFT); + logoChooser.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + sp.setValue(val); + } + }); + return logoChooser; + } + else if (choiceAttribute != null && choiceAttribute.equals("placeh")) { + SelectItem placeChooser = new SelectItem(); + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("right", MSG.getString("right")); + valueMap.put("left", MSG.getString("left")); + valueMap.put("center", MSG.getString("center")); + placeChooser.setValueMap(valueMap); + placeChooser.setTitleStyle("color:#000;"); + placeChooser.setTitleAlign(Alignment.LEFT); + placeChooser.setTitle(MSG.getString(name)); + placeChooser.setTitleAlign(Alignment.LEFT); + placeChooser.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + sp.setValue(val); + } + }); + return placeChooser; + } + else if (choiceAttribute != null && choiceAttribute.equals("placev")) { + SelectItem placeChooser = new SelectItem(); + LinkedHashMap valueMap = new LinkedHashMap(); + valueMap.put("top", MSG.getString("top")); + valueMap.put("bottom", MSG.getString("bottom")); + valueMap.put("center", MSG.getString("center")); + placeChooser.setValueMap(valueMap); + placeChooser.setTitleStyle("color:#000;"); + placeChooser.setTitleAlign(Alignment.LEFT); + placeChooser.setTitle(MSG.getString(name)); + placeChooser.setTitleAlign(Alignment.LEFT); + placeChooser.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + sp.setValue(val); + } + }); + return placeChooser; + } + + TextItem item = new TextItem(); + item.setTitle(MSG.getString(name)); + item.setTitleAlign(Alignment.LEFT); + item.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + sp.setValue(val); + } + }); + return item; + } + + + /** + * + */ + protected FormItem createBooleanProperty(final BooleanProperty bp) { + String name = bp.getName(); + if (name.contains("-")) { + name = name.replace("-", "_"); + } + + CheckboxItem item = new CheckboxItem("item", MSG.getString(name)); + item.setLabelAsTitle(true); + item.setTitleStyle("color:#000;"); + item.setTitleAlign(Alignment.LEFT); + item.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + bp.setValue(val); + } + }); + return item; + } + + + /** + * + */ + protected FormItem createDoubleProperty(final DoubleProperty dp) { + String name = dp.getName(); + if (name.contains("-")) { + name = name.replace("-", "_"); + } + + TextItem item = new TextItem(); + item.setTitle(MSG.getString(name)); + item.setTitleAlign(Alignment.LEFT); + item.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + DoubleValidator validator = new DoubleValidator(); + Map errors = e.getForm().getErrors(); + if(validator.validate(e.getItem(), errors)) { + dp.setValueFromUI(e.getItem().getValue().toString()); + } + e.getForm().setErrors(errors, true); + } + }); + return item; + } + + + /** + * + */ + protected FormItem createIntegerProperty(final IntegerProperty ip) { + String name = ip.getName(); + if (name.contains("-")) { + name = name.replace("-", "_"); + } + + TextItem item = new TextItem(); + item.setTitle(MSG.getString(name)); + item.setTitleAlign(Alignment.LEFT); + item.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + IntegerValidator validator = new IntegerValidator(); + Map errors = e.getForm().getErrors(); + if(validator.validate(e.getItem(), errors)) { + ip.setValue(e.getItem().getValue().toString()); + } + e.getForm().setErrors(errors, true); + } + }); + return item; + } + + + protected void updateCollection() { + final Config config = Config.getInstance(); + final String loc = config.getLocale(); + + GWT.log("PropertiesEditor.updateCollection via RPC now"); + + Settings s = settings; + collection.addSettings(this.tab.getOutputName(), s); + updater.update(collection, loc, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not update collection attributes."); + SC.warn(MSG.getString(caught.getMessage())); + } + @Override + public void onSuccess(Collection collection) { + updateChartTab(); + } + }); + } + + protected void updateChartTab() { + this.tab.updateChartInfo(); + this.tab.updateChartPanel(); + this.destroy(); + } + + + protected boolean isDialogValid() { + boolean valid = true; + for (int i = 0; i < tabs.getNumTabs(); i++) { + Tab t = tabs.getTab(i); + Canvas container = t.getPane(); + Canvas[] children = container.getChildren(); + for (Canvas c: children) { + valid = validateCanvas(c); + if(!valid) { + return valid; + } + } + } + return valid; + } + + + protected boolean validateCanvas(Canvas c) { + boolean valid = true; + if(c instanceof DynamicForm) { + DynamicForm f = (DynamicForm) c; + FormItem up = f.getItem("rangeupper"); + FormItem lo = f.getItem("rangelower"); + + if(up != null && lo != null && + !up.isDisabled() && !lo.isDisabled()) + { + validateRange(f); + } + return !f.hasErrors(); + } + else if(c.getChildren().length > 0) { + for (Canvas child: c.getChildren()) { + valid = validateCanvas(child); + if(!valid) { + return valid; + } + } + } + return valid; + } + + protected boolean validateRange(DynamicForm form) { + Map errors = form.getErrors(); + FormItem up = form.getItem("rangeupper"); + FormItem lo = form.getItem("rangelower"); + + String v1 = up.getValue().toString(); + String v2 = lo.getValue().toString(); + + if(v1.equals(v2)) { + errors.put(up.getFieldName(), MSG.wrongFormat()); + errors.put(lo.getFieldName(), MSG.wrongFormat()); + form.setErrors(errors, true); + return false; + } + return true; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartThemePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartThemePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,461 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.menu.Menu; +import com.smartgwt.client.widgets.menu.MenuItem; +import com.smartgwt.client.widgets.menu.events.ClickHandler; +import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.FeedServiceAsync; +import org.dive4elements.river.client.client.services.LoadArtifactService; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; +import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.ThemePanel; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DefaultArtifact; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.FacetRecord; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.Theme; +import org.dive4elements.river.client.shared.model.ThemeList; + + +/** + * ThemePanel on the left in CollectionView. + * Contains control widgets for "themes", which are plotted in a diagram (chart). + * + * @author Ingo Weinzierl + */ +public class ChartThemePanel extends ThemePanel { + /** Artifact Clone/Creation service. */ + protected LoadArtifactServiceAsync loadService = + GWT.create(LoadArtifactService.class); + + /** The interface that provides i18n messages. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + public static final String GRID_FIELD_ACTIVE = "active"; + public static final String GRID_FIELD_NAME = "name"; + public static final String GRID_FIELD_ACTIONS = "actions"; + + FeedServiceAsync feedService = GWT.create( + org.dive4elements.river.client.client.services.FeedService.class); + + + /** Constructor for a ChartThemePanel. */ + public ChartThemePanel( + OutputMode mode, + CollectionView view + ) { + super(mode, view); + + initGrid(); + initLayout(); + + updateGrid(); + } + + + /** Creates Layout with theme list and navigation bar inside. */ + protected VLayout createLayout() { + VLayout layout = new VLayout(); + layout.setWidth100(); + layout.setHeight100(); + + layout.addMember(list); + layout.addMember(navigation); + + return layout; + } + + + /** + * Initializes the layout of this panel. + */ + protected void initLayout() { + setWidth100(); + setHeight100(); + + addChild(createLayout()); + } + + + /** + * Initializes the components (columns) of the theme grid. + */ + protected void initGrid() { + list.setCanEdit(true); + list.setCanSort(false); + list.setShowRecordComponents(false); + list.setShowRecordComponentsByCell(true); + list.setShowHeader(true); + list.setShowHeaderContextMenu(false); + list.setWidth100(); + list.setHeight100(); + + list.addEditCompleteHandler(this); + + ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20); + active.setType(ListGridFieldType.BOOLEAN); + + ListGridField name = new ListGridField( + GRID_FIELD_NAME, MSG.chart_themepanel_header_themes()); + name.setType(ListGridFieldType.TEXT); + + list.setFields(active, name); + } + + + /** Set theme active/inactive. */ + @Override + public void activateTheme(Theme theme, boolean active) { + theme.setActive(active ? 1 : 0); + } + + + /** Returns name of longitudinal section area facets. */ + protected String getAreaFacetName() { + return "longitudinal_section.area"; + } + + + /** Create the DataProvider ('Blackboard') key for a theme. */ + public static String areaKey(Theme theme) { + return theme.getArtifact() + ":" + theme.getFacet() + ":" + + theme.getIndex(); + } + + + /** + * Tell an area artifact where to get the upper and lower curve from. + * @param artifact UUID of area-artifact. + */ + public void feedTellArea( + final String artifact, + Theme under, + Theme over, + boolean between + ) { + Data[] feedData; + + if (over != null && under != null) { + feedData = new Data[] { + DefaultData.createSimpleStringData("area.curve_under", + areaKey(under)), + DefaultData.createSimpleStringData("area.curve_over", + areaKey(over)), + DefaultData.createSimpleStringData("area.name", + over.getDescription() + " / " + under.getDescription()), + DefaultData.createSimpleStringData("area.facet", + getAreaFacetName()), + DefaultData.createSimpleStringData("area.between", + (between)? "true" : "false") + }; + GWT.log("Have 'over' and 'under' curve"); + } + else if (over == null && under != null) { + feedData = new Data[] { + DefaultData.createSimpleStringData("area.curve_under", + areaKey(under)), + DefaultData.createSimpleStringData("area.name", + under.getDescription() + " / " + MSG.getString("x_axis")), + DefaultData.createSimpleStringData("area.facet", + getAreaFacetName()), + DefaultData.createSimpleStringData("area.between", + (between)? "true" : "false") + }; + GWT.log("Have 'under' curve only"); + } + else if (over != null && under == null) { + feedData = new Data[] { + DefaultData.createSimpleStringData("area.curve_over", + areaKey(over)), + DefaultData.createSimpleStringData("area.name", + MSG.getString("x_axis") + " / " + over.getDescription()), + DefaultData.createSimpleStringData("area.facet", + getAreaFacetName()), + DefaultData.createSimpleStringData("area.between", + (between)? "true" : "false") + }; + GWT.log("Have 'over' curve only"); + } + else { + GWT.log("Missing Data for area painting."); + return; + } + + feedService.feed( + Config.getInstance().getLocale(), + new DefaultArtifact(artifact, "TODO:hash"), + feedData, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not feed artifact (" + artifact + + ") with area info: " + caught.getMessage()); + SC.warn(MSG.getString(caught.getMessage())); + enable(); + } + @Override + public void onSuccess(Artifact fartifact) { + GWT.log("Successfully set area params to " + artifact); + requestRedraw(); + updateCollection(); + updateGrid(); + enable(); + } + }); + } + + + /** + * Create and parameterize a new area artifact. + * @param under + * @param over if null, against axis. + * @param between if true, ignore under/over order. + */ + public void createAreaArtifact( + final Theme over, + final Theme under, + final boolean between + ) { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + Recommendation area = new Recommendation( + "area", + "", + "", + null); + Recommendation[] recommendations = new Recommendation[] {area}; + + loadService.loadMany( + this.getCollection(), + recommendations, + null, //use individual factories. + locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Failed, no area artifact: " + caught.getMessage()); + enable(); + // TODO i18n + SC.warn("Failed, no area artifact: " + caught.getMessage()); + } + @Override + public void onSuccess(Artifact[] artifacts) { + GWT.log("Success, created area artifact: " + + artifacts[0].getUuid()); + // Now, feed the artifact with the relevant data. + feedTellArea(artifacts[0].getUuid(), under, over, between); + } + } + ); + } + + + /** + * Return true if two themes are canditates for an area being + * rendered between them. + * TODO join with canArea, generalize to allow easier modification + * in subclasses. + */ + protected boolean areAreaCompatible(Theme a, Theme b) { + if (a.equals(b)) { + return false; + } + if (a.getFacet().equals("longitudinal_section.w") || + a.getFacet().equals("other.wkms")) { + return b.getFacet().equals("longitudinal_section.w") + || b.getFacet().equals("other.wkms"); + } + else if (a.getFacet().equals("longitudinal_section.q")) { + return b.getFacet().equals("longitudinal_section.q"); + } + return false; + } + + + /** + * True if context menu should contain 'create area' submenu on + * this theme. + */ + protected boolean canArea(Theme a) { + return a.getFacet().equals("longitudinal_section.q") + || a.getFacet().equals("longitudinal_section.w") + || a.getFacet().equals("other.wkms"); + } + + + /** Attach menu/item to open editor for Manual Points. */ + protected void attachManualPointsMenu(Menu menu) { + menu.addItem(createSeparator()); + MenuItem editManualPoints = new MenuItem(MSG.editpoints()); + + editManualPoints.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + if(mode.getName().equals("historical_discharge")) { + new ManualDatePointsEditor(view.getCollection(), + redrawRequestHandlers.get(0), + mode.getName()).show(); + } + else { + new ManualPointsEditor(view.getCollection(), + redrawRequestHandlers.get(0), + mode.getName()).show(); + } + } + }); + menu.addItem(editManualPoints); + } + + + /** + * Include area specific menu items and manual point editor, depending + * on facet. + */ + @Override + protected Menu getSingleContextMenu(final ListGridRecord[] records) { + Menu menu = super.getSingleContextMenu(records); + + final Theme facetTheme = ((FacetRecord)records[0]).getTheme(); + + if (!canArea(facetTheme)) { + if (facetTheme.getFacet().endsWith("manualpoints")) { + attachManualPointsMenu(menu); + return menu; + } + else { + return menu; + } + } + + menu.addItem(createSeparator()); + + MenuItem areaMenuItem = new MenuItem(MSG.chart_themepanel_new_area()); + Menu areaMenu = new Menu(); + + ThemeList themes = getThemeList(); + int nThemes = themes.getThemeCount(); + + // Create the "under..." submenu. + MenuItem underMenuItem = new MenuItem(MSG.chart_themepanel_area_under()); + Menu underMenu = new Menu(); + for (int i = 0; i < nThemes; i++) { + final Theme theme = themes.getThemeAt(i+1); + + if (theme.getVisible() == 0) { + continue; + } + + if (!areAreaCompatible(facetTheme, theme)) { + continue; + } + + MenuItem againster = new MenuItem(theme.getDescription()); + underMenu.addItem(againster); + + againster.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + disable(); + createAreaArtifact(theme, facetTheme, false); + } + }); + } + + // Create the "over..." submenu. + MenuItem overMenuItem = new MenuItem(MSG.chart_themepanel_area_over()); + Menu overMenu = new Menu(); + for (int i = 0; i < nThemes; i++) { + final Theme theme = themes.getThemeAt(i+1); + if (theme.getVisible() == 0) { + continue; + } + if (!areAreaCompatible(facetTheme, theme)) { + continue; + } + MenuItem againster = new MenuItem(theme.getDescription()); + overMenu.addItem(againster); + + againster.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + disable(); + createAreaArtifact(facetTheme, theme, false); + } + }); + } + overMenu.addItem(createSeparator()); + MenuItem againstAxis = new MenuItem(MSG.getString("x_axis")); + againstAxis.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + disable(); + createAreaArtifact(null, facetTheme, false); + } + }); + overMenu.addItem(againstAxis); + + // Create the "between..." submenu. + MenuItem betweenMenuItem = new MenuItem(MSG.chart_themepanel_area_between()); + Menu betweenMenu = new Menu(); + for (int i = 0; i < nThemes; i++) { + final Theme theme = themes.getThemeAt(i+1); + if (theme.getVisible() == 0) { + continue; + } + if (!areAreaCompatible(facetTheme, theme)) { + continue; + } + MenuItem againster = new MenuItem(theme.getDescription()); + betweenMenu.addItem(againster); + + againster.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + disable(); + createAreaArtifact(facetTheme, theme, true); + } + }); + } + betweenMenu.addItem(createSeparator()); + betweenMenu.addItem(againstAxis); + + overMenuItem.setSubmenu(overMenu); + underMenuItem.setSubmenu(underMenu); + betweenMenuItem.setSubmenu(betweenMenu); + + areaMenu.addItem(betweenMenuItem); + areaMenu.addItem(overMenuItem); + areaMenu.addItem(underMenuItem); + areaMenu.addItem(createSeparator()); + MenuItem standAloneAgainstAxis = new MenuItem(MSG.getString("against_x_axis")); + standAloneAgainstAxis.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + disable(); + createAreaArtifact(null, facetTheme, false); + } + }); + areaMenu.addItem(standAloneAgainstAxis); + + areaMenuItem.setSubmenu(areaMenu); + menu.addItem(areaMenuItem); + + return menu; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartToolbar.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartToolbar.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,338 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.ImgButton; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.ZoomEvent; +import org.dive4elements.river.client.client.event.ZoomHandler; +import org.dive4elements.river.client.client.ui.ImgLink; +import org.dive4elements.river.client.client.ui.Toolbar; + + +/** + * Toolbar with buttons/icons to open datacage, switch to zoom mode, zoom out + * etc. + * + * @author Ingo Weinzierl + */ +public class ChartToolbar extends Toolbar implements ZoomHandler { + + protected static FLYSConstants MSG = GWT.create(FLYSConstants.class); + + public static final int PANEL_HEIGHT = 35; + + protected Button manageThemes; + protected Button datacage; + protected ImgLink downloadPNG; + protected ImgLink downloadPDF; + protected ImgLink downloadSVG; + protected Canvas downloadCSV; + protected MousePositionPanel position; + protected ZoomboxControl zoombox; + protected ImgButton zoomToMaxExtent; + protected ImgButton historyBack; + protected ImgButton zoomOut; + protected ImgButton chartProperties; + protected Button addPoints; + protected Button addWSP; + protected ImgLink exportAT; + protected PanControl panControl; + + + /** @param chartTab Output-Tab on which this toolbar is located. */ + public ChartToolbar(ChartOutputTab chartTab) { + super(chartTab); + initTools(); + } + + + protected void initTools() { + ChartOutputTab chartTab = getChartOutputTab(); + + manageThemes = new Button(MSG.manageThemes()); + datacage = new Button(MSG.databasket()); + position = new MousePositionPanel(chartTab); + zoombox = new ZoomboxControl(chartTab, MSG.zoom_in()); + zoomToMaxExtent = new ImgButton(); + zoomOut = new ImgButton(); + historyBack = new ImgButton(); + panControl = new PanControl(chartTab, MSG.pan()); + chartProperties = new ImgButton(); + addPoints = new Button(MSG.points()); + + if (chartTab.getMode().getName().equals("cross_section")) { + addWSP = new Button(MSG.addWSPButton()); + addWSP.setTooltip(MSG.addWSPTooltip()); + final ChartOutputTab finalChartTab = chartTab; + addWSP.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent ce) { + new ManualWSPEditor(finalChartTab.getView().getCollection(), + finalChartTab, finalChartTab.getMode().getName()).show(); + }}); + } + + addPoints.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + openPointWindow(); + } + }); + addPoints.setTooltip(MSG.addPointsTooltip()); + + manageThemes.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + getChartOutputTab().toggleThemePanel(); + } + }); + + datacage.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + GWT.log("Clicked 'datacage' button."); + openDatacageWindow((ChartOutputTab) getOutputTab()); + } + }); + + String baseUrl = GWT.getHostPageBaseURL(); + String moduleUrl = GWT.getModuleBaseURL(); + Config config = Config.getInstance(); + + if (chartTab.getMode().getName().equals("fix_wq_curve")) { + exportAT = new ImgLink( + baseUrl + MSG.downloadCSV(), + moduleUrl + "export" + + "?uuid=" + chartTab.getCollection().identifier() + + "&name=" + chartTab.getMode().getName() + + "&mode=" + chartTab.getMode().getName() + "_at_export" + + "&type=at" + + "&server=" + config.getServerUrl() + + "&locale=" + config.getLocale() + + "&km=" + chartTab.getCollectionView().getCurrentKm(), + 20, + 20 + ); + exportAT.setTooltip(MSG.exportATTooltip()); + } + + downloadPNG = new ImgLink( + baseUrl + MSG.downloadPNG(), + chartTab.getExportUrl(-1, -1, "png"), + 20, + 20); + downloadPNG.setTooltip(MSG.downloadPNGTooltip()); + + downloadPDF = new ImgLink( + baseUrl + MSG.downloadPDF(), + chartTab.getExportUrl(1280, 1024, "pdf"), + 20, + 20); + downloadPDF.setTooltip(MSG.downloadPDFTooltip()); + + downloadSVG = new ImgLink( + baseUrl + MSG.downloadSVG(), + chartTab.getExportUrl(1280, 1024, "svg"), + 20, + 20); + downloadSVG.setTooltip(MSG.downloadSVGTooltip()); + + downloadCSV = new ImgLink( + baseUrl + MSG.downloadCSV(), + chartTab.getExportUrl(-1, -1, "csv"), + 20, + 20); + downloadCSV.setTooltip(MSG.downloadCSVTooltip()); + + zoomToMaxExtent.setSrc(baseUrl + MSG.zoom_all()); + adjustImageButton(zoomToMaxExtent); + zoomToMaxExtent.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + getChartOutputTab().resetRanges(); + // Relink the export buttons. + onZoom(null); + } + }); + zoomToMaxExtent.setTooltip(MSG.zoomToMaxExtentTooltip()); + + zoomOut.setSrc(baseUrl + MSG.zoom_out()); + adjustImageButton(zoomOut); + zoomOut.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + getChartOutputTab().zoomOut(10); + // Relink the export buttons. + onZoom(null); + } + }); + zoomOut.setTooltip(MSG.zoomOutTooltip()); + + historyBack.setSrc(baseUrl + MSG.zoom_back()); + adjustImageButton(historyBack); + historyBack.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + getChartOutputTab().zoomOut(); + // Relink the export buttons. + onZoom(null); + } + }); + historyBack.setTooltip(MSG.historyBackTooltip()); + + zoombox.addZoomHandler(chartTab); + zoombox.addZoomHandler(this); + zoombox.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + panControl.deselect(); + } + }); + zoombox.setTooltip(MSG.zoomboxTooltip()); + + panControl.addPanHandler(chartTab); + panControl.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + zoombox.deselect(); + } + }); + panControl.setTooltip(MSG.panControlTooltip()); + + chartProperties.setSrc(baseUrl + MSG.properties_ico()); + adjustImageButton(chartProperties); + chartProperties.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + openPropertiesEditor(); + } + }); + chartProperties.setTooltip(MSG.chartPropertiesTooltip()); + + initLayout(); + } + + /** Set width, height and other properties of an imagebutton. */ + public void adjustImageButton(ImgButton imgButton) { + imgButton.setWidth(20); + imgButton.setHeight(20); + imgButton.setShowDown(false); + imgButton.setShowRollOver(false); + imgButton.setShowRollOverIcon(false); + imgButton.setShowDisabled(false); + imgButton.setShowDisabledIcon(true); + imgButton.setShowDownIcon(false); + imgButton.setShowFocusedIcon(false); + } + + + protected ChartOutputTab getChartOutputTab() { + return (ChartOutputTab)getOutputTab(); + } + + + protected void initLayout() { + setWidth100(); + setHeight(PANEL_HEIGHT); + setMembersMargin(10); + setPadding(5); + setBorder("1px solid black"); + + Label spacer = new Label(); + spacer.setWidth("*"); + datacage.setWidth("95px"); + position.setWidth("200px"); + + addMember(manageThemes); + addMember(datacage); + addMember(downloadPNG); + addMember(downloadPDF); + addMember(downloadSVG); + addMember(downloadCSV); + if (getChartOutputTab().getMode().getName().equals("fix_wq_curve")) { + addMember(exportAT); + } + addMember(zoomToMaxExtent); + addMember(historyBack); + addMember(zoomOut); + addMember(zoombox); + addMember(panControl); + addMember(chartProperties); + addMember(addPoints); + + if (getChartOutputTab().getMode().getName().equals("cross_section")) { + addMember(addWSP); + } + + addMember(spacer); + addMember(position); + } + + /** + * Open the chart property editor dialog. + */ + protected void openPropertiesEditor() { + ChartPropertiesEditor editor = + new ChartPropertiesEditor(getChartOutputTab()); + editor.show(); + } + + + /** Open editor for custom points. */ + protected void openPointWindow() { + ChartOutputTab chartTab = getChartOutputTab(); + if (chartTab.getMode().getName().equals("historical_discharge")) { + new ManualDatePointsEditor(chartTab.getView().getCollection(), + chartTab, chartTab.getMode().getName()).show(); + } + else { + new ManualPointsEditor(chartTab.getView().getCollection(), + chartTab, chartTab.getMode().getName()).show(); + } + } + + + /** + * Sets new sources to the export button/images, such that the + * correct zoom values are included in the request when clicked. + * @param evt ignored. + */ + @Override + public void onZoom(ZoomEvent evt) { + ChartOutputTab chartTab = getChartOutputTab(); + downloadPNG.setSource(chartTab.getExportUrl(-1, -1, "png")); + downloadPDF.setSource(chartTab.getExportUrl(-1, -1, "pdf")); + downloadSVG.setSource(chartTab.getExportUrl(-1, -1, "svg")); + } + + public void deselectControls() { + zoombox.deselect(); + } + + public void updateLinks() { + ChartOutputTab chartTab = getChartOutputTab(); + String moduleUrl = GWT.getModuleBaseURL(); + Config config = Config.getInstance(); + + if (chartTab.getMode().getName().equals("fix_wq_curve")) { + exportAT.setSource( + moduleUrl + "export" + + "?uuid=" + chartTab.getCollection().identifier() + + "&mode=" + chartTab.getMode().getName() + "_at_export" + + "&type=at" + + "&server=" + config.getServerUrl() + + "&locale=" + config.getLocale() + + "&km=" + chartTab.getCollectionView().getCurrentKm()); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/CrossSectionChartThemePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/CrossSectionChartThemePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,722 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.SelectItem; +import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; +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.layout.VLayout; +import com.smartgwt.client.widgets.menu.Menu; +import com.smartgwt.client.widgets.menu.MenuItem; +import com.smartgwt.client.widgets.menu.events.ClickHandler; +import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.services.CrossSectionKMServiceAsync; +import org.dive4elements.river.client.client.services.LoadArtifactService; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; +import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.widgets.KMSpinner; +import org.dive4elements.river.client.client.widgets.KMSpinnerChangeListener; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DefaultArtifact; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.FacetRecord; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.Theme; +import org.dive4elements.river.client.shared.model.ThemeList; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + + +/** + * ThemePanel much like ChartThemePanel, but shows an "Actions" column, + * needed for interaction in the CrossSection Charts and a selector to + * declare which cross section profile is "master" (waterlevels refer to the + * chosen kilometer of that cross section profile). + * Also can show 'area creation' context menus. + */ +public class CrossSectionChartThemePanel +extends ChartThemePanel +implements KMSpinnerChangeListener +{ + /** Artifact Clone/Creation service. */ + protected LoadArtifactServiceAsync loadService = + GWT.create(LoadArtifactService.class); + + /** Service to query measurement points of cross sections. */ + CrossSectionKMServiceAsync kmService = GWT.create( + org.dive4elements.river.client.client.services.CrossSectionKMService.class); + + /** UUID of the current "master" cross section. */ + protected String currentCSMasterUUID; + + /** The layout (used for visual active/inactive feedback). */ + protected VLayout layout; + + /** Data item name for CrossSections selected km. */ + protected static String CS_KM = "cross_section.km"; + + /** Data item name for CrossSections selected km. */ + protected static String CS_IS_MASTER = "cross_section.master?"; + + /** List of cross-section themes through which is moved through synchronously. */ + protected HashSet synchronCrossSectionThemes = new HashSet(); + + /** Data for master artifact combobox.*/ + protected LinkedHashMap masters; + + /** Combobox for master artifacts.*/ + protected SelectItem masterCb; + + + /** + * Trivial constructor. + */ + public CrossSectionChartThemePanel( + OutputMode mode, + CollectionView view) + { + super(mode, view); + } + + + /** Create DefaultArtifact. */ + public static DefaultArtifact artifactReference(String uuid) { + return new DefaultArtifact(uuid, "TODO:hash"); + } + + + /** Access data of collection item of theme. */ + public static String dataOf(Theme theme, String dataItemName) { + if (theme != null && theme.getCollectionItem() != null + && theme.getCollectionItem().getData() != null + ) { + return theme.getCollectionItem().getData().get(dataItemName); + } + + return null; + } + + + /** + * Feed an artifact to let it know that it is master wrt cross-sections. + * @param artifact uuid of an artifact. + */ + public void feedTellMaster(final String artifact) { + Data[] feedData = DefaultData.createSimpleStringDataArray( + CS_IS_MASTER, "1"); + + feedService.feed( + Config.getInstance().getLocale(), + artifactReference(artifact), + feedData, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not feed artifact (" + artifact + + ") with master marker: " + caught.getMessage()); + SC.warn(MSG.getString(caught.getMessage())); + enable(); + } + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully injected master mark to " + artifact); + setCurrentCSMaster(artifact.getUuid()); + requestRedraw(); + enable(); + } + }); + } + + + /** + * Sets currentCSMasterUUID. + */ + public String findCurrentCSMaster() { + ThemeList themeList = getThemeList(); + int count = getThemeList().getThemeCount(); + String firstCSUuid = null; + + for (int i = 1; i <= count; i++) { + Theme theme = themeList.getThemeAt(i); + String value = dataOf(theme, CS_IS_MASTER); + + if (value != null) { + if (firstCSUuid == null) { + firstCSUuid = theme.getArtifact(); + } + if (!value.equals("0")) { + setCurrentCSMaster(theme.getArtifact()); + GWT.log("found a master: " + currentCSMasterUUID + + "/" + theme.getDescription()); + return theme.getDescription(); + } + } + } + // There is none selected. Take the first one. + if (firstCSUuid != null) { + setCurrentCSMaster(firstCSUuid); + feedTellMaster(firstCSUuid); + } + return null; + } + + + /** + * Create Layout, add a master selection box beneath. + */ + @Override + protected VLayout createLayout() { + layout = super.createLayout(); + + // Create "set master" combobox. + masterCb = new SelectItem(); + + masterCb.setTitle(MSG.chart_themepanel_set_master()); + masterCb.setType("comboBox"); + masters = getThemeList().toMapArtifactUUIDDescription("cross_section"); + masterCb.setValueMap(masters); + + final DynamicForm form = new DynamicForm(); + form.setWidth(200); + form.setFields(masterCb); + layout.addMember(form, 0); + + Config config = Config.getInstance(); + final String locale = config.getLocale(); + findCurrentCSMaster(); + masterCb.setValue(getCurrentCSMaster()); + + // Add Change Handler to first unset the old master and then set the + // new master. + masterCb.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + String selectedItem = (String) event.getValue(); + final String artifact = selectedItem; + + disable(); + + // Tell current master that he is not master anymore. + if (getCurrentCSMaster() != null) { + Data[] feedData = DefaultData.createSimpleStringDataArray( + CS_IS_MASTER, "0"); + feedService.feed( + locale, + artifactReference(getCurrentCSMaster()), + feedData, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not un-master artifact (" + + getCurrentCSMaster() + "): " + + caught.getMessage()); + SC.warn(MSG.getString(caught.getMessage())); + enable(); + } + @Override + public void onSuccess(Artifact oldMaster) { + GWT.log("Successfully un-mastered artifact."); + feedTellMaster(artifact); + } + }); + } + else { + feedTellMaster(artifact); + } + } + }); + + return layout; + } + + + /** Disable the UI (becomes gray, inresponsive to user input). */ + @Override + public void disable() { + this.layout.setDisabled(true); + } + + + /** DisDisable the UI (becomes ungray, responsive to user input). */ + @Override + public void enable() { + this.layout.setDisabled(false); + } + + + /** + * Returns a double from the list that has the smallest distance to the + * given to value. In case of multiple values with the same difference, + * the last one is taken. + * @param in possible return values. + * @param to the value to be as close to as possible. + * @param up if true, prefer numerically higher values in case of two + * values with equal distance to \param to. + * @return value from in that is closest to to, -1 if none. + */ + public static double closest(Double[] in, double to, boolean up) { + if (in == null || in.length == 0) { + return -1; + } + if (in[0] == to) { + return to; + } + for (int i = 0; i < in.length; i++) { + GWT.log ("Close? " + in[i]); + } + + double minDiff = Math.abs(to - in[0]); + double bestMatch = in[0]; + for (int i = 1; i < in.length; i++) { + if (in[i] == to) { + return to; + } + if ((in[i] < to && up) + || (in[i] > to && !up)) { + continue; + } + double diff = Math.abs(to - in[i]); + if (diff <= minDiff) { + minDiff = diff; + bestMatch = in[i]; + } + } + return bestMatch; + } + + + /** + * Feed a single artifact with the km of the crosssection to display. + * If its the selected master, also feed the collectionmaster. + * + * @param artifacts List of artifacts to feed. + * @param kmD The km to set. + */ + public void sendFeed(final List artifacts, final double kmD) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + + Data[] feedData = + DefaultData.createSimpleStringDataArray(CS_KM, + Double.valueOf(kmD).toString()); + + disable(); + // TODO + // The ones who do not have data for this km should not show line! + feedService.feedMany( + locale, + artifacts, + feedData, + new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not feed many artifacts " + caught.getMessage()); + SC.warn(MSG.getString(caught.getMessage())); + enable(); + } + @Override + public void onSuccess(List artifact) { + GWT.log("Successfully fed many with km"); + requestRedraw(); + enable(); + } + }); + } + + + /** + * Feed a single artifact with the km of the crosssection to display. + * If its the selected master, also feed the collectionmaster. + * @param artUUID The UUID of the artifact to feed. + * @param kmD The km to set. + */ + public void sendFeed(final String artUUID, final double kmD) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + + Data[] feedData = + DefaultData.createSimpleStringDataArray(CS_KM, + Double.valueOf(kmD).toString()); + + disable(); + feedService.feed( + locale, + artifactReference(artUUID), + feedData, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not feed artifact " + caught.getMessage()); + SC.warn(MSG.getString(caught.getMessage())); + enable(); + } + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully fed with km"); + requestRedraw(); + enable(); + } + }); + } + + + /** Remove the themes, also from the master (reference) select box. */ + @Override + protected void removeThemes(final ListGridRecord[] records) { + // TODO take care of what happens if that was the last + // cross section and/or the cross section currently selected as master. + for (ListGridRecord record: records) { + FacetRecord facet = (FacetRecord) record; + Theme theme = facet.getTheme(); + masters.remove(theme.getArtifact()); + } + masterCb.setValueMap(masters); + super.removeThemes(records); + } + + + /** + * Callback for when a value has been accepted in the km-spinner + * of a Cross-Section Profile theme. + * @param item The SpinnerItem which was manipulated. + * @param enteredKm The double-parsed value that has been entered. + * @param facetRecord The underlying datastores record. + * @param up If true, numerically higher values are preferred if + * two values in \param in are in the same distance to + * \param to. + */ + @Override + public void spinnerValueEntered(KMSpinner spinner, final double enteredKm, final FacetRecord facetRecord, final boolean up) { + disable(); + Config config = Config.getInstance(); + final String locale = config.getLocale(); + + Map map = new HashMap(); + int _dbid = -1; + try { + _dbid = Integer.valueOf(facetRecord.getTheme() + .getCollectionItem() + .getData().get("cross_section.dbid")); + } + catch (NumberFormatException nfe) { + GWT.log("Could not extract cross-section db id from data."); + } + final int dbid = _dbid; + + map.put(dbid, enteredKm); + + // Query the available cross section measurements. + kmService.getCrossSectionKMs(locale, map, 2, + new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not get single km for " + + dbid + ": "+ caught.getMessage()); + SC.warn(MSG.getString(caught.getMessage())); + updateCollection(); + //updateGrid(); + enable(); + } + + @Override + public void onSuccess(Map obj) { + Double[] kms = obj.get(dbid); + double closest = + CrossSectionChartThemePanel.closest(kms, enteredKm, up); + GWT.log("Got single km close to " + enteredKm + " for " + dbid + ", it is " + + closest); + + // Do not set value, as it will trigger strange + // "javascript" bugs. /*item.setValue(closest);*/ + if (synchronCrossSectionThemes.contains (themeHash + (facetRecord.getTheme()))) { + // Move all other synchrons + ThemeList themes = getThemeList(); + int nThemes = themes.getThemeCount(); + List artifacts = new ArrayList(); + for (int i = 0; i < nThemes; i++) { + final Theme theme = themes.getThemeAt(i+1); + if (theme.getFacet().equals("cross_section") && + theme.getActive() == 1 && + synchronCrossSectionThemes.contains(themeHash(theme)) + ) { + artifacts.add(artifactReference(theme.getArtifact())); + } + } + sendFeed(artifacts, closest); + } + else { + sendFeed(facetRecord.getTheme().getArtifact(), + closest); + } + } + }); + } + + + /** + * Create and configure the Grid to display. + * @return ListGrid with Themes and related controls inside. + */ + @Override + protected ListGrid createGrid() { + final CrossSectionChartThemePanel parent = this; + + ListGrid list = new ListGrid() { + @Override + protected Canvas createRecordComponent( + final ListGridRecord record, + Integer colNum) + { + // Only cross_section Facets display an action widget. + final FacetRecord facetRecord = (FacetRecord) record; + if (!facetRecord.getTheme().getFacet().equals( + "cross_section")) + { + return null; + } + + String fieldName = this.getFieldName(colNum); + + if (fieldName.equals(GRID_FIELD_ACTIONS)) { + double currentValue = + Double.valueOf(facetRecord.getTheme().getCollectionItem().getData().get(CS_KM)); + KMSpinner kmSpinner = new KMSpinner(currentValue, facetRecord); + kmSpinner.addChangeListener(parent); + return kmSpinner; + } + else { + return null; + } + } + }; + list.setCanResizeFields(true); + list.setShowRecordComponents(true); + list.setShowRecordComponentsByCell(true); + list.setShowAllRecords(true); + list.setShowHeaderContextMenu(false); + list.setLeaveScrollbarGap(false); + return list; + } + + + /** + * Initializes the components (columns) of the theme grid. + */ + @Override + protected void initGrid() { + list.setCanEdit(true); + list.setCanSort(false); + list.setShowRecordComponents(true); + list.setShowRecordComponentsByCell(true); + list.setShowHeader(true); + list.setWidth100(); + list.setHeight100(); + + list.addEditCompleteHandler(this); + + ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20); + active.setType(ListGridFieldType.BOOLEAN); + + ListGridField name = new ListGridField( + GRID_FIELD_NAME, MSG.chart_themepanel_header_themes()); + name.setType(ListGridFieldType.TEXT); + + ListGridField actions = new ListGridField(GRID_FIELD_ACTIONS, + MSG.chart_themepanel_header_actions(), 100); + + list.setFields(active, name, actions); + } + + + /** Get Current Cross-section Masters uuid. */ + public String getCurrentCSMaster() { + return currentCSMasterUUID; + } + + + /** Set Current Cross-section Masters uuid. */ + public void setCurrentCSMaster(String currentMasterUuid) { + this.currentCSMasterUUID = currentMasterUuid; + } + + + /** Returns name of cross section area facets. */ + @Override + protected String getAreaFacetName() { + return "cross_section.area"; + } + + + /** + * Return true if two themes are canditates for an area being + * rendered between them. + * TODO join with canArea, generalize to allow easier modification + * in subclasses. + */ + @Override + protected boolean areAreaCompatible(Theme a, Theme b) { + if (a.equals(b)) { + return false; + } + return (a.getFacet().equals("cross_section") + || a.getFacet().endsWith("line")) + && (b.getFacet().equals("cross_section") + || b.getFacet().endsWith("line")); + } + + + /** + * True if context menu should contain 'create area' submenu on + * this theme. + */ + @Override + protected boolean canArea(Theme a) { + return a.getFacet().equals("cross_section") + || a.getFacet().equals("cross_section_water_line") + || a.getFacet().endsWith("line"); + } + + + protected String themeHash(Theme theme) { + return theme.getArtifact() + theme.getFacet() + theme.getIndex(); + } + + + /** + * Include synchron navigation item. + */ + @Override + protected Menu getSingleContextMenu(final ListGridRecord[] records) { + Menu contextMenu = super.getSingleContextMenu(records); + + Theme facetTheme = ((FacetRecord)records[0]).getTheme(); + String item = facetTheme.getFacet(); + + if (item.equals("cross_section")) { + // Synchron checking. + MenuItem synchronNavigationMenuItem = new MenuItem(); + final String themeHash = themeHash(facetTheme); + if (synchronCrossSectionThemes.contains(themeHash)) { + synchronNavigationMenuItem.setTitle(MSG.chart_themepanel_asynchron()); + synchronNavigationMenuItem.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + synchronCrossSectionThemes.remove (themeHash); + } + }); + } + else { + synchronNavigationMenuItem.setTitle(MSG.chart_themepanel_synchron()); + synchronNavigationMenuItem.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + synchronCrossSectionThemes.add (themeHash); + } + }); + } + contextMenu.addItem(synchronNavigationMenuItem); + } + + return contextMenu; + } + + + /** + * This method is used to clear the current theme grid and add new updated + * data. + */ + @Override + protected void updateGrid() { + GWT.log("CrossSectionChartThemePanel.updateGrid"); + + ListGridRecord[] selected = list.getSelectedRecords(); + + clearGrid(); + + ThemeList themeList = getThemeList(); + + if (themeList == null) { + GWT.log("ERROR: No theme list."); + return; + } + + int count = themeList.getThemeCount(); + + for (int i = 1; i <= count; i++) { + Theme theme = themeList.getThemeAt(i); + + if (theme == null) { + continue; + } + + if (theme.getFacet().equals("empty.facet")) { + theme.setVisible(0); + } + + if (theme.getVisible() == 0) { + continue; + } + + if (theme.getFacet().equals("cross_section")) { + addToReferences(theme); + } + + FacetRecord newRecord = createRecord(theme); + addFacetRecord(newRecord); + + String newArtifact = theme.getArtifact(); + String newFacet = theme.getFacet(); + int newIndex = theme.getIndex(); + + for (ListGridRecord r: selected) { + FacetRecord sel = (FacetRecord) r; + Theme oldTheme = sel.getTheme(); + + if (oldTheme.getArtifact().equals(newArtifact) + && oldTheme.getFacet().equals(newFacet) + && oldTheme.getIndex() == newIndex) { + list.selectRecord(newRecord); + } + } + } + + fireOutputParameterChanged(); + + } + + + /** + * Adds a cross section theme to the master artifacts combobox and finds + * a new master if necessary. + * + * @param theme The cross section theme. + */ + protected void addToReferences(Theme theme) { + if (theme.getVisible() != 0) { + masters.put(theme.getArtifact(), theme.getDescription()); + masterCb.setValueMap(masters); + } + findCurrentCSMaster(); + if (masterCb.getSelectedRecord() == null) { + masterCb.setValue(getCurrentCSMaster()); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ManualDatePointsEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ManualDatePointsEditor.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,408 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.i18n.client.NumberFormat; +import com.google.gwt.json.client.JSONArray; +import com.google.gwt.json.client.JSONBoolean; +import com.google.gwt.json.client.JSONNumber; +import com.google.gwt.json.client.JSONParser; +import com.google.gwt.json.client.JSONString; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.IButton; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.grid.CellEditValueFormatter; +import com.smartgwt.client.widgets.grid.CellEditValueParser; +import com.smartgwt.client.widgets.grid.CellFormatter; +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; + +import org.dive4elements.river.client.client.event.RedrawRequestHandler; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItem; +import org.dive4elements.river.client.shared.model.Property; +import org.dive4elements.river.client.shared.model.PropertyGroup; +import org.dive4elements.river.client.shared.model.Settings; +import org.dive4elements.river.client.shared.model.StringProperty; + +import java.util.Date; +import java.util.List; + +/** + * UI to enter point data and save it to an PointArtifact. + */ +public class ManualDatePointsEditor +extends ManualPointsEditor +{ + + public ManualDatePointsEditor(Collection collection, + RedrawRequestHandler handler, String outputModeName + ) { + super (collection, handler, outputModeName); + } + + + /** Create and setup/add the ui. */ + @Override + public void createUI() { + Button accept = new Button(MSG.label_ok()); + Button cancel = new Button(MSG.label_cancel()); + cancel.addClickHandler(this); + + accept.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + okClicked(); + } + }); + + HLayout buttons = new HLayout(); + buttons.addMember(accept); + buttons.addMember(cancel); + buttons.setAlign(Alignment.CENTER); + buttons.setHeight(30); + + VLayout layout = new VLayout(); + listGrid = new ListGrid(); + listGrid.setWidth100(); + listGrid.setHeight("*"); + listGrid.setCanSort(false); + listGrid.setCanEdit(true); + listGrid.setShowHeaderContextMenu(false); + + CellFormatter doubleFormat = new CellFormatter() { + @Override + public String format(Object value, ListGridRecord record, int rowNum, int colNum) { + if(value != null) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + try { + double d = Double.valueOf(value.toString()).doubleValue(); + return nf.format(d); + } catch (Exception e) { + return value.toString(); + } + } else { + return null; + } + }}; + + CellFormatter dateFormat = new CellFormatter() { + @Override + public String format(Object value, ListGridRecord record, int rowNum, int colNum) { + if(value != null && !value.toString().equals("")) { + try { + DateTimeFormat df = + DateTimeFormat.getFormat("dd.MM.yyyy"); + Date d = df.parse(value.toString()); + DateTimeFormat df2 = + DateTimeFormat.getFormat( + DateTimeFormat.PredefinedFormat.DATE_MEDIUM); + return df2.format(d); + + } + catch(IllegalArgumentException iae) { + SC.warn(MSG.error_invalid_date()); + record.setAttribute(DatePointRecord.ATTRIBUTE_X, ""); + return ""; + } + } + else { + return null; + } + }}; + + + CellEditValueParser cevp = new CellEditValueParser() { + @Override + public Object parse(Object value, ListGridRecord record, int rowNum, int colNum) { + if (value == null) + return null; + try { + NumberFormat nf = NumberFormat.getDecimalFormat(); + double d = nf.parse(value.toString()); + return (new Double(d)).toString(); + } + catch(NumberFormatException nfe) { + return value; + } + } + }; + + CellEditValueFormatter cevf = new CellEditValueFormatter() { + @Override + public Object format(Object value, ListGridRecord record, int rowNum, int colNum) { + if (value != null) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + try { + double d = Double.valueOf(value.toString()).doubleValue(); + return nf.format(d); + } catch (Exception e) { + return value.toString(); + } + } + return null; + } + }; + + // Use X and Y as default fallback. + String xAxis = "X"; + String yAxis = "Y"; + + // Get header text from collection settings. + Settings settings = this.collection.getSettings(outputModeName); + List axes = settings.getSettings("axes"); + if(axes != null) { + for (Property p: axes) { + PropertyGroup pg = (PropertyGroup)p; + StringProperty id = + (StringProperty)pg.getPropertyByName("id"); + if(id.getValue().equals("X")) { + StringProperty name = + (StringProperty)pg.getPropertyByName("label"); + xAxis = name.getValue(); + } + else if (yAxis.equals("Y")) { + StringProperty name = + (StringProperty)pg.getPropertyByName("label"); + yAxis = name.getValue(); + } + } + } + ListGridField xField = + new ListGridField(PointRecord.ATTRIBUTE_X, xAxis); + xField.setType(ListGridFieldType.TEXT); + xField.setCellFormatter(dateFormat); + + ListGridField yField = + new ListGridField(PointRecord.ATTRIBUTE_Y, yAxis); + yField.setType(ListGridFieldType.FLOAT); + yField.setCellFormatter(doubleFormat); + yField.setEditValueParser(cevp); + yField.setEditValueFormatter(cevf); + + ListGridField nameField = new ListGridField(PointRecord.ATTRIBUTE_NAME, + MSG.pointname()); + final ListGridField removeField = + new ListGridField("_removeRecord", MSG.removepoint()){{ + setType(ListGridFieldType.ICON); + setIcon(GWT.getHostPageBaseURL() + MSG.removeFeature()); + setCanEdit(false); + setCanFilter(false); + setCanSort(false); + setCanGroupBy(false); + setCanFreeze(false); + setWidth(25); + }}; + + ListGridField activeField = new ListGridField( + PointRecord.ATTRIBUTE_ACTIVE, MSG.selection()); + activeField.setType(ListGridFieldType.BOOLEAN); + activeField.setDefaultValue(true); + + listGrid.setFields(new ListGridField[] {activeField, xField, yField, + nameField, removeField}); + + listGrid.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()); + } + }); + + // Find the artifacts uuid. + findManualPointsUUID(); + CollectionItem item = collection.getItem(uuid); + + // Add points to grid. + if (item != null) { + String jsonData = item.getData().get(outputModeName + "." + POINT_DATA); + JSONArray jsonArray = (JSONArray) JSONParser.parse(jsonData); + for (int i = 0; i < jsonArray.size(); i++) { + JSONArray point = (JSONArray) jsonArray.get(i); + listGrid.addData(datePointRecordFromJSON(point)); + } + } + else { + GWT.log("No item found for " + uuid); + } + + IButton button = new IButton(MSG.newpoint()); + button.setTop(250); + button.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + listGrid.startEditingNew(); + } + }); + + layout.addMember(listGrid); + layout.addMember(button); + + addItem(layout); + + addItem(buttons); + setWidth(380); + setHeight(470); + centerInPage(); + } + + + /** Create JSON representation of the points present in the list grid. */ + @Override + protected JSONArray jsonArrayFromListGrid() { + JSONArray list = new JSONArray(); + int idx = 0; + + for(ListGridRecord record : listGrid.getRecords()) { + if (record instanceof DatePointRecord) { + JSONArray data = new JSONArray(); + + DatePointRecord point = (DatePointRecord) record; + String dateString = point.getX(); + DateTimeFormat df = DateTimeFormat.getFormat( + DateTimeFormat.PredefinedFormat.DATE_MEDIUM); + + Date d = df.parse(dateString); + double dv = d.getTime(); + + data.set(0, new JSONNumber(dv)); + data.set(1, new JSONNumber(point.getY())); + data.set(2, new JSONString(point.getName())); + data.set(3, JSONBoolean.getInstance(point.isActive())); + + list.set(idx, data); + idx++; + } + else { + JSONArray data = new JSONArray(); + + String nameString = record.getAttributeAsString(PointRecord.ATTRIBUTE_NAME); + // Apply default name if none set. + if (nameString == null || nameString.equals("")) { + String xString = record.getAttributeAsString( + PointRecord.ATTRIBUTE_X); + String yString = record.getAttributeAsString( + PointRecord.ATTRIBUTE_Y); + nameString = xString + "/" + yString; + } + + String dateString = record.getAttributeAsString(PointRecord.ATTRIBUTE_X); + DateTimeFormat df = DateTimeFormat.getFormat( + DateTimeFormat.PredefinedFormat.DATE_MEDIUM); + + Date d = df.parse(dateString); + double dv = d.getTime(); + data.set(0, new JSONNumber(dv)); + data.set(1, new JSONNumber(record. + getAttributeAsDouble(PointRecord.ATTRIBUTE_Y))); + data.set(2, new JSONString(nameString)); + data.set(3, JSONBoolean.getInstance(record.getAttributeAsBoolean( + PointRecord.ATTRIBUTE_ACTIVE))); + + list.set(idx, data); + idx++; + } + } + return list; + } + + /** From a JSON-encoded point, create a PointRecord. */ + public DatePointRecord datePointRecordFromJSON(JSONArray jsonArray) { + JSONNumber x = (JSONNumber) jsonArray.get(0); + JSONNumber y = (JSONNumber) jsonArray.get(1); + JSONString s = (JSONString) jsonArray.get(2); + JSONBoolean b = (JSONBoolean) jsonArray.get(3); + + Date d = new Date (Long.valueOf(x.toString()).longValue()); + DateTimeFormat df = DateTimeFormat.getFormat( + DateTimeFormat.PredefinedFormat.DATE_MEDIUM); + + return new DatePointRecord(b.booleanValue(), df.format(d), + y.doubleValue(), s.stringValue()); + } + + + /** Return false if x or y attribute is missing. */ + @Override + protected boolean isDialogValid() { + boolean valid = true; + for (ListGridRecord record : listGrid.getRecords()) { + if (record.getAttributeAsString(PointRecord.ATTRIBUTE_X) == null || + record.getAttributeAsString( + DatePointRecord.ATTRIBUTE_X).equals("") || + record.getAttributeAsDouble(PointRecord.ATTRIBUTE_Y) == null) { + return false; + } + } + if (listGrid.hasErrors()) { + valid = false; + } + return valid; + } + + + /** Simple record to store points. */ + public class DatePointRecord extends ListGridRecord { + protected static final String ATTRIBUTE_X = "X"; + protected static final String ATTRIBUTE_Y = "Y"; + protected static final String ATTRIBUTE_NAME = "name"; + protected static final String ATTRIBUTE_ACTIVE = "active"; + + private DatePointRecord() {;} + + public DatePointRecord(boolean b, String x, double y, String name) { + setActive(b); + setName(name); + setX(x); + setY(y); + } + + public void setActive(boolean b) { + setAttribute(ATTRIBUTE_ACTIVE, b); + } + + public boolean isActive() { + return getAttributeAsBoolean(ATTRIBUTE_ACTIVE); + } + + public void setName(String name) { + setAttribute(ATTRIBUTE_NAME, name); + } + + public String getName() { + return getAttributeAsString(ATTRIBUTE_NAME); + } + + public void setX(String x) { + setAttribute(ATTRIBUTE_X, x); + } + + public void setY(double y) { + setAttribute(ATTRIBUTE_Y, y); + } + + public String getX() { + return getAttributeAsString(ATTRIBUTE_X); + } + + public double getY() { + return getAttributeAsDouble(ATTRIBUTE_Y); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ManualPointsEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ManualPointsEditor.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,535 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.i18n.client.NumberFormat; +import com.google.gwt.json.client.JSONArray; +import com.google.gwt.json.client.JSONBoolean; +import com.google.gwt.json.client.JSONNumber; +import com.google.gwt.json.client.JSONParser; +import com.google.gwt.json.client.JSONString; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.IButton; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.grid.CellEditValueFormatter; +import com.smartgwt.client.widgets.grid.CellEditValueParser; +import com.smartgwt.client.widgets.grid.CellFormatter; +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; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.RedrawRequestEvent; +import org.dive4elements.river.client.client.event.RedrawRequestHandler; +import org.dive4elements.river.client.client.services.FeedServiceAsync; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItem; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DefaultArtifact; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.Property; +import org.dive4elements.river.client.shared.model.PropertyGroup; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.Settings; +import org.dive4elements.river.client.shared.model.StringProperty; + +import java.util.Date; +import java.util.List; + + +/** + * UI to enter point data and save it to an PointArtifact. + */ +public class ManualPointsEditor +extends Window +implements ClickHandler +{ + /** The interface that provides i18n messages. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** Part of name of the main data item to be fed. */ + public static final String POINT_DATA = "manualpoints.data"; + + /** When we chaged something, we need a RedrawRequest(Handler). */ + protected RedrawRequestHandler redrawRequestHandler; + + /** The collection */ + protected Collection collection; + + /** The listGrid showing point entries. */ + protected ListGrid listGrid; + + protected ListGridFieldType fieldTypeX = ListGridFieldType.FLOAT; + + /** Service handle to clone and add artifacts to collection. */ + LoadArtifactServiceAsync loadArtifactService = GWT.create( + org.dive4elements.river.client.client.services.LoadArtifactService.class); + + /** Service to feed the artifact with new point-data. */ + FeedServiceAsync feedService = GWT.create( + org.dive4elements.river.client.client.services.FeedService.class); + + /** UUID of artifact to feed. */ + protected String uuid; + + /** Name of the outputmode, important when feeding data. */ + protected String outputModeName; + + /** Name of the point data item. */ + protected String pointDataItemName; + + + /** + * Setup editor dialog. + * @param collection The collection to use. + */ + public ManualPointsEditor(Collection collection, + RedrawRequestHandler handler, String outputModeName + ) { + this.collection = collection; + this.redrawRequestHandler = handler; + this.outputModeName = outputModeName; + this.pointDataItemName = outputModeName + "." + POINT_DATA; + init(); + } + + + /** Searches collection for first artifact to serve (manual) point data. */ + public String findManualPointsUUID() { + // TODO Need to be more picky (different points in different diagrams) + int size = collection.getItemLength(); + + for (int i = 0; i < size; i++) { + CollectionItem item = collection.getItem(i); + String dataValue = item.getData().get(pointDataItemName); + if (dataValue != null) { + // Found it. + uuid = item.identifier(); + return uuid; + } + } + + return null; + } + + + /** + * Initialize the editor window and its components. + */ + protected void init() { + setTitle(MSG.addpoints()); + setCanDragReposition(true); + setCanDragResize(true); + + // If no manualpoints artifact found, create it now. + if(findManualPointsUUID() == null) { + addArtifactCreateUI(); + } + else { + createUI(); + } + } + + + /** Create and setup/add the ui. */ + public void createUI() { + Button accept = new Button(MSG.label_ok()); + Button cancel = new Button(MSG.label_cancel()); + cancel.addClickHandler(this); + + accept.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + okClicked(); + } + }); + + HLayout buttons = new HLayout(); + buttons.addMember(accept); + buttons.addMember(cancel); + buttons.setAlign(Alignment.CENTER); + buttons.setHeight(30); + + VLayout layout = new VLayout(); + listGrid = new ListGrid(); + listGrid.setWidth100(); + listGrid.setHeight("*"); + listGrid.setCanSort(false); + listGrid.setCanEdit(true); + listGrid.setShowHeaderContextMenu(false); + + // Use X and Y as default fallback. + String xAxis = "X"; + String yAxis = "Y"; + + // Get header text from collection settings + Settings settings = this.collection.getSettings(outputModeName); + List axes = settings.getSettings("axes"); + if(axes != null) { + for (Property p: axes) { + PropertyGroup pg = (PropertyGroup)p; + GWT.log(pg.toString()); + StringProperty id = + (StringProperty)pg.getPropertyByName("id"); + if(id.getValue().equals("X")) { + StringProperty name = + (StringProperty)pg.getPropertyByName("label"); + xAxis = name.getValue(); + } + else if (yAxis.equals("Y")) { + StringProperty name = + (StringProperty)pg.getPropertyByName("label"); + yAxis = name.getValue(); + } + } + } + + CellFormatter format = createCellFormatter(); + CellEditValueParser cevp = createCellEditValueParser(); + CellEditValueFormatter cevf = createCellEditValueFormatter(); + + ListGridField xField = + new ListGridField(PointRecord.ATTRIBUTE_X, xAxis); + if(xAxis.equalsIgnoreCase("date") || xAxis.equalsIgnoreCase("Datum")) { + // FIXME: This is a hack for Timeseries charts with Date types on the x axis + xField.setType(ListGridFieldType.DATE); + this.fieldTypeX = ListGridFieldType.DATE; + } + else { + xField.setType(ListGridFieldType.FLOAT); + xField.setCellFormatter(format); + xField.setEditValueParser(cevp); + xField.setEditValueFormatter(cevf); + } + + ListGridField yField = + new ListGridField(PointRecord.ATTRIBUTE_Y, yAxis); + yField.setType(ListGridFieldType.FLOAT); + yField.setCellFormatter(format); + yField.setEditValueParser(cevp); + yField.setEditValueFormatter(cevf); + + ListGridField nameField = new ListGridField(PointRecord.ATTRIBUTE_NAME, + MSG.pointname()); + final ListGridField removeField = + new ListGridField("_removeRecord", MSG.removepoint()){{ + setType(ListGridFieldType.ICON); + setIcon(GWT.getHostPageBaseURL() + MSG.removeFeature()); + setCanEdit(false); + setCanFilter(false); + setCanSort(false); + setCanGroupBy(false); + setCanFreeze(false); + setWidth(25); + }}; + + ListGridField activeField = new ListGridField( + PointRecord.ATTRIBUTE_ACTIVE, MSG.selection()); + activeField.setType(ListGridFieldType.BOOLEAN); + activeField.setDefaultValue(true); + + listGrid.setFields(new ListGridField[] {activeField, xField, yField, + nameField, removeField}); + + listGrid.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()); + } + }); + + // Find the artifacts uuid + findManualPointsUUID(); + CollectionItem item = collection.getItem(uuid); + + // Add points to grid + if (item != null) { + // TODO store this from findPointUUID instead (we touched these). + String jsonData = item.getData().get(pointDataItemName); + JSONArray jsonArray = (JSONArray) JSONParser.parse(jsonData); + for (int i = 0; i < jsonArray.size(); i++) { + JSONArray point = (JSONArray) jsonArray.get(i); + listGrid.addData(PointRecord.fromJSON(point)); + } + } + else { + GWT.log("ManualPointsEditor: No item found for " + uuid); + } + + IButton button = new IButton(MSG.newpoint()); + button.setTop(250); + button.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + listGrid.startEditingNew(); + } + }); + + layout.addMember(listGrid); + layout.addMember(button); + + addItem(layout); + + addItem(buttons); + setWidth(380); + setHeight(470); + centerInPage(); + } + + + protected CellFormatter createCellFormatter() { + return new CellFormatter() { + @Override + public String format(Object value, ListGridRecord record, int rowNum, int colNum) { + if(value != null) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + try { + double d = Double.valueOf(value.toString()).doubleValue(); + return nf.format(d); + } catch (Exception e) { + return value.toString(); + } + } else { + return null; + } + }}; + } + + + protected CellEditValueParser createCellEditValueParser() { + return new CellEditValueParser() { + @Override + public Object parse(Object value, ListGridRecord record, int rowNum, int colNum) { + if (value == null) + return null; + try { + NumberFormat nf = NumberFormat.getDecimalFormat(); + double d = nf.parse(value.toString()); + return (new Double(d)).toString(); + } + catch(NumberFormatException nfe) { + return value; + } + } + }; + } + + + protected CellEditValueFormatter createCellEditValueFormatter() { + return new CellEditValueFormatter() { + @Override + public Object format(Object value, ListGridRecord record, int rowNum, int colNum) { + if (value == null) { + return ""; + } + NumberFormat nf = NumberFormat.getDecimalFormat(); + try { + double d = Double.valueOf(value.toString()).doubleValue(); + return nf.format(d); + } + catch(NumberFormatException nfe) { + return value; + } + } + }; + } + + protected String getLocaleDateFormat() { + String loc = Config.getInstance().getLocale(); + if ("de".equals(loc)) { + return "yy.MM.yyyy"; + } + else { + return "MM/dd/yyyy"; + } + } + + protected String formatDate(Date date) { + DateTimeFormat dtf = DateTimeFormat.getFormat(getLocaleDateFormat()); + return dtf.format(date); + } + + /** Create JSON representation of the points present in the list grid. */ + protected JSONArray jsonArrayFromListGrid() { + JSONArray list = new JSONArray(); + int idx = 0; + + for(ListGridRecord record : listGrid.getRecords()) { + if (record instanceof PointRecord) { + JSONArray data = new JSONArray(); + + PointRecord point = (PointRecord) record; + if(point.isTimeseriesPoint()) { + data.set(0, new JSONString(point.getXAsDate())); + GWT.log("Date: " + point.getXAsDate()); + } + else { + data.set(0, new JSONNumber(point.getX())); + } + data.set(1, new JSONNumber(point.getY())); + data.set(2, new JSONString(point.getName())); + data.set(3, JSONBoolean.getInstance(point.isActive())); + + list.set(idx, data); + idx++; + } + else { + JSONArray data = new JSONArray(); + + String nameString = record.getAttributeAsString(PointRecord.ATTRIBUTE_NAME); + // Apply default name if none set. + if (nameString == null || nameString.equals("")) { + String xString = record.getAttributeAsString( + PointRecord.ATTRIBUTE_X); + String yString = record.getAttributeAsString( + PointRecord.ATTRIBUTE_Y); + nameString = xString + "/" + yString; + } + + if(fieldTypeX.equals(ListGridFieldType.DATE)) { + Date date = record.getAttributeAsDate(PointRecord.ATTRIBUTE_X); + data.set(0, new JSONString(formatDate(date))); + GWT.log("Date: " + formatDate(date)); + } + else { + data.set(0, new JSONNumber(record. + getAttributeAsDouble(PointRecord.ATTRIBUTE_X))); + } + data.set(1, new JSONNumber(record. + getAttributeAsDouble(PointRecord.ATTRIBUTE_Y))); + data.set(2, new JSONString(nameString)); + data.set(3, JSONBoolean.getInstance(record.getAttributeAsBoolean( + PointRecord.ATTRIBUTE_ACTIVE))); + + list.set(idx, data); + idx++; + } + } + return list; + } + + + /** + * Called when OK Button was clicked. Then, if entered values are valid, + * fire a RedrawRequest and destroy. + */ + protected void okClicked() { + if(isDialogValid()) { + // Feed JSON-encoded content of listgrid. + JSONArray list = jsonArrayFromListGrid(); + + Data[] feedData = new Data[] { + DefaultData.createSimpleStringData(pointDataItemName, + list.toString()) + }; + + feedService.feed( + Config.getInstance().getLocale(), + new DefaultArtifact(uuid, "TODO:hash"), + feedData, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not feed artifact with points."); + SC.warn(MSG.getString(caught.getMessage())); + enable(); + } + @Override + public void onSuccess(Artifact fartifact) { + GWT.log("Successfully set points"); + redrawRequestHandler.onRedrawRequest( + new RedrawRequestEvent()); + destroy(); + } + }); + } + else { + GWT.log("Dialog not valid"); + SC.warn(MSG.error_dialog_not_valid()); + } + } + + + /** Add a ManualPointArtifact to Collection. */ + public void addArtifactCreateUI() { + final Label standByLabel = new Label(MSG.standby()); + addItem(standByLabel); + + setWidth(380); + setHeight(470); + centerInPage(); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + loadArtifactService.load( + this.collection, + new Recommendation("manualpoints", ""), + "manualpoints", + locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Creating manualpoint artifact failed!"); + } + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully created artifact."); + removeItem(standByLabel); + uuid = artifact.getUuid(); + createUI(); + } + }); + } + + + /** + * This method is called when the user aborts point editing. + * @param event The event. + */ + @Override + public void onClick(ClickEvent event) { + this.destroy(); + } + + + /** Return false if x or y attribute is missing. */ + protected boolean isDialogValid() { + boolean valid = true; + for (ListGridRecord record : listGrid.getRecords()) { + try { + if (record.getAttribute(PointRecord.ATTRIBUTE_X) == null + || record.getAttribute(PointRecord.ATTRIBUTE_Y) == null) { + return false; + } + } + catch(IllegalArgumentException ex) { + + } + } + if (listGrid.hasErrors()) { + valid = false; + } + return valid; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ManualWSPEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ManualWSPEditor.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,355 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; +import com.google.gwt.json.client.JSONArray; +import com.google.gwt.json.client.JSONNumber; +import com.google.gwt.json.client.JSONParser; +import com.google.gwt.json.client.JSONString; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.Window; +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.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.RedrawRequestEvent; +import org.dive4elements.river.client.client.event.RedrawRequestHandler; +import org.dive4elements.river.client.client.services.FeedServiceAsync; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; +import org.dive4elements.river.client.client.utils.DoubleValidator; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItem; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DefaultArtifact; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.Property; +import org.dive4elements.river.client.shared.model.PropertyGroup; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.Settings; +import org.dive4elements.river.client.shared.model.StringProperty; + +import java.util.List; +import java.util.Map; + +/** + * UI to enter point data and save it to an PointArtifact. + */ +public class ManualWSPEditor +extends Window +implements ClickHandler +{ + /** The interface that provides i18n messages. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** Name of the main data item to be fed. */ + public static final String LINE_DATA = "manualpoints.lines"; + + /** When we change something, we need a RedrawRequest(Handler). */ + protected RedrawRequestHandler redrawRequestHandler; + + /** The collection */ + protected Collection collection; + + /** Service handle to clone and add artifacts to collection. */ + LoadArtifactServiceAsync loadArtifactService = GWT.create( + org.dive4elements.river.client.client.services.LoadArtifactService.class); + + /** Service to feed the artifact with new point-data. */ + FeedServiceAsync feedService = GWT.create( + org.dive4elements.river.client.client.services.FeedService.class); + + /** UUID of artifact to feed. */ + protected String uuid; + + /** Name of the outputmode, important when feeding data. */ + protected String outputModeName; + + /** Name of the data item for lines in this context. */ + protected String dataItemName; + + /** Input Field for y-coor of line. */ + protected TextItem valueInputPanel; + + /** Input Field for name of line. */ + protected TextItem nameInputPanel; + + /** Line data that is not added in this session. */ + protected JSONArray oldLines = null; + + + /** + * Setup editor dialog. + * @param collection The collection to use. + */ + public ManualWSPEditor(Collection collection, + RedrawRequestHandler handler, String outputModeName + ) { + this.collection = collection; + this.redrawRequestHandler = handler; + this.outputModeName = outputModeName; + this.dataItemName = outputModeName + "." + LINE_DATA; + init(); + } + + + /** Searches collection for first artifact to serve (manual) line data. */ + public String findManualPointsUUID() { + int size = collection.getItemLength(); + + for (int i = 0; i < size; i++) { + CollectionItem item = collection.getItem(i); + String dataValue = item.getData().get(dataItemName); + if (dataValue != null) { + // Found it. + uuid = item.identifier(); + return uuid; + } + } + + return null; + } + + + /** + * Initialize the editor window and its components. + */ + protected void init() { + setTitle(MSG.addWSP()); + setCanDragReposition(true); + setCanDragResize(true); + + if(findManualPointsUUID() == null) { + addArtifactCreateUI(); + } + else { + createUI(); + } + } + + + /** Create and setup/add the ui. */ + public void createUI() { + Button accept = new Button(MSG.label_ok()); + Button cancel = new Button(MSG.label_cancel()); + cancel.addClickHandler(this); + + accept.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + okClicked(); + } + }); + + HLayout buttons = new HLayout(); + buttons.addMember(accept); + buttons.addMember(cancel); + buttons.setAlign(Alignment.CENTER); + buttons.setHeight(30); + + // Use X and Y as default fallback. + String yAxis = "Y"; + + // Get header text from collection settings. + Settings settings = this.collection.getSettings(outputModeName); + List axes = settings.getSettings("axes"); + if(axes != null) { + for (Property p: axes) { + PropertyGroup pg = (PropertyGroup)p; + StringProperty id = + (StringProperty)pg.getPropertyByName("id"); + if (id.getValue().equals("W")) { + StringProperty name = + (StringProperty)pg.getPropertyByName("label"); + yAxis = name.getValue(); + } + } + } + + DynamicForm form = new DynamicForm(); + valueInputPanel = new TextItem(); + valueInputPanel.setTitle(yAxis); + valueInputPanel.setShowTitle(true); + valueInputPanel.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + DoubleValidator validator = new DoubleValidator(); + Map errors = e.getForm().getErrors(); + validator.validate(e.getItem(), errors); + e.getForm().setErrors(errors, true); + } + }); + nameInputPanel = new TextItem(); + nameInputPanel.setTitle(MSG.pointname()); + nameInputPanel.setShowTitle(true); + form.setFields(valueInputPanel, nameInputPanel); + + VLayout layout = new VLayout(); + layout.addMember(form); + + // Find the artifacts uuid. + // TODO this has been called already, why call it again? + findManualPointsUUID(); + CollectionItem item = collection.getItem(uuid); + + // Store the old line data. + if (item != null) { + String jsonData = item.getData().get(dataItemName); + oldLines = (JSONArray) JSONParser.parse(jsonData); + } + else { + GWT.log("No old lines found for " + uuid); + } + + addItem(layout); + + addItem(buttons); + setWidth(360); + setHeight(120); + centerInPage(); + } + + + /** + * Create JSON representation of the points present in the form. + * Add old data, too. + * @return a jsonarray with the old and the new lines. + */ + protected JSONArray jsonArrayFromForm() { + if (oldLines == null) { + oldLines = new JSONArray(); + } + + double val; + if (valueInputPanel.getValue() == null) + return oldLines; + try { + NumberFormat nf = NumberFormat.getDecimalFormat(); + double d = nf.parse(valueInputPanel.getValue().toString()); + val = d; + } + catch(NumberFormatException nfe) { + GWT.log("fehler... nfe... TODO"); + return oldLines; + } + + JSONArray data = new JSONArray(); + data.set(0, new JSONNumber(val)); + if (nameInputPanel.getValue() == null) { + data.set(1, new JSONString(valueInputPanel.getValue().toString())); + } + else { + data.set(1, new JSONString(nameInputPanel.getValue().toString())); + } + oldLines.set(oldLines.size(), data); + + return oldLines; + } + + + /** + * Called when OK Button was clicked. Then, if entered values are valid, + * fire a RedrawRequest and destroy. + */ + protected void okClicked() { + if (valueInputPanel.getValue() == null) { + return; + } + GWT.log(valueInputPanel.getValue().toString()); + if(isDialogValid()) { + // Feed JSON-encoded content of form. + JSONArray list = jsonArrayFromForm(); + + Data[] feedData = new Data[] { + DefaultData.createSimpleStringData(dataItemName, + list.toString()) + }; + + feedService.feed( + Config.getInstance().getLocale(), + new DefaultArtifact(uuid, "TODO:hash"), + feedData, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not feed artifact with lines."); + SC.warn(MSG.getString(caught.getMessage())); + enable(); + } + @Override + public void onSuccess(Artifact fartifact) { + GWT.log("Successfully set lines "); + redrawRequestHandler.onRedrawRequest( + new RedrawRequestEvent()); + destroy(); + } + }); + } + else { + GWT.log("Dialog not valid"); + SC.warn(MSG.error_dialog_not_valid()); + } + } + + + /** Add a ManualPointArtifact to Collection. */ + public void addArtifactCreateUI() { + final Label standByLabel = new Label(MSG.standby()); + addItem(standByLabel); + + setWidth(360); + setHeight(120); + centerInPage(); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + loadArtifactService.load( + this.collection, + new Recommendation("manualpoints", ""), + "manualpoints", + locale, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Creating manualpoint artifact failed!"); + } + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully created artifact."); + removeItem(standByLabel); + uuid = artifact.getUuid(); + createUI(); + } + }); + } + + + /** + * This method is called when the user aborts point editing. + * @param event The event. + */ + @Override + public void onClick(ClickEvent event) { + this.destroy(); + } + + + /** Return false if x or y attribute is missing. */ + protected boolean isDialogValid() { + return (DoubleValidator.isDouble(valueInputPanel.getValue())); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/MousePositionPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/MousePositionPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,137 @@ +package org.dive4elements.river.client.client.ui.chart; + +import java.util.ArrayList; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.events.MouseMoveEvent; +import com.smartgwt.client.widgets.events.MouseMoveHandler; + +import org.dive4elements.river.client.shared.Transform2D; + + +/** + * Panel showing the mouse position in data space. + * @author Ingo Weinzierl + */ +public class MousePositionPanel extends HLayout implements MouseMoveHandler { + + /** Is associated to a ChartTab. */ + protected ChartOutputTab chartTab; + + protected HLayout xLayout; + protected ArrayList yLayouts; + + + public MousePositionPanel(ChartOutputTab chartTab) { + super(); + + this.chartTab = chartTab; + + chartTab.getChartPanel().addMouseMoveHandler(this); + + initLayout(); + } + + + /** + * Initializes the layout of this component. Note: This layout has a + * fixed width of 195px plus a margin of 5px. + */ + protected void initLayout() { + setMembersMargin(5); + + xLayout = null; + yLayouts = new ArrayList(); + } + + + /** + * Listens to mouse move events to refresh the xy position. + * + * @param event The move event. + */ + public void onMouseMove(MouseMoveEvent event) { + updateMousePosition(event.getX(), event.getY()); + } + + + /** + * This method takes pixel coordinates, transforms those values into chart + * coordinates using the Transform2D class and updates the mouse position. + * + * @param x The x part of the pixel. + * @param y The y part of the pixel. + */ + public void updateMousePosition(double x, double y) { + int transformerCount = chartTab.getTransformerCount(); + + Canvas chart = chartTab.getChartPanel(); + int xOffset = chart.getPageLeft(); + int yOffset = chart.getPageTop(); + + x = x - xOffset; + y = y - yOffset; + + // Create Layout for x coordinates. + if (xLayout == null){ + Label xDesc = new Label("Position: X = "); + Label xLabel = new Label(); + xLayout = new HLayout(); + xLayout.setWidth(125); + xLayout.addMember(xDesc); + xLayout.addMember(xLabel); + xDesc.setWidth(70); + xLabel.setWidth(55); + addMember(xLayout); + } + + for (int i = 0; i < transformerCount; i++) { + HLayout yLayout = null; + // If no layout exists for this y axis, create one. + // else use the existing one. + if (yLayouts.size() <= i) { + Label yDesc = new Label("Y" + (i+1) + " = "); + Label yLabel = new Label(); + yLayout = new HLayout(); + yLayout.setWidth(80); + yLayout.addMember(yDesc); + yLayout.addMember(yLabel); + yDesc.setWidth(30); + yLabel.setWidth(50); + addMember(yLayout); + yLayouts.add(i, yLayout); + } + else { + yLayout = yLayouts.get(i); + } + + Transform2D transformer = chartTab.getTransformer(i); + + if (transformer == null) { + return; + } + + // Get the label for the coordinates. + Canvas xLabel = xLayout.getMember(1); + Canvas yLabel = yLayout.getMember(1); + + double[] xy = transformer.transform(x, y); + String[] xyStr = transformer.format(new Number[] { + new Double(xy[0]), new Double(xy[1]) }); + // Set the coordinates. + xLabel.setContents(xyStr[0]); + yLabel.setContents(xyStr[1]); + } + + // Remove y coordinates. + if (yLayouts.size() > transformerCount) { + for (int i = yLayouts.size() - 1; i >= transformerCount; i--) { + removeMember(yLayouts.get(i)); + yLayouts.remove(i); + } + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartOutputTab.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartOutputTab.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,336 @@ +package org.dive4elements.river.client.client.ui.chart; + +import java.util.Map; +import java.util.HashMap; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.Alignment; + +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; + +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.fields.events.KeyPressEvent; +import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler; + +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; +import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; + +import org.dive4elements.river.client.client.Config; + +import org.dive4elements.river.client.client.ui.CollectionView; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.FixAnalysisArtifact; +import org.dive4elements.river.client.shared.model.FixFilter; +import org.dive4elements.river.client.shared.model.OutputMode; + +import java.util.Date; + + +/** + * Tab representing and showing one Chart-output with a "navi" thing. + * + * @author Ingo Weinzierl + */ +public class NaviChartOutputTab +extends ChartOutputTab +implements TabSelectedHandler +{ + protected TextItem currentkm; + + public NaviChartOutputTab( + String title, + Collection collection, + OutputMode mode, + CollectionView collectionView + ){ + super(title, collection, mode, collectionView); + right.removeChild(chart); + right.addChild(createNaviChart()); + collectionView.registerTabHandler(this); + } + + + protected Canvas createNaviChart() { + final Artifact art = collectionView.getArtifact(); + VLayout root = new VLayout(); + root.setWidth100(); + root.setHeight100(); + + HLayout layout = new HLayout(); + layout.setAlign(Alignment.CENTER); + + DynamicForm form = new DynamicForm(); + Button lower = new Button("<<"); + lower.setWidth(30); + Button upper = new Button(">>"); + upper.setWidth(30); + currentkm = new TextItem(); + currentkm.setWidth(60); + currentkm.setShowTitle(false); + + form.setFields(currentkm); + form.setWidth(60); + + double fromKm; + double toKm; + + if (art instanceof FixAnalysisArtifact) { + FixAnalysisArtifact fix = (FixAnalysisArtifact) art; + FixFilter fixFilter = fix.getFilter(); + String s = fix.getArtifactDescription().getDataValueAsString("ld_step"); + try { + double ds = Double.parseDouble(s); + collectionView.setSteps(ds); + } + catch(NumberFormatException nfe) { + collectionView.setSteps(100d); + } + fromKm = fixFilter.getFromKm(); + toKm = fixFilter.getToKm(); + } + else { + // Probably WINFOArtifact kind of artifact. + String ld_step = + art.getArtifactDescription().getDataValueAsString("ld_step"); + try { + collectionView.setSteps(Double.valueOf(ld_step)); + } + catch (Exception e) { + GWT.log("No ld_steps data or not parsable."); + return root; + } + + double[] kmRange = art.getArtifactDescription().getKMRange(); + if (kmRange == null || kmRange.length == 2) { + fromKm = kmRange[0]; + toKm = kmRange[1]; + } + else { + GWT.log("No KM range in description found."); + return root; + } + } + + collectionView.setMinKm(fromKm); + collectionView.setMaxKm(toKm); + + final NumberFormat nf = NumberFormat.getDecimalFormat(); + if (collectionView.getCurrentKm() == -1d) { + try { + double d = Double.valueOf(fromKm); + currentkm.setValue(nf.format(d)); + } catch (NumberFormatException e) { + currentkm.setValue(fromKm); + } + collectionView.setCurrentKm(fromKm); + } + else { + try { + double d = Double.valueOf(fromKm); + currentkm.setValue(nf.format(d)); + } catch (NumberFormatException e) { + currentkm.setValue(fromKm); + } + currentkm.setValue(collectionView.getCurrentKm()); + } + + lower.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent ce) { + tbarPanel.deselectControls(); + updateChartDown(); + try { + double d = Double.valueOf(collectionView.getCurrentKm()); + currentkm.setValue(nf.format(d)); + } catch (NumberFormatException e) { + currentkm.setValue(collectionView.getCurrentKm()); + } + } + }); + + upper.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent ce) { + tbarPanel.deselectControls(); + updateChartUp(); + try { + double d = Double.valueOf(collectionView.getCurrentKm()); + currentkm.setValue(nf.format(d)); + } catch (NumberFormatException e) { + currentkm.setValue(collectionView.getCurrentKm()); + } + } + }); + + currentkm.addKeyPressHandler(new KeyPressHandler() { + public void onKeyPress(KeyPressEvent kpe) { + if (!kpe.getKeyName().equals("Enter")) { + return; + } + if(kpe.getItem().getValue() != null) { + tbarPanel.deselectControls(); + try { + String s = kpe.getItem().getValue().toString(); + double d; + try { + d = nf.parse(s); + currentkm.setValue(nf.format(d)); + } catch (NumberFormatException e) { + d = -1d; + } + if (d <= collectionView.getMaxKm() && + d >= collectionView.getMinKm()) { + collectionView.setCurrentKm(d); + tbarPanel.updateLinks(); + if (right != null) { + updateChartPanel(); + updateChartInfo(); + } + } + } + catch(NumberFormatException nfe) { + // Do nothing. + } + } + } + }); + layout.addMember(lower); + layout.addMember(form); + layout.addMember(upper); + + root.addMember(chart); + root.addMember(layout); + return root; + } + + + /** Callback when km-up-button is clicked. + * Increases collectionViews KM and refreshes view. */ + protected void updateChartUp() { + double currentKm = collectionView.getCurrentKm(); + if (currentKm < collectionView.getMaxKm()) { + // Why this math? + double newVal = currentKm * 100; + newVal += (collectionView.getSteps() / 10); + collectionView.setCurrentKm((double)Math.round(newVal) / 100); + tbarPanel.updateLinks(); + updateChartPanel(); + updateChartInfo(); + } + } + + /** Callback when km-down-button is clicked. + * Decreases collectionViews KM and refreshes view. */ + protected void updateChartDown() { + double currentKm = collectionView.getCurrentKm(); + if (currentKm > collectionView.getMinKm()) { + // Why this math? + double newVal = currentKm * 100; + newVal -= (collectionView.getSteps() / 10); + collectionView.setCurrentKm((double)Math.round(newVal) / 100); + tbarPanel.updateLinks(); + updateChartPanel(); + updateChartInfo(); + } + + } + + /** + * Returns the existing chart panel. + * + * @return the existing chart panel. + */ + @Override + public Canvas getChartPanel() { + return chart; + } + + /** + * Builds the URL that points to the chart image. + * + * @param width The width of the requested chart. + * @param height The height of the requested chart. + * @param xr Optional x range (used for zooming). + * @param yr Optional y range (used for zooming). + * + * @return the URL to the chart image. + */ + @Override + protected String getImgUrl(int width, int height) { + Config config = Config.getInstance(); + + String imgUrl = GWT.getModuleBaseURL(); + imgUrl += "chart"; + imgUrl += "?uuid=" + collection.identifier(); + imgUrl += "&type=" + mode.getName(); + imgUrl += "&locale=" + config.getLocale(); + imgUrl += "×tamp=" + new Date().getTime(); + imgUrl += "&width=" + Integer.toString(width); + imgUrl += "&height=" + Integer.toString(height - 40); + + Number[] zoom = getZoomValues(); + + if (zoom != null) { + if (zoom[0].intValue() != 0 || zoom[1].intValue() != 1) { + // a zoom range of 0-1 means displaying the whole range. In such + // case we don't need to zoom. + imgUrl += "&minx=" + zoom[0]; + imgUrl += "&maxx=" + zoom[1]; + } + + if (zoom[2].intValue() != 0 || zoom[3].intValue() != 1) { + // a zoom range of 0-1 means displaying the whole range. In such + // case we don't need to zoom. + imgUrl += "&miny=" + zoom[2]; + imgUrl += "&maxy=" + zoom[3]; + } + } + + if (collectionView.getArtifact() instanceof FixAnalysisArtifact) { + if (collectionView.getCurrentKm() == -1) { + FixAnalysisArtifact fix = + (FixAnalysisArtifact) collectionView.getArtifact(); + collectionView.setCurrentKm(fix.getFilter().getFromKm()); + } + } + else if (collectionView.getCurrentKm() == -1) { + collectionView.setCurrentKm(collectionView.getArtifact().getArtifactDescription().getKMRange()[0]); + } + if (collectionView.getCurrentKm() != -1) { + imgUrl += "¤tKm=" + collectionView.getCurrentKm(); + } + + return imgUrl; + } + + public void onTabSelected(TabSelectedEvent tse) { + if (this.equals(tse.getTab())) { + updateChartPanel(); + updateChartInfo(); + currentkm.setValue(collectionView.getCurrentKm()); + } + } + + @Override + public Map getChartAttributes() { + Map attr = new HashMap(); + + attr = super.getChartAttributes(); + attr.put("km", String.valueOf(collectionView.getCurrentKm())); + + return attr; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/OverviewOutputTab.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/OverviewOutputTab.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,109 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; + +import org.dive4elements.river.client.client.event.OutputParameterChangeHandler; +import org.dive4elements.river.client.client.event.RedrawRequestHandler; +import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.ImgLink; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.Theme; + + +public class OverviewOutputTab extends ChartOutputTab { + + private class NoChartThemePanel extends ChartThemePanel { + + public NoChartThemePanel(OutputMode mode, CollectionView view) { + super(mode, view); + } + + @Override + public void activateTheme(Theme theme, boolean active) { } + + @Override + public void feedTellArea( + final String artifact, + Theme under, + Theme over, + boolean between + ) { } + + @Override + public void createAreaArtifact( + final Theme over, + final Theme under, + final boolean between + ) { } + + @Override + public void addOutputParameterChangeHandler(OutputParameterChangeHandler h) { } + + @Override + public void addRedrawRequestHandler(RedrawRequestHandler h){ } + } + + + + private class MinimumChartToolbar extends ChartToolbar { + + public MinimumChartToolbar(ChartOutputTab tab) { + super(tab); + } + + @Override + protected void initTools() { + GWT.log("CREATE NEW MINIMALISTIC CHART TOOLBAR"); + ChartOutputTab chartTab = getChartOutputTab(); + + String baseUrl = GWT.getHostPageBaseURL(); + + downloadPNG = new ImgLink( + baseUrl + MSG.downloadPNG(), + chartTab.getExportUrl(-1, -1, "png"), + 20, + 20); + downloadPNG.setTooltip(MSG.downloadPNGTooltip()); + + initLayout(); + } + + + @Override + protected void initLayout() { + setWidth100(); + setHeight(PANEL_HEIGHT); + setMembersMargin(10); + setPadding(5); + setBorder("1px solid black"); + + addMember(downloadPNG); + } + } + + + + public OverviewOutputTab( + String title, + Collection collection, + OutputMode mode, + CollectionView collectionView + ){ + super(title, collection, mode, collectionView); + left.setVisible(false); + } + + + @Override + public ChartThemePanel createThemePanel( + OutputMode mode, CollectionView view + ) { + return new NoChartThemePanel(mode, view); + } + + @Override + public ChartToolbar createChartToolbar(ChartOutputTab tab) { + return new MinimumChartToolbar(tab); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/PanControl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/PanControl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,210 @@ +package org.dive4elements.river.client.client.ui.chart; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.SelectionType; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.ImgButton; +import com.smartgwt.client.widgets.events.MouseDownEvent; +import com.smartgwt.client.widgets.events.MouseDownHandler; +import com.smartgwt.client.widgets.events.MouseMoveEvent; +import com.smartgwt.client.widgets.events.MouseMoveHandler; +import com.smartgwt.client.widgets.events.MouseOutEvent; +import com.smartgwt.client.widgets.events.MouseOutHandler; +import com.smartgwt.client.widgets.events.MouseUpEvent; +import com.smartgwt.client.widgets.events.MouseUpHandler; + +import org.dive4elements.river.client.client.event.HasPanHandlers; +import org.dive4elements.river.client.client.event.PanEvent; +import org.dive4elements.river.client.client.event.PanHandler; + + +/** + * @author Ingo Weinzierl + */ +public class PanControl +extends ImgButton +implements MouseDownHandler, MouseMoveHandler, MouseUpHandler, + MouseOutHandler, HasPanHandlers +{ + protected ChartOutputTab chartTab; + + protected List handlers; + + protected int[] start; + protected int[] end; + + + public PanControl(ChartOutputTab chartTab, String imageUrl) { + super(); + + this.chartTab = chartTab; + this.handlers = new ArrayList(); + this.start = new int[] { -1, -1 }; + this.end = new int[] { -1, -1 }; + + String baseUrl = GWT.getHostPageBaseURL(); + setSrc(baseUrl + imageUrl); + setActionType(SelectionType.CHECKBOX); + setSize(20); + setShowRollOver(false); + setSelected(false); + + chartTab.getChartPanel().addMouseDownHandler(this); + chartTab.getChartPanel().addMouseMoveHandler(this); + chartTab.getChartPanel().addMouseUpHandler(this); + chartTab.getChartPanel().addMouseOutHandler(this); + } + + + /** + * Method used to register a new PanHandler. + * + * @param handler A new PanHandler. + */ + public void addPanHandler(PanHandler handler) { + if (handler != null) { + handlers.add(handler); + } + } + + + /** + * This event starts the dragging operation if the control is activated. + * + * @param event The mouse down event which contains the start coordinates. + */ + public void onMouseDown(MouseDownEvent event) { + if (!isSelected()) { + return; + } + + start[0] = event.getX(); + start[1] = event.getY(); + + end[0] = start[0]; + end[1] = start[1]; + } + + + /** + * This event is used to reposition the chart image based on the current + * drag operation. + * + * @param event The move event which contains the new coordinates to update + * the chart image position. + */ + public void onMouseMove(MouseMoveEvent event) { + if (!isSelected() || start[0] == -1 || start[1] == -1) { + return; + } + + int x = event.getX() - end[0]; + int y = event.getY() - end[1]; + + end[0] = end[0] + x; + end[1] = end[1] + y; + + Canvas c = chartTab.getChartImg(); + c.moveBy(x, y); + } + + + /** + * This event stops the dragging operation and fires a DragEnd event to the + * registered listeners. + * + * @param event The mouse up event which contains the end coordinates. + */ + public void onMouseUp(MouseUpEvent event) { + if (!isSelected()) { + return; + } + + end[0] = event.getX(); + end[1] = event.getY(); + + Canvas c = chartTab.getChartImg(); + c.setLeft(0); + c.setTop(0); + + fireOnPan(); + + start[0] = -1; + start[1] = -1; + } + + + /** + * This event is used to cancel the current dragging operation. + * + * @param event The mouse out event. + */ + public void onMouseOut(MouseOutEvent event) { + int x = event.getX(); + int y = event.getY(); + + if (!isSelected() || !isMouseOut(x, y) || start[0] == -1) { + return; + } + + Canvas c = chartTab.getChartImg(); + c.setLeft(0); + c.setTop(0); + + fireOnPan(); + + start[0] = -1; + start[1] = -1; + } + + + /** + * This method is required to check manually if the mouse pointer really + * moves out the chart area. The MouseOutEvent is also fired if the mouse + * goes down which doesn't seem to be correct. So, we gonna check this + * manually. + * + * @param x The x coordinate. + * @param y The y coordinate. + * + * @return true, if the mouse is really out of the chart area, otherwise + * false. + */ + protected boolean isMouseOut(int x, int y) { + Canvas chart = chartTab.getChartImg(); + + if (chart instanceof Img) { + chart = chart.getParentElement(); + } + + int left = chart.getPageLeft(); + int right = chart.getPageRight(); + int top = chart.getPageTop(); + int bottom = chart.getPageBottom(); + + if (x <= left || x >= right || y <= top || y >= bottom) { + return true; + } + + return false; + } + + + /** + * A pan event is fired to inform the registered listeners about a pan + * operation has finished. + */ + protected void fireOnPan() { + PanEvent event = new PanEvent(start, end); + + for (PanHandler handler: handlers) { + handler.onPan(event); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/PointRecord.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/PointRecord.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,105 @@ +package org.dive4elements.river.client.client.ui.chart; + +import com.google.gwt.json.client.JSONArray; +import com.google.gwt.json.client.JSONBoolean; +import com.google.gwt.json.client.JSONNumber; +import com.google.gwt.json.client.JSONString; +import com.google.gwt.json.client.JSONValue; + +import com.smartgwt.client.widgets.grid.ListGridRecord; + +/** Simple record to store points. */ +public class PointRecord extends ListGridRecord { + protected static final String ATTRIBUTE_X = "X"; + protected static final String ATTRIBUTE_Y = "Y"; + protected static final String ATTRIBUTE_NAME = "name"; + protected static final String ATTRIBUTE_ACTIVE = "active"; + + /** From a JSON-encoded point, create a PointRecord. */ + public static PointRecord fromJSON(JSONArray jsonArray) { + JSONValue x = jsonArray.get(0); + JSONNumber y = (JSONNumber) jsonArray.get(1); + JSONString s = (JSONString) jsonArray.get(2); + JSONBoolean b = (JSONBoolean)jsonArray.get(3); + + if(x instanceof JSONNumber) { + return new PointRecord( + b.booleanValue(), ((JSONNumber)x).doubleValue(), + y.doubleValue(), s.stringValue()); + } + else { + return new PointRecord( + b.booleanValue(), ((JSONString)x).stringValue(), + y.doubleValue(), s.stringValue()); + } + } + + protected boolean isTimeseriesPoint = false; + + public PointRecord(boolean isActive, double x, double y, String name) { + setActive(isActive); + setName(name); + setX(x); + setY(y); + } + + /** + * Constructor taking the x axis value as String representing a Date value. + * @param isActive + * @param x + * @param y + * @param name + */ + public PointRecord(boolean isActive, String x, double y, String name) { + setActive(isActive); + setName(name); + setX(x); + setY(y); + + this.isTimeseriesPoint = true; + } + + public void setActive(boolean isActive) { + setAttribute(ATTRIBUTE_ACTIVE, isActive); + } + + public boolean isActive() { + return getAttributeAsBoolean(ATTRIBUTE_ACTIVE); + } + + public boolean isTimeseriesPoint() { + return this.isTimeseriesPoint; + } + + public void setName(String name) { + setAttribute(ATTRIBUTE_NAME, name); + } + + public String getName() { + return getAttributeAsString(ATTRIBUTE_NAME); + } + + public void setX(double x) { + setAttribute(ATTRIBUTE_X, x); + } + + public void setX(String date) { + setAttribute(ATTRIBUTE_X, date); + } + + public void setY(double y) { + setAttribute(ATTRIBUTE_Y, y); + } + + public double getX() { + return getAttributeAsDouble(ATTRIBUTE_X); + } + + public String getXAsDate() { + return getAttributeAsString(ATTRIBUTE_X); + } + + public double getY() { + return getAttributeAsDouble(ATTRIBUTE_Y); + } +} \ No newline at end of file diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ZoomboxControl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ZoomboxControl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,324 @@ +package org.dive4elements.river.client.client.ui.chart; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.Positioning; +import com.smartgwt.client.types.SelectionType; +import com.smartgwt.client.widgets.ImgButton; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.events.MouseDownEvent; +import com.smartgwt.client.widgets.events.MouseDownHandler; +import com.smartgwt.client.widgets.events.MouseMoveEvent; +import com.smartgwt.client.widgets.events.MouseMoveHandler; +import com.smartgwt.client.widgets.events.MouseOutEvent; +import com.smartgwt.client.widgets.events.MouseOutHandler; +import com.smartgwt.client.widgets.events.MouseUpEvent; +import com.smartgwt.client.widgets.events.MouseUpHandler; + +import org.dive4elements.river.client.client.event.HasZoomHandlers; +import org.dive4elements.river.client.client.event.ZoomEvent; +import org.dive4elements.river.client.client.event.ZoomHandler; + + +/** + * This control observes that panel retrieved by ChartOutputTab.getChartPanel(). + * If activated, a zoombox is drawn. One of the two edges is the position of the + * mouse down event on the observed panel. The other edge is specified by the + * current mouse position. If the mouse up event occurs, start and end point + * relative to the left and upper border of the observed panel is determined and + * a ZoomEvent is fired. + * + * @author Ingo Weinzierl + */ +public class ZoomboxControl +extends ImgButton +implements MouseDownHandler, MouseUpHandler, MouseMoveHandler, HasZoomHandlers, + MouseOutHandler +{ + protected List handlers; + + protected ChartOutputTab chartTab; + + protected Canvas zoombox; + + protected int[] start; + protected int[] end; + + + public ZoomboxControl(ChartOutputTab chartTab, String imageUrl) { + super(); + + this.handlers = new ArrayList(); + this.chartTab = chartTab; + this.start = new int[] { -1, -1 }; + this.end = new int[2]; + this.zoombox = new Canvas(); + + initZoombox(); + + String baseUrl = GWT.getHostPageBaseURL(); + setSrc(baseUrl + imageUrl); + setActionType(SelectionType.CHECKBOX); + setSize(20); + setShowRollOver(false); + setSelected(false); + + Canvas chart = chartTab.getChartPanel(); + chart.addMouseDownHandler(this); + chart.addMouseOutHandler(this); + chart.addMouseMoveHandler(this); + chart.addMouseUpHandler(this); + } + + + /** + * Initializes the zoombox that is displayed over the observed area. The + * zoombox has an opaque background. Its height/width and x/y values are + * determined by the start point (mouse down) and the current mouse + * position. + */ + protected void initZoombox() { + Canvas chart = chartTab.getChartPanel(); + chart.addChild(zoombox); + + zoombox.setPosition(Positioning.ABSOLUTE); + zoombox.setBorder("2px solid black"); + zoombox.setOpacity(50); + zoombox.setWidth(1); + zoombox.setHeight(1); + zoombox.setLeft(-10000); + zoombox.setTop(-10000); + } + + + /** + * Registers a new ZoomHandler that wants to listen to ZoomEvents. + * + * @param handler A new ZoomHandler. + */ + public void addZoomHandler(ZoomHandler handler) { + if (handler != null) { + handlers.add(handler); + } + } + + + /** + * A mouse down event on the specified area will set the start point for the + * zoombox. + * + * @param event The mouse down event which contains the xy coordinates of + * the observed area. + */ + public void onMouseDown(MouseDownEvent event) { + if (!isSelected()) { + return; + } + + start[0] = getRelativeX(event.getX()) - 1; + start[1] = getRelativeY(event.getY()) + 1; + + end[0] = start[0]; + end[1] = start[1]; + } + + + /** + * A mouse move event on the specified area will set the end point for the + * zoombox. If the end point differs from the start point, an opaque box is + * displayed. + * + * @param event The mouse move event which contains the xy coordinates of + * the observed area. + */ + public void onMouseMove(MouseMoveEvent event) { + if (!isSelected() || !isZooming()) { + return; + } + + int x = getRelativeX(event.getX()); + int y = getRelativeY(event.getY()); + + end[0] = x > start[0] ? x-1 : x+1; + end[1] = y > start[1] ? y-1 : y+1; + + positionZoombox(); + } + + + /** + * The mouse up event finalizes the zoom operation. It sets the end point + * for this operation, clears the zoombox and fires a ZoomEvent. + * + * @param event The mouse up event which contains the xy coordinates of the + * observed area. + */ + public void onMouseUp(MouseUpEvent event) { + if (!isSelected()) { + return; + } + + end[0] = getRelativeX(event.getX()); + end[1] = getRelativeY(event.getY()); + + fireZoomEvent(); + + reset(); + } + + + /** + * The mouse out event is used to cancel an active zoom operation. + * + * @param event The mouse out event. + */ + public void onMouseOut(MouseOutEvent event) { + if (!isSelected() || !isMouseOut(event.getX(), event.getY())) { + return; + } + + reset(); + } + + + /** + * Returns the chart panel. + * + * @return the chart panel. + */ + protected Canvas getChartPanel() { + return chartTab.getChartPanel(); + } + + + /** + * This method is required to check manually if the mouse pointer really + * moves out the chart area. The MouseOutEvent is also fired if the mouse + * goes down which doesn't seem to be correct. So, we gonna check this + * manually. + * + * @param x The x coordinate. + * @param y The y coordinate. + * + * @return true, if the mouse is really out of the chart area, otherwise + * false. + */ + protected boolean isMouseOut(int x, int y) { + Canvas chart = getChartPanel(); + + int left = chart.getPageLeft(); + int right = chart.getPageRight(); + int top = chart.getPageTop(); + int bottom = chart.getPageBottom(); + + if (x <= left || x >= right || y <= top || y >= bottom) { + return true; + } + + return false; + } + + + /** + * Returns true, if a zoom action is in process. + * + * @return true, if a zoom action is in process. + */ + public boolean isZooming() { + return start[0] > 0 && start[1] > 0; + } + + + /** + * Returns the X coordinate relative to the left border. + * + * @param x The X coordinate relative to the window. + * + * @return the X coordinate relative to the left border. + */ + protected int getRelativeX(int x) { + return x - chartTab.getChartPanel().getPageLeft(); + } + + + /** + * Returns the Y coordinate relative to the top border. + * + * @param y The Y coordinate relative to the window. + * + * @return the Y coordinate relative to the top border. + */ + protected int getRelativeY(int y) { + return y - chartTab.getChartPanel().getPageTop(); + } + + + /** + * Returns min and max x/y values based on the stored values in start + * and end. + * + * @return an int[] as follows: [xmin, ymin, xmax, ymax]. + */ + protected int[] orderPositions() { + int xmin = start[0] < end[0] ? start[0] : end[0]; + int ymin = start[1] < end[1] ? start[1] : end[1]; + + int xmax = start[0] >= end[0] ? start[0] : end[0]; + int ymax = start[1] >= end[1] ? start[1] : end[1]; + + return new int[] { xmin, ymin, xmax, ymax }; + } + + + /** + * Sets the width, height, x and y values of the zoombox. + */ + protected void positionZoombox() { + int[] values = orderPositions(); + + zoombox.setLeft(values[0]); + zoombox.setTop(values[1]); + zoombox.setWidth(values[2] - values[0]); + zoombox.setHeight(values[3] - values[1]); + } + + + /** + * Clears the zoombox (set position and size to null). + */ + protected void clearZoombox() { + zoombox.setLeft(-10000); + zoombox.setTop(-10000); + zoombox.setWidth(1); + zoombox.setHeight(1); + } + + + /** + * Resets the zoom control (start point and zoombox). + */ + protected void reset() { + start[0] = -1; + start[1] = -1; + + clearZoombox(); + } + + + /** + * Fires a ZoomEvent to all registered listeners. + */ + protected void fireZoomEvent() { + int[] pos = orderPositions(); + + ZoomEvent event = new ZoomEvent(pos[0], pos[1], pos[2], pos[3]); + + for (ZoomHandler handler: handlers) { + handler.onZoom(event); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixEventSelect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixEventSelect.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,170 @@ +package org.dive4elements.river.client.client.ui.fixation; + +import java.util.List; +import java.util.ArrayList; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; + +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; + +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.IntDataItem; +import org.dive4elements.river.client.shared.model.IntegerArrayData; +import org.dive4elements.river.client.shared.model.FixingsOverviewInfo.FixEvent; + +import org.dive4elements.river.client.client.services.FixingsOverviewService; +import org.dive4elements.river.client.client.services.FixingsOverviewServiceAsync; + +/** + * This UIProvider lets you select events. + * + * @author Raimund Renkert + */ +public class FixEventSelect +extends FixationPanel +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + public static final int MAX_DISPLAYED_ITEMS = 5; + + protected FixingsOverviewServiceAsync overviewService = + GWT.create(FixingsOverviewService.class); + + protected List events; + + public FixEventSelect() { + htmlOverview = ""; + events = new ArrayList(); + } + + public Canvas createWidget(DataList data) { + instances.put(this.artifact.getUuid(), this); + + VLayout layout = new VLayout(); + + Canvas title = new Label(MESSAGES.eventselect()); + title.setHeight("25px"); + + layout.addMember(title); + return layout; + } + + @Override + public Canvas createOld(DataList dataList) { + List list = dataList.getAll(); + + Data data = getData(list, "events"); + + VLayout dataLayout = new VLayout(); + dataLayout.setWidth(130); + + DataItem[] items = data.getItems(); + + if (items.length > MAX_DISPLAYED_ITEMS) { + for (int i = 0; i < MAX_DISPLAYED_ITEMS-2; ++i) { + Label l = new Label(items[i].getLabel()); + l.setHeight(25); + dataLayout.addMember(l); + } + Label l = new Label("..."); + l.setHeight(25); + dataLayout.addMember(l); + l = new Label(items[items.length-1].getLabel()); + l.setHeight(25); + dataLayout.addMember(l); + } + else { + for (int i = 0; i < items.length; i++) { + Label l = new Label(items[i].getLabel()); + l.setHeight(25); + dataLayout.addMember(l); + } + } + + 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(dataLayout); + layout.addMember(back); + + return layout; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + public Data[] getData() { + List data = new ArrayList(); + + if (events.size() > 0) { + IntDataItem[] arr = new IntDataItem[events.size()]; + for (int i = 0, E = events.size(); i < E; i++) { + try { + Integer v = new Integer(events.get(i)); + arr[i] = new IntDataItem("id", "id", v.intValue()); + } + catch (NumberFormatException nfe) { + return data.toArray(new Data[data.size()]); + } + } + + IntegerArrayData iad = + new IntegerArrayData("events", "events", arr); + + data.add(iad); + } + + return data.toArray(new Data[data.size()]); + } + + + @Override + public void setValues(String cid, boolean checked) { + if (checked) { + events.add(cid); + } + else { + if (events.contains(cid)) { + events.remove(cid); + } + } + } + + + @Override + public boolean renderCheckboxes() { + return true; + } + + + public void success() { + for (FixEvent fe: fixInfo.getEvents()) { + events.add(fe.getCId()); + } + } + + public void dumpGWT(String cid) { + GWT.log("Setting values for cId: " + cid); + GWT.log("River: " + fixInfo.getRiver()); + GWT.log("Date: " + fixInfo.getEventByCId(cid).getDate()); + GWT.log("Name: " + fixInfo.getEventByCId(cid).getDescription()); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixFunctionSelect.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixFunctionSelect.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,173 @@ +package org.dive4elements.river.client.client.ui.fixation; + +import com.smartgwt.client.types.VerticalAlignment; +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.SelectItem; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +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 java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +public class FixFunctionSelect extends FixationPanel { + private static final Map funcDesc = new HashMap(); + + static { + funcDesc.put("log", "W(Q) = m*ln(Q + b)"); + funcDesc.put("linear", "W(Q) = m * Q + b"); + funcDesc.put("log-linear", "W(Q) = a*ln(m*Q+b)"); + funcDesc.put("exp", "W(Q) = m * a^Q + b"); + funcDesc.put("quad", "W(Q) = n*Q^2+m*Q+b"); + funcDesc.put("pow", "W(Q) = a * Q^c + d"); + funcDesc.put("sq-pow", "S(Q) = a * Q^b"); + } + + /** The combobox.*/ + protected DynamicForm form; + + @Override + public Canvas createWidget(DataList data) { + VLayout layout = new VLayout(); + layout.setAlign(VerticalAlignment.TOP); + layout.setHeight(25); + + LinkedHashMap initial = new LinkedHashMap(); + + form = new DynamicForm(); + + int size = data.size(); + + for (int i = 0; i < size; i++) { + Data d = data.get(i); + + Label label = new Label(d.getDescription()); + label.setValign(VerticalAlignment.TOP); + label.setHeight(20); + label.setWidth(400); + + SelectItem combobox = new SelectItem(d.getLabel()); + combobox.setWidth(250); + + LinkedHashMap funcTypes = new LinkedHashMap(); + + boolean defaultSet = false; + boolean first = true; + + DataItem def = d.getDefault(); + String defValue = def != null ? def.getStringValue() : null; + + if (defValue != null && defValue.length() > 0) { + initial.put(d.getLabel(), def.getStringValue()); + defaultSet = true; + } + + // I was here. Me 2. + for (DataItem item: d.getItems()) { + if (!defaultSet && first) { + initial.put(d.getLabel(), item.getStringValue()); + first = false; + } + + funcTypes.put(item.getStringValue(), item.getLabel()); + } + + label.setWidth(50); + combobox.setValueMap(funcTypes); + combobox.setShowTitle(false); + form.setItems(combobox); + + layout.addMember(label); + layout.addMember(form); + } + + form.setValues(initial); + + layout.setAlign(VerticalAlignment.TOP); + + return layout; + } + + + @Override + public Canvas createOld(DataList dataList) { + HLayout layout = new HLayout(); + VLayout vLayout = new VLayout(); + layout.setWidth("400px"); + + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + + int size = dataList.size(); + for (int i = 0; i < size; i++) { + Data data = dataList.get(i); + DataItem[] items = data.getItems(); + + for (DataItem item: items) { + HLayout hLayout = new HLayout(); + + String desc = funcDesc.containsKey(item.getLabel()) ? + funcDesc.get(item.getLabel()) : item.getLabel(); + hLayout.addMember(label); + hLayout.addMember(new Label(desc)); + + vLayout.addMember(hLayout); + vLayout.setWidth("130px"); + } + } + + Canvas back = getBackButton(dataList.getState()); + + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + + @Override + public Data[] getData() { + Map values = form.getValues(); + Iterator keys = values.keySet().iterator(); + + Data[] list = new Data[values.size()]; + int i = 0; + + while (keys.hasNext()) { + String fieldname = (String) keys.next(); + String selection = (String) values.get(fieldname); + + DataItem item = new DefaultDataItem(fieldname, null, selection); + + list[i++] = new DefaultData( + fieldname, null, null, new DataItem[] { item }); + } + + return list; + } + + + @Override + public void setValues(String cid, boolean checked) { + } + + @Override + public boolean renderCheckboxes() { + return false; + } + + @Override + public void success() { + } + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixGaugeSelectPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixGaugeSelectPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,179 @@ +package org.dive4elements.river.client.client.ui.fixation; + +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.SelectItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +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 java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +/** + * This UIProvider creates a panel for location or distance input. + * + * @author Raimund Renkert + */ +public class FixGaugeSelectPanel +extends FixationPanel +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected String first; + protected String second; + + protected SelectItem from; + protected SelectItem to; + + protected LinkedHashMap mapValues; + + public FixGaugeSelectPanel() { + htmlOverview = ""; + + mapValues = new LinkedHashMap(); + mapValues.put("0", MESSAGES.gauge_mnq()); + mapValues.put("1", MESSAGES.gauge_mq()); + mapValues.put("2", MESSAGES.gauge_mhq()); + mapValues.put("3", MESSAGES.gauge_hq5()); + } + + @Override + public Canvas createWidget(DataList data) { + instances.put(this.artifact.getUuid(), this); + + VLayout layout = new VLayout(); + + Label title = new Label(MESSAGES.gauge_class()); + title.setHeight(25); + + from = new SelectItem(MESSAGES.from()); + to = new SelectItem(MESSAGES.to()); + + from.setShowTitle(false); + to.setShowTitle(false); + from.setValueMap(mapValues); + from.setDefaultValues("0"); + from.setWidth(160); + to.setValueMap(mapValues); + to.setDefaultValues("3"); + to.setWidth(160); + + DynamicForm form = new DynamicForm(); + StaticTextItem separator = new StaticTextItem("separator"); + separator.setShowTitle(false); + separator.setValue(MESSAGES.to()); + form.setNumCols(5); + form.setFields(from, separator, to); + + layout.addMember(title); + layout.addMember(form); + + return layout; + } + + @Override + public Canvas createOld(DataList dataList) { + List items = dataList.getAll(); + + Data f = getData(items, "q1"); + Data t = getData(items, "q2"); + DataItem[] fItems = f.getItems(); + DataItem[] tItems = t.getItems(); + + StringBuilder sb = new StringBuilder(); + sb.append(mapValues.get(fItems[0].getLabel())); + sb.append(" " + MESSAGES.to() + " "); + sb.append(mapValues.get(tItems[0].getLabel())); + + Label old = new Label(sb.toString()); + old.setWidth(130); + + 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; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + @Override + public Data[] getData() { + List data = new ArrayList(); + + boolean valid = saveClassValues(); + if (valid) { + DataItem firstItem = new DefaultDataItem("q1", "q1", this.first); + DataItem secItem = new DefaultDataItem("q2", "q2", this.second); + data.add(new DefaultData( + "q1", + null, + null, + new DataItem[] { firstItem })); + data.add(new DefaultData( + "q2", + null, + null, + new DataItem[] { secItem })); + } + return data.toArray(new Data[data.size()]); + } + + + @Override + public void setValues(String cid, boolean checked) { + // No user interaction, do nothing. + } + + + @Override + public boolean renderCheckboxes() { + // No selection, return false. + return false; + } + + + @Override + public void success() {} + + protected boolean saveClassValues() { + String v1 = from.getValueAsString(); + String v2 = to.getValueAsString(); + try { + int v1i = Integer.parseInt(v1); + int v2i = Integer.parseInt(v2); + if (v1i <= v2i) { + this.first = v1; + this.second = v2; + return true; + } + } + catch(NumberFormatException nfe) { + return false; + } + return false; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixLocationPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixLocationPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,193 @@ +package org.dive4elements.river.client.client.ui.fixation; + +import java.util.List; +import java.util.ArrayList; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; + +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.ui.DoubleRangePanel; + +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; +/** + * This UIProvider creates a panel for location or distance input. + * + * @author Raimund Renkert + */ +public class FixLocationPanel +extends FixationPanel +implements BlurHandler +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + /** The constant name of the input field to enter locations.*/ + public static final String FIELD_VALUE_LOCATION = "location"; + + /** The constant name of the input field to enter distance.*/ + public static final String FIELD_VALUE_DISTANCE = "distance"; + + DoubleRangePanel inputPanel; + + double from; + double to; + double step; + + public FixLocationPanel() { + htmlOverview = ""; + } + + public Canvas createWidget(DataList data) { + instances.put(this.artifact.getUuid(), this); + + VLayout layout = new VLayout(); + + Canvas title = new Label(MESSAGES.distance()); + title.setHeight("25px"); + + inputPanel = new DoubleRangePanel( + MESSAGES.unitFrom(), + MESSAGES.unitTo(), + MESSAGES.unitWidth(), + 0d, + 0d, + 0d, + 240, + this); + + layout.addMember(title); + layout.addMember(inputPanel); + return layout; + } + + @Override + public Canvas createOld(DataList dataList) { + List items = dataList.getAll(); + + Data f = getData(items, "ld_from"); + Data t = getData(items, "ld_to"); + Data s = getData(items, "ld_step"); + DataItem[] fItems = f.getItems(); + DataItem[] tItems = t.getItems(); + DataItem[] sItems = s.getItems(); + + StringBuilder sb = new StringBuilder(); + sb.append(fItems[0].getLabel()); + sb.append(" " + MESSAGES.unitFrom() + " "); + sb.append(tItems[0].getLabel()); + sb.append(" " + MESSAGES.unitTo() + " "); + sb.append(sItems[0].getLabel()); + sb.append(" " + MESSAGES.unitWidth()); + + Label old = new Label(sb.toString()); + old.setWidth(130); + + 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; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + public Data[] getData() { + List data = new ArrayList(); + + boolean valid = saveRangeValues(inputPanel); + if (valid) { + String f = Double.valueOf(this.from).toString(); + String t = Double.valueOf(this.to).toString(); + String s = Double.valueOf(this.step).toString(); + DataItem fi = new DefaultDataItem("ld_from", "ld_from", f); + DataItem ti = new DefaultDataItem("ld_to", "ld_to", t); + DataItem si = new DefaultDataItem("ld_step", "ld_step", s); + data.add(new DefaultData("ld_from", null, null, new DataItem[]{ fi })); + data.add(new DefaultData("ld_to", null, null, new DataItem[]{ ti })); + data.add(new DefaultData("ld_step", null, null, new DataItem[]{ si })); + } + // what else? + return data.toArray(new Data[data.size()]); + } + + + protected boolean saveRangeValues(DoubleRangePanel p) { + FormItem[] items = p.getFields(); + boolean valid = p.validateForm(); + + if(valid) { + this.from = p.getFrom(); + this.to = p.getTo(); + this.step = p.getStep(); + } + return valid; + } + + + @Override + public void setValues(String cid, boolean checked) { + // No user interaction, do nothing. + } + + + @Override + public boolean renderCheckboxes() { + // No selection, return false. + return false; + } + + + public void success() { + inputPanel.setValues(fixInfo.getFrom(), fixInfo.getTo(), 100d); + } + + /** + * This method is used to validate the inserted data in the form fields. + * + * @param event The BlurEvent that gives information about the FormItem that + * has been modified and its value. + */ + public void onBlur(BlurEvent event) { + FormItem item = event.getItem(); + String field = item.getFieldName(); + + if (field == null) { + return; + } + DoubleRangePanel p = (DoubleRangePanel) event.getForm(); + } + + + public void dumpGWT(String cid) { + GWT.log("Setting values for cId: " + cid); + GWT.log("River: " + fixInfo.getRiver()); + GWT.log("Date: " + fixInfo.getEventByCId(cid).getDate()); + GWT.log("Name: " + fixInfo.getEventByCId(cid).getDescription()); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixMultiPeriodPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixMultiPeriodPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,241 @@ +package org.dive4elements.river.client.client.ui.fixation; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; + +import com.smartgwt.client.types.ListGridFieldType; +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.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; + +import org.dive4elements.river.client.client.FLYSConstants; +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 java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * This UIProvider creates a panel for location or distance input. + * + * @author Raimund Renkert + */ +public class FixMultiPeriodPanel +extends FixPeriodPanel +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected ListGrid elements; + + protected String values; + + public FixMultiPeriodPanel() { + this("", ""); + } + + public FixMultiPeriodPanel(String startName, String endName) { + super(startName, endName); + } + + @Override + public Canvas createWidget(DataList data) { + HLayout input = new HLayout(); + VLayout root = new VLayout(); + VLayout grid = new VLayout(); + VLayout layout = (VLayout) super.createWidget(data); + Button add = new Button(MESSAGES.add()); + elements = new ListGrid(); + + add.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent ce) { + Date f = inputPanel.getFromDate(); + Date t = inputPanel.getToDate(); + if (f == null || t == null) { + return; + } + DateRangeRecord drr = new DateRangeRecord(f, t); + elements.addData(drr); + } + }); + layout.addMember(add); + + Label sel = new Label("Selected"); + sel.setHeight(25); + elements.setWidth(185); + elements.setHeight(120); + elements.setShowHeaderContextMenu(false); + elements.setCanReorderFields(false); + elements.setCanSort(false); + elements.setCanEdit(false); + ListGridField from = new ListGridField("from", "From"); + ListGridField to = new ListGridField("to", "To"); + from.setWidth(70); + to.setWidth(70); + + final ListGridField removeField = + new ListGridField("_removeRecord", "Remove Record"){{ + setType(ListGridFieldType.ICON); + setIcon(GWT.getHostPageBaseURL() + MSG.removeFeature()); + setCanEdit(false); + setCanFilter(false); + setCanSort(false); + setCanGroupBy(false); + setCanFreeze(false); + setWidth(25); + }}; + + elements.addRecordClickHandler(new RecordClickHandler() { + public void onRecordClick(final RecordClickEvent event) { + // Just handle remove-clicks + if(!event.getField().getName().equals(removeField.getName())) { + return; + } + event.getViewer().removeData(event.getRecord()); + } + }); + + elements.setFields(from, to, removeField); + + grid.addMember(sel); + grid.addMember(elements); + input.addMember(layout); + input.addMember(grid); + root.addMember(input); + + return root; + } + + @Override + public Canvas createOld(DataList dataList) { + HLayout layout = new HLayout(); + layout.setWidth("400px"); + VLayout vLayout = new VLayout(); + vLayout.setWidth(130); + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + label.setHeight(25); + + List items = dataList.getAll(); + Data str = getData(items, "ana_data"); + DataItem[] strItems = str.getItems(); + + String[] pairs = strItems[0].getLabel().split(";"); + for (int i = 0; i < pairs.length; i++) { + String[] vals = pairs[i].split(","); + try { + long f = Long.valueOf(vals[0]).longValue(); + long t = Long.valueOf(vals[1]).longValue(); + Date from = new Date(f); + Date to = new Date(t); + String fromString = + DateTimeFormat.getMediumDateFormat().format(from); + String toString = + DateTimeFormat.getMediumDateFormat().format(to); + + Label dateLabel = new Label(fromString + " - " + toString); + dateLabel.setHeight(20); + vLayout.addMember(dateLabel); + } + catch(NumberFormatException nfe) { + } + } + Canvas back = getBackButton(dataList.getState()); + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + @Override + public Data[] getData() { + List data = new ArrayList(); + + boolean valid = saveDateValues(); + if(valid) { + DataItem item = new DefaultDataItem("ana_data", null, this.values); + data.add(new DefaultData( + "ana_data", + null, + null, + new DataItem[] { item })); + } + return data.toArray(new Data[data.size()]); + } + + + @Override + protected boolean saveDateValues() { + ListGridRecord[] lgr = elements.getRecords(); + if (lgr.length == 0) { + return false; + } + String data = ""; + for (int i = 0; i < lgr.length; i++) { + DateRangeRecord drr = (DateRangeRecord) lgr[i]; + data += drr.getFrom() + "," + drr.getTo(); + data += ";"; + } + values = data; + return true; + } + + + protected static class DateRangeRecord extends ListGridRecord { + protected Date from; + protected Date to; + + protected final static String FROM_FIELD = "from"; + protected final static String TO_FIELD = "to"; + + public DateRangeRecord (Date from, Date to) { + setFrom(from); + setTo(to); + } + + public void setFrom(Date from) { + this.from = from; + setAttribute( + FROM_FIELD, + DateTimeFormat.getMediumDateFormat().format(from)); + } + + + public void setTo(Date to) { + this.to = to; + setAttribute( + TO_FIELD, + DateTimeFormat.getMediumDateFormat().format(to)); + } + + + public long getFrom() { + return this.from.getTime(); + } + + + public long getTo() { + return this.to.getTime(); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixPeriodPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixPeriodPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,231 @@ +package org.dive4elements.river.client.client.ui.fixation; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; + +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.DateRangeItem; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +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.FixingsOverviewInfo.FixEvent; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * This UIProvider creates a panel for location or distance input. + * + * @author Raimund Renkert + */ +public class FixPeriodPanel +extends FixationPanel +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + DateRangeItem inputPanel; + + long start; + long end; + + protected String startName; + protected String endName; + + public FixPeriodPanel() { + this("start", "end"); + } + + public FixPeriodPanel(String startName, String endName) { + this.startName = startName; + this.endName = endName; + htmlOverview = ""; + } + + @Override + public Canvas createWidget(DataList data) { + instances.put(this.artifact.getUuid(), this); + + VLayout layout = new VLayout(); + + Label title = new Label(data.get(0).getDescription()); + title.setHeight("25px"); + + DynamicForm form = new DynamicForm(); + inputPanel = new DateRangeItem(); + inputPanel.setToTitle(MESSAGES.to()); + inputPanel.setFromTitle(MESSAGES.from()); + inputPanel.setShowTitle(false); + form.setFields(inputPanel); + + layout.addMember(title); + layout.addMember(form); + + return layout; + } + + @Override + public Canvas createOld(DataList dataList) { + List items = dataList.getAll(); + + Data start = getData(items, startName); + Data end = getData(items, endName); + DataItem[] startItem = start.getItems(); + DataItem[] endItem = end.getItems(); + + String v1 = startItem[0].getStringValue(); + String v2 = endItem[0].getStringValue(); + + long v1l = 0; + long v2l = 0; + try { + v1l = Long.parseLong(v1); + v2l = Long.parseLong(v2); + } + catch(NumberFormatException nfe) { + GWT.log(nfe.toString()); + } + Date d1 = new Date(v1l); + Date d2 = new Date(v2l); + + DateTimeFormat f = + DateTimeFormat.getFormat( + DateTimeFormat.PredefinedFormat.DATE_MEDIUM); + StringBuilder sb = new StringBuilder(); + sb.append(f.format(d1) + " - "); + sb.append(f.format(d2)); + + Label old = new Label(sb.toString()); + old.setWidth(130); + + 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; + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + @Override + public Data[] getData() { + List data = new ArrayList(); + + boolean valid = saveDateValues(); + if(valid) { + String start = Long.valueOf(this.start).toString(); + String end = Long.valueOf(this.end).toString(); + DataItem startItem = new DefaultDataItem(startName, startName, start); + DataItem endItem = new DefaultDataItem(endName, endName, end); + data.add(new DefaultData( + startName, + null, + null, + new DataItem[] { startItem })); + data.add(new DefaultData( + endName, + null, + null, + new DataItem[] { endItem })); + } + + return data.toArray(new Data[data.size()]); + } + + + @Override + public void setValues(String cid, boolean checked) { + // No user interaction, do nothing. + } + + + @Override + public boolean renderCheckboxes() { + // No selection, return false. + return false; + } + + @Override + public void success() { + List list = fixInfo.getEvents(); + + // The date in FixEvent is always "de" locale, so it seems... + DateTimeFormat df = DateTimeFormat.getFormat("yy.MM.yyyy"); + + if (!setFromAndToDate(list, df)) { + // or perhaps "en"? + df = DateTimeFormat.getFormat("MM/dd/yyyy"); + + if (!setFromAndToDate(list, df)) { + GWT.log("FixPeriodPanel::success(): could not set from and to dates!"); + } + } + } + + protected boolean setFromAndToDate(List list, DateTimeFormat df) { + try { + setFromDate(list.get(0).getDate(), df); + setToDate(list.get(list.size() - 1).getDate(), df); + return true; + } + catch(IllegalArgumentException ex) { + GWT.log("FixPeriodPanel::setFromAndToDate(): " + ex.toString()); + return false; + } + } + + protected void setFromDate(String date, DateTimeFormat df) + throws IllegalArgumentException + { + Date from = df.parse(date); + this.inputPanel.setFromDate(from); + } + + protected void setToDate(String date, DateTimeFormat df) + throws IllegalArgumentException + { + Date to = df.parse(date); + this.inputPanel.setToDate(to); + } + + protected boolean saveDateValues() { + Date st = inputPanel.getFromDate(); + Date en = inputPanel.getToDate(); + if (st == null || en == null) { + SC.warn(MESSAGES.error_wrong_date()); + return false; + } + + long start = st.getTime(); + long end = en.getTime(); + + if (start <= end) { + this.start = start; + this.end = end; + return true; + } + return false; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixQSelectPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixQSelectPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,63 @@ +package org.dive4elements.river.client.client.ui.fixation; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.widgets.Canvas; + +import org.dive4elements.river.client.client.FLYSConstants; + +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; + +/** + * This UIProvider creates a panel for location or distance input. + * + * @author Raimund Renkert + */ +public class FixQSelectPanel +extends FixationPanel +{ + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + public FixQSelectPanel() { + htmlOverview = ""; + } + + public Canvas createWidget(DataList data) { + instances.put(this.artifact.getUuid(), this); + + return new Canvas(); + } + + @Override + public Canvas createOld(DataList dataList) { + return new Canvas(); + } + + + /** + * This method returns the selected data. + * + * @return the selected/inserted data. + */ + public Data[] getData() { + return new Data[0]; + } + + + @Override + public void setValues(String cid, boolean checked) { + // No user interaction, do nothing. + } + + + @Override + public boolean renderCheckboxes() { + // No selection, return false. + return false; + } + + + public void success() {} +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixationPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixationPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,484 @@ +package org.dive4elements.river.client.client.ui.fixation; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.i18n.client.NumberFormat; +import com.google.gwt.json.client.JSONNumber; +import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONString; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.HTMLPane; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.events.ResizedEvent; +import com.smartgwt.client.widgets.events.ResizedHandler; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.FixingsOverviewService; +import org.dive4elements.river.client.client.services.FixingsOverviewServiceAsync; +import org.dive4elements.river.client.client.ui.AbstractUIProvider; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.FixAnalysisArtifact; +import org.dive4elements.river.client.shared.model.FixFilter; +import org.dive4elements.river.client.shared.model.FixingsOverviewInfo; + +import java.util.Date; +import java.util.HashMap; + + +/** + * This UIProvider creates helper panel for fixation analysis without input + * elements. + * + * @author Raimund Renkert + */ +public abstract class FixationPanel +extends AbstractUIProvider +implements ResizedHandler +{ + private static final long serialVersionUID = -3667553404493415619L; + + protected static HashMap instances = new HashMap(); + + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + protected FixingsOverviewServiceAsync overviewService = + GWT.create(FixingsOverviewService.class); + + protected String htmlOverview; + protected FixingsOverviewInfo fixInfo; + protected TabSet tabs; + protected Tab events; + protected Tab chart; + protected VLayout chartContainer; + protected Img chartImg; + protected TextItem kmText; + + public static final DateTimeFormat DTF = DateTimeFormat.getFormat("dd.MM.yyyy"); + + + public FixationPanel() { + chartImg = new Img(); + htmlOverview = ""; + } + + + /** Get the (master) artifact UUID. */ + protected String getArtifactUuid() { + return this.artifact.getUuid(); + } + + protected void init() { + } + + @Override + public Data[] getData() { + return null; + } + + @Override + public Canvas create(DataList list) { + VLayout layout = new VLayout(); + + Canvas helper = createHelper(); + this.helperContainer.addMember(helper); + + Canvas submit = getNextButton(); + Canvas widget = createWidget(list); + + layout.addMember(widget); + layout.addMember(submit); + return layout; + } + + @Override + public Canvas createOld(DataList list) { + return new DynamicForm(); + } + + protected Canvas createHelper() { + Config config = Config.getInstance(); + String locale = config.getLocale (); + + tabs = new TabSet(); + events = new Tab(MESSAGES.events()); + chart = new Tab(MESSAGES.kmchart()); + + chartContainer = new VLayout(); + Canvas scroll = createChartHelper(); + + VLayout layout = new VLayout(); + layout.addResizedHandler(this); + layout.addMember(chartContainer); + layout.addMember(scroll); + layout.setAlign(Alignment.CENTER); + chart.setPane(layout); + + final HTMLPane eventPane = new HTMLPane(); + + String river = artifact.getArtifactDescription().getRiver(); + createCallback(); + + String callBack = "fixationCallback(this.checked, this.name)"; + + if (this.artifact instanceof FixAnalysisArtifact == false) + return chartContainer; + + FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; + + overviewService.generateOverview( + locale, + artifact.getUuid(), + getOverviewFilter(art.getFilter()), + renderCheckboxes(), + callBack, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not receive overview."); + SC.warn(caught.getMessage()); + } + @Override + public void onSuccess(FixingsOverviewInfo info) { + GWT.log("Successfully loaded overview."); + fixInfo = info; + htmlOverview = info.getHTML(); + FixAnalysisArtifact art = (FixAnalysisArtifact)artifact; + FixFilter filter = art.getFilter(); + filter.setRiver(info.getRiver()); + if (filter.getCurrentKm() == -Double.MAX_VALUE || + filter.getCurrentKm() == -1d) { + filter.setCurrentKm(info.getFrom()); + filter.setToKm(info.getTo()); + } + if (kmText != null) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + try { + double d = Double.valueOf(filter.getCurrentKm()); + kmText.setValue(nf.format(d)); + } catch (NumberFormatException e) { + kmText.setValue(filter.getCurrentKm()); + } + } + eventPane.setContents(htmlOverview); + updateChartTab(fixInfo.getFrom()); + events.setPane(eventPane); + success(); + } + }); + + tabs.addTab(events); + tabs.addTab(chart); + + return tabs; + } + + + protected Canvas createChartHelper() { + DynamicForm form = new DynamicForm(); + Button lower = new Button("<<"); + lower.setWidth(30); + Button upper = new Button(">>"); + upper.setWidth(30); + kmText = new TextItem(); + kmText.setWidth(60); + kmText.setShowTitle(false); + + + form.setFields(kmText); + form.setWidth(60); + lower.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent ce) { + FixFilter filter = updateChartTabLow(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + try { + double d = Double.valueOf(filter.getCurrentKm()); + kmText.setValue(nf.format(d)); + } catch (NumberFormatException e) { + kmText.setValue(filter.getCurrentKm()); + } + } + }); + + upper.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent ce) { + FixFilter filter = updateChartTabUp(); + NumberFormat nf = NumberFormat.getDecimalFormat(); + try { + double d = Double.valueOf(filter.getCurrentKm()); + kmText.setValue(nf.format(d)); + } catch (NumberFormatException e) { + kmText.setValue(filter.getCurrentKm()); + } + } + }); + + kmText.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent ce) { + //TODO: get current value. + if(ce.getItem().getValue() != null) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + try { + double d = nf.parse(ce.getItem().getValue().toString()); + updateChartTab(d); + } + catch(NumberFormatException nfe) { + // Do nothing. + } + } + } + }); + + HLayout layout = new HLayout(); + layout.setAlign(Alignment.CENTER); + + layout.addMember(lower); + layout.addMember(form); + layout.addMember(upper); + return layout; + } + + protected void updateChartTab(double km) { + Config config = Config.getInstance(); + String locale = config.getLocale (); + + FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; + + if (fixInfo != null) { + if (km < fixInfo.getFrom()) km = fixInfo.getFrom(); + if (km > fixInfo.getTo()) km = fixInfo.getTo(); + } + + FixFilter filter = art.getFilter(); + + if (km < filter.getFromKm()) km = filter.getFromKm(); + if (km > filter.getToKm()) km = filter.getToKm(); + + filter.setCurrentKm(km); + + int hWidth = helperContainer.getWidth() - 12; + int hHeight = helperContainer.getHeight() - 62; + + if ((int)(hHeight *4f/3) < hWidth) { + hWidth = (int)(hHeight * 4f/3); + } + else { + hHeight = (int)(hWidth *3f/4); + } + + String imgUrl = GWT.getModuleBaseURL(); + imgUrl += "fixings-km-chart"; + imgUrl += "?locale=" + locale; + imgUrl += "&filter=" + getChartFilter(filter, hWidth, hHeight); + + if (chartContainer.hasMember(chartImg)) { + chartImg.setWidth(hWidth); + chartImg.setHeight(hHeight); + chartImg.setSrc(imgUrl); + } + else { + chartImg = new Img(imgUrl, hWidth, hHeight); + chartContainer.addMember(chartImg); + } + } + + + protected FixFilter updateChartTabLow() { + FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; + + FixFilter filter = art.getFilter(); + + double curr = filter.getCurrentKm(); + if (curr > filter.getFromKm()) { + double newVal = (curr - 0.1) * 10; + long round = Math.round(newVal); + updateChartTab(((double)round) / 10); + } + return filter; + } + + + protected FixFilter updateChartTabUp() { + FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; + + FixFilter filter = art.getFilter(); + + double curr = filter.getCurrentKm(); + if (curr < filter.getToKm()) { + double newVal = (curr + 0.1) * 10; + long round = Math.round(newVal); + updateChartTab(((double)round) / 10); + } + return filter; + } + + + @Override + public void onResized(ResizedEvent re) { + FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; + + updateChartTab(art.getFilter().getCurrentKm()); + } + + + private native void createCallback() /*-{ + $wnd.fixationCallback = @org.dive4elements.river.client.client.ui.fixation.FixationPanel::helperCallback(ZLjava/lang/String;); + }-*/; + + private static void helperCallback(boolean checked, String name) { + String[] parts = name.split(":"); + String uuid = parts[0]; + String cid = parts[1]; + + FixationPanel p = FixationPanel.getInstance(uuid); + if (p != null) { + p.setValues(cid, checked); + } + } + + private static FixationPanel getInstance(String uuid) { + return instances.get(uuid); + } + + public abstract Canvas createWidget(DataList data); + public abstract void setValues(String cid, boolean checked); + public abstract boolean renderCheckboxes(); + public abstract void success(); + + + /** Creates JSON string from filter. */ + public static String getOverviewFilter(FixFilter filter) { + String river = filter.getRiver(); + + if (river != null && river.length() > 0) { + JSONObject jfix = new JSONObject(); + JSONObject jfilter = new JSONObject(); + JSONObject jrName = new JSONObject(); + JSONString jrValue = new JSONString(river); + jrName.put("name", jrValue); + jfilter.put("river", jrName); + jfix.put("fixings", createFilter(filter, jfilter)); + return jfix.toString(); + } + return ""; + } + + public String getChartFilter(FixFilter filter, int width, int height) { + String river = filter.getRiver(); + double currentKm = filter.getCurrentKm(); + double fromKm = filter.getFromKm(); + double toKm = filter.getToKm(); + + if (river != null && river.length() > 0 && + currentKm >= fromKm && currentKm <= toKm) + { + JSONObject jfix = new JSONObject(); + JSONObject jfilter = new JSONObject(); + JSONObject jrName = new JSONObject(); + JSONString jrValue = new JSONString(river); + JSONObject jkm = new JSONObject(); + JSONNumber jkmValue = new JSONNumber(currentKm); + JSONObject jextent = new JSONObject(); + JSONNumber jwidth = new JSONNumber(width); + JSONNumber jheight = new JSONNumber(height); + + jkm.put("value", jkmValue); + jrName.put("name", jrValue); + jfilter.put("river", jrName); + jfilter.put("km", jkm); + jextent.put("width", jwidth); + jextent.put("height", jheight); + jfilter.put("extent", jextent); + jfix.put("fixings", createFilter(filter, jfilter)); + return jfix.toString(); + } + return ""; + } + + protected static JSONObject createFilter(FixFilter filter, JSONObject root) { + double fromKm = filter.getFromKm(); + double toKm = filter.getToKm(); + boolean hasDate = filter.getFromDate() > 0 && filter.getToDate() > 0; + + if (fromKm >= 0 && toKm >= 0 && fromKm <= toKm) { + JSONObject range = new JSONObject(); + JSONObject fromtokm = new JSONObject(); + JSONNumber f = new JSONNumber(fromKm); + JSONNumber t = new JSONNumber(toKm); + fromtokm.put("from", f); + fromtokm.put("to", t); + root.put("range", fromtokm); + } + + JSONObject and = new JSONObject(); + if (hasDate) { + long fromDate = filter.getFromDate(); + long toDate = filter.getToDate(); + + Date df = new Date(fromDate); + Date dt = new Date(toDate); + + JSONObject daterange = new JSONObject(); + JSONString f = new JSONString(DTF.format(df)); + JSONString t = new JSONString(DTF.format(dt)); + + daterange.put("from", f); + daterange.put("to", t); + and.put("date-range", daterange); + } + + int fromClass = filter.getFromClass(); + int toClass = filter.getToClass(); + + if (fromClass >= 0 && toClass >= 0 && fromClass <= toClass) { + JSONObject classrange = new JSONObject(); + JSONNumber f = new JSONNumber(fromClass); + JSONNumber t = new JSONNumber(toClass); + + classrange.put("from", f); + classrange.put("to", t); + and.put("sector-range", classrange); + } + + int[] events = filter.getEvents(); + + if (events.length > 0) { + StringBuilder cids = new StringBuilder(); + + for (int i = 0; i < events.length; i++) { + if (i > 0) cids.append(' '); + cids.append(events[i]); + } + JSONObject columns = new JSONObject(); + columns.put("cids", new JSONString(cids.toString())); + and.put("columns", columns); + } + if (and.size() > 0) { + JSONObject jFilter = new JSONObject(); + jFilter.put("and", and); + root.put("filter", jFilter); + } + return root; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/CapabilitiesPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/CapabilitiesPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,108 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Grid; + +import com.smartgwt.client.types.Overflow; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.Layout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.shared.model.Capabilities; +import org.dive4elements.river.client.shared.model.ContactInformation; +import org.dive4elements.river.client.client.FLYSConstants; + + +public class CapabilitiesPanel extends VLayout { + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected Capabilities capabilites; + + + public CapabilitiesPanel(Capabilities capabilites) { + super(); + this.capabilites = capabilites; + + initLayout(); + } + + + protected void initLayout() { + setMargin(5); + setOverflow(Overflow.AUTO); + initContent(); + } + + + protected void initContent() { + Grid grid = new Grid(10, 2); + grid.setCellPadding(10); + + grid.setText(0, 0, MSG.capabilitiesTitle() + ":"); + grid.setText(0, 1, capabilites.getTitle()); + grid.setText(1, 0, MSG.capabilitiesURL() + ":"); + grid.setText(1, 1, capabilites.getOnlineResource()); + grid.setText(2, 0, MSG.capabilitiesAccessConstraints() + ":"); + grid.setText(2, 1, capabilites.getAccessConstraints()); + grid.setText(3, 0, MSG.capabilitiesFees() + ":"); + grid.setText(3, 1, capabilites.getFees()); + + int row = 4; + + ContactInformation ci = capabilites.getContactInformation(); + + grid.setText(row, 0, MSG.capabilitiesContactInformation() + ":"); + + String person = ci.getPerson(); + if (person != null && person.length() > 0) { + grid.setText(row++, 1, person); + } + + String organization = ci.getOrganization(); + if (organization != null && organization.length() > 0) { + grid.setText(row++, 1, organization); + } + + String address = ci.getAddress(); + if (address != null && address.length() > 0) { + grid.setText(row++, 1, address); + } + + String pc = ci.getPostcode(); + String c = ci.getCity(); + if ((pc != null && pc.length() > 0) || (c != null && c.length() > 0)) { + grid.setText(row++, 1, pc + " " + c); + } + + String email = ci.getEmail(); + if (email != null && email.length() > 0) { + grid.setText(row++, 1, MSG.capabilitiesEmail() + ": " + email); + } + + String phone = ci.getPhone(); + if (phone != null && phone.length() > 0) { + grid.setText(row++, 1, MSG.capabilitiesPhone() + ": " + phone); + } + + Label title = new Label(MSG.capabilitiesHint()); + title.setHeight(25); + title.setStyleName("capabilities-info-title"); + + addMember(title); + addMember(grid); + } + + + protected Layout createRow(Label title, Label content) { + title.setWidth(100); + + HLayout layout = new HLayout(); + layout.addMember(title); + layout.addMember(content); + + return layout; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/DrawControl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/DrawControl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,251 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.types.SelectionType; +import com.smartgwt.client.widgets.ImgButton; +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.FormItem; +import com.smartgwt.client.widgets.form.fields.SelectItem; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.utils.EnableDisableCmd; + +import java.util.LinkedHashMap; + +import org.gwtopenmaps.openlayers.client.Map; +import org.gwtopenmaps.openlayers.client.Style; +import org.gwtopenmaps.openlayers.client.control.Control; +import org.gwtopenmaps.openlayers.client.control.DrawFeature; +import org.gwtopenmaps.openlayers.client.event.VectorFeatureAddedListener; +import org.gwtopenmaps.openlayers.client.feature.VectorFeature; +import org.gwtopenmaps.openlayers.client.handler.Handler; +import org.gwtopenmaps.openlayers.client.handler.PathHandler; +import org.gwtopenmaps.openlayers.client.handler.PolygonHandler; +import org.gwtopenmaps.openlayers.client.layer.Vector; +import org.gwtopenmaps.openlayers.client.util.Attributes; + +/** + * Widget that handles the drawing of pipes and dikes in the DigitizePanel (MapPanel). + */ +public class DrawControl extends HLayout implements VectorFeatureAddedListener { + + public static final String BARRIER_PIPE1 = "pipe1"; + public static final String BARRIER_PIPE2 = "pipe2"; + public static final String BARRIER_DITCH = "ditch"; + public static final String BARRIER_DAM = "dam"; + public static final String BARRIER_RINGDIKE = "ring_dike"; + + // FIXME: i18n + public static final String BARRIER_PIPE1_VALUE = "Rohr 1"; + public static final String BARRIER_PIPE2_VALUE = "Rohr 2"; + public static final String BARRIER_DITCH_VALUE = "Graben"; + public static final String BARRIER_DAM_VALUE = "Damm"; + public static final String BARRIER_RINGDIKE_VALUE = "Ringdeich"; + + public static final String FIELD_BARRIER_TYPE = "field_barrier_type"; + + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected EnableDisableCmd cmd; + + protected ImgButton button; + protected DynamicForm form; + + protected Map map; + protected Vector layer; + + protected Control control; + + + public DrawControl(Map map, Vector layer, EnableDisableCmd cmd) { + this.map = map; + this.layer = layer; + this.cmd = cmd; + + initialize(); + } + + + protected void initialize() { + setWidth(100); + setMembersMargin(0); + + button = new ImgButton(); + + final String baseUrl = GWT.getHostPageBaseURL(); + button.setSrc(baseUrl + MSG.digitize()); + button.setActionType(SelectionType.CHECKBOX); + button.setSize(20); + button.setShowRollOver(false); + button.setSelected(false); + button.setTooltip(MSG.digitizeObjects()); + + button.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + if (button.isSelected()) { + cmd.enable(); + } + else { + cmd.disable(); + } + } + }); + + form = new DynamicForm(); + form.setWidth(100); + form.setTitlePrefix(""); + form.setTitleSuffix(""); + + final LinkedHashMap map = new LinkedHashMap(); + map.put(BARRIER_PIPE1, MSG.getString(BARRIER_PIPE1)); + map.put(BARRIER_PIPE2, MSG.getString(BARRIER_PIPE2)); + map.put(BARRIER_DITCH, MSG.getString(BARRIER_DITCH)); + map.put(BARRIER_DAM, MSG.getString(BARRIER_DAM)); + map.put(BARRIER_RINGDIKE, MSG.getString(BARRIER_RINGDIKE)); + + final LinkedHashMap ics = new LinkedHashMap(); + ics.put(BARRIER_PIPE1, BARRIER_PIPE1); + ics.put(BARRIER_PIPE2, BARRIER_PIPE2); + ics.put(BARRIER_DITCH, BARRIER_DITCH); + ics.put(BARRIER_DAM, BARRIER_DAM); + ics.put(BARRIER_RINGDIKE, BARRIER_RINGDIKE); + + final SelectItem box = new SelectItem(FIELD_BARRIER_TYPE); + box.setTitle(""); + box.setWidth(100); + box.setValueMap(map); + box.setImageURLSuffix(".png"); + box.setValueIcons(ics); + + box.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent e) { + setSelectedControl(); + } + }); + + form.setFields(box); + + addMember(button); + addMember(form); + + layer.addVectorFeatureAddedListener(this); + + activate(false); + } + + + protected String getSelectedType() { + return form.getValueAsString(FIELD_BARRIER_TYPE); + } + + + @Override + public void onFeatureAdded(FeatureAddedEvent evt) { + setCurrentType(evt.getVectorFeature()); + } + + + protected void setCurrentType(VectorFeature feature) { + final Attributes attrs = feature.getAttributes(); + String type = attrs.getAttributeAsString("typ"); + + if (type == null || type.length() == 0) { + type = getSelectedType(); + + final Style style = FloodMap.getStyle(type); + if (style != null) { + feature.setStyle(style); + } + + if (type.equals(BARRIER_PIPE1)) { + attrs.setAttribute("typ", BARRIER_PIPE1_VALUE); + } + else if (type.equals(BARRIER_PIPE2)) { + attrs.setAttribute("typ", BARRIER_PIPE2_VALUE); + } + else if (type.equals(BARRIER_DAM)) { + attrs.setAttribute("typ", BARRIER_DAM_VALUE); + } + else if (type.equals(BARRIER_DITCH)) { + attrs.setAttribute("typ", BARRIER_DITCH_VALUE); + } + else if (type.equals(BARRIER_RINGDIKE)) { + attrs.setAttribute("typ", BARRIER_RINGDIKE_VALUE); + } + + layer.redraw(); + } + } + + + protected void removeControl() { + if (control != null) { + control.deactivate(); + map.removeControl(control); + } + } + + + protected void setSelectedControl() { + removeControl(); + + final String type = getSelectedType(); + + if (type == null || type.length() == 0) { + return; + } + + if (type.equalsIgnoreCase(BARRIER_RINGDIKE)) { + control = createDrawPolygonControl(); + } + else { + control = createDrawLineControl(); + } + + map.addControl(control); + control.activate(); + + // Make sure the barrier layer is on top; sometime it looses it z-index... + layer.setZIndex(1000); + } + + + protected Control createDrawControl(Handler handler) { + return new DrawFeature(layer, handler); + } + + + protected Control createDrawPolygonControl() { + return createDrawControl(new PolygonHandler()); + } + + + protected Control createDrawLineControl() { + return createDrawControl(new PathHandler()); + } + + + public void activate(boolean activate) { + final FormItem item = form.getField(FIELD_BARRIER_TYPE); + + if (activate) { + button.select(); + item.enable(); + setSelectedControl(); + } + else { + removeControl(); + button.deselect(); + item.disable(); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/ElevationWindow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/ElevationWindow.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,432 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.SelectionStyle; +import com.smartgwt.client.types.SortArrow; +import com.smartgwt.client.types.SortDirection; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.IButton; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.events.CloseClickEvent; +import com.smartgwt.client.widgets.events.CloseClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +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.EditCompleteEvent; +import com.smartgwt.client.widgets.grid.events.EditCompleteHandler; +import com.smartgwt.client.widgets.grid.events.RowOutEvent; +import com.smartgwt.client.widgets.grid.events.RowOutHandler; +import com.smartgwt.client.widgets.grid.events.RowOverEvent; +import com.smartgwt.client.widgets.grid.events.RowOverHandler; + +import org.gwtopenmaps.openlayers.client.Style; +import org.gwtopenmaps.openlayers.client.feature.VectorFeature; +import org.gwtopenmaps.openlayers.client.geometry.Geometry; +import org.gwtopenmaps.openlayers.client.geometry.LinearRing; +import org.gwtopenmaps.openlayers.client.geometry.LineString; +import org.gwtopenmaps.openlayers.client.geometry.Point; +import org.gwtopenmaps.openlayers.client.geometry.Polygon; +import org.gwtopenmaps.openlayers.client.layer.Vector; +import org.gwtopenmaps.openlayers.client.layer.VectorOptions; +import org.gwtopenmaps.openlayers.client.util.Attributes; + +import org.dive4elements.river.client.client.FLYSConstants; + + + +public class ElevationWindow extends Window { + + public static FLYSConstants MSG = GWT.create(FLYSConstants.class); + + public static final int WINDOW_WIDTH = 250; + public static final int WINDOW_HEIGHT = 250; + + protected FloodMap floodmap; + protected Vector layer; + protected VectorFeature feature; + + protected ListGrid grid; + + + private class PointRecord extends ListGridRecord { + protected VectorFeature point; + + public PointRecord(VectorFeature point, double x, double y, String z) { + super(); + + this.point = point; + setAttribute("x", x); + setAttribute("y", y); + setAttribute("z", z); + } + + public VectorFeature getPoint() { + return point; + } + } + + + public ElevationWindow(FloodMap floodmap, VectorFeature feature) { + super(); + this.feature = feature; + this.floodmap = floodmap; + + init(); + } + + + protected void init() { + addCloseClickHandler(new CloseClickHandler() { + public void onCloseClick(CloseClickEvent evt) { + doClose(); + } + }); + + initLayout(); + initEdit(); + updateGrid(); + } + + + protected void initLayout() { + setWidth(WINDOW_WIDTH); + setHeight(WINDOW_HEIGHT); + setTitle(MSG.ele_window_title()); + + VLayout root = new VLayout(); + root.setMembersMargin(5); + root.setPadding(5); + + root.addMember(getLabel()); + root.addMember(getGrid()); + root.addMember(getButtonBar()); + + addItem(root); + centerInPage(); + } + + + protected void initEdit() { + VectorOptions opts = new VectorOptions(); + opts.setProjection(floodmap.getRiverProjection()); + opts.setMaxExtent(floodmap.getMaxExtent()); + + layer = new Vector("tmp", opts); + layer.setIsBaseLayer(false); + + floodmap.getMap().addLayer(layer); + } + + + public Style getStyle() { + Style style = new Style(); + style.setStrokeColor("#000000"); + style.setStrokeWidth(1); + style.setFillColor("#FF0000"); + style.setFillOpacity(0.5); + style.setPointRadius(5); + style.setStrokeOpacity(1.0); + return style; + } + + + public Style getHighStyle() { + Style style = new Style(); + style.setStrokeColor("#000000"); + style.setStrokeWidth(1); + style.setFillColor("#FFFF22"); + style.setFillOpacity(0.5); + style.setPointRadius(5); + style.setStrokeOpacity(1.0); + return style; + } + + + protected Label getLabel() { + Label label = new Label(MSG.ele_window_label()); + label.setHeight(25); + + return label; + } + + + protected ListGrid getGrid() { + if (grid == null) { + grid = new ListGrid(); + grid.setCanEdit(true); + grid.setCanReorderFields(false); + grid.setAutoFitMaxWidth(WINDOW_WIDTH); + grid.setShowHeaderContextMenu(false); + grid.setShowSortArrow(SortArrow.NONE); + grid.setSortDirection(SortDirection.DESCENDING); + grid.setSelectionType(SelectionStyle.NONE); + + ListGridField x = new ListGridField("x", MSG.ele_window_x_col()); + x.setCanEdit(false); + + ListGridField y = new ListGridField("y", MSG.ele_window_y_col()); + y.setCanEdit(false); + + ListGridField z = new ListGridField("z", MSG.ele_window_z_col()); + z.setCanEdit(true); + + grid.setFields(x, y, z); + + grid.addRowOverHandler(new RowOverHandler() { + public void onRowOver(RowOverEvent evt) { + PointRecord pr = (PointRecord) evt.getRecord(); + VectorFeature p = pr.getPoint(); + + p.setStyle(getHighStyle()); + layer.redraw(); + } + }); + + grid.addRowOutHandler(new RowOutHandler() { + public void onRowOut(RowOutEvent evt) { + PointRecord pr = (PointRecord) evt.getRecord(); + VectorFeature p = pr.getPoint(); + + p.setStyle(getStyle()); + layer.redraw(); + } + }); + + grid.addEditCompleteHandler(new EditCompleteHandler() { + public void onEditComplete(EditCompleteEvent evt) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + String z = (String) evt.getNewValues().get("z"); + + try { + nf.parse(z); + } + catch (NumberFormatException nfe) { + SC.warn(MSG.ele_window_format_error() + " " + z); + + PointRecord old = (PointRecord) evt.getOldRecord(); + + ListGridRecord[] records = grid.getRecords(); + records[evt.getRowNum()] = old; + + grid.setRecords(records); + } + + } + }); + } + + return grid; + } + + + protected HLayout getButtonBar() { + HLayout bar = new HLayout(); + bar.setAlign(Alignment.CENTER); + bar.setHeight(25); + bar.setMembersMargin(15); + + bar.addMember(getOKButton()); + bar.addMember(getCancelButton()); + + return bar; + } + + + protected IButton getOKButton() { + IButton btn = new IButton(MSG.ele_window_ok_button()); + + btn.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent evt) { + if (saveElevation()) { + doClose(); + } + + } + }); + + return btn; + } + + + protected IButton getCancelButton() { + IButton btn = new IButton(MSG.ele_window_cancel_button()); + + btn.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent evt) { + doClose(); + } + }); + + return btn; + } + + + public void updateGrid() { + Attributes attr = feature.getAttributes(); + Geometry geom = feature.getGeometry(); + + String barrierType = null; + + if (attr != null) { + barrierType = attr.getAttributeAsString("typ"); + } + else { + barrierType = DrawControl.BARRIER_DAM_VALUE; + } + + GWT.log("Geometry is from type: " + geom.getClassName()); + GWT.log("Barrier is from type: " + barrierType); + + double[][] points = getPointsFromGeometry(geom); + double[] ele = extractElevations(attr); + + if (points == null) { + return; + } + + NumberFormat nf = NumberFormat.getDecimalFormat(); + + ListGrid grid = getGrid(); + + int zLen = ele != null ? ele.length : 0; + + for (int i = 0, len = points.length; i < len; i++) { + double[] point = points[i]; + VectorFeature p = addPoint(point[0], point[1]); + + String value = null; + + if (zLen > i) { + value = nf.format(ele[i]); + } + else if (barrierType.equals(DrawControl.BARRIER_DITCH_VALUE)) { + value = "-9999"; + } + else { + value = "9999"; + } + + grid.addData(new PointRecord(p, point[0], point[1], value)); + } + + grid.redraw(); + } + + + public static double[] extractElevations(Attributes attr) { + if (attr == null) { + return null; + } + + String elevationStr = attr.getAttributeAsString("elevation"); + + if (elevationStr == null || elevationStr.length() == 0) { + return null; + } + + String[] elevations = elevationStr.split(" "); + + int len = elevations != null ? elevations.length : 0; + + if (len == 0) { + return null; + } + + double[] res = new double[len]; + + for (int i = 0; i < len; i++) { + try { + res[i] = Double.valueOf(elevations[i]); + } + catch (NumberFormatException nfe) { + // go on + } + } + + return res; + } + + + public static double[][] getPointsFromGeometry(Geometry geom) { + String clazz = geom.getClassName(); + + if (clazz != null && clazz.equals(Geometry.LINESTRING_CLASS_NAME)) { + return getPointsFromLineString( + LineString.narrowToLineString(geom.getJSObject())); + } + else if (clazz != null && clazz.equals(Geometry.POLYGON_CLASS_NAME)) { + return getPointsFromPolygon( + Polygon.narrowToPolygon(geom.getJSObject())); + } + else { + SC.warn(MSG.ele_window_geometry_error() + " " + clazz); + } + + return null; + } + + + public static double[][] getPointsFromLineString(LineString line) { + return line.getCoordinateArray(); + } + + + public static double[][] getPointsFromPolygon(Polygon polygon) { + LinearRing[] rings = polygon.getComponents(); + + return getPointsFromLineString(rings[0]); + } + + + protected VectorFeature addPoint(double x, double y) { + VectorFeature point = new VectorFeature(new Point(x, y), getStyle()); + layer.addFeature(point); + + return point; + } + + + protected boolean saveElevation() { + ListGridRecord[] records = grid.getRecords(); + + NumberFormat nf = NumberFormat.getDecimalFormat(); + + StringBuilder sb = new StringBuilder(); + + for (ListGridRecord record: records) { + PointRecord pr = (PointRecord) record; + String value = pr.getAttributeAsString("z"); + + try { + double z = nf.parse(value); + sb.append(String.valueOf(z)); + } + catch (NumberFormatException nfe) { + SC.warn(MSG.ele_window_save_error()); + return false; + } + + sb.append(" "); + } + + Attributes attr = feature.getAttributes(); + attr.setAttribute("elevation", sb.toString()); + + return true; + } + + + protected void doClose() { + floodmap.getMap().removeLayer(layer); + destroy(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/ExternalWMSWindow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/ExternalWMSWindow.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,394 @@ +package org.dive4elements.river.client.client.ui.map; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.LinkedHashMap; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.ComboBoxItem; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.Layout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.shared.model.Capabilities; +import org.dive4elements.river.client.shared.model.WMSLayer; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.GCService; +import org.dive4elements.river.client.client.services.GCServiceAsync; +import org.dive4elements.river.client.client.services.MapUrlService; +import org.dive4elements.river.client.client.services.MapUrlServiceAsync; + + +public class ExternalWMSWindow extends Window { + + public interface LayerLoader { + void load(List toLoad); + } // end of interface WMSLayerLoader + + + protected GCServiceAsync gcService = GWT.create(GCService.class); + protected MapUrlServiceAsync muService = GWT.create(MapUrlService.class); + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected Layout inputPanel; + protected Layout infoPanel; + protected Layout layersPanel; + + protected Capabilities capabilites; + + protected String srs; + + protected LinkedHashMap urls; + protected String url; + + protected LayerLoader loader; + + + public ExternalWMSWindow(LayerLoader loader) { + super(); + this.urls = new LinkedHashMap(); + this.loader = loader; + } + + + public ExternalWMSWindow(LayerLoader loader, String srs) { + this(loader); + this.srs = srs; + } + + + protected void setUrl(String url) { + this.url = url; + } + + + protected String getUrl() { + return url; + } + + + protected String getCapabilitiesUrl() { + String cUrl = url; + + if (url.indexOf("?") >= 0) { + cUrl += "&SERVICE=WMS&REQUEST=GetCapabilities"; + } + else { + cUrl += "?SERVICE=WMS&REQUEST=GetCapabilities"; + } + + return cUrl; + } + + + protected void setCapabilites(Capabilities capabilites) { + this.capabilites = capabilites; + } + + + public void start() { + show(); + centerInPage(); + + goToInputPanel(); + } + + + protected void goToInputPanel() { + clearItems(); + + inputPanel = createInputPanel(); + + addItem(inputPanel); + + setWidth(380); + setHeight(140); + } + + + protected void goToInfoPanel() { + clearItems(); + + infoPanel = createInfoPanel(); + + addItem(infoPanel); + + setWidth(500); + setHeight(500); + + centerInPage(); + } + + + protected void goToLayersPanel() { + clearItems(); + + layersPanel = createLayersPanel(); + + addItem(layersPanel); + + setWidth(500); + setHeight(500); + } + + + protected void clearItems() { + Canvas[] items = getItems(); + + if (items != null) { + for (Canvas item: items) { + removeItem(item); + } + } + } + + + protected void setUrls(Map urls) { + this.urls.putAll(urls); + } + + protected void readUrls() { + } + + + protected Layout createInputPanel() { + setTitle(MSG.addwmsInputTitle()); + + readUrls(); + + DynamicForm form = new DynamicForm(); + final ComboBoxItem url = new ComboBoxItem("Url:"); + url.setRedrawOnChange(true); + muService.getUrls(new AsyncCallback >() { + public void onFailure(Throwable caught) { + GWT.log("Error reading WMS-Services" + caught.getMessage()); + } + public void onSuccess(Map wms) { + urls.putAll(wms); + url.setValueMap(urls); + + } + }); + + String oldUrl = getUrl(); + if (oldUrl != null && oldUrl.length() > 0) { + url.setValue(oldUrl); + } + + ClickHandler goHandler = new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + String newUrl = url.getValue().toString(); + + if (!isUrlValid(newUrl)) { + SC.warn(MSG.addwmsInvalidURL()); + return; + } + + setUrl(newUrl); + + doCapabilitesRequest(); + } + }; + + ClickHandler cancelHandler = new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + quit(); + } + }; + + VLayout root = new VLayout(); + root.setHeight(75); + root.setMargin(10); + root.setLayoutMargin(10); + + form.setFields(url); + root.addMember(form); + root.addMember(createButtonPanel(null, goHandler, cancelHandler)); + + return root; + } + + + protected Layout createInfoPanel() { + setTitle(MSG.addwmsInfoTitle()); + + ClickHandler backHandler = new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + goToInputPanel(); + } + }; + + ClickHandler goHandler = new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + goToLayersPanel(); + } + }; + + ClickHandler cancelHandler = new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + quit(); + } + }; + + VLayout root = new VLayout(); + VLayout panel = new CapabilitiesPanel(capabilites); + + root.setLayoutMargin(10); + panel.setHeight(420); + + root.addMember(panel); + root.addMember(createButtonPanel(backHandler, goHandler, cancelHandler)); + + return root; + } + + + protected Layout createLayersPanel() { + setTitle(MSG.addwmsLayerTitle()); + + final WMSLayersTree tree = new WMSLayersTree(capabilites, srs); + + ClickHandler backHandler = new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + goToInfoPanel(); + } + }; + + ClickHandler goHandler = new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + ListGridRecord[] selection = tree.getSelectedRecords(); + + if (selection == null || selection.length == 0) { + return; + } + + List toLoad = new ArrayList(); + + for (ListGridRecord record: selection) { + toLoad.add( + ((WMSLayersTree.WMSLayerNode) record).getWMSLayer()); + + } + + finish(toLoad); + } + }; + + ClickHandler cancelHandler = new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + quit(); + } + }; + + VLayout root = new VLayout(); + + root.setLayoutMargin(10); + tree.setHeight(420); + + root.addMember(tree); + root.addMember(createButtonPanel(backHandler, goHandler, cancelHandler)); + + return root; + } + + + /** + * @param back + * @param ok + * @param cancel + * + * @return + */ + protected Layout createButtonPanel( + ClickHandler backHandler, + ClickHandler goHandler, + ClickHandler cancelHandler + ) { + Button back = new Button(MSG.addwmsBack()); + Button go = new Button(MSG.addwmsContinue()); + Button cancel = new Button(MSG.addwmsCancel()); + + if (backHandler != null) { + back.addClickHandler(backHandler); + } + else { + back.setDisabled(true); + } + + if (goHandler != null) { + go.addClickHandler(goHandler); + } + else { + go.setDisabled(true); + } + + if (cancelHandler != null) { + cancel.addClickHandler(cancelHandler); + } + else { + cancel.setDisabled(true); + } + + HLayout buttonPanel = new HLayout(); + buttonPanel.setHeight(25); + buttonPanel.setMembersMargin(15); + buttonPanel.setLayoutTopMargin(10); + buttonPanel.addMember(back); + buttonPanel.addMember(go); + buttonPanel.addMember(cancel); + + return buttonPanel; + } + + + protected boolean isUrlValid(String url) { + // TODO Improve URL validation + return !(url == null || url.length() == 0); + } + + + protected void finish(List toLoad) { + loader.load(toLoad); + + quit(); + } + + + protected void quit() { + destroy(); + } + + + protected void doCapabilitesRequest() { + gcService.query(getCapabilitiesUrl(),new AsyncCallback() { + public void onFailure(Throwable e) { + SC.warn(MSG.getString(e.getMessage())); + } + + public void onSuccess(Capabilities capabilites) { + setCapabilites(capabilites); + goToInfoPanel(); + } + }); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/FloodMap.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/FloodMap.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,330 @@ +package org.dive4elements.river.client.client.ui.map; + +import org.gwtopenmaps.openlayers.client.Bounds; +import org.gwtopenmaps.openlayers.client.LonLat; +import org.gwtopenmaps.openlayers.client.Map; +import org.gwtopenmaps.openlayers.client.MapOptions; +import org.gwtopenmaps.openlayers.client.MapWidget; +import org.gwtopenmaps.openlayers.client.Style; +import org.gwtopenmaps.openlayers.client.control.Attribution; +import org.gwtopenmaps.openlayers.client.control.ScaleLine; +import org.gwtopenmaps.openlayers.client.control.ScaleLineOptions; +import org.gwtopenmaps.openlayers.client.event.VectorFeatureAddedListener; +import org.gwtopenmaps.openlayers.client.feature.VectorFeature; +import org.gwtopenmaps.openlayers.client.format.GeoJSON; +import org.gwtopenmaps.openlayers.client.layer.Layer; +import org.gwtopenmaps.openlayers.client.layer.Vector; +import org.gwtopenmaps.openlayers.client.layer.VectorOptions; +import org.gwtopenmaps.openlayers.client.util.Attributes; +import org.gwtopenmaps.openlayers.client.util.JObjectArray; +import org.gwtopenmaps.openlayers.client.util.JSObject; + + +public class FloodMap implements VectorFeatureAddedListener { + + public static final String LAYER_BARRIERS = "vector_layer_barriers"; + + public static final String MARK_SELECTED = "mark.selected"; + + public static final int SELECTED_STROKE_WIDTH = 2; + + protected MapWidget mapWidget; + protected Map map; + protected Vector barrierLayer; + protected String srid; + protected Bounds maxExtent; + protected ScaleLine scaleLine; + + public FloodMap(String srid, Bounds maxExtent, int width, int height) { + this.srid = srid; + this.maxExtent = maxExtent; + recreateWidget(width, height); + getBarrierLayer(); + } + + + public void recreateWidget(int width, int height) { + final MapOptions opts = new MapOptions(); + opts.setControls(new JObjectArray(new JSObject[] {})); + opts.setNumZoomLevels(16); + opts.setProjection(getRiverProjection()); + opts.setMaxExtent(maxExtent); + opts.setUnits("m"); + opts.setMaxResolution(500); // TODO DO THIS ON THE FLY + + mapWidget = new MapWidget( + Integer.toString(width - 4), + Integer.toString(height), + opts); + map = mapWidget.getMap(); + map.addControl(new Attribution()); + } + + + @Override + public void onFeatureAdded(FeatureAddedEvent evt) { + final VectorFeature feature = evt.getVectorFeature(); + + final Attributes attrs = feature.getAttributes(); + final String type = attrs.getAttributeAsString("typ"); + + if (type == null || type.length() == 0) { + return; + } + + final Style style = getStyle(type); + if (style != null) { + feature.setStyle(style); + } + + // necessary, otherwise the setStyle() has no effect + getBarrierLayer().redraw(); + } + + + /** + * Returns an OpenLayers.Style based on a given type. + * + * @param type Type can be one of "pipe1", "pipe2", "ditch", "dam", + * "ringdike". + * + * @return an OpenLayers.Style object. + */ + public static Style getStyle(String type) { + final Style style = new Style(); + + if (type == null) { + return null; + } + + if (type.equals(DrawControl.BARRIER_PIPE1) + || type.equals(DrawControl.BARRIER_PIPE1_VALUE) + ) { + style.setFillColor("#800080"); + style.setStrokeColor("#800080"); + } + else if (type.equals(DrawControl.BARRIER_PIPE2) + || type.equals(DrawControl.BARRIER_PIPE2_VALUE) + ) { + style.setFillColor("#808080"); + style.setStrokeColor("#808080"); + } + else if (type.equals(DrawControl.BARRIER_DAM) + || type.equals(DrawControl.BARRIER_DAM_VALUE) + ) { + style.setFillColor("#008000"); + style.setStrokeColor("#008000"); + } + else if (type.equals(DrawControl.BARRIER_DITCH) + || type.equals(DrawControl.BARRIER_DITCH_VALUE) + ) { + style.setFillColor("#800000"); + style.setStrokeColor("#800000"); + } + else if (type.equals(DrawControl.BARRIER_RINGDIKE) + || type.equals(DrawControl.BARRIER_RINGDIKE_VALUE) + ) { + style.setFill(false); + style.setStrokeColor("#FF8000"); + } + + return style; + } + + + public MapWidget getMapWidget() { + return mapWidget; + } + + + public Map getMap() { + return map; + } + + + public String getRiverProjection() { + return "EPSG:" + srid; + } + + + public Bounds getMaxExtent() { + return maxExtent; + } + + + public Vector getBarrierLayer() { + if (barrierLayer == null) { + final VectorOptions opts = new VectorOptions(); + opts.setProjection(getRiverProjection()); + opts.setMaxExtent(getMaxExtent()); + + barrierLayer = new Vector(LAYER_BARRIERS, opts); + barrierLayer.setIsBaseLayer(true); + + map.addLayer(barrierLayer); + map.setLayerZIndex(barrierLayer, 1000); + + barrierLayer.addVectorFeatureAddedListener(this); + } + + return barrierLayer; + } + + + public String getFeaturesAsGeoJSON() { + // disable features before exporting to GeoJSON + disableFeatures(); + + final VectorFeature[] features = barrierLayer.getFeatures(); + + if (features == null || features.length == 0) { + return null; + } + + return new GeoJSON().write(features); + } + + + public void setSize(String width, String height) { + mapWidget.setWidth(width); + mapWidget.setHeight(height); + final int currentZoom = map.getZoom(); + final LonLat currentCenter = map.getCenter(); + map.updateSize(); + map.zoomTo(currentZoom); + map.setCenter(currentCenter); + } + + + public void addLayer(Layer layer) { + if (layer != null) { + map.addLayer(layer); + + final int index = map.getLayerIndex(layer); + final int newIndex = index * (-1) + 1; + + map.raiseLayer(layer, newIndex); + + update(); + } + } + + + public void hideBarrierLayer () { + if (getBarrierLayer() != null) { + barrierLayer.setIsVisible(false); + } + } + + public void showBarrierLayer () { + if (getBarrierLayer() != null) { + barrierLayer.setIsVisible(true); + } + } + + + public void selectFeature(VectorFeature feature) { + if (feature != null) { + selectFeatures(new VectorFeature[] { feature } ); + } + } + + + public void selectFeatures(VectorFeature[] features) { + if (features == null || features.length == 0) { + return; + } + + for (final VectorFeature feature: features) { + final Attributes attr = feature.getAttributes(); + + if (attr.getAttributeAsInt(MARK_SELECTED) == 1) { + continue; + } + + attr.setAttribute(MARK_SELECTED, 1); + + final Style style = feature.getStyle(); + final double strokeWidth = style.getStrokeWidth(); + + style.setStrokeWidth(strokeWidth+SELECTED_STROKE_WIDTH); + } + + getBarrierLayer().redraw(); + } + + + public void disableFeatures() { + final Vector barriers = getBarrierLayer(); + final VectorFeature[] features = barriers.getFeatures(); + + if (features == null || features.length == 0) { + return; + } + + disableFeatures(features); + } + + + public void disableFeature(VectorFeature feature) { + if (feature != null) { + disableFeatures(new VectorFeature[] { feature }); + } + } + + + public void disableFeatures(VectorFeature[] features) { + if (features == null || features.length == 0) { + return; + } + + for (final VectorFeature feature: features) { + final Attributes attr = feature.getAttributes(); + + if (attr.getAttributeAsInt(MARK_SELECTED) == 0) { + continue; + } + + attr.setAttribute(FloodMap.MARK_SELECTED, 0); + + final Style style = feature.getStyle(); + final double strokeWidth = style.getStrokeWidth(); + + style.setStrokeWidth(strokeWidth-SELECTED_STROKE_WIDTH); + } + + getBarrierLayer().redraw(); + } + + + public void update() { + final Layer[] layers = map.getLayers(); + + for (final Layer l: layers) { + l.redraw(); + } + } + + + public void updateSize() { + this.map.updateSize(); + } + + + public void activateScaleLine(boolean activate) { + if (activate) { + final ScaleLineOptions slOpts = new ScaleLineOptions(); + slOpts.setBottomInUnits("m"); + slOpts.setBottomOutUnits("km"); + slOpts.setTopInUnits(""); + slOpts.setTopOutUnits(""); + + scaleLine = new ScaleLine(slOpts); + this.map.addControl(scaleLine); + } + else if (!activate && scaleLine != null){ + this.map.removeControl(scaleLine); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/GetFeatureInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/GetFeatureInfo.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,125 @@ +package org.dive4elements.river.client.client.ui.map; + +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.gwtopenmaps.openlayers.client.Map; +import org.gwtopenmaps.openlayers.client.LonLat; +import org.gwtopenmaps.openlayers.client.Pixel; +import org.gwtopenmaps.openlayers.client.event.MapClickListener; + +import org.dive4elements.river.client.shared.model.FeatureInfo; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.GFIService; +import org.dive4elements.river.client.client.services.GFIServiceAsync; +import org.dive4elements.river.client.shared.model.FacetRecord; +import org.dive4elements.river.client.shared.model.Theme; +import org.dive4elements.river.client.shared.model.AttributedTheme; +import org.dive4elements.river.client.shared.model.FeatureInfoResponse; +import org.dive4elements.river.client.client.ui.ThemePanel; + + +public class GetFeatureInfo implements MapClickListener { + + protected GFIServiceAsync gfiService = GWT.create(GFIService.class); + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected GetFeatureInfoWindow gfiWindow; + + protected Map map; + protected ThemePanel themePanel; + protected String infoFormat; + + + /** + * @param map + * @param themes + * @param url + * @param infoFormat + */ + public GetFeatureInfo(Map map, ThemePanel themePanel, String infoFormat) { + this.map = map; + this.themePanel = themePanel; + this.infoFormat = infoFormat; + } + + + public void activate(boolean activate) { + if (activate) { + map.addMapClickListener(this); + } + else { + map.removeListener(this); + } + } + + + protected void newGetFeatureInfoWindow(List features, String title) { + if (gfiWindow != null) { + gfiWindow.destroy(); + } + + gfiWindow = new GetFeatureInfoWindow(features, title); + gfiWindow.show(); + } + + protected void newGetFeatureInfoWindow(String response, String title) { + if (gfiWindow != null) { + gfiWindow.destroy(); + } + + gfiWindow = new GetFeatureInfoWindow(response, title); + gfiWindow.show(); + } + + @Override + public void onClick(MapClickListener.MapClickEvent e) { + LonLat lonlat = e.getLonLat(); + Pixel pixel = map.getPixelFromLonLat(lonlat); + + if (themePanel.getSelectedRecords().length == 0) { + SC.say(MSG.requireTheme()); + } + + for (ListGridRecord rec : themePanel.getSelectedRecords()) { + Theme act_theme = ((FacetRecord)rec).getTheme(); + final AttributedTheme at = (AttributedTheme)act_theme; + gfiService.query( + act_theme, + infoFormat, + map.getExtent().toString(), + map.getProjection(), + (int) map.getSize().getHeight(), + (int) map.getSize().getWidth(), + pixel.x(), pixel.y(), + new AsyncCallback() { + @Override + public void onFailure(Throwable e) { + SC.warn(MSG.getString(e.getMessage())); + } + + @Override + public void onSuccess(FeatureInfoResponse response) { + List features = response.getFeatures(); + if (features != null && !features.isEmpty()) { + newGetFeatureInfoWindow(features, at.getAttr("description")); + } else if (response.getFeatureInfoHTML() != null) { + newGetFeatureInfoWindow(response.getFeatureInfoHTML(), + at.getAttr("description")); + } else { + GWT.log("GetFeatureInfo returned neither a list of features nor a string"); + } + } + } + ); + break; // More intelligent handling when more then one is selected + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/GetFeatureInfoWindow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/GetFeatureInfoWindow.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,153 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.widgets.HTMLPane; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.viewer.DetailViewer; +import com.smartgwt.client.widgets.viewer.DetailViewerField; +import com.smartgwt.client.widgets.viewer.DetailViewerRecord; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.FeatureInfo; +import org.dive4elements.river.client.shared.model.FeatureInfoResponse; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.MissingResourceException; + +import org.gwtopenmaps.openlayers.client.feature.VectorFeature; +import org.gwtopenmaps.openlayers.client.util.Attributes; +import org.gwtopenmaps.openlayers.client.util.JSObject; + + +public class GetFeatureInfoWindow extends Window { + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected List features; + + protected String title; + + protected String featureInfoHTML; + + + public static final int ROW_HEIGHT = 25; + + + public GetFeatureInfoWindow(List features, String title) { + super(); + this.features = features; + this.title = title; + + initLayout(); + } + + public GetFeatureInfoWindow(String featureInfoHTML, String title) { + super(); + features = null; + this.title = title; + this.featureInfoHTML = featureInfoHTML; + + initLayoutHTML(); + } + + protected void initLayoutHTML() { + HTMLPane pane = new HTMLPane(); + pane.setContents(featureInfoHTML); + addItem(pane); + setWidth(500); + setHeight(300); + + setTitle(MSG.getFeatureInfoWindowTitle() + " " + title); + + setIsModal(false); +// setShowModalMask(true); + + centerInPage(); + } + + protected void initLayout() { + VLayout root = new VLayout(); + + for (FeatureInfo feature: features) { + // Currently this should alway be only one + root.addMember(createFeatureViewer(feature)); + setTitle(MSG.getFeatureInfoWindowTitle() + " " + title); + } + + addItem(root); + + setWidth(500); + setHeight(300); + + setIsModal(false); +// setShowModalMask(true); + + centerInPage(); + } + + + protected DetailViewer createFeatureViewer(FeatureInfo feature) { + DetailViewer detailViewer = new DetailViewer(); + detailViewer.setWidth(487); + + Map attrs = feature.getAttrs(); + Set> entries = attrs.entrySet(); + List fields = new ArrayList(); + DetailViewerRecord dr = new DetailViewerRecord(); + + DetailViewerField path_field = null; // Make sure path is always the last element + + for (Map.Entry entry: entries) { + String localized; + try { + localized = MSG.getString(entry.getKey()); + } catch (MissingResourceException mre) { + localized = entry.getKey(); +// We filter unwanted information by localization +// Uncomment to filter out unlocalized elements +// continue; + } + if (entry.getKey().equals("PATH")) { + path_field = new DetailViewerField(entry.getKey(), localized); + } else { + fields.add(new DetailViewerField(entry.getKey(), localized)); + } + dr.setAttribute(entry.getKey(), entry.getValue()); + } + if (path_field != null) + fields.add(path_field); + + DetailViewerField[] fieldArray = new DetailViewerField[fields.size()]; + detailViewer.setFields(fields.toArray(fieldArray)); + detailViewer.setData(new DetailViewerRecord[]{dr}); + detailViewer.setCanSelectText(true); + + return detailViewer; + } + + + protected String[][] extractProperties(VectorFeature feature) { + Attributes tmp = feature.getAttributes(); + JSObject jsobj = tmp.getJSObject(); + + String tmpNames = jsobj.getPropertyNames(); + String[] allNames = tmpNames.split(","); + + String[][] attr = new String[allNames.length][]; + + for (int i = 0, n = attr.length; i < n; i++) { + attr[i] = new String[] { + allNames[i], + jsobj.getPropertyAsString(allNames[i]) }; + } + + return attr; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/LegendWindow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/LegendWindow.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,100 @@ +package org.dive4elements.river.client.client.ui.map; + +import java.util.List; + +import com.smartgwt.client.types.ImageStyle; +import com.smartgwt.client.types.VerticalAlignment; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.shared.MapUtils; +import org.dive4elements.river.client.shared.model.AttributedTheme; +import org.dive4elements.river.client.shared.model.Theme; +import org.dive4elements.river.client.shared.model.ThemeList; + + +public class LegendWindow extends Window { + + private ThemeList themeList; + + private VLayout legendContainer; + + public LegendWindow(ThemeList themeList) { + this.themeList = themeList; + this.legendContainer = new VLayout(); + + init(); + } + + public void update(ThemeList themeList) { + this.themeList = themeList; + + Canvas[] legends = legendContainer.getMembers(); + legendContainer.removeMembers(legends); + + addLegends(); + } + + private void addLegends() { + List themes = themeList.getActiveThemes(); + + for (Theme theme : themes) { + if (theme.getActive() == 0) { + continue; + } + + if (theme instanceof AttributedTheme) { + legendContainer + .addMember(createLegendGraphicsRow((AttributedTheme) theme)); + } + } + } + + private Canvas createLegendGraphicsRow(AttributedTheme at) { + Label label = new Label(at.getDescription()); + Img img = createLegendGraphics(at); + + HLayout row = new HLayout(); + row.addMember(label); + row.addMember(img); + + row.setHeight(150); + row.setWidth(400); + + return row; + } + + private Img createLegendGraphics(AttributedTheme at) { + String imgUrl = MapUtils.getLegendGraphicUrl(at.getAttr("url"), + at.getAttr("layers")); + + Img img = new Img(imgUrl); + img.setImageType(ImageStyle.CENTER); + img.setAutoFit(true); + + return img; + } + + private void init() { + legendContainer.setAutoHeight(); + legendContainer.setLayoutAlign(VerticalAlignment.TOP); + legendContainer.setAlign(VerticalAlignment.CENTER); + + setTitle("WMS Legend"); + setAutoSize(true); + setCanDragResize(true); + setIsModal(false); + setShowModalMask(false); + setLayoutAlign(VerticalAlignment.TOP); + setAlign(VerticalAlignment.TOP); + + addItem(legendContainer); + addLegends(); + + centerInPage(); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapOutputTab.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapOutputTab.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,636 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.AbsolutePanel; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.events.ParentMovedEvent; +import com.smartgwt.client.widgets.events.ParentMovedHandler; +import com.smartgwt.client.widgets.events.ResizedEvent; +import com.smartgwt.client.widgets.events.ResizedHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; +import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.event.OutputParameterChangeEvent; +import org.dive4elements.river.client.client.event.OutputParameterChangeHandler; +import org.dive4elements.river.client.client.event.RedrawRequestEvent; +import org.dive4elements.river.client.client.event.RedrawRequestHandler; +import org.dive4elements.river.client.client.services.LoadArtifactService; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; +import org.dive4elements.river.client.client.services.MapOutputService; +import org.dive4elements.river.client.client.services.MapOutputServiceAsync; +import org.dive4elements.river.client.client.services.StepForwardService; +import org.dive4elements.river.client.client.services.StepForwardServiceAsync; +import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.OutputTab; +import org.dive4elements.river.client.client.ui.ThemePanel; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.AttributedTheme; +import org.dive4elements.river.client.shared.model.Collection; +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.MapConfig; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.Theme; +import org.dive4elements.river.client.shared.model.ThemeList; +import org.dive4elements.river.client.shared.model.WMSLayer; + +import java.util.HashMap; +import java.util.List; + +import org.gwtopenmaps.openlayers.client.Bounds; +import org.gwtopenmaps.openlayers.client.Map; +import org.gwtopenmaps.openlayers.client.MapWidget; +import org.gwtopenmaps.openlayers.client.event.VectorFeatureAddedListener; +import org.gwtopenmaps.openlayers.client.event.VectorFeatureRemovedListener; +import org.gwtopenmaps.openlayers.client.feature.VectorFeature; +import org.gwtopenmaps.openlayers.client.format.GeoJSON; +import org.gwtopenmaps.openlayers.client.layer.Layer; +import org.gwtopenmaps.openlayers.client.layer.TransitionEffect; +import org.gwtopenmaps.openlayers.client.layer.Vector; +import org.gwtopenmaps.openlayers.client.layer.WMS; +import org.gwtopenmaps.openlayers.client.layer.WMSOptions; +import org.gwtopenmaps.openlayers.client.layer.WMSParams; + + +public class MapOutputTab +extends OutputTab +implements RedrawRequestHandler, ExternalWMSWindow.LayerLoader, TabSelectedHandler, OutputParameterChangeHandler { + + public static final String DEFAULT_SRID = "4326"; + + public static final String BARRIERS_PARAMETER_KEY = "uesk.barriers"; + + public static final String WSPLGEN_FACET = "floodmap.wsplgen"; + + public static final String EXTERNAL_WMS_FACTORY = "externalwmsfactory"; + + + protected StepForwardServiceAsync feedService = + GWT.create(StepForwardService.class); + + protected MapOutputServiceAsync mapService = + GWT.create(MapOutputService.class); + + /** Service handle to clone and add artifacts to collection. */ + protected LoadArtifactServiceAsync loadArtifactService = + GWT.create(LoadArtifactService.class); + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected MapToolbar controlPanel; + protected ThemePanel themePanel; + protected Canvas themePanelCanvas; + protected MapWidget mapPanel; + protected Canvas mapPanelCanvas; + protected VLayout rootLayout = new VLayout(); + protected AbsolutePanel absPan = new AbsolutePanel(); + protected FloodMap floodMap; + protected java.util.Map wmsUrls = new HashMap(); + + + public MapOutputTab( + String title, + Collection collection, + OutputMode mode, + CollectionView collectionView + ){ + super(title, collection, collectionView, mode); + + collectionView.registerTabHandler(this); + + mapService.doOut(collection, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("MAP ERROR: " + caught.getMessage()); + } + + @Override + public void onSuccess(MapConfig c) { + GWT.log("MAP SUCCESS!"); + + Bounds max = boundsFromString(c.getMaxExtent()); + Bounds initial = boundsFromString(c.getInitialExtent()); + + if (initial == null) { + GWT.log("Warning: No initial extent set."); + initial = max; + } + + setFloodmap(new FloodMap(c.getSrid(), max, 640, 480)); + + initLayout(); + initBarriers(); + + GWT.log("MAX EXTENT: " + max); + GWT.log("ZOOM TO: " + initial); + getMap().zoomToExtent(initial); + } + } + ); + } + + + protected void initLayout() { + rootLayout.setHeight100(); + rootLayout.setWidth100(); + rootLayout.setMembersMargin(2); + + HLayout hlayout = new HLayout(); + hlayout.setMembersMargin(0); + + this.themePanelCanvas = createThemePanel(); + + controlPanel = createControlPanel(); + mapPanel = floodMap.getMapWidget(); + + rootLayout.addMember(controlPanel); + rootLayout.addMember(absPan); + absPan.setWidth("100%"); + absPan.setHeight("100%"); + absPan.add(themePanelCanvas); + absPan.add(mapPanel); + + rootLayout.addResizedHandler(new ResizedHandler() { + @Override + public void onResized(ResizedEvent e) { + doLayout(); + } + }); + + rootLayout.addParentMovedHandler(new ParentMovedHandler() { + @Override + public void onParentMoved(ParentMovedEvent event) { + mapPanel.getMap().updateSize(); + } + }); + + setPane(rootLayout); + } + + + protected void doLayout() { + if(!rootLayout.isVisible()) { + return; + } + + // Manually set the height of the AbsolutePanel, somehow this is necessary + absPan.setHeight(String.valueOf( + rootLayout.getHeight() - controlPanel.getHeight() - 2) + "px"); + + // Calculate bounds of Map + int height = rootLayout.getHeight() - + controlPanel.getHeight() - 6; + int width = controlPanel.getWidth() - + (themePanelCanvas.isVisible() ? themePanelCanvas.getWidth() + 4 : 2); + + // Set size and position of Map + String w = String.valueOf(width) + "px"; + String h = String.valueOf(height) + "px"; + GWT.log("width=" + w); + + mapPanel.setSize(w, h); + mapPanel.getMap().updateSize(); + if(themePanelCanvas.isVisible()) { + absPan.setWidgetPosition(mapPanel, themePanelCanvas.getWidth() + 2, 0); + } + else { + absPan.setWidgetPosition(mapPanel, 0, 0); + } + + // Set bounds of ThemePanelCanvas + themePanelCanvas.setSize(themePanelCanvas.getWidthAsString(), String.valueOf(height + 2) + "px"); + } + + + protected void initBarriers() { + Vector vector = floodMap.getBarrierLayer(); + vector.addVectorFeatureAddedListener( + new VectorFeatureAddedListener() { + @Override + public void onFeatureAdded(FeatureAddedEvent e) { + saveBarriers(); + } + } + ); + + vector.addVectorFeatureRemovedListener( + new VectorFeatureRemovedListener() { + @Override + public void onFeatureRemoved(FeatureRemovedEvent e) { + saveBarriers(); + } + } + ); + + + Artifact artifact = getArtifact(); + + if (artifact == null) { + return; + } + + ArtifactDescription desc = artifact.getArtifactDescription(); + + String geojson = getGeoJSONFromStatic(desc); + geojson = geojson != null ? geojson : getGeoJSONFromDynamic(desc); + + if (geojson == null || geojson.length() == 0) { + GWT.log("No geojson string found -> no barriers existing."); + return; + } + + GeoJSON reader = new GeoJSON(); + VectorFeature[] features = reader.read(geojson); + + vector.addFeatures(features); + } + + + public void addLayer(Layer layer) { + FloodMap map = getFloodmap(); + + if (map != null) { + GWT.log("Add new layer '" + layer.getName() + "' to map."); + map.addLayer(layer); + if (layer instanceof WMS) { + wmsUrls.put(layer.getName(), + ((WMS)layer).getFullRequestString(new WMSParams(), null)); + } + } + } + + + public void removeLayer(String name) { + Map map = getMap(); + + Layer[] layers = map.getLayers(); + + for (Layer layer: layers) { + if (name.equals(layer.getName())) { + map.removeLayer(layer); + } + } + } + + + @Override + public void onRedrawRequest(RedrawRequestEvent event) { + mapService.doOut(collection, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("MAP ERROR: " + caught.getMessage()); + } + + @Override + public void onSuccess(MapConfig c) { + GWT.log("We want to refresh the map now!"); + themePanel.updateCollection(); + getFloodmap().update(); + } + }); + } + + + @Override + public void load(List toLoad) { + GWT.log("The user wants to add " + toLoad.size() + " new WMS layers."); + + int len = toLoad.size(); + + Recommendation[] recom = new Recommendation[len]; + + for (int i = 0; i < len; i++) { + WMSLayer w = toLoad.get(i); + + String ids = w.getServer() + ";" + w.getName() + ";" + w.getTitle(); + recom[i] = new Recommendation(EXTERNAL_WMS_FACTORY, ids); + } + + Collection c = getCollection(); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + loadArtifactService.loadMany(c, recom, EXTERNAL_WMS_FACTORY, locale, + new AsyncCallback() { + + @Override + public void onFailure(Throwable throwable) { + SC.warn(MSG.getString(throwable.getMessage())); + } + + @Override + public void onSuccess(Artifact[] newArtifacts) { + getThemePanel().updateCollection(); + } + } + ); + } + + + protected void setFloodmap(FloodMap floodMap) { + this.floodMap = floodMap; + } + + + protected FloodMap getFloodmap() { + return floodMap; + } + + + protected Map getMap() { + return floodMap.getMap(); + } + + + protected ThemePanel getThemePanel() { + return themePanel; + } + + + protected String getGeoJSONFromDynamic(ArtifactDescription desc) { + DataList list = desc.getCurrentData(); + + if (list == null) { + return null; + } + + List datas = list.getAll(); + for (Data data: datas) { + String key = data.getLabel(); + + if (key != null && key.equals(BARRIERS_PARAMETER_KEY)) { + DataItem def = data.getDefault(); + + if (def != null) { + return def.getStringValue(); + } + } + } + + return null; + } + + + protected String getGeoJSONFromStatic(ArtifactDescription desc) { + // TODO Implement this method, if there are reachable states right after + // the floodmap state - which is currently not the case. + return null; + } + + + public ThemeList getThemeList() { + return collection.getThemeList(mode.getName()); + } + + + public String getSrid() { + ThemeList themeList = getThemeList(); + + int num = themeList.getThemeCount(); + + for (int i = 1; i <= num; i++) { + AttributedTheme theme = (AttributedTheme) themeList.getThemeAt(i); + + if (theme == null) { + continue; + } + + String srid = theme.getAttr("srid"); + + if (srid != null && srid.length() > 0) { + return srid; + } + } + + return DEFAULT_SRID; + } + + + protected Bounds boundsFromString(String bounds) { + GWT.log("Create Bounds from String: '" + bounds + "'"); + if (bounds == null || bounds.length() == 0) { + return null; + } + + String[] values = bounds.split(" "); + + if (values == null || values.length < 4) { + return null; + } + + try { + return new Bounds( + Double.valueOf(values[0]), + Double.valueOf(values[1]), + Double.valueOf(values[2]), + Double.valueOf(values[3])); + } + catch (NumberFormatException nfe) {} + + return null; + } + + + public Layer createWMSLayer(Theme theme) { + if (!(theme instanceof AttributedTheme)) { + return null; + } + + AttributedTheme at = (AttributedTheme) theme; + + String name = at.getAttr("name"); + String desc = at.getAttr("description"); + String url = at.getAttr("url"); + String layers = at.getAttr("layers"); + + if (url == null || layers == null) { + return null; + } + + WMSParams params = new WMSParams(); + params.setLayers(layers); + params.setFormat("image/png"); + params.setIsTransparent(true); + + WMSOptions opts = new WMSOptions(); + opts.setProjection("EPSG:" + getSrid()); + opts.setSingleTile(true); + opts.setRatio(1); + if (layers.equals("OSM-WMS-Dienst")) { + opts.setAttribution(MSG.attribution()); + opts.setSingleTile(true); + opts.setTransitionEffect(TransitionEffect.RESIZE); + } + WMS wms = new WMS(layers, url, params, opts); + wms.setIsVisible(at.getActive() == 1); + wms.setIsBaseLayer(false); + // We can't set the full_url attribute here because map is not set + // at.addAttr("full_url", wms.getFullRequestString(params, null)); + return wms; + } + + + public java.util.Map wmsUrls() { + return this.wmsUrls; + } + + + protected MapToolbar createControlPanel() { + return new MapToolbar(this, floodMap, false); + } + + + protected Canvas createThemePanel() { + Canvas c = new Canvas(); + c.setMinWidth(300); + c.setWidth(200); + c.setHeight100(); + c.setCanDragResize(true); + c.setBorder("1px solid black"); + + themePanel = new MapThemePanel( + this.getCollectionView(), + mode, + this, + new MapThemePanel.ActivateCallback() { + @Override + public void activate(Theme theme, boolean active) { + fireActivateTheme(theme, active); + } + }, + new MapThemePanel.ThemeMovedCallback() { + @Override + public void onThemeMoved(Theme theme, int oldIdx, int newIdx) { + // this code synchronizes the ThemePanel and the OpenLayers + // internal order of layers. + AttributedTheme at = (AttributedTheme) theme; + + String name = at.getAttr("layers"); + Map map = getMap(); + Layer[] layers = map.getLayersByName(name); + + if (layers == null || layers.length == 0) { + GWT.log("Error: Cannot find layer '" + name + "'"); + return; + } + + map.raiseLayer(layers[0], (newIdx-oldIdx)*-1); + map.zoomTo(map.getZoom()-1); + map.zoomTo(map.getZoom()+1); + } + }, + new MapThemePanel.LayerZoomCallback() { + @Override + public void onLayerZoom(Theme theme, String extent) { + Bounds zoomTo = boundsFromString(extent); + + if (zoomTo == null) { + GWT.log("WARNING: No valid bounds for zooming found!"); + return; + } + + getMap().zoomToExtent(zoomTo); + } + } + ); + themePanel.addRedrawRequestHandler(this); + themePanel.addOutputParameterChangeHandler(this); + c.addChild(themePanel); + + return c; + } + + + private void fireActivateTheme(Theme theme, boolean active) { + activateTheme(theme, active); + } + + + protected void activateTheme(Theme theme, boolean active) { + AttributedTheme at = (AttributedTheme) theme; + + String name = at.getAttr("layers"); + Layer layer = floodMap.getMap().getLayerByName(name); + + GWT.log("Set visibility of '" + name + "': " + active); + + if (layer != null) { + layer.setIsVisible(active); + } + } + + + protected void saveBarriers() { + Vector layer = floodMap.getBarrierLayer(); + + GeoJSON format = new GeoJSON(); + String features = format.write(layer.getFeatures()); + + DataItem item = new DefaultDataItem( + BARRIERS_PARAMETER_KEY, BARRIERS_PARAMETER_KEY, features); + + Data data = new DefaultData( + BARRIERS_PARAMETER_KEY, BARRIERS_PARAMETER_KEY, "String", + new DataItem[] {item} ); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + feedService.go(locale, getArtifact(), new Data[] { data }, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not save barrier geometries: " + + caught.getMessage()); + } + + @Override + public void onSuccess(Artifact artifact) { + GWT.log("Successfully saved barrier geometries."); + } + } + ); + } + + + @Override + public void onTabSelected(TabSelectedEvent tse) { + if(floodMap == null) { + return; + } + if(this.equals(tse.getTab())) { + floodMap.activateScaleLine(true); + } + else { + controlPanel.activateMeasureControl(false); + floodMap.activateScaleLine(false); + } + } + + public void toogleThemePanel() { + this.themePanelCanvas.setVisible(!themePanelCanvas.isVisible()); + + // Trigger resize event handler + doLayout(); + } + + + @Override + public void onOutputParameterChanged(OutputParameterChangeEvent evt) { + GWT.log("OutputParameterChanged"); + controlPanel.updateThemes(getThemePanel().getThemeList()); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,78 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.AbsolutePanel; + +import org.dive4elements.river.client.shared.model.BBox; +import org.dive4elements.river.client.shared.model.MapInfo; + +import org.gwtopenmaps.openlayers.client.Bounds; +import org.gwtopenmaps.openlayers.client.MapWidget; + +/** + * Panel that contains a MapWidget and a MapToolbar. + * This panel is used by the flood map calculation input helper. + */ +public class MapPanel extends AbsolutePanel { + + protected MapToolbar toolbar; + + protected FloodMap floodMap; + protected MapWidget floodMapWidget; + protected boolean digitizeEnabled; + + public MapPanel(MapInfo mapInfo, boolean digitizeEnabled) { + BBox bbox = mapInfo.getBBox(); + + this.digitizeEnabled = digitizeEnabled; + this.floodMap = new FloodMap( + String.valueOf(mapInfo.getSrid()), + new Bounds( + bbox.getLowerX(), + bbox.getLowerY(), + bbox.getUpperX(), + bbox.getUpperY()), + 640, 480); + + initLayout(); + } + + + private void initLayout() { + setWidth("100%"); + setHeight("100%"); + + floodMapWidget = floodMap.getMapWidget(); + toolbar = new MapToolbar(floodMap, digitizeEnabled); + + add(toolbar); + add(floodMapWidget); + } + + public void doLayout(int w, int h) { + int width = w; + int height = h; + GWT.log("MapPanel.size: " + width + "x" + height); + + width -= 2; // minus black borders + height -= toolbar.getHeight() + 4; + + if (width < 0 || height < 0) { + GWT.log("MapPanel: Oops what a size!"); + return; + } + + floodMapWidget.setSize(Integer.toString(width), Integer.toString(height)); + floodMapWidget.getMap().updateSize(); + } + + + public FloodMap getFloodMap() { + return floodMap; + } + + public MapToolbar getMapToolbar () { + return toolbar; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapPositionPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapPositionPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,77 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.gwtopenmaps.openlayers.client.LonLat; +import org.gwtopenmaps.openlayers.client.Map; +import org.gwtopenmaps.openlayers.client.MapWidget; +import org.gwtopenmaps.openlayers.client.Pixel; +import org.gwtopenmaps.openlayers.client.event.EventHandler; +import org.gwtopenmaps.openlayers.client.event.EventObject; +import org.gwtopenmaps.openlayers.client.util.JSObject; + +/** + * @author Ingo Weinzierl + */ +public class MapPositionPanel extends HLayout { + + protected MapWidget mapWidget; + protected final Map map; + + protected Label x; + protected Label y; + + + public MapPositionPanel(MapWidget mapWidget) { + this.mapWidget = mapWidget; + this.map = mapWidget.getMap(); + + this.x = new Label(); + this.y = new Label(); + Label d = new Label("|"); + + setAlign(Alignment.RIGHT); + setMembersMargin(2); + + setWidth(150); + x.setWidth(25); + y.setWidth(25); + d.setWidth(5); + + addMember(x); + addMember(d); + addMember(y); + + // TODO This is not an optimal way to get the mouse position but makes + // the wrapper canvas superfluous. + this.map.getEvents().register("mousemove", map, new EventHandler() { + + @Override + public void onHandle(EventObject eventObject) { + JSObject xy = eventObject.getJSObject().getProperty("xy"); + Pixel px = Pixel.narrowToPixel(xy); + LonLat lonlat = map.getLonLatFromPixel(px); + + setX(lonlat.lon()); + setY(lonlat.lat()); + } + }); + } + + + protected void setX(double x) { + NumberFormat f = NumberFormat.getFormat("#0.0000"); + this.x.setContents(f.format(x).toString()); + } + + + protected void setY(double y) { + NumberFormat f = NumberFormat.getFormat("#0.0000"); + this.y.setContents(f.format(y).toString()); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapPrintPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapPrintPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,356 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.Window; + +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.ButtonItem; +import com.smartgwt.client.widgets.form.fields.SelectItem; +import com.smartgwt.client.widgets.form.fields.events.ClickEvent; +import com.smartgwt.client.widgets.form.fields.events.ClickHandler; +import com.smartgwt.client.types.Alignment; + +import org.gwtopenmaps.openlayers.client.Bounds; +import org.gwtopenmaps.openlayers.client.Map; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.CollectionAttributeService; +import org.dive4elements.river.client.client.services.CollectionAttributeServiceAsync; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.OutputSettings; +import org.dive4elements.river.client.shared.model.Property; +import org.dive4elements.river.client.shared.model.PropertySetting; +import org.dive4elements.river.client.shared.model.Settings; +import org.dive4elements.river.client.shared.model.Artifact; +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 java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.MissingResourceException; + +public class MapPrintPanel extends Canvas { + + private static final String MAPFISH_MAPTITLE = "mapfish_mapTitle"; + private static final String MAPFISH_RANGE = "mapfish_data_range"; + private static final String MAPFISH_SUBTITLE = "mapfish_data_subtitle"; + private static final String MAPFISH_STRETCH = "mapfish_data_strech"; + private static final String MAPFISH_INSTITUTION = "mapfish_data_institution"; + private static final String MAPFISH_SOURCE = "mapfish_data_source"; + private static final String MAPFISH_CREATOR = "mapfish_data_creator"; + private static final String MAPFISH_DATEPLACE = "mapfish_data_dateplace"; + private static final String MAPFISH_RIVER = "mapfish_data_river"; + private static final String MAPFISH_LOGO = "mapfish_logo"; + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** CollectionAttribute Update Service. */ + protected CollectionAttributeServiceAsync updater = + GWT.create(CollectionAttributeService.class); + + + protected Collection collection; + protected Settings settings; + protected TextItem pageTitle = new TextItem(); + protected TextItem pageRange = new TextItem(); + protected TextItem pageSubtitle = new TextItem(); + protected TextItem pageStretch = new TextItem(); + protected TextItem pageInstitution = new TextItem(); + protected TextItem pageSource = new TextItem(); + protected TextItem pageCreator = new TextItem(); + protected TextItem pageDatePlace = new TextItem(); + protected SelectItem pageLogo = createPageLogoSelectItem(); +// protected SelectItem pageFormat = createPageFormatSelectItem(); + protected MapToolbar mapToolbar; + protected MapPrintWindow parent; + + public MapPrintPanel(Collection collection, MapToolbar mapToolbar, MapPrintWindow parent) { + this.collection = collection; + this.mapToolbar = mapToolbar; + this.parent = parent; + initLayout(); + + this.settings = collection.getSettings("print-settings"); + if (settings == null) { + settings = new OutputSettings(); + GWT.log("settings are empty"); + } + else { + List properties = settings.getSettings("default"); + for (Property prop : properties) { + PropertySetting props = (PropertySetting)prop; + GWT.log(props.getName() + "=" + props.getValue()); + if (props.getName().equals(MAPFISH_MAPTITLE)) { + this.pageTitle.setValue(props.getValue()); + } + else if (props.getName().equals(MAPFISH_RANGE)) { + this.pageRange.setValue(props.getValue()); + } + else if (props.getName().equals(MAPFISH_SUBTITLE)) { + this.pageSubtitle.setValue(props.getValue()); + } + else if (props.getName().equals(MAPFISH_STRETCH)) { + this.pageStretch.setValue(props.getValue()); + } + else if (props.getName().equals(MAPFISH_INSTITUTION)) { + this.pageInstitution.setValue(props.getValue()); + } + else if (props.getName().equals(MAPFISH_SOURCE)) { + this.pageSource.setValue(props.getValue()); + } + else if (props.getName().equals(MAPFISH_CREATOR)) { + this.pageCreator.setValue(props.getValue()); + } + else if (props.getName().equals(MAPFISH_DATEPLACE)) { + this.pageDatePlace.setValue(props.getValue()); + } else { + GWT.log("Unknown Print property: " + prop.getName()); + } + } + } + } + + protected void initLayout() { + // TODO: i18n + this.pageTitle.setTitle(MSG.mapTitle()); + this.pageSubtitle.setTitle(MSG.mapSubtitle()); + this.pageRange.setTitle(MSG.mapRange()); + this.pageStretch.setTitle(MSG.mapStretch()); + this.pageInstitution.setTitle(MSG.mapInstitution()); + this.pageSource.setTitle(MSG.mapSource()); + this.pageCreator.setTitle(MSG.mapCreator()); + this.pageDatePlace.setTitle(MSG.mapDate()); + + pageTitle.setLength(30); + pageSubtitle.setLength(30); + pageRange.setLength(30); + pageStretch.setLength(30); + pageInstitution.setLength(30); + pageSource.setLength(30); + pageCreator.setLength(30); + pageDatePlace.setLength(30); + ButtonItem printButton = createPrintButtonItem(); + + printButton.setAlign(Alignment.RIGHT); + + DynamicForm df = new DynamicForm(); + df.setFields( +// this.pageFormat, + this.pageTitle, + this.pageSubtitle, + this.pageRange, + this.pageStretch, + this.pageInstitution, + this.pageSource, + this.pageCreator, + this.pageDatePlace, + this.pageLogo, + printButton); + addChild(df); + } + + protected SelectItem createPageLogoSelectItem() { + LinkedHashMap values = new LinkedHashMap(); + // TODO: this should be configurable + values.put(MSG.bfgLogo(), "BfG Logo"); + + SelectItem selItem = new SelectItem(); + selItem.setTitle(MSG.mapLogo()); + selItem.setValueMap(values); + selItem.setDefaultToFirstOption(true); + + return selItem; + } + +/* + * Commented out because we only provide a layout for A4 Landscape atm + + protected SelectItem createPageFormatSelectItem() { + LinkedHashMap values = new LinkedHashMap(); + // TODO: i18n + values.put("A4 landscape", "DIN A4 (Querformat)"); + //values.put("A4 portrait", "DIN A4 (Hochformat)"); + //values.put("A0 portrait", "DIN A0 (Hochformat)"); + + SelectItem selItem = new SelectItem(); + selItem.setTitle("Seitengröße:"); // TODO: i18n + selItem.setValueMap(values); + selItem.setDefaultToFirstOption(true); + + return selItem; + } +*/ + protected ButtonItem createPrintButtonItem() { + ButtonItem btn = new ButtonItem(); + btn.addClickHandler(new ClickHandler() { + + public void onClick(ClickEvent event) { + updateCollection(); + Window.open(createPrintUrl(), "_blank", ""); + parent.destroy(); + } + }); + btn.setTitle(MSG.print()); + return btn; + } + + private String createPrintUrl() { + MapOutputTab ot = (MapOutputTab)mapToolbar.getOutputTab(); + Collection collection = ot.getCollection(); + String uuid = collection.identifier(); + + String mapType = collection.getOutputModes().containsKey("floodmap") + ? "floodmap" + : "map"; + + StringBuilder url = new StringBuilder(); + url.append(GWT.getModuleBaseURL()); + url.append("map-print?"); + + Map map = mapToolbar.getMap(); + Bounds bounds = map.getExtent(); + + if (bounds != null) { + try { + url.append("minx="); + url.append(bounds.getLowerLeftX()); + url.append("&"); + + url.append("maxx="); + url.append(bounds.getUpperRightX()); + url.append("&"); + + url.append("miny="); + url.append(bounds.getLowerLeftY()); + url.append("&"); + + url.append("maxy="); + url.append(bounds.getUpperRightY()); + url.append("&"); + } + catch (Exception e) { + // XXX: Ignore it. bounds.getXXX() throw + // exceptions when bound is invalid. :-/ + } + } + + url.append("uuid="); + url.append(uuid); + url.append("&maptype="); + url.append(mapType); + + appendPrintToUrl(collection, url); + + return url.toString(); + } + + private void appendPrintToUrl(Collection collection, StringBuilder url) { + Settings settings = collection.getSettings("print-settings"); + if (settings != null) { + List properties = settings.getSettings("default"); + for (Property prop : properties) { + PropertySetting props = (PropertySetting)prop; + url.append("&"); + String localized; + try { + localized = MSG.getString(props.getName()); + } + catch (MissingResourceException mre) { + localized = props.getName(); + } + url.append(toJavaEncodedString(localized)); + url.append("="); + url.append(props.getValue()); + } + } + // O.o + String river = findRiver(((MapOutputTab)mapToolbar.getOutputTab() + ).getCollectionView().getArtifact()); + url.append("&" + toJavaEncodedString(MSG.getString(MAPFISH_RIVER)) + "=" + river); + } + + // Copy of DatacageWindow's findRiver + protected String findRiver(Artifact artifact) { + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList [] data = adescr.getOldData(); + + if (data != null && data.length > 0) { + for (int i = 0; i < data.length; i++) { + DataList dl = data[i]; + if (dl.getState().equals("state.winfo.river")) { + for (int j = dl.size()-1; j >= 0; --j) { + Data d = dl.get(j); + DataItem [] di = d.getItems(); + if (di != null && di.length == 1) { + return d.getItems()[0].getStringValue(); + } + } + } + } + } + + return ""; + } + + public static String toJavaEncodedString(String str) { + if (str == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + for (int i = 0, len = str.length(); i < len; i++) { + int unipoint = Character.codePointAt(str, i); + if ((unipoint < 32) || (unipoint > 127)) { + sb.append("\\u"); + sb.append(Integer.toHexString((unipoint >> 3*4) & 0xf)); + sb.append(Integer.toHexString((unipoint >> 2*4) & 0xf)); + sb.append(Integer.toHexString((unipoint >> 1*4) & 0xf)); + sb.append(Integer.toHexString((unipoint >> 0*4) & 0xf)); + } else { + sb.append(str.charAt(i)); + } + } + return sb.toString(); + } + + protected void updateCollection() { + final Config config = Config.getInstance(); + final String loc = config.getLocale(); + + GWT.log("MapPrintPanel.updateCollection via RPC now"); + + List properties = new ArrayList(); + properties.add(new PropertySetting(MAPFISH_MAPTITLE, toJavaEncodedString(pageTitle.getValueAsString()))); +// properties.add(new PropertySetting(MAPFISH_LAYOUT, toJavaEncodedString(pageFormat.getValueAsString()))); + properties.add(new PropertySetting(MAPFISH_SUBTITLE, toJavaEncodedString(pageSubtitle.getValueAsString()))); + properties.add(new PropertySetting(MAPFISH_RANGE, toJavaEncodedString(pageRange.getValueAsString()))); + properties.add(new PropertySetting(MAPFISH_STRETCH, toJavaEncodedString(pageStretch.getValueAsString()))); + properties.add(new PropertySetting(MAPFISH_INSTITUTION, toJavaEncodedString(pageInstitution.getValueAsString()))); + properties.add(new PropertySetting(MAPFISH_SOURCE, toJavaEncodedString(pageSource.getValueAsString()))); + properties.add(new PropertySetting(MAPFISH_CREATOR, toJavaEncodedString(pageCreator.getValueAsString()))); + properties.add(new PropertySetting(MAPFISH_DATEPLACE, toJavaEncodedString(pageDatePlace.getValueAsString()))); + properties.add(new PropertySetting(MAPFISH_LOGO, toJavaEncodedString(pageLogo.getValueAsString()))); + settings.setSettings("default", properties); + + collection.addSettings("print-settings", settings); + updater.update(collection, loc, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not update collection attributes."); + SC.warn(MSG.getString(caught.getMessage())); + } + @Override + public void onSuccess(Collection collection) { + GWT.log("MapPrint: collection attributes updated"); + } + }); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapPrintWindow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapPrintWindow.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,25 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.smartgwt.client.widgets.Window; +import com.google.gwt.core.client.GWT; + +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.client.FLYSConstants; + +public class MapPrintWindow extends Window { + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected MapPrintPanel panel; + + public MapPrintWindow(Collection collection, MapToolbar mapToolbar) { + setWidth(255); + setHeight(300); + + setTitle(MSG.printWindowTitle()); + centerInPage(); + + this.panel = new MapPrintPanel(collection, mapToolbar, this); + this.panel.setPadding(20); + addItem(this.panel); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapThemePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapThemePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,294 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.util.BooleanCallback; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.grid.events.HeaderDoubleClickEvent; +import com.smartgwt.client.widgets.grid.events.HeaderDoubleClickHandler; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.menu.Menu; +import com.smartgwt.client.widgets.menu.MenuItem; +import com.smartgwt.client.widgets.menu.events.ClickHandler; +import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.ThemePanel; +import org.dive4elements.river.client.shared.model.AttributedTheme; +import org.dive4elements.river.client.shared.model.FacetRecord; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.Theme; + + +/** + * @author Ingo Weinzierl + */ +public class MapThemePanel extends ThemePanel { + + public static final int CELL_HEIGHT = 25; + + + public interface ActivateCallback { + void activate(Theme theme, boolean activate); + } + + + public interface ThemeMovedCallback { + void onThemeMoved(Theme theme, int oldIdx, int newIdx); + } + + public interface LayerZoomCallback { + void onLayerZoom(Theme theme, String extent); + } + + + + private FLYSConstants MSG = GWT.create(FLYSConstants.class); + + + protected ActivateCallback activateCallback; + protected ThemeMovedCallback themeMovedCallback; + protected LayerZoomCallback layerZoomCallback; + + protected ListGridRecord[] oldRecords; + + + public static final String GRID_FIELD_ACTIVE = "active"; + public static final String GRID_FIELD_NAME = "name"; + + + protected MapOutputTab mapOut; + + + public MapThemePanel( + CollectionView view, + OutputMode mode, + MapOutputTab mapOut, + ActivateCallback activateCallback, + ThemeMovedCallback themeMovedCallback, + LayerZoomCallback layerZoomCallback + ) { + super(mode, view); + + this.mapOut = mapOut; + this.activateCallback = activateCallback; + this.themeMovedCallback = themeMovedCallback; + this.layerZoomCallback = layerZoomCallback; + + initGrid(); + initLayout(); + + updateGrid(); + } + + + protected void initLayout() { + setWidth100(); + setHeight100(); + + VLayout layout = new VLayout(); + layout.setWidth100(); + layout.setHeight100(); + + layout.addMember(list); + layout.addMember(navigation); + + addChild(layout); + } + + + protected void initGrid() { + list.setCanEdit(true); + list.setCanSort(false); + list.setShowRecordComponents(false); + list.setShowRecordComponentsByCell(true); + list.setShowHeader(true); + list.setShowHeaderContextMenu(false); + list.setCanReorderFields(false); + list.setWidth100(); + list.setHeight100(); + + list.addHeaderDoubleClickHandler(new HeaderDoubleClickHandler() { + @Override + public void onHeaderDoubleClick(HeaderDoubleClickEvent event) { + // cancel the event. + return; + } + }); + + list.setCellHeight(CELL_HEIGHT); + list.setShowRecordComponents(true); + list.setShowRecordComponentsByCell(true); + list.setShowAllRecords(true); + + list.addEditCompleteHandler(this); + + ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20); + active.setType(ListGridFieldType.BOOLEAN); + active.setCanDragResize(false); + + ListGridField name = new ListGridField( + GRID_FIELD_NAME, MSG.chart_themepanel_header_themes()); + name.setType(ListGridFieldType.TEXT); + + list.setFields(active, name); + } + + + @Override + protected void clearGrid() { + oldRecords = list.getRecords(); + super.clearGrid(); + } + + + @Override + protected void addFacetRecord(FacetRecord rec) { + Theme newTheme = rec.getTheme(); + boolean isNew = true; + + for (ListGridRecord old: getOldRecords()) { + FacetRecord fr = (FacetRecord) old; + + if (newTheme.equals(fr.getTheme())) { + isNew = false; + break; + } + } + + if (isNew && mapOut != null) { + mapOut.addLayer(mapOut.createWMSLayer(newTheme)); + } + + super.addFacetRecord(rec); + } + + + @Override + protected Menu getSingleContextMenu(final ListGridRecord[] records) { + Menu menu = super.getSingleContextMenu(records); + + MenuItem layerZoom = createLayerZoomItem(records); + if (layerZoom != null) { + menu.addItem(layerZoom); + } + menu.addItem(createMapURLItem(records)); + + return menu; + } + + + protected MenuItem createMapURLItem(final ListGridRecord[] records) { + final FacetRecord fr = (FacetRecord) records[0]; + final AttributedTheme at = (AttributedTheme) fr.getTheme(); + + MenuItem item = new MenuItem(MSG.wmsURLMenuItem()); + item.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + String url = getMapOutputTab().wmsUrls().get(at.getAttr("layers")); + SC.say(MSG.wmsURLBoxTitle(), url); + } + }); + + return item; + } + + + @Override + protected MenuItem createRemoveItem(final ListGridRecord[] records) { + MenuItem item = super.createRemoveItem(records); + item.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + SC.ask(MSG.askThemeRemove(), new BooleanCallback() { + @Override + public void execute(Boolean value) { + if (value) { + for (ListGridRecord record: records) { + FacetRecord facet = (FacetRecord) record; + + Theme theme = facet.getTheme(); + theme.setVisible(0); + theme.setActive(0); + + AttributedTheme at = (AttributedTheme) theme; + getMapOutputTab().removeLayer(at.getAttr("layers")); + } + + updateCollection(); + } + } + }); + } + }); + + return item; + } + + + protected MenuItem createLayerZoomItem(final ListGridRecord[] recs) { + final FacetRecord fr = (FacetRecord) recs[0]; + final AttributedTheme at = (AttributedTheme) fr.getTheme(); + + final String extent = at.getAttr("extent"); + + if (extent == null || extent.length() == 0) { + return null; + } + + MenuItem zoom = new MenuItem(MSG.zoomToLayer()); + zoom.addClickHandler(new ClickHandler() { + @Override + public void onClick(MenuItemClickEvent evt) { + if (layerZoomCallback != null) { + layerZoomCallback.onLayerZoom(at, extent); + } + } + }); + + return zoom; + } + + @Override + public String getWidthAsString() { + if(!isVisible()) { + return "0"; + } + else { + return super.getWidthAsString(); + } + } + + @Override + public void activateTheme(Theme theme, boolean active) { + if (activateCallback != null) { + activateCallback.activate(theme, active); + } + + theme.setActive(active ? 1 : 0); + } + + + @Override + protected void fireThemeMoved(Theme theme, int oldIdx, int newIdx) { + if (themeMovedCallback != null) { + themeMovedCallback.onThemeMoved(theme, oldIdx, newIdx); + } + } + + + protected ListGridRecord[] getOldRecords() { + return oldRecords != null ? oldRecords : new ListGridRecord[0]; + } + + + protected MapOutputTab getMapOutputTab() { + return mapOut; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapToolbar.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapToolbar.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,686 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.SelectionType; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.ImgButton; +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.layout.HLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.ui.ImgLink; +import org.dive4elements.river.client.client.ui.Toolbar; +import org.dive4elements.river.client.client.utils.EnableDisableCmd; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.Property; +import org.dive4elements.river.client.shared.model.PropertySetting; +import org.dive4elements.river.client.shared.model.Settings; +import org.dive4elements.river.client.shared.model.ThemeList; + +import java.util.List; + +import org.gwtopenmaps.openlayers.client.Map; +import org.gwtopenmaps.openlayers.client.control.DragPan; +import org.gwtopenmaps.openlayers.client.control.SelectFeature; +import org.gwtopenmaps.openlayers.client.control.SelectFeatureOptions; +import org.gwtopenmaps.openlayers.client.control.ZoomBox; +import org.gwtopenmaps.openlayers.client.event.MapZoomListener; +import org.gwtopenmaps.openlayers.client.feature.VectorFeature; +import org.gwtopenmaps.openlayers.client.layer.Vector; +import org.gwtopenmaps.openlayers.client.util.Attributes; + + +/** + * Toolbar for the Map views. + * @author Ingo Weinzierl + */ +public class MapToolbar +extends Toolbar +implements MapZoomListener +{ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected FloodMap floodMap; + protected DragPan pan; + protected ZoomBox zoomBox; + protected SelectFeature selectFeature; + protected GetFeatureInfo getFeatureInfo; + + protected Button manageThemesButton; + protected Button datacageButton; + protected Button legendButton; + + protected ImgButton addWMSButton; + protected ImgButton zoomToMaxButton; + protected ImgButton zoomBoxButton; + protected ImgButton zoomOutButton; + protected ImgButton panButton; + protected ImgButton selectButton; + protected ImgButton infoButton; + protected ImgButton removeButton; + protected ImgButton elevationButton; + protected ImgButton printMap; + + protected Label epsgLabel; + + protected DrawControl drawControl; + protected MeasureControl measureControl; + + protected LegendWindow legendWindow; + + protected Canvas position; + + + public MapToolbar(FloodMap floodMap, boolean digitize) { + this(null, floodMap, digitize); + } + + + public MapToolbar( + MapOutputTab mapTab, + FloodMap floodMap, + boolean digitize) + { + super(mapTab); + + setWidth100(); + setHeight(38); + setMembersMargin(10); + setPadding(5); + setBorder("1px solid black"); + this.floodMap = floodMap; + + zoomToMaxButton = createMaxExtentControl(); + zoomBoxButton = createZoomBoxControl(); + zoomOutButton = createZoomOutControl(); + panButton = createPanControl(); + drawControl = createDrawControl(); + selectButton = createSelectFeatureControl(); + infoButton = createGetFeatureInfo(); + measureControl = createMeasureControl(); + position = createMousePosition(); + removeButton = createRemoveFeatureControl(); + elevationButton = createElevationControl(); + epsgLabel = createEPSGLabel(); + + if (mapTab != null) { + manageThemesButton = createManageThemesControl(); + addMember(manageThemesButton); + + datacageButton = createDatacageControl(); + addMember(datacageButton); + + legendButton = createLegendControl(); + addMember(legendButton); + + addWMSButton = createWMSControl(); + addMember(addWMSButton); + + printMap = createMapPrintControl(); + addMember(printMap); + } + + addMember(zoomToMaxButton); + addMember(zoomBoxButton); + addMember(zoomOutButton); + addMember(panButton); + + if (digitize) { + addMember(drawControl); + addMember(selectButton); + addMember(removeButton); + addMember(elevationButton); + } + + if (infoButton != null) { + addMember(infoButton); + } + + addMember(measureControl); + addMember(createRightPanel()); + } + + + protected HLayout createRightPanel() { + HLayout right = new HLayout(); + right.setAlign(Alignment.RIGHT); + + right.addMember(epsgLabel); + right.addMember(position); + + return right; + } + + + protected Map getMap() { + return floodMap.getMap(); + } + + + protected void activatePan(boolean activate) { + if (activate) { + panButton.select(); + pan.activate(); + } + else { + panButton.deselect(); + pan.deactivate(); + } + } + + + protected void activateZoomBox(boolean activate) { + if (activate) { + zoomBoxButton.select(); + zoomBox.activate(); + } + else { + zoomBoxButton.deselect(); + zoomBox.deactivate(); + } + } + + + public void activateDrawFeature(boolean activate) { + drawControl.activate(activate); + } + + + protected void activateSelectFeature(boolean activate) { + if (activate) { + selectButton.select(); + selectFeature.activate(); + } + else { + selectButton.deselect(); + selectFeature.deactivate(); + } + } + + + protected void activateMeasureControl(boolean activate) { + measureControl.activate(activate); + } + + + protected void activateGetFeatureInfo(boolean activate) { + if (infoButton == null) { + return; + } + + if (activate) { + infoButton.select(); + } + else { + infoButton.deselect(); + } + + getFeatureInfo.activate(activate); + } + + + protected ImgButton createButton(String img, ClickHandler handler) { + ImgButton btn = new ImgButton(); + + String baseUrl = GWT.getHostPageBaseURL(); + btn.setSrc(baseUrl + img); + btn.setWidth(20); + btn.setHeight(20); + btn.setShowDown(false); + btn.setShowRollOver(false); + btn.setShowRollOverIcon(false); + btn.setShowDisabled(false); + btn.setShowDisabledIcon(true); + btn.setShowDownIcon(false); + btn.setShowFocusedIcon(false); + + if (handler != null) { + btn.addClickHandler(handler); + } + + return btn; + } + + + protected ImgButton createToggleButton( + String img, + final EnableDisableCmd cmd + ) { + final ImgButton btn = new ImgButton(); + + String baseUrl = GWT.getHostPageBaseURL(); + btn.setSrc(baseUrl + img); + btn.setActionType(SelectionType.CHECKBOX); + btn.setSize(20); + btn.setShowRollOver(false); + btn.setShowRollOverIcon(false); + btn.setSelected(false); + btn.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + if (btn.isSelected()) { + cmd.enable(); + } + else { + cmd.disable(); + } + } + }); + + return btn; + } + + + protected ImgButton createMaxExtentControl() { + ImgButton zoomToMax = createButton(MSG.zoom_all(), new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + floodMap.getMap().zoomToMaxExtent(); + } + }); + + zoomToMax.setTooltip(MSG.zoomMaxExtent()); + + return zoomToMax; + } + + + protected ImgButton createZoomBoxControl() { + zoomBox = new ZoomBox(); + + EnableDisableCmd cmd = new EnableDisableCmd() { + @Override + public void enable() { + activatePan(false); + activateDrawFeature(false); + activateSelectFeature(false); + activateMeasureControl(false); + activateGetFeatureInfo(false); + activateZoomBox(true); + } + + @Override + public void disable() { + activateZoomBox(false); + } + }; + + ImgButton button = createToggleButton(MSG.zoom_in(), cmd); + button.setTooltip(MSG.zoomIn()); + + Map map = getMap(); + map.addControl(zoomBox); + + return button; + } + + + protected ImgButton createZoomOutControl() { + ImgButton zoomOut = createButton(MSG.zoom_out(), new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + Map map = floodMap.getMap(); + int level = map.getZoom(); + + if (level > 1) { + map.zoomTo(level-1); + } + } + }); + + zoomOut.setTooltip(MSG.zoomOut()); + + return zoomOut; + } + + + protected ImgButton createPanControl() { + pan = new DragPan(); + getMap().addControl(pan); + + EnableDisableCmd cmd = new EnableDisableCmd() { + @Override + public void enable() { + activateZoomBox(false); + activateDrawFeature(false); + activateSelectFeature(false); + activateMeasureControl(false); + activateGetFeatureInfo(false); + activatePan(true); + } + + @Override + public void disable() { + activatePan(false); + } + }; + + final ImgButton button = createToggleButton(MSG.pan(), cmd); + button.setTooltip(MSG.moveMap()); + + return button; + } + + + protected DrawControl createDrawControl() { + EnableDisableCmd cmd = new EnableDisableCmd() { + @Override + public void enable() { + activateZoomBox(false); + activatePan(false); + activateDrawFeature(true); + activateSelectFeature(false); + activateMeasureControl(false); + } + + @Override + public void disable() { + activateDrawFeature(false); + } + }; + return new DrawControl(getMap(), floodMap.getBarrierLayer(), cmd); + } + + + protected ImgButton createSelectFeatureControl() { + SelectFeatureOptions opts = new SelectFeatureOptions(); + opts.setBox(true); + + // VectorFeatures selected by the SelectFeature control are manually + // marked with the string "mark.delete". The control to remove selected + // features makes use of this string to determine if the feature should + // be deleted (is marked) or not. Actually, we would like to use the + // OpenLayers native mechanism to select features, but for some reason + // this doesn't work here. After a feature has been selected, the layer + // still has no selected features. + opts.onSelect(new SelectFeature.SelectFeatureListener() { + @Override + public void onFeatureSelected(VectorFeature feature) { + floodMap.selectFeature(feature); + } + }); + + opts.onUnSelect(new SelectFeature.UnselectFeatureListener() { + @Override + public void onFeatureUnselected(VectorFeature feature) { + floodMap.disableFeature(feature); + } + }); + + selectFeature = new SelectFeature(floodMap.getBarrierLayer(), opts); + getMap().addControl(selectFeature); + + EnableDisableCmd cmd = new EnableDisableCmd() { + @Override + public void enable() { + activateDrawFeature(false); + activatePan(false); + activateZoomBox(false); + activateSelectFeature(true); + activateMeasureControl(false); + } + + @Override + public void disable() { + activateSelectFeature(false); + floodMap.disableFeatures(); + } + }; + + ImgButton button = createToggleButton(MSG.selectFeature(), cmd); + button.setTooltip(MSG.selectObject()); + + return button; + } + + + protected ImgButton createRemoveFeatureControl() { + ImgButton remove = createButton(MSG.removeFeature(),new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + Vector barriers = floodMap.getBarrierLayer(); + VectorFeature[] features = barriers.getFeatures(); + + if (features == null || features.length == 0) { + return; + } + + for (int i = features.length-1; i >= 0; i--) { + VectorFeature feature = features[i]; + + Attributes attr = feature.getAttributes(); + int del = attr.getAttributeAsInt(FloodMap.MARK_SELECTED); + + if (del == 1) { + barriers.removeFeature(feature); + feature.destroy(); + } + } + } + }); + + remove.setTooltip(MSG.removeObject()); + + return remove; + } + + + protected ImgButton createElevationControl() { + ImgButton btn = createButton(MSG.adjustElevation(), new ClickHandler() { + @Override + public void onClick(ClickEvent evt) { + Vector barriers = floodMap.getBarrierLayer(); + VectorFeature[] features = barriers.getFeatures(); + + VectorFeature feature = null; + + if (features == null || features.length == 0) { + SC.warn(MSG.error_no_feature_selected()); + return; + } + + boolean multipleFeatures = false; + + for (VectorFeature f: features) { + Attributes attr = f.getAttributes(); + if (attr.getAttributeAsInt(FloodMap.MARK_SELECTED) == 1) { + if (feature == null) { + feature = f; + } + else { + multipleFeatures = true; + } + } + } + + if (feature == null) { + SC.warn(MSG.error_no_feature_selected()); + return; + } + + new ElevationWindow(floodMap, feature).show(); + + if (multipleFeatures) { + SC.warn(MSG.warning_use_first_feature()); + } + } + }); + + btn.setTooltip(MSG.adjustElevationTooltip()); + + return btn; + } + + + protected Canvas createMousePosition() { + return new MapPositionPanel(floodMap.getMapWidget()); + } + + + protected MeasureControl createMeasureControl() { + EnableDisableCmd cmd = new EnableDisableCmd() { + @Override + public void enable() { + activateDrawFeature(false); + activatePan(false); + activateZoomBox(false); + activateSelectFeature(false); + activateGetFeatureInfo(false); + } + + @Override + public void disable() { + // do nothing + } + }; + + return new MeasureControl(floodMap, cmd); + } + + + protected Button createDatacageControl() { + Button btn = new Button(MSG.databasket()); + btn.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent evt) { + openDatacageWindow((MapOutputTab) getOutputTab()); + } + }); + + return btn; + } + + + protected Button createLegendControl() { + Button btn = new Button(MSG.legend()); + btn.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + openLegendWindow(); + } + }); + + return btn; + } + + + protected void openLegendWindow() { + if (legendWindow == null) { + MapOutputTab tab = (MapOutputTab) getOutputTab(); + legendWindow = new LegendWindow(tab.getThemePanel().getThemeList()); + } + + legendWindow.show(); + } + + + protected ImgButton createGetFeatureInfo() { + MapOutputTab ot = (MapOutputTab) getOutputTab(); + if (ot == null) { + return null; + } + + //ThemeList tl = ot.getCollection().getThemeList("floodmap"); + + getFeatureInfo = new GetFeatureInfo( + getMap(), + ot.getThemePanel(), + "gml"); + + EnableDisableCmd cmd = new EnableDisableCmd() { + @Override + public void enable() { + activateDrawFeature(false); + activatePan(false); + activateZoomBox(false); + activateSelectFeature(false); + activateMeasureControl(false); + activateGetFeatureInfo(true); + } + + @Override + public void disable() { + activateGetFeatureInfo(false); + } + }; + + ImgButton button = createToggleButton(MSG.getFeatureInfo(), cmd); + button.setTooltip(MSG.getFeatureInfoTooltip()); + + return button; + } + + + protected Button createManageThemesControl() { + Button btn = new Button(MSG.manageThemes()); + btn.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + ((MapOutputTab)getOutputTab()).toogleThemePanel(); + } + }); + return btn; + } + + + protected ImgButton createMapPrintControl() { + final MapToolbar mtb = this; + ImgButton btn = createButton(MSG.printMapSettings(), new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + MapPrintWindow mpsw = + new MapPrintWindow(outputTab.getCollection(), mtb); + outputTab.getCollectionView().addChild(mpsw); + } + }); + btn.setTooltip(MSG.printTooltip()); + + return btn; + } + + + protected ImgButton createWMSControl() { + final String srs = floodMap.getRiverProjection(); + + ImgButton add = createButton(MSG.addWMS(), new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + MapOutputTab ot = (MapOutputTab) getOutputTab(); + new ExternalWMSWindow(ot, srs).start(); + } + }); + + add.setTooltip(MSG.addWMSTooltip()); + + return add; + } + + + protected Label createEPSGLabel() { + Label epsgLabel = new Label(floodMap.getRiverProjection()); + + epsgLabel.setAlign(Alignment.RIGHT); + epsgLabel.setWidth(75); + + return epsgLabel; + } + + @Override + public void onMapZoom(MapZoomListener.MapZoomEvent e) { +// updatePrintUrl(); + } + + public void updateThemes(ThemeList themeList) { + if (legendWindow != null) { + legendWindow.update(themeList); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MeasureControl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MeasureControl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,219 @@ +package org.dive4elements.river.client.client.ui.map; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.SelectionType; +import com.smartgwt.client.widgets.ImgButton; +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.layout.HLayout; + +import org.gwtopenmaps.openlayers.client.control.Measure; +import org.gwtopenmaps.openlayers.client.event.MeasureEvent; +import org.gwtopenmaps.openlayers.client.event.MeasureListener; +import org.gwtopenmaps.openlayers.client.event.MeasurePartialListener; +import org.gwtopenmaps.openlayers.client.handler.PathHandler; +import org.gwtopenmaps.openlayers.client.handler.PolygonHandler; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.utils.EnableDisableCmd; + + +public class MeasureControl extends HLayout { + + public static final String NUMBER_FORMAT_PATTERN = "#.##"; + + public static final String AREA_UNIT = "ha"; + public static final int AREA_FACTOR_M = 10000; + public static final int AREA_FACTOR_KM = 100; + + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected FloodMap floodMap; + + protected Measure measureLine; + protected Measure measurePolygon; + + protected ImgButton measureLineButton; + protected ImgButton measurePolyButton; + protected Label label; + + protected NumberFormat formatter; + + + public MeasureControl(FloodMap floodMap, EnableDisableCmd cmd) { + this.floodMap = floodMap; + + measureLineButton = createMeasureLineControl(cmd); + measurePolyButton = createMeasurePolyControl(cmd); + + formatter = NumberFormat.getFormat(NUMBER_FORMAT_PATTERN); + + label = new Label(); + + initLayout(); + } + + + protected void initLayout() { + setWidth(100); + setMembersMargin(2); + + label.setWidth(75); + + addMember(measureLineButton); + addMember(measurePolyButton); + addMember(label); + } + + + protected ImgButton createMeasureLineControl(final EnableDisableCmd cmd) { + measureLine = new Measure(new PathHandler()); + measureLine.setPersist(true); + measureLine.addMeasureListener(new MeasureListener() { + public void onMeasure(MeasureEvent e) { + updateMeasure(e.getMeasure(), e.getUnits()); + } + }); + measureLine.addMeasurePartialListener(new MeasurePartialListener() { + public void onMeasurePartial(MeasureEvent e) { + updateMeasure(e.getMeasure(), e.getUnits()); + } + }); + + floodMap.getMap().addControl(measureLine); + + final ImgButton btn = new ImgButton(); + String baseUrl = GWT.getHostPageBaseURL(); + btn.setSrc(baseUrl + MSG.measureLine()); + btn.setActionType(SelectionType.CHECKBOX); + btn.setSize(20); + btn.setShowRollOver(false); + btn.setShowRollOverIcon(false); + btn.setSelected(false); + btn.setTooltip(MSG.measureDistance()); + btn.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent e) { + if (btn.isSelected()) { + cmd.enable(); + activateMeasurePolygon(false); + activateMeasureLine(true); + } + else { + cmd.disable(); + activateMeasureLine(false); + } + } + }); + + return btn; + } + + + protected ImgButton createMeasurePolyControl(final EnableDisableCmd cmd) { + measurePolygon = new Measure(new PolygonHandler()); + measurePolygon.setPersist(true); + measurePolygon.addMeasureListener(new MeasureListener() { + public void onMeasure(MeasureEvent e) { + updateMeasureArea(e.getMeasure(), e.getUnits()); + } + }); + measurePolygon.addMeasurePartialListener(new MeasurePartialListener() { + public void onMeasurePartial(MeasureEvent e) { + updateMeasureArea(e.getMeasure(), e.getUnits()); + } + }); + + floodMap.getMap().addControl(measurePolygon); + + final ImgButton btn = new ImgButton(); + String baseUrl = GWT.getHostPageBaseURL(); + btn.setSrc(baseUrl + MSG.measurePolygon()); + btn.setActionType(SelectionType.CHECKBOX); + btn.setSize(20); + btn.setShowRollOver(false); + btn.setShowRollOverIcon(false); + btn.setSelected(false); + btn.setTooltip(MSG.measureArea()); + btn.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent e) { + if (btn.isSelected()) { + cmd.enable(); + activateMeasureLine(false); + activateMeasurePolygon(true); + } + else { + cmd.disable(); + activateMeasurePolygon(false); + } + } + }); + + return btn; + } + + + protected void clearMeasure() { + label.setContents(""); + } + + + protected void updateMeasure(float value, String unit) { + label.setContents(formatter.format(value) + " " + unit); + } + + + protected void updateMeasureArea(float value, String unit) { + float ha = value; + String ha_unit = unit; + + if (unit.equals("m")) { + ha = (float) value / AREA_FACTOR_M; + ha_unit = AREA_UNIT; + } + else if (unit.equals("km")) { + ha = (float) value * AREA_FACTOR_KM; + ha_unit = AREA_UNIT; + } + + label.setContents(formatter.format(ha) + " " + ha_unit); + } + + + public void activate(boolean activate) { + if (!activate) { + clearMeasure(); + activateMeasureLine(activate); + activateMeasurePolygon(activate); + } + } + + + protected void activateMeasureLine(boolean activate) { + if (activate) { + clearMeasure(); + measureLineButton.select(); + measureLine.activate(); + } + else { + measureLineButton.deselect(); + measureLine.deactivate(); + } + } + + + protected void activateMeasurePolygon(boolean activate) { + if (activate) { + clearMeasure(); + measurePolyButton.select(); + measurePolygon.activate(); + } + else { + measurePolyButton.deselect(); + measurePolygon.deactivate(); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/WMSLayersTree.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/WMSLayersTree.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,122 @@ +package org.dive4elements.river.client.client.ui.map; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.TreeModelType; +import com.smartgwt.client.widgets.tree.Tree; +import com.smartgwt.client.widgets.tree.TreeGrid; +import com.smartgwt.client.widgets.tree.TreeNode; + +import org.dive4elements.river.client.shared.model.Capabilities; +import org.dive4elements.river.client.shared.model.WMSLayer; + + +public class WMSLayersTree extends TreeGrid { + + /** + * An internal TreeNode that stores besides some string attribute a WMSLayer + * object. + */ + public static class WMSLayerNode extends TreeNode { + + protected WMSLayer wms; + + public WMSLayerNode(WMSLayer wms) { + super(); + this.wms = wms; + + setAttribute("name", wms.getName()); + setAttribute("title", wms.getTitle()); + } + + public WMSLayer getWMSLayer() { + return wms; + } + } // end of class WMSLayerNode + + + protected Capabilities capabilites; + protected String srs; + + + public WMSLayersTree(Capabilities capabilites) { + super(); + this.capabilites = capabilites; + + initTree(); + } + + + public WMSLayersTree(Capabilities capabilites, String srs) { + super(); + + this.capabilites = capabilites; + this.srs = srs; + + initTree(); + } + + + protected void initTree() { + setLoadDataOnDemand(false); + setWidth100(); + setHeight100(); + setShowRoot(false); + setShowConnectors(true); + setNodeIcon("[SKIN]/images/blank.gif"); + + Tree tree = new Tree(); + tree.setChildrenProperty("children-nodes"); + tree.setNameProperty("title"); + tree.setIdField("title"); + tree.setModelType(TreeModelType.CHILDREN); + tree.setShowRoot(false); + + TreeNode root = new TreeNode("Root"); + TreeNode[] layers = buildTree(capabilites.getLayers()); + + root.setAttribute("children-nodes", layers); + tree.setRoot(root); + + setData(tree); + + if (layers != null && layers.length == 1) { + tree.openFolder(layers[0]); + } + } + + + protected TreeNode[] buildTree(List layers) { + List layerNodes = new ArrayList(); + + for (WMSLayer layer: layers) { + WMSLayerNode tn = buildTreeNode(layer); + + if (tn != null) { + TreeNode[] tns = buildTree(layer.getLayers()); + + if (tns != null && tns.length > 0) { + tn.setAttribute("children-nodes", tns); + } + + layerNodes.add(tn); + } + } + + return layerNodes.toArray(new TreeNode[layerNodes.size()]); + } + + + protected WMSLayerNode buildTreeNode(WMSLayer wms) { + if (srs != null && srs.length() > 0) { + return wms.supportsSrs(srs) ? new WMSLayerNode(wms) : null; + } + else { + GWT.log("No target SRS specified."); + return new WMSLayerNode(wms); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/BedCampaignChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/BedCampaignChart.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,78 @@ +package org.dive4elements.river.client.client.ui.minfo; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.json.client.JSONNumber; +import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONString; +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.events.ResizedHandler; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.shared.model.Artifact; + +public class BedCampaignChart extends VLayout { + + private final Artifact artifact; + + protected Img chartImg; + + public BedCampaignChart(Artifact artifact, ResizedHandler resizeHandler) { + super(); + + this.artifact = artifact; + this.chartImg = new Img(); + + addResizedHandler(resizeHandler); + setAlign(Alignment.CENTER); + } + + public void update() { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + int hWidth = getWidth() - 12; + int hHeight = getHeight() - 12; + + if ((int) (hHeight * 4f / 3) < hWidth) { + hWidth = (int) (hHeight * 4f / 3); + } + else { + hHeight = (int) (hWidth * 3f / 4); + } + + String river = artifact.getArtifactDescription().getRiver(); + + JSONObject jfix = new JSONObject(); + JSONObject jfilter = new JSONObject(); + JSONObject jrName = new JSONObject(); + JSONString jrValue = new JSONString(river); + JSONObject jextent = new JSONObject(); + JSONNumber jwidth = new JSONNumber(hWidth); + JSONNumber jheight = new JSONNumber(hHeight); + + jrName.put("name", jrValue); + jfilter.put("river", jrName); + jextent.put("width", jwidth); + jextent.put("height", jheight); + jfilter.put("extent", jextent); + jfix.put("bed", jfilter); + String filter = jfix.toString(); + + String imgUrl = GWT.getModuleBaseURL(); + imgUrl += "bed-km-chart"; + imgUrl += "?locale=" + locale; + imgUrl += "&filter=" + filter; + + if (chartImg != null && hasMember(chartImg)) { + chartImg.setWidth(hWidth); + chartImg.setHeight(hHeight); + chartImg.setSrc(imgUrl); + } + else { + chartImg = new Img(imgUrl, hWidth, hHeight); + addMember(chartImg); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/BedHeightsDatacagePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/BedHeightsDatacagePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,310 @@ +package org.dive4elements.river.client.client.ui.minfo; + +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.widgets.Canvas; + +import com.smartgwt.client.widgets.events.ClickEvent; + +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.FLYSConstants; + +import org.dive4elements.river.client.client.event.StepForwardEvent; + +import org.dive4elements.river.client.client.services.LoadArtifactService; +import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; +import org.dive4elements.river.client.client.services.RemoveArtifactService; +import org.dive4elements.river.client.client.services.RemoveArtifactServiceAsync; + +import org.dive4elements.river.client.client.ui.DatacagePairWidget; +import org.dive4elements.river.client.client.ui.DatacageTwinPanel; +import org.dive4elements.river.client.client.ui.RecommendationPairRecord; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +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.Recommendation.Facet; +import org.dive4elements.river.client.shared.model.Recommendation.Filter; + +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.User; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +// TODO Probably better to branch off AbstractUIProvider. +// TODO Merge with other datacage-widget impls. +/** + * Panel containing a Grid and a "next" button. The Grid is fed by a + * DatacagePairWidget which is put in the input-helper area. + */ +public class BedHeightsDatacagePanel +extends DatacageTwinPanel { + + protected static FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** + * List to track previously selected but now removed pairs. (Needed to + * be able to identify artifacts that can be removed from the collection. + */ + protected List removedPairs = + new ArrayList(); + + /** Service handle to clone and add artifacts to collection. */ + LoadArtifactServiceAsync loadArtifactService = GWT.create( + org.dive4elements.river.client.client.services.LoadArtifactService.class); + + /** Service to remove artifacts from collection. */ + RemoveArtifactServiceAsync removeArtifactService = GWT.create( + org.dive4elements.river.client.client.services.RemoveArtifactService.class); + + + public BedHeightsDatacagePanel(User user) { + super(user); + } + + + /** + * Create a recommendation from a string representation of it. + * @TODO describe format of input string + * @param from string in format as shown above. + * @return recommendation from input string. + */ + public Recommendation createRecommendationFromString(String from) { + // TODO Construct "real" filter. + String[] parts = unbracket(from).split(";"); + Recommendation.Filter filter = new Recommendation.Filter(); + Recommendation.Facet facet = new Recommendation.Facet( + parts[1], + parts[2]); + + List facets = new ArrayList + (); + facets.add(facet); + filter.add("longitudinal_section", facets); + Recommendation r = new Recommendation("bedheight", parts[0], + this.artifact.getUuid(), filter); + r.setDisplayName(parts[3]); + return r; + } + + + /** + * Creates the graphical representation and interaction widgets for the data. + * @param dataList the data. + * @return graphical representation and interaction widgets for data. + */ + @Override + public Canvas create(DataList dataList) { + GWT.log("createData()"); + + Data data = dataList.get(0); + DataItem[] items = data.getItems(); + + String value = items[0].getStringValue(); + + String filter = "minfo-heights"; + if (value.equals("epoch")) { + filter = "minfo-heights-epoch"; + } + Canvas widget = createWidget(); + Canvas submit = getNextButton(); + + VLayout layout = new VLayout(); + HLayout helperLayout = new HLayout(); + helperLayout.addMember(new DatacagePairWidget(this.artifact, + user, filter, differencesList)); + + layout.addMember(widget); + layout.addMember(submit); + layout.setMembersMargin(10); + this.helperContainer.addMember(helperLayout); + + this.dataName = "diffids"; + + return layout; + } + + + /** + * Add record to list of removed records. + */ + public void trackRemoved(Record r) { + RecommendationPairRecord pr = (RecommendationPairRecord) r; + this.removedPairs.add(pr); + } + + + /** + * Validates data, does nothing if invalid, otherwise clones new selected + * waterlevels and add them to collection, forward the artifact. + */ + @Override + public void onClick(ClickEvent e) { + GWT.log("DatacageTwinPanel.onClick"); + + List errors = validate(); + if (errors != null && !errors.isEmpty()) { + showErrors(errors); + return; + } + + Config config = Config.getInstance(); + String locale = config.getLocale(); + + ListGridRecord[] records = differencesList.getRecords(); + + List ar = new ArrayList(); + List all = new ArrayList(); + + for (ListGridRecord record : records) { + RecommendationPairRecord r = + (RecommendationPairRecord) record; + // Do not add "old" recommendations. + if (!r.isAlreadyLoaded()) { + // Check whether one of those is a dike or similar. + // TODO differentiate and merge: new clones, new, old. + Recommendation firstR = r.getFirst(); + if(firstR.getIDs() != null) { + GWT.log("First IDs: " + firstR.getIDs() + " factory: " + + firstR.getFactory()); + } + firstR.setFactory("bedheight"); + Recommendation secondR = r.getSecond(); + if(secondR.getIDs() != null) { + GWT.log("Second IDs: " + secondR.getIDs() + " factory: " + + secondR.getFactory()); + } + secondR.setFactory("bedheight"); + + ar.add(firstR); + ar.add(secondR); + } + else { + all.add(r.getFirst()); + all.add(r.getSecond()); + } + } + + final Recommendation[] toClone = ar.toArray(new Recommendation[ar.size()]); + final Recommendation[] toUse = all.toArray(new Recommendation[all.size()]); + + // Find out whether "old" artifacts have to be removed. + List artifactIdsToRemove = new ArrayList(); + for (RecommendationPairRecord rp: this.removedPairs) { + Recommendation first = rp.getFirst(); + Recommendation second = rp.getSecond(); + + for (Recommendation recommendation: toUse) { + if (first != null && first.getIDs().equals(recommendation.getIDs())) { + first = null; + } + if (second != null && second.getIDs().equals(recommendation.getIDs())) { + second = null; + } + + if (first == null && second == null) { + break; + } + } + if (first != null) { + artifactIdsToRemove.add(first.getIDs()); + } + if (second != null) { + artifactIdsToRemove.add(second.getIDs()); + } + } + + // Remove old artifacts, if any. Do this asychronously without much + // feedback. + for(final String uuid: artifactIdsToRemove) { + removeArtifactService.remove(this.collection, + uuid, + locale, + new AsyncCallback() { + public void onFailure(Throwable caught) { + GWT.log("RemoveArtifact (" + uuid + ") failed."); + } + public void onSuccess(Collection collection) { + GWT.log("RemoveArtifact succeeded"); + } + }); + } + + // Clone new ones (and spawn statics), go forward. + loadArtifactService.loadMany( + this.collection, + toClone, + //"staticwkms" and "waterlevel" + null, + locale, + new AsyncCallback() { + public void onFailure(Throwable caught) { + GWT.log("Failure of cloning with factories!"); + } + public void onSuccess(Artifact[] artifacts) { + GWT.log("Successfully cloned " + toClone.length + + " with factories."); + + fireStepForwardEvent(new StepForwardEvent( + getData(toClone, artifacts, toUse))); + } + }); + } + + + /** + * Creates part of the String that encodes minuend or subtrahend. + * @param artifact Artifacts UUID. + * @param recommendation Recommendation to wrap in string. + */ + protected String createDataString( + String artifact, + Recommendation recommendation) + { + Filter filter = recommendation.getFilter(); + Facet f = null; + + if(filter != null) { + Map> outs = filter.getOuts(); + Set>> entries = outs.entrySet(); + + for (Map.Entry> entry: entries) { + List fs = entry.getValue(); + + f = fs.get(0); + if (f != null) { + break; + } + } + + return "[" + artifact + ";" + + f.getName() + + ";" + + f.getIndex() + + ";" + + recommendation.getDisplayName() + "]"; + } + else { + return "[" + + artifact + + ";bedheight;0;" + + recommendation.getDisplayName() + "]"; + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/BedMultiPeriodPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/BedMultiPeriodPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,34 @@ +package org.dive4elements.river.client.client.ui.minfo; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.events.ResizedEvent; +import com.smartgwt.client.widgets.events.ResizedHandler; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.ui.MultiPeriodPanel; + +public class BedMultiPeriodPanel +extends MultiPeriodPanel +implements ResizedHandler { + protected BedCampaignChart chartContainer1; + protected BedloadCampaignChart chartContainer2; + + public BedMultiPeriodPanel() { + } + + @Override + protected Canvas createHelper() { + chartContainer1 = new BedCampaignChart(artifact, this); + chartContainer2 = new BedloadCampaignChart(artifact, this); + VLayout layout = new VLayout(); + layout.addMember(chartContainer1); + layout.addMember(chartContainer2); + return layout; + } + + @Override + public void onResized(ResizedEvent re) { + chartContainer1.update(); + chartContainer2.update(); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/BedloadCampaignChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/BedloadCampaignChart.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,78 @@ +package org.dive4elements.river.client.client.ui.minfo; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.json.client.JSONNumber; +import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONString; +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.events.ResizedHandler; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.shared.model.Artifact; + +public class BedloadCampaignChart extends VLayout { + + private final Artifact artifact; + + protected Img chartImg; + + public BedloadCampaignChart(Artifact artifact, ResizedHandler resizeHandler) { + super(); + + this.artifact = artifact; + this.chartImg = new Img(); + + addResizedHandler(resizeHandler); + setAlign(Alignment.CENTER); + } + + public void update() { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + int hWidth = getWidth() - 12; + int hHeight = getHeight() - 12; + + if ((int) (hHeight * 4f / 3) < hWidth) { + hWidth = (int) (hHeight * 4f / 3); + } + else { + hHeight = (int) (hWidth * 3f / 4); + } + + String river = artifact.getArtifactDescription().getRiver(); + + JSONObject jfix = new JSONObject(); + JSONObject jfilter = new JSONObject(); + JSONObject jrName = new JSONObject(); + JSONString jrValue = new JSONString(river); + JSONObject jextent = new JSONObject(); + JSONNumber jwidth = new JSONNumber(hWidth); + JSONNumber jheight = new JSONNumber(hHeight); + + jrName.put("name", jrValue); + jfilter.put("river", jrName); + jextent.put("width", jwidth); + jextent.put("height", jheight); + jfilter.put("extent", jextent); + jfix.put("bedload", jfilter); + String filter = jfix.toString(); + + String imgUrl = GWT.getModuleBaseURL(); + imgUrl += "bedload-km-chart"; + imgUrl += "?locale=" + locale; + imgUrl += "&filter=" + filter; + + if (chartImg != null && hasMember(chartImg)) { + chartImg.setWidth(hWidth); + chartImg.setHeight(hHeight); + chartImg.setSrc(imgUrl); + } + else { + chartImg = new Img(imgUrl, hWidth, hHeight); + addMember(chartImg); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/CheckboxPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/CheckboxPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,117 @@ +package org.dive4elements.river.client.client.ui.minfo; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Set; + +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.CheckboxItem; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.ui.AbstractUIProvider; +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; + +public class CheckboxPanel extends AbstractUIProvider { + + private String dataName; + HashMap values; + + protected DynamicForm form; + + public CheckboxPanel() { + super(); + values = new HashMap(); + } + + @Override + public Canvas createOld(DataList dataList) { + Data data = dataList.get(0); + DataItem[] items = data.getItems(); + + HLayout layout = new HLayout(); + Label label = new Label(dataList.getLabel()); + Label value = new Label(items[0].getLabel()); + + layout.setHeight(35); + layout.setWidth(400); + label.setWidth(200); + + layout.addMember(label); + layout.addMember(value); + layout.addMember(getBackButton(dataList.getState())); + + return layout; + } + + @Override + public Canvas create(DataList dataList) { + Data data = dataList.get(0); + DataItem[] items = data.getItems(); + + this.dataName = data.getLabel(); + form = new DynamicForm(); + + VLayout layout = new VLayout(); + Label label = new Label(data.getDescription()); + LinkedList cbItems = new LinkedList(); + for (int i = 0; i < items.length; i++) { + CheckboxItem item = new CheckboxItem(items[i].getLabel()); + GWT.log(items[i].getStringValue() + "; " + items[i].getLabel()); + item.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent event) { + values.put( + event.getItem().getName(), + (Boolean)event.getItem().getValue()); + } + }); + cbItems.add(item); + } + + form.setFields(cbItems.toArray(new CheckboxItem[cbItems.size()])); + layout.setMembersMargin(10); + layout.setHeight(35); + label.setHeight(35); + + layout.addMember(label); + layout.addMember(form); + layout.addMember(getNextButton()); + layout.setMembersMargin(10); + + return layout; + } + + @Override + protected Data[] getData() { + String value = ""; + Set entries = values.keySet(); + boolean first = true; + for (String s: values.keySet()) { + if (!first) { + value += ";"; + } + if ((Boolean)values.get(s) == true) { + value += s; + } + first = false; + } + DataItem item = new DefaultDataItem("diameter", "diameter", value); + + return new Data[] {new DefaultData( + "diameter", + null, + null, + new DataItem[]{item})}; + } + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/SedLoadDistancePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/SedLoadDistancePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,276 @@ +package org.dive4elements.river.client.client.ui.minfo; + +import java.util.List; + +import com.smartgwt.client.data.Record; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.grid.events.CellClickEvent; +import com.smartgwt.client.widgets.grid.events.CellClickHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.ui.AbstractUIProvider; +import org.dive4elements.river.client.client.ui.DoubleRangeOnlyPanel; +import org.dive4elements.river.client.client.ui.DoubleRangePanel; +import org.dive4elements.river.client.client.ui.LocationPicker; +import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource; +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; + + +public class SedLoadDistancePanel +extends AbstractUIProvider +implements BlurHandler, CellClickHandler +{ + public static final String FIELD_LOWER = "ld_from"; + public static final String FIELD_UPPER = "ld_to"; + + protected DoubleRangePanel distancePanel; + protected double min; + protected double max; + protected LocationPicker picker; + + @Override + public Canvas createOld(DataList dataList) { + String s = getOldSelectionString(dataList); + String l = dataList.getLabel(); + + Label label = new Label(l); + Label selected = new Label(s); + + HLayout layout = new HLayout(); + + layout.setWidth(400); + label.setWidth(200); + selected.setWidth(130); + + layout.addMember(label); + layout.addMember(selected); + layout.addMember(getBackButton(dataList.getState())); + + return layout; + } + + protected String getOldSelectionString(DataList dataList) { + List items = dataList.getAll(); + + Data dFrom = getData(items, FIELD_LOWER); + Data dTo = getData(items, FIELD_UPPER); + + DataItem[] from = dFrom.getItems(); + DataItem[] to = dTo.getItems(); + + StringBuilder sb = new StringBuilder(); + sb.append(from[0].getLabel()); + sb.append(" " + MSG.dpUnitFrom() + " - "); + sb.append(to[0].getLabel()); + sb.append(" " + MSG.dpUnitTo()); + + return sb.toString(); + } + + @Override + public Canvas create(DataList data) { + picker = new LocationPicker(this); + distancePanel = new DoubleRangeOnlyPanel( + MSG.dpUnitFrom() + " - ", MSG.dpUnitTo(), 0d, 0d, 250, this, "right"); + VLayout layout = new VLayout(); + layout.setMembersMargin(10); + + Label label = new Label(MSG.distance_state()); + + Canvas submit = getNextButton(); + + label.setHeight(25); + distancePanel.setHeight(50); + + layout.addMember(label); + layout.addMember(distancePanel); + layout.addMember(submit); + + initMinMaxValues(data); + initDefaultValues(data); + + + picker.setIsDistance(true); + picker.getLocationTable().setAutoFetchData(true); + picker.prepareFilter(); + + helperContainer.addMember(picker.getLocationTable()); + helperContainer.addMember(picker.getFilterLayout()); + helperContainer.addMember(picker.getResultCountForm()); + + setPickerDataSource(); + picker.createLocationTable(); + + return layout; + } + + protected void initMinMaxValues(DataList data) { + Data f = getData(data.getAll(), FIELD_LOWER); + Data t = getData(data.getAll(), FIELD_UPPER); + + DataItem[] fItems = f.getItems(); + DataItem[] tItems = t.getItems(); + + try { + min = Double.valueOf(fItems[0].getStringValue()); + max = Double.valueOf(tItems[0].getStringValue()); + } + catch (NumberFormatException nfe) { + min = -Double.MAX_VALUE; + max = Double.MAX_VALUE; + } + } + + protected void initDefaultValues(DataList data) { + initDefaultFrom(data); + initDefaultTo(data); + } + + protected void initDefaultFrom(DataList data) { + Data f = getData(data.getAll(), FIELD_LOWER); + + double from = getDefaultFrom(); + + try { + from = getDefaultValue(f); + } + catch (NumberFormatException nfe) { + // do nothing + } + + distancePanel.setFrom(from); + } + + + protected double getDefaultFrom() { + return min; + } + + + protected void initDefaultTo(DataList data) { + Data t = getData(data.getAll(), FIELD_UPPER); + + double to = getDefaultTo(); + + try { + to = getDefaultValue(t); + } + catch (NumberFormatException nfe) { + // do nothing + } + + distancePanel.setTo(to); + } + + + protected double getDefaultTo() { + return max; + } + + protected double getDefaultValue(Data data) + throws NumberFormatException + { + DataItem def = data.getDefault(); + String defValue = def != null ? def.getStringValue() : null; + + return Double.valueOf(defValue); + } + + /** Hook service to the listgrid with possible input values. */ + protected void setPickerDataSource() { + Config config = Config.getInstance(); + String url = config.getServerUrl(); + String river = ""; + + ArtifactDescription adescr = artifact.getArtifactDescription(); + DataList[] data = adescr.getOldData(); + + // Try to find a "river" data item to set the source for the + // list grid. + String dataFilter = "locations"; + if (data != null && data.length > 0) { + for (int i = 0; i < data.length; i++) { + DataList dl = data[i]; + if (dl.getState().equals("state.minfo.river")) { + dataFilter = "measuringpoint"; + } + if (dl.getState().equals("state.winfo.river") || + dl.getState().equals("state.chart.river") || + dl.getState().equals("state.minfo.river")) { + for (int j = 0; j < dl.size(); j++) { + Data d = dl.get(j); + DataItem[] di = d.getItems(); + if (di != null && di.length == 1) { + river = d.getItems()[0].getStringValue(); + break; + } + } + } + } + } + + picker.getLocationTable().setDataSource(new DistanceInfoDataSource( + url, river, dataFilter)); + } + + @Override + protected Data[] getData() { + Data[] data = new Data[2]; + + data[0] = getDataFrom(); + data[1] = getDataTo(); + + return data; + } + + protected Data getDataFrom() { + String value = String.valueOf(distancePanel.getFrom()); + String field = FIELD_LOWER; + + DataItem item = new DefaultDataItem(field, field, value); + return new DefaultData( + field, null, null, new DataItem[] { item }); + } + + protected Data getDataTo() { + String value = String.valueOf(distancePanel.getTo()); + String field = FIELD_UPPER; + + DataItem item = new DefaultDataItem(field, field, value); + return new DefaultData( + field, null, null, new DataItem[] { item }); + } + + @Override + public void onBlur(BlurEvent event) { + distancePanel.validateForm(); + } + + @Override + public void onCellClick(CellClickEvent e) { + Record record = e.getRecord(); + int ndx = e.getColNum(); + String from = record.getAttribute("from"); + try { + double value = Double.valueOf(from); + switch (ndx) { + case 0: distancePanel.setFrom(value); break; + case 1: distancePanel.setTo(value); break; + } + } + catch(NumberFormatException nfe) { + SC.warn(MSG.wrongFormat()); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/SedLoadEpochPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/SedLoadEpochPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,277 @@ +package org.dive4elements.river.client.client.ui.minfo; + +import java.util.ArrayList; +import java.util.List; + +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; + +import org.dive4elements.river.client.client.Config; +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 SedLoadEpochPanel +extends AbstractUIProvider +{ + protected SedimentLoadInfoServiceAsync sedLoadInfoService = + GWT.create(SedimentLoadInfoService.class); + + protected ListGrid elements; + private TextItem start; + private TextItem end; + private ListGrid sedLoadTable; + + public Canvas createWidget(DataList data) { + HLayout input = new HLayout(); + VLayout root = new VLayout(); + VLayout grid = new VLayout(); + VLayout intFields = new VLayout(); + Button add = new Button(MSG.add_date()); + elements = new ListGrid(); + + Label title = new Label(data.get(0).getDescription()); + title.setHeight("25px"); + + DynamicForm form = new DynamicForm(); + form.setNumCols(4); + start = new TextItem(MSG.from()); + start.setWidth(60); + start.setValidators(new IsIntegerValidator()); + end = new TextItem(MSG.to()); + end.setWidth(60); + end.setValidators(new IsIntegerValidator()); + form.setFields(start, end); + add.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent ce) { + String v1 = start.getValueAsString(); + String v2 = end.getValueAsString(); + //TODO: better validation. + if (v1 == null || v2 == null) { + return; + } + try { + int v1i = Integer.parseInt(v1); + int v2i = Integer.parseInt(v2); + } + catch(NumberFormatException nfe) { + return; + } + Record r = new Record(); + r.setAttribute("from", v1); + r.setAttribute("to", v2); + elements.addData(r); + } + }); + + Label sel = new Label(MSG.select()); + sel.setHeight(25); + elements.setWidth(185); + elements.setHeight(120); + elements.setShowHeaderContextMenu(false); + elements.setCanReorderFields(false); + elements.setCanSort(false); + elements.setCanEdit(false); + ListGridField from = new ListGridField("from", MSG.from()); + ListGridField to = new ListGridField("to", MSG.to()); + from.setWidth(70); + to.setWidth(70); + + final ListGridField removeField = + new ListGridField("_removeRecord", "Remove Record"){{ + setType(ListGridFieldType.ICON); + setIcon(GWT.getHostPageBaseURL() + MSG.removeFeature()); + setCanEdit(false); + setCanFilter(false); + setCanSort(false); + setCanGroupBy(false); + setCanFreeze(false); + setWidth(25); + }}; + + 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()); + } + }); + + elements.setFields(from, to, removeField); + + intFields.addMember(form); + intFields.addMember(add); + grid.addMember(sel); + grid.addMember(elements); + input.addMember(intFields); + input.addMember(grid); + root.addMember(title); + root.addMember(input); + + return root; + } + + @Override + public Canvas createOld(DataList dataList) { + HLayout layout = new HLayout(); + layout.setWidth("400px"); + VLayout vLayout = new VLayout(); + vLayout.setWidth(130); + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + label.setHeight(25); + + List items = dataList.getAll(); + Data str = getData(items, "epochs"); + DataItem[] strItems = str.getItems(); + + String[] pairs = strItems[0].getLabel().split(";"); + for (int i = 0; i < pairs.length; i++) { + String[] vals = pairs[i].split(","); + Label dateLabel = new Label(vals[0] + " - " + vals[1]); + dateLabel.setHeight(20); + vLayout.addMember(dateLabel); + } + Canvas back = getBackButton(dataList.getState()); + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + @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("*"); + + sedLoadTable.setFields(date, descr); + return sedLoadTable; + } + + @Override + protected Data[] getData() { + List data = new ArrayList(); + + ListGridRecord[] lgr = elements.getRecords(); + if (lgr.length == 0) { + return new Data[0]; + } + String d = ""; + for (int i = 0; i < lgr.length; i++) { + Record r = (Record) lgr[i]; + d += r.getAttribute("from") + "," + r.getAttribute("to"); + d += ";"; + } + + 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() { + 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(); + + sedLoadInfoService.getSedimentLoadInfo(locale, river, "single", km[0], km[1], + new AsyncCallback() { + public void onFailure(Throwable caught) { + GWT.log("Could not recieve sediment load informations."); + SC.warn(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); + } + } + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/SedLoadOffEpochPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/SedLoadOffEpochPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,187 @@ +package org.dive4elements.river.client.client.ui.minfo; + +import java.util.ArrayList; +import java.util.List; + +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.types.SelectionAppearance; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +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.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.client.services.SedimentLoadInfoService; +import org.dive4elements.river.client.client.services.SedimentLoadInfoServiceAsync; +import org.dive4elements.river.client.client.ui.PeriodPanel; +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 SedLoadOffEpochPanel +extends PeriodPanel +{ + protected SedimentLoadInfoServiceAsync sedLoadInfoService = + GWT.create(SedimentLoadInfoService.class); + + private ListGrid sedLoadTable; + + public Canvas createWidget(DataList data) { + VLayout root = new VLayout(); + + Label title = new Label(data.get(0).getDescription()); + title.setHeight("25px"); + + root.addMember(title); + + return root; + } + + @Override + public Canvas createOld(DataList dataList) { + HLayout layout = new HLayout(); + layout.setWidth("400px"); + VLayout vLayout = new VLayout(); + vLayout.setWidth(130); + Label label = new Label(dataList.getLabel()); + label.setWidth("200px"); + label.setHeight(25); + + List items = dataList.getAll(); + Data str = getData(items, "epochs"); + DataItem[] strItems = str.getItems(); + + String[] pairs = strItems[0].getLabel().split(";"); + for (int i = 0; i < pairs.length; i++) { + String[] vals = pairs[i].split(","); + Label dateLabel = new Label(vals[0] + " - " + vals[1]); + dateLabel.setHeight(20); + vLayout.addMember(dateLabel); + } + Canvas back = getBackButton(dataList.getState()); + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + @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; + } + + protected 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); + sedLoadTable.setSelectionAppearance(SelectionAppearance.CHECKBOX); + + 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("*"); + + sedLoadTable.setFields(date, descr); + return sedLoadTable; + } + + @Override + public Data[] getData() { + List data = new ArrayList(); + + ListGridRecord[] lgr = sedLoadTable.getSelectedRecords(); + if (lgr.length == 0) { + return new Data[0]; + } + String d = ""; + for (int i = 0; i < lgr.length; i++) { + Record r = (Record) lgr[i]; + String date = r.getAttribute("date"); + String[] range = date.split(" - "); + d += range[0] + "," + range[1]; + d += ";"; + } + 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() { + 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(); + + sedLoadInfoService.getSedimentLoadInfo(locale, river, "epoch", km[0], km[1], + new AsyncCallback() { + public void onFailure(Throwable caught) { + GWT.log("Could not recieve sediment load informations."); + SC.warn(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); + } + } + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/SedLoadPeriodPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/SedLoadPeriodPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,230 @@ +package org.dive4elements.river.client.client.ui.minfo; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +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 org.dive4elements.river.client.client.Config; +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 SedLoadPeriodPanel +extends AbstractUIProvider +{ + protected SedimentLoadInfoServiceAsync sedLoadInfoService = + GWT.create(SedimentLoadInfoService.class); + + private TextItem start; + private TextItem end; + + private ListGrid sedLoadTable; + + public SedLoadPeriodPanel () { + } + + @Override + public Canvas createOld(DataList dataList) { + List items = dataList.getAll(); + Data start = getData(items, "start"); + Data end = getData(items, "end"); + DataItem[] startItem = start.getItems(); + DataItem[] endItem = end.getItems(); + + String v1 = startItem[0].getStringValue(); + String v2 = endItem[0].getStringValue(); + + int v1i = 0; + int v2i = 0; + try { + v1i = Integer.parseInt(v1); + v2i = Integer.parseInt(v2); + } + catch (NumberFormatException nfe) { + GWT.log(nfe.toString()); + } + Label old = new Label(v1i + " - " + v2i); + 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 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("*"); + + sedLoadTable.setFields(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); + start = new TextItem(MSG.from()); + start.setValidators(new IsIntegerValidator()); + end = new TextItem(MSG.to()); + end.setValidators(new IsIntegerValidator()); + form.setFields(start, end); +// inputPanel.setToTitle(MSG.to()); +// inputPanel.setFromTitle(MSG.from()); +// inputPanel.setShowTitle(false); + + layout.addMember(title); + layout.addMember(form); + + return layout; + } + + @Override + protected Data[] getData() { + int v1; + int v2; + try { + v1 = Integer.parseInt(start.getValueAsString()); + v2 = Integer.parseInt(end.getValueAsString()); + } + catch(NumberFormatException nfe) { + // warn the user... + return new Data[0]; + } + if (validateRange(v1, v2)) { + List data = new ArrayList(); + + DataItem startItem = new DefaultDataItem("start", "start", start.getValueAsString()); + DataItem endItem = new DefaultDataItem("end", "end", end.getValueAsString()); + data.add(new DefaultData( + "start", + null, + null, + new DataItem[] { startItem })); + data.add(new DefaultData( + "end", + null, + null, + new DataItem[] { endItem })); + + return data.toArray(new Data[data.size()]); + } + return new Data[0]; + } + + protected boolean validateRange(int v1, int v2) { + // TODO: Set useful years for validation. Current range is between start + // of gregorian calendar and a year in the future... + if ((v1 > 1582 && v1 < 2100) + && (v2 > 1582 && v2 < 2100)) { + return true; + } + return false; + } + + 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(); + + sedLoadInfoService.getSedimentLoadInfo(locale, river, "single", km[0], km[1], + new AsyncCallback() { + public void onFailure(Throwable caught) { + GWT.log("Could not recieve sediment load informations."); + SC.warn(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); + } + } + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/range/DischargeInfoDataSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/range/DischargeInfoDataSource.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,42 @@ +package org.dive4elements.river.client.client.ui.range; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.data.DataSource; +import com.smartgwt.client.data.DataSourceField; +import com.smartgwt.client.types.DSDataFormat; +import com.smartgwt.client.types.FieldType; + +public class DischargeInfoDataSource extends DataSource { + + public static final String XPATH_DISCHARGE_DEFAULT = "/discharges/discharge"; + + + public DischargeInfoDataSource(String url, long gauge) { + setDataFormat(DSDataFormat.XML); + setRecordXPath(XPATH_DISCHARGE_DEFAULT); + + DataSourceField desc = new DataSourceField( + "description", FieldType.TEXT, "description"); + + DataSourceField start = new DataSourceField( + "start", FieldType.TEXT, "start"); + + DataSourceField end = new DataSourceField( + "end", FieldType.TEXT, "end"); + + setFields(desc, start, end); + setDataURL(getServiceURL(url, gauge)); + } + + + protected String getServiceURL(String server, long gauge) { + String url = GWT.getModuleBaseURL(); + url += "dischargeinfoxml"; + url += "?server=" + server; + url += "&gauge=" + String.valueOf(gauge); + + return url; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/range/DistanceInfoDataSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/range/DistanceInfoDataSource.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,53 @@ +package org.dive4elements.river.client.client.ui.range; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.data.DataSource; +import com.smartgwt.client.data.DataSourceField; +import com.smartgwt.client.types.DSDataFormat; +import com.smartgwt.client.types.FieldType; + + +public class DistanceInfoDataSource extends DataSource { + + public static final String XPATH_DISTANCE_DEFAULT = "/distances/distance"; + + + public DistanceInfoDataSource(String url, String river, String filter) { + setDataFormat(DSDataFormat.XML); + setRecordXPath(XPATH_DISTANCE_DEFAULT); + + DataSourceField desc = new DataSourceField( + "description", FieldType.TEXT, "description"); + + DataSourceField from = new DataSourceField( + "from", FieldType.TEXT, "from"); + + DataSourceField to = new DataSourceField( + "to", FieldType.TEXT, "to"); + + DataSourceField side = new DataSourceField( + "riverside", FieldType.TEXT, "riverside"); + + DataSourceField top = new DataSourceField( + "top", FieldType.TEXT, "top"); + + DataSourceField bottom = new DataSourceField( + "bottom", FieldType.TEXT, "bottom"); + + setFields(desc, from, to, side, top, bottom); + setDataURL(getServiceURL(url, river, filter)); + } + + + protected String getServiceURL(String server, String river, String filter) { + String url = GWT.getModuleBaseURL(); + url += "distanceinfoxml"; + url += "?server=" + server; + url += "&river=" + river; + url += "&filter=" + filter; + + return url; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/range/LocationsTable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/range/LocationsTable.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,92 @@ +package org.dive4elements.river.client.client.ui.range; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.types.SelectionStyle; +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.CellFormatter; + +import org.dive4elements.river.client.client.FLYSConstants; + + +/** + * @author Ingo Weinzierl + */ +public class LocationsTable extends ListGrid { + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + + public LocationsTable() { + String baseUrl = GWT.getHostPageBaseURL(); + + setWidth100(); + setHeight100(); + setSelectionType(SelectionStyle.SINGLE); + setSelectionType(SelectionStyle.SINGLE); + setShowHeaderContextMenu(false); + setShowRecordComponents(true); + setShowRecordComponentsByCell(true); + setEmptyMessage(MSG.empty_filter()); + setCanReorderFields(false); + + ListGridField addfrom = new ListGridField ("from", MSG.from()); + addfrom.setType(ListGridFieldType.ICON); + addfrom.setWidth(30); + addfrom.setCellIcon(baseUrl + MSG.markerGreen()); + + ListGridField addto = new ListGridField("to", MSG.to()); + addto.setType(ListGridFieldType.ICON); + addto.setWidth(30); + addto.setCellIcon(baseUrl + MSG.markerRed()); + + ListGridField ldescr = new ListGridField( + "description", MSG.description()); + ldescr.setType(ListGridFieldType.TEXT); + ldescr.setWidth("*"); + + ListGridField lside = new ListGridField("riverside", MSG.riverside()); + lside.setType(ListGridFieldType.TEXT); + lside.setWidth("12%"); + + ListGridField loc = new ListGridField("from", MSG.locations()); + loc.setType(ListGridFieldType.FLOAT); + loc.setCellFormatter(new CellFormatter() { + public String format( + Object value, + ListGridRecord record, + int rowNum, int colNum) { + if (value == null) return null; + try { + NumberFormat nf; + double v = Double.parseDouble((String)value); + nf = NumberFormat.getFormat("###0.00##"); + return nf.format(v); + } + catch (Exception e) { + return value.toString(); + } + } + } + ); + + loc.setWidth("12%"); + + ListGridField bottom = new ListGridField("bottom", MSG.bottom_edge()); + bottom.setType(ListGridFieldType.TEXT); + bottom.setWidth("10%"); + + ListGridField top = new ListGridField("top", MSG.top_edge()); + top.setType(ListGridFieldType.TEXT); + top.setWidth("10%"); + + setFields(addfrom, addto, ldescr, loc, lside, bottom, top); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/range/RangeTable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/range/RangeTable.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,111 @@ +package org.dive4elements.river.client.client.ui.range; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.types.SelectionStyle; +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.CellFormatter; + +import org.dive4elements.river.client.client.FLYSConstants; + + +/** + * @author Ingo Weinzierl + */ +public class RangeTable extends ListGrid { + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); + + + public RangeTable() { + String baseUrl = GWT.getHostPageBaseURL(); + + setWidth100(); + setHeight100(); + setSelectionType(SelectionStyle.SINGLE); + setSelectionType(SelectionStyle.SINGLE); + setShowHeaderContextMenu(false); + setShowRecordComponents(true); + setShowRecordComponentsByCell(true); + setEmptyMessage(MESSAGES.empty_filter()); + setCanReorderFields(false); + + ListGridField addDistance = new ListGridField ("", ""); + addDistance.setType (ListGridFieldType.ICON); + addDistance.setWidth (20); + addDistance.setCellIcon(baseUrl + MESSAGES.markerGreen()); + + ListGridField ddescr = new ListGridField( + "description", MESSAGES.description()); + ddescr.setType(ListGridFieldType.TEXT); + ddescr.setWidth("*"); + ListGridField from = new ListGridField("from", MESSAGES.from()); + from.setType(ListGridFieldType.FLOAT); + from.setCellFormatter(new CellFormatter() { + public String format( + Object value, + ListGridRecord record, + int rowNum, int colNum) { + if (value == null) return null; + try { + NumberFormat nf; + double v = Double.parseDouble((String)value); + nf = NumberFormat.getFormat("###0.00##"); + return nf.format(v); + } + catch (Exception e) { + return value.toString(); + } + } + } + ); + + from.setWidth("12%"); + + ListGridField to = new ListGridField("to", MESSAGES.to()); + to.setType(ListGridFieldType.FLOAT); + to.setCellFormatter(new CellFormatter() { + public String format( + Object value, + ListGridRecord record, + int rowNum, int colNum) { + if (value == null) return null; + GWT.log((String)value); + try { + NumberFormat nf; + double v = Double.parseDouble((String)value); + nf = NumberFormat.getFormat("###0.00##"); + return nf.format(v); + } + catch (Exception e) { + return value.toString(); + } + } + } + ); + + to.setWidth("12%"); + + ListGridField dside = new ListGridField( + "riverside", MESSAGES.riverside()); + dside.setType(ListGridFieldType.TEXT); + dside.setWidth("12%"); + + ListGridField bottom = new ListGridField( + "bottom", MESSAGES.bottom_edge()); + bottom.setType(ListGridFieldType.TEXT); + bottom.setWidth("10%"); + + ListGridField top = new ListGridField("top", MESSAGES.top_edge()); + top.setType(ListGridFieldType.TEXT); + top.setWidth("10%"); + + setFields(addDistance, ddescr, from, to, dside, bottom, top); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sq/SQCampaignChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sq/SQCampaignChart.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,79 @@ +package org.dive4elements.river.client.client.ui.sq; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.json.client.JSONNumber; +import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONString; +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.events.ResizedHandler; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.Config; +import org.dive4elements.river.client.shared.model.Artifact; + + +public class SQCampaignChart extends VLayout { + + private final Artifact artifact; + + protected Img chartImg; + + public SQCampaignChart(Artifact artifact, ResizedHandler resizeHandler) { + super(); + + this.artifact = artifact; + this.chartImg = new Img(); + + addResizedHandler(resizeHandler); + setAlign(Alignment.CENTER); + } + + public void update() { + Config config = Config.getInstance(); + String locale = config.getLocale(); + + int hWidth = getWidth() - 12; + int hHeight = getHeight() - 12; + + if ((int) (hHeight * 4f / 3) < hWidth) { + hWidth = (int) (hHeight * 4f / 3); + } + else { + hHeight = (int) (hWidth * 3f / 4); + } + + String river = artifact.getArtifactDescription().getRiver(); + + JSONObject jfix = new JSONObject(); + JSONObject jfilter = new JSONObject(); + JSONObject jrName = new JSONObject(); + JSONString jrValue = new JSONString(river); + JSONObject jextent = new JSONObject(); + JSONNumber jwidth = new JSONNumber(hWidth); + JSONNumber jheight = new JSONNumber(hHeight); + + jrName.put("name", jrValue); + jfilter.put("river", jrName); + jextent.put("width", jwidth); + jextent.put("height", jheight); + jfilter.put("extent", jextent); + jfix.put("sq", jfilter); + String filter = jfix.toString(); + + String imgUrl = GWT.getModuleBaseURL(); + imgUrl += "sq-km-chart"; + imgUrl += "?locale=" + locale; + imgUrl += "&filter=" + filter; + + if (chartImg != null && hasMember(chartImg)) { + chartImg.setWidth(hWidth); + chartImg.setHeight(hHeight); + chartImg.setSrc(imgUrl); + } + else { + chartImg = new Img(imgUrl, hWidth, hHeight); + addMember(chartImg); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sq/SQMultiPeriodPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sq/SQMultiPeriodPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,32 @@ +package org.dive4elements.river.client.client.ui.sq; + +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.events.ResizedEvent; +import com.smartgwt.client.widgets.events.ResizedHandler; + +import org.dive4elements.river.client.client.ui.MultiPeriodPanel; + + +/** + * This UIProvider creates helper panel for sq relation. + * + * @author Raimund Renkert + */ +public class SQMultiPeriodPanel extends MultiPeriodPanel implements + ResizedHandler { + protected SQCampaignChart chartContainer; + + public SQMultiPeriodPanel() { + } + + @Override + protected Canvas createHelper() { + chartContainer = new SQCampaignChart(artifact, this); + return chartContainer; + } + + @Override + public void onResized(ResizedEvent re) { + chartContainer.update(); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sq/SQPeriodPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sq/SQPeriodPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,26 @@ +package org.dive4elements.river.client.client.ui.sq; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.events.ResizedEvent; +import com.smartgwt.client.widgets.events.ResizedHandler; + +import org.dive4elements.river.client.client.ui.PeriodPanel; + +public class SQPeriodPanel extends PeriodPanel implements ResizedHandler { + + private SQCampaignChart chartLayout; + + @Override + protected Canvas createHelper() { + GWT.log("Create new SQCampaignChart as Helper Widget"); + chartLayout = new SQCampaignChart(artifact, this); + return chartLayout; + } + + + @Override + public void onResized(ResizedEvent re) { + chartLayout.update(); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugeInfoPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugeInfoPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,114 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.i18n.client.NumberFormat; +import com.google.gwt.user.client.ui.Anchor; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.Label; + +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.GaugeInfo; + +public class GaugeInfoPanel extends VLayout { + + /** The message class that provides i18n strings.*/ + private FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** Application instance. */ + private FLYS flys; + + public GaugeInfoPanel(GaugeInfo gauge, FLYS flys) { + this.flys = flys; + setStyleName("gaugeinfopanel"); + + NumberFormat nf = NumberFormat.getDecimalFormat(); + + VLayout grid = new VLayout(); + HLayout line1 = new HLayout(); + + Double minw = gauge.getMinW(); + Double maxw = gauge.getMaxW(); + if (minw != null && maxw != null) { + Label key = new Label(MSG.wq_value_q()); + Label value = new Label(nf.format(minw) + + " - " + nf.format(maxw)); + key.setWidth(150); + line1.addMember(key); + line1.addMember(value); + } + + HLayout line2 = new HLayout(); + Double minq = gauge.getMinQ(); + Double maxq = gauge.getMaxQ(); + if (minq != null && maxq != null) { + Label key = new Label(MSG.wq_value_w()); + Label value = new Label( nf.format(minq) + + " - " + nf.format(maxq)); + key.setWidth(150); + line2.addMember(key); + line2.addMember(value); + } + + HLayout line3 = new HLayout(); + Double aeo = gauge.getAeo(); + if (aeo != null) { + Label key = new Label("AEO [km²]"); + Label value = new Label(nf.format(aeo)); + key.setWidth(150); + line3.addMember(key); + line3.addMember(value); + } + + HLayout line4 = new HLayout(); + Double datum = gauge.getDatum(); + if (datum != null) { + Label key = new Label(MSG.gauge_zero() + " [" + + gauge.getWstUnit() + "]"); + Label value = new Label(nf.format(datum)); + key.setWidth(150); + line4.addMember(key); + line4.addMember(value); + } + + HLayout line5 = new HLayout(); + line5.addMember(new GaugeMainValueAnchor(flys, gauge)); + + grid.addMember(line1); + grid.addMember(line2); + grid.addMember(line3); + grid.addMember(line4); + grid.addMember(line5); + addMember(grid); + } + + + /** + * Clickable anchor that asks application to show window with + * main values for gauge. + */ + class GaugeMainValueAnchor extends Anchor implements ClickHandler { + + private FLYS flys; + private GaugeInfo gauge; + + public GaugeMainValueAnchor(FLYS flys, GaugeInfo gauge) { + super(MSG.show_mainvalues()); + this.flys = flys; + this.gauge = gauge; + this.setHeight("5"); + + addClickHandler(this); + } + + @Override + public void onClick(ClickEvent ev) { + GWT.log("GaugeMainValueAnchor - onClick " + gauge.getRiverName() + + " " + gauge.getOfficialNumber()); + flys.newGaugeMainValueTable(gauge); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugeListGrid.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugeListGrid.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,320 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.WidgetCanvas; +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 org.dive4elements.river.client.client.FLYS; +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.GaugeInfo; +import org.dive4elements.river.client.shared.model.RiverInfo; + + +/** + * @author Björn Ricks + */ +public class GaugeListGrid extends InfoListGrid implements RecordClickHandler { + + private static final int ABFLUSSTAFEL_COLUMN = 6; + + public GaugeListGrid(FLYS flys) { + super(flys); + //TODO i18n!!! + ListGridField nfield = new ListGridField("name", "Pegel"); + ListGridField sfield = new ListGridField("kmstart", "Start [km]", 60); + ListGridField efield = new ListGridField("kmend", "Ende [km]", 60); + ListGridField stfield = new ListGridField("station", "Station [km]"); + ListGridField lfield = new ListGridField("link", "Info"); + lfield.setType(ListGridFieldType.LINK); + ListGridField cfield = new ListGridField("curvelink", MSG.gauge_curve_link()); + cfield.addRecordClickHandler(this); + + this.setFields(nfield, sfield, efield, stfield, lfield, cfield); + } + + public void setRiverInfo(RiverInfo riverinfo) { + List gauges = riverinfo.getGauges(); + + if (gauges != null && !gauges.isEmpty()) { + + ArrayList emptygauges = new ArrayList(); + + if (!riverinfo.isKmUp()) { + for (GaugeInfo gauge : gauges) { + addGauge(gauge, emptygauges); + } + } + else { + for (int i = gauges.size()-1; i >= 0; i--) { + GaugeInfo gauge = gauges.get(i); + addGauge(gauge, emptygauges); + } + } + + // put empty gauges to the end + for (GaugeInfo gauge : emptygauges) { + addGauge(gauge); + } + } + } + + private void addGauge(GaugeInfo gauge, List empty) { + if (gauge.getKmStart() != null && gauge.getKmEnd() != null) { + addGauge(gauge); + } + else { + empty.add(gauge); + } + } + + private void addGauge(GaugeInfo gauge) { + this.addData(new GaugeRecord(gauge)); + } + + public void open() { + ArrayList locations = new ArrayList(); + + if (data != null && data.length > 0) { + for (int i = 0; i < data.length; i++) { + DataList dl = data[i]; + String state = dl.getState(); + GWT.log("GaugeListGrid - open " + state); + if (state.equals("state.winfo.location_distance")) { + Double ldfrom = null; + Double ldto = null; + + for (int j = dl.size()-1; j >= 0; --j) { + Data d = dl.get(j); + String label = d.getLabel(); + GWT.log("GaugeListGrid - setData - label " + label + " " + d.getStringValue()); + if (label.equals("ld_from")) { + ldfrom = getDoubleValue(d); + } + else if (label.equals("ld_to")) { + ldto = getDoubleValue(d); + } + else if (label.equals("ld_locations")) { + getLocationsFromData(locations, d); + openOnLocations(locations); + return; + } + } + if (ldfrom != null) { + openOnDistance(ldfrom, ldto); + return; + } + } + else if(state.equals("state.winfo.distance_only") || + state.equals("state.winfo.distance")) { + Double ldfrom = null; + Double ldto = null; + + for (int j = dl.size()-1; j >= 0; --j) { + Data d = dl.get(j); + String label = d.getLabel(); + GWT.log("GaugeListGrid - setData - label " + label + " " + d.getStringValue()); + if (label.equals("ld_from")) { + ldfrom = getDoubleValue(d); + } + else if (label.equals("ld_to")) { + ldto = getDoubleValue(d); + } + } + + if (ldfrom != null) { + openOnDistance(ldfrom, ldto); + return; + } + } + else if (state.equals("state.winfo.location")) { + getLocations("ld_locations", locations, dl); + openOnLocations(locations); + return; + } + else if (state.equals("state.winfo.reference.curve.input.start")) { + getLocations("reference_startpoint", locations, dl); + } + else if (state.equals("state.winfo.reference.curve.input.end")) { + getLocations("reference_endpoint", locations, dl); + } + else if (state.equals("state.winfo.historicalq.reference_gauge")) { + for (int j = dl.size()-1; j >= 0; --j) { + Data d = dl.get(j); + String label = d.getLabel(); + if (label.equals("reference_gauge")) { + String tmp = d.getStringValue(); + if (tmp != null) { + Long gaugereference = Long.valueOf(tmp); + if (gaugereference != null) { + openOnReference(gaugereference); + return; + } + } + } + } + } + } + } + if (!locations.isEmpty()) { + openOnLocations(locations); + } + else { + openAll(); + } + } + + void getLocations(String labelname, List locations, DataList dl) { + for (int j = dl.size()-1; j >= 0; --j) { + Data d = dl.get(j); + String label = d.getLabel(); + if (label.equals(labelname)) { + getLocationsFromData(locations, d); + } + } + } + + void getLocationsFromData(List locations, Data data) { + DataItem[] items = data.getItems(); + for (int k = 0; k < items.length; k++) { + String tmp = items[k].getStringValue(); + GWT.log("GaugeListGrid - getLocationsFromData " + tmp); + if (tmp != null) { + if (tmp.contains(" ")) { + // string contains several values ... + String[] values = tmp.split(" "); + for(int i=0; i < values.length; i++) { + Double value = Double.valueOf(values[i]); + if (value != null) { + locations.add(value); + } + } + } + else { + Double value = Double.valueOf(tmp); + if (value != null) { + locations.add(value); + } + } + } + } + } + + public void openOnReference(Long number) { + GWT.log("GaugeListGrid - openOnReference " + number); + for (ListGridRecord record: this.getRecords()) { + GaugeRecord item = (GaugeRecord)record; + if (item.getOfficialNumber().equals(number)) { + expandRecord(item); + } + else { + collapseRecord(item); + } + } + } + + public void openOnDistance(Double start, Double end) { + GWT.log("GaugeListGrid - openOnDistance " + start + " " + end); + + for (ListGridRecord record: this.getRecords()) { + GaugeRecord item = (GaugeRecord)record; + if (end == null && item.getKmStart() != null) { + if (item.getKmStart() >= start) { + expandRecord(item); + } + else { + collapseRecord(item); + } + } + else if (item.getKmStart() != null && item.getKmEnd() != null) { + // as getStart()/getEnd() return Double objects, they can be null and + // can cause NPEs when comparing with double... strange... + GWT.log("GaugeListGrid - openOnDistance item " + item.getKmStart() + " " + item.getKmEnd()); + if ((start >= item.getKmStart() && start <= item.getKmEnd()) || + (end >= item.getKmStart() && end <= item.getKmEnd()) || + (start <= item.getKmStart() && end >= item.getKmEnd())) { + expandRecord(item); + } + else { + collapseRecord(item); + } + } + else { + collapseRecord(item); + } + } + } + + /** + * Open Gauge entry if a location fits to the gauge. + */ + public void openOnLocations(List locations) { + GWT.log("GaugeListGrid - openOnLocations " + locations); + + if (locations == null || locations.isEmpty()) { + return; + } + + for (ListGridRecord record: this.getRecords()) { + GaugeRecord item = (GaugeRecord)record; + boolean isset = false; + for (Double location: locations) { + if (locations == null) { + continue; + } + + Double start = item.getKmStart(); + Double end = item.getKmEnd(); + if (start == null || end == null) { + // should not occur but avoid NullPointerException + continue; + } + + if (location >= start && location <= end) { + isset = true; + break; + } + } + if (isset) { + expandRecord(item); + } + else { + collapseRecord(item); + } + } + } + + @Override + protected Canvas getExpandPanel(ListGridRecord record) { + GaugeRecord item = (GaugeRecord)record; + return new WidgetCanvas(new GaugeInfoPanel(item, flys)); + } + + @Override + public void onRecordClick(RecordClickEvent event) { + GaugeRecord gauge = (GaugeRecord)event.getRecord(); + flys.newGaugeDischargeCurve(gauge.getRiverName(), + gauge.getOfficialNumber()); + } + + @Override + public String getCellCSSText(ListGridRecord record, int rowNum, + int colNum) { + if (colNum == ABFLUSSTAFEL_COLUMN) { + // display the ablfusstafel cell like a link + return "text-decoration: underline; color: #0000EE; cursor: pointer;"; + } + else { + return super.getCellCSSText(record, rowNum, colNum); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugePanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,53 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.shared.model.RiverInfo; + + +/** + * The GaugePanel is intended to be used within a SectionStackSection + * + * @author Björn Ricks + */ +public class GaugePanel extends InfoPanel { + + /** + * GaugePanel loads the GaugeInfo from the RiverInfoService and + * displays them in a tree underneath a RiverInfoPanel + * + * @param flys The FLYS object + */ + public GaugePanel(FLYS flys) { + super(new GaugeListGrid(flys)); + } + + + @Override + public String getSectionTitle() { + return MSG.gaugePanelTitle(); + } + + /** + * Loads the river info and renders it afterwards. + */ + public void refresh() { + contract(); + + riverInfoService.getGauges(this.river, new AsyncCallback() { + @Override + public void onFailure(Throwable e) { + GWT.log("Could not load the river info." + e); + } + + @Override + public void onSuccess(RiverInfo riverinfo) { + GWT.log("Loaded river info"); + render(riverinfo); + expand(); + } + }); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugeRecord.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugeRecord.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,165 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.GaugeInfo; + +/** + * @author Björn Ricks + */ +public class GaugeRecord extends ListGridRecord implements GaugeInfo { + + /** The message class that provides i18n strings.*/ + private FLYSConstants MSG = GWT.create(FLYSConstants.class); + + public GaugeRecord(GaugeInfo gauge) { + setCanExpand(true); + Long number = gauge.getOfficialNumber(); + String url = number != null ? + MSG.gauge_url() + number : + MSG.gauge_url(); + setLink(url); + setLinkText(MSG.gauge_info_link()); + setName(gauge.getName()); + setKmStart(gauge.getKmStart()); + setKmEnd(gauge.getKmEnd()); + setMinQ(gauge.getMinQ()); + setMaxQ(gauge.getMaxQ()); + setMinW(gauge.getMinW()); + setMaxW(gauge.getMaxW()); + setAeo(gauge.getAeo()); + setDatum(gauge.getDatum()); + setKmUp(gauge.isKmUp()); + setOfficialNumber(gauge.getOfficialNumber()); + setRiverName(gauge.getRiverName()); + setStation(gauge.getStation()); + setWstUnit(gauge.getWstUnit()); + setCurveLink(MSG.gauge_curve_link()); + } + + private void setCurveLink(String value) { + this.setAttribute("curvelink", value); + } + + private void setLink(String url) { + this.setAttribute("link", url); + } + + public String getLink() { + return this.getAttributeAsString("link"); + } + + public String getName() { + return this.getAttributeAsString("name"); + } + + private void setName(String value) { + this.setAttribute("name", value); + } + + public Double getKmStart() { + return this.getAttributeAsDouble("kmstart"); + } + + private void setKmStart(Double value) { + this.setAttribute("kmstart", value); + } + + public Double getKmEnd() { + return this.getAttributeAsDouble("kmend"); + } + + private void setKmEnd(Double value) { + this.setAttribute("kmend", value); + } + + public Double getMinQ() { + return this.getAttributeAsDouble("minq"); + } + + private void setMinQ(Double value) { + this.setAttribute("minq", value); + } + + public Double getMaxQ() { + return this.getAttributeAsDouble("maxq"); + } + + private void setMaxQ(Double value) { + this.setAttribute("maxq", value); + } + + public Double getMinW() { + return this.getAttributeAsDouble("minw"); + } + + private void setMinW(Double value) { + this.setAttribute("minw", value); + } + + public Double getMaxW() { + return this.getAttributeAsDouble("maxw"); + } + + private void setMaxW(Double value) { + this.setAttribute("maxw", value); + } + + public Double getDatum() { + return this.getAttributeAsDouble("datum"); + } + + private void setDatum(Double value) { + this.setAttribute("datum", value); + } + + public Double getAeo() { + return this.getAttributeAsDouble("aeo"); + } + + private void setAeo(Double value) { + this.setAttribute("aeo", value); + } + + public boolean isKmUp() { + return this.getAttributeAsBoolean("kmup"); + } + + private void setKmUp(boolean value) { + this.setAttribute("kmup", value); + } + + public Double getStation() { + return this.getAttributeAsDouble("station"); + } + + private void setStation(Double value) { + this.setAttribute("station", value); + } + + public String getWstUnit() { + return this.getAttributeAsString("wstunit"); + } + + private void setWstUnit(String value) { + this.setAttribute("wstunit", value); + } + + public Long getOfficialNumber() { + return this.getAttributeAsLong("officialnumber"); + } + + private void setOfficialNumber(Long number) { + this.setAttribute("officialnumber", number); + } + + public String getRiverName() { + return this.getAttributeAsString("rivername"); + } + + private void setRiverName(String rivername) { + this.setAttribute("rivername", rivername); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/InfoListGrid.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/InfoListGrid.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,67 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.RiverInfo; + +/** + * @author Björn Ricks + */ +public abstract class InfoListGrid extends ListGrid { + + protected FLYS flys; + protected DataList[] data; + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + + public InfoListGrid(FLYS flys) { + super(); + this.flys = flys; + this.setCanExpandRecords(true); + this.setCanExpandMultipleRecords(true); + } + + public void openAll() { + GWT.log("InfoListGrid - openAll"); + for (ListGridRecord record: this.getRecords()) { + expandRecord(record); + } + } + + public void setData(DataList[] data) { + GWT.log("InfoListGrid - setData"); + this.data = data; + this.open(); + } + + protected Double getDoubleValue(Data d) { + String tmp = d.getStringValue(); + if (tmp != null) { + return Double.valueOf(tmp); + } + return null; + } + + @Override + protected Canvas getExpansionComponent(ListGridRecord record) { + VLayout layout = new VLayout(); + layout.setPadding(5); + layout.addMember(this.getExpandPanel(record)); + return layout; + } + + public abstract void open(); + + public abstract void setRiverInfo(RiverInfo riverinfo); + + protected abstract Canvas getExpandPanel(ListGridRecord record); +} \ No newline at end of file diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/InfoPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/InfoPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,140 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.Overflow; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.layout.SectionStackSection; +import com.smartgwt.client.widgets.layout.VLayout; +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.client.services.RiverInfoService; +import org.dive4elements.river.client.client.services.RiverInfoServiceAsync; +import org.dive4elements.river.client.client.ui.RiverInfoPanel; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.RiverInfo; + +/** + * @author Björn Ricks + */ +public abstract class InfoPanel extends VLayout { + + /** SectionStackSection where this InfoPanel belongs in*/ + protected SectionStackSection section; + + /** Name of the river */ + protected String river; + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + protected RiverInfoServiceAsync riverInfoService = GWT.create(RiverInfoService.class); + + /** Panel to show the info about the river */ + protected RiverInfoPanel riverinfopanel; + + protected InfoListGrid listgrid; + + public final static String SECTION_ID = "InfoPanelSection"; + + public InfoPanel(InfoListGrid listgrid) { + SectionStackSection section = new SectionStackSection(); + section.setExpanded(false); + section.setTitle(getSectionTitle()); + section.setName(SECTION_ID); + section.setID(SECTION_ID); + + setOverflow(Overflow.HIDDEN); + setStyleName("infopanel"); + + section.setHidden(true); + section.setItems(this); + this.section = section; + this.listgrid = listgrid; + this.addMember(listgrid); + } + + /** + * Sets and loads the river data if river is not the current set river. + */ + public void setRiver(String river) { + if (!river.equals(this.river)) { + this.river = river; + this.refresh(); + } + } + + /** + * Sets the data and closes not corresponding folds in the gauge tree. + */ + public void setData(DataList[] data) { + this.listgrid.setData(data); + } + + protected void render(RiverInfo riverinfo) { + if (this.riverinfopanel == null) { + this.riverinfopanel = new RiverInfoPanel(riverinfo); + + this.addMember(this.riverinfopanel, 0); + } + else { + riverinfopanel.setRiverInfo(riverinfo); + } + this.listgrid.setRiverInfo(riverinfo); + } + + /** + * Hide the section stack section. + */ + @Override + public void hide() { + GWT.log("InfoPanel - hide"); + this.section.setHidden(true); + } + + /** + * Show the section stack section. + */ + @Override + public void show() { + GWT.log("InfoPanel - show"); + this.section.setHidden(false); + } + + @Override + public void addMember(Canvas component) { + super.addMember(component); + expand(); + } + + @Override + public void removeMembers(Canvas[] components) { + super.removeMembers(components); + contract(); + } + + public SectionStackSection getSection() { + return this.section; + } + + protected void removeAllMembers() { + removeMembers(getMembers()); + } + + /** + * Expands the gauge section. + */ + public void expand() { + section.setExpanded(true); + } + + /** + * Contracts/shrinks the expanded gauge section. + */ + public void contract() { + section.setExpanded(false); + } + + protected abstract void refresh(); + + protected abstract String getSectionTitle(); +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationInfoPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationInfoPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,60 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import java.util.Date; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; +import com.google.gwt.user.client.ui.Grid; +import com.smartgwt.client.widgets.layout.VLayout; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.MeasurementStation; + +public class MeasurementStationInfoPanel extends VLayout { + + /** The message class that provides i18n strings.*/ + private FLYSConstants MSG = GWT.create(FLYSConstants.class); + + public MeasurementStationInfoPanel(MeasurementStation station) { + setStyleName("infopanel"); + setWidth100(); + + Grid grid = new Grid(5, 2); + + String type = station.getMeasurementType(); + if (type != null) { + grid.setText(0, 0, MSG.measurement_station_type()); + grid.setText(0, 1, type); + } + + String riverside = station.getRiverSide(); + if (riverside != null) { + grid.setText(1, 0, MSG.riverside()); + grid.setText(1, 1, riverside); + } + + String gaugename = station.getGaugeName(); + if (gaugename != null) { + grid.setText(2, 0, MSG.measurement_station_gauge_name()); + grid.setText(2, 1, gaugename); + } + + DateTimeFormat df = DateTimeFormat.getFormat( + PredefinedFormat.DATE_MEDIUM); + + Date starttime = station.getStartTime(); + if (starttime != null) { + grid.setText(3, 0, MSG.measurement_station_start_time()); + grid.setText(3, 1, df.format(starttime)); + } + + String moperator = station.getOperator(); + if (moperator != null) { + grid.setText(4, 0, MSG.measurement_station_operator()); + grid.setText(4, 1, moperator); + } + + addMember(grid); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationListGrid.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationListGrid.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,105 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.WidgetCanvas; +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 org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.shared.model.MeasurementStation; +import org.dive4elements.river.client.shared.model.RiverInfo; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Björn Ricks + */ +public class MeasurementStationListGrid +extends InfoListGrid +implements RecordClickHandler { + + public MeasurementStationListGrid(FLYS flys) { + super(flys); + ListGridField nfield = new ListGridField("name", "Messtelle"); + ListGridField sfield = new ListGridField("kmstart", "Start [km]", 60); + ListGridField efield = new ListGridField("kmend", "Ende [km]", 60); + ListGridField stfield = new ListGridField("station", "Station [km]"); + ListGridField lfield = new ListGridField("link", "Link"); + lfield.setType(ListGridFieldType.LINK); + ListGridField cfield = new ListGridField("curvelink", "SQ"); + cfield.addRecordClickHandler(this); + this.setFields(nfield, sfield, efield, stfield, lfield, cfield); + } + + /** + * Resets the items of the tree. + * If the list of gauges is empty or null the tree will be empty. + */ + @Override + public void setRiverInfo(RiverInfo riverinfo) { + List stations = riverinfo.getMeasurementStations(); + GWT.log("MeasurmentStationListGrid - setRiverInfo " + stations); + + if (stations != null && !stations.isEmpty()) { + + ArrayList emptystations = + new ArrayList(); + + if (!riverinfo.isKmUp()) { + for (MeasurementStation station : stations) { + addStation(station, emptystations); + } + } + else { + for (int i = stations.size()-1; i >= 0; i--) { + MeasurementStation station = stations.get(i); + addStation(station, emptystations); + } + } + + // put empty stations to the end + for (MeasurementStation station : emptystations) { + addStation(station); + } + } + } + + private void addStation(MeasurementStation station, + List empty) { + if (station.getKmStart() != null && station.getKmEnd() != null) { + addStation(station); + } + else { + empty.add(station); + } + } + + private void addStation(MeasurementStation station) { + ListGridRecord record = new MeasurementStationRecord(station); + this.addData(record); + } + + @Override + public void open() { + } + + @Override + protected Canvas getExpandPanel(ListGridRecord record) { + MeasurementStationRecord station = (MeasurementStationRecord)record; + return new WidgetCanvas(new MeasurementStationInfoPanel(station)); + } + + @Override + public void onRecordClick(RecordClickEvent event) { + MeasurementStationRecord station = + (MeasurementStationRecord)event.getRecord(); + flys.newSQRelation(station.getRiverName(), station.getID()); + } + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationPanel.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,56 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.shared.model.RiverInfo; + +/** + * A Panel to show info about the MeasurementStations of a river + * + * @author Björn Ricks + */ +public class MeasurementStationPanel extends InfoPanel { + + /** + * MeasurementStationPanel loads the MeasurementStations from the + * RiverInfoService and displays them in a tree underneath a RiverInfoPanel + * + * @param flys The FLYS object + */ + public MeasurementStationPanel(FLYS flys) { + super(new MeasurementStationListGrid(flys)); + } + + /** + * Returns the title which should be displayed in the section + */ + @Override + public String getSectionTitle() { + return MSG.measurementStationPanelTitle(); + } + + /** + * Loads the river info and renders it afterwards + */ + @Override + public void refresh() { + GWT.log("MeasurementStationPanel - refresh"); + contract(); + + riverInfoService.getMeasurementStations(this.river, + new AsyncCallback() { + @Override + public void onFailure(Throwable e) { + GWT.log("Could not load the river info." + e); + } + + @Override + public void onSuccess(RiverInfo riverinfo) { + GWT.log("MeasurementStationPanel - Loaded river info"); + render(riverinfo); + expand(); + } + }); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationRecord.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationRecord.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,185 @@ +package org.dive4elements.river.client.client.ui.stationinfo; + +import java.util.Date; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.MeasurementStation; + +/** + * @author Björn Ricks + */ +public class MeasurementStationRecord +extends ListGridRecord +implements MeasurementStation { + + /** The message class that provides i18n strings.*/ + private FLYSConstants MSG = GWT.create(FLYSConstants.class); + + public MeasurementStationRecord(MeasurementStation station) { + this.setCanExpand(true); + + Integer number = station.getID(); + String link = number != null ? + MSG.measurement_station_url() + number : + MSG.measurement_station_url(); + this.setLink(link); + this.setLinkText(MSG.measurement_station_info_link()); + this.setCurveLink(MSG.static_sqrelation()); + this.setID(number); + this.setName(station.getName()); + if (station.isKmUp()) { + this.setKmEnd(station.getKmStart()); + this.setKmStart(station.getKmEnd()); + } + else { + this.setKmEnd(station.getKmEnd()); + this.setKmStart(station.getKmStart()); + } + this.setKmUp(station.isKmUp()); + this.setRiverName(station.getRiverName()); + this.setStation(station.getStation()); + this.setGaugeName(station.getGaugeName()); + this.setMeasurementType(station.getMeasurementType()); + this.setOperator(station.getOperator()); + this.setRiverSide(station.getRiverSide()); + this.setStartTime(station.getStartTime()); + this.setStopTime(station.getStopTime()); + } + + @Override + public Integer getID() { + return this.getAttributeAsInt("stationid"); + } + + private void setID(Integer value) { + this.setAttribute("stationid", value); + } + + @Override + public String getName() { + return this.getAttributeAsString("name"); + } + + private void setName(String value) { + this.setAttribute("name", value); + } + + @Override + public Double getKmStart() { + return this.getAttributeAsDouble("kmstart"); + } + + private void setKmStart(Double value) { + this.setAttribute("kmstart", value); + } + + @Override + public Double getKmEnd() { + return this.getAttributeAsDouble("kmend"); + } + + private void setKmEnd(Double value) { + this.setAttribute("kmend", value); + } + + @Override + public boolean isKmUp() { + return this.getAttributeAsBoolean("kmup"); + } + + private void setKmUp(boolean value) { + this.setAttribute("kmup", value); + } + + @Override + public Double getStation() { + return this.getAttributeAsDouble("station"); + } + + private void setStation(Double station) { + this.setAttribute("station", station); + } + + @Override + public String getRiverName() { + return this.getAttributeAsString("rivername"); + } + + private void setRiverName(String rivername) { + this.setAttribute("rivername", rivername); + } + + @Override + public String getRiverSide() { + return this.getAttributeAsString("riverside"); + } + + private void setRiverSide(String riverside) { + this.setAttribute("riverside", riverside); + } + + @Override + public String getMeasurementType() { + return this.getAttributeAsString("measurementtype"); + } + + private void setMeasurementType(String value) { + this.setAttribute("measurementtype", value); + } + + @Override + public String getOperator() { + return this.getAttributeAsString("operator"); + } + + private void setOperator(String value) { + this.setAttribute("operator", value); + } + + @Override + public Date getStartTime() { + return this.getAttributeAsDate("starttime"); + } + + private void setStartTime(Date value) { + this.setAttribute("starttime", value); + } + + @Override + public Date getStopTime() { + return this.getAttributeAsDate("stoptime"); + } + + private void setStopTime(Date value) { + this.setAttribute("stoptime", value); + } + + @Override + public String getGaugeName() { + return this.getAttributeAsString("gaugename"); + } + + private void setGaugeName(String value) { + this.setAttribute("gaugename", value); + } + + public String getLink() { + return this.getAttributeAsString("link"); + } + + public void setLink(String link) { + this.setAttribute("link", link); + } + + public void setCurveLink(String link) { + this.setAttribute("curvelink", link); + } + + public String getCurveLink() { + return this.getAttribute("curvelink"); + } + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/ClickableQDTable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/ClickableQDTable.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,171 @@ +package org.dive4elements.river.client.client.ui.wq; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.types.SelectionStyle; +import com.smartgwt.client.widgets.grid.CellFormatter; +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.CellClickEvent; +import com.smartgwt.client.widgets.grid.events.CellClickHandler; + +import org.dive4elements.river.client.client.FLYSConstants; + + +/** + * @author Ingo Weinzierl + */ +public class ClickableQDTable extends ListGrid { + + public static enum ClickMode { + NONE, SINGLE, RANGE + } + + public static interface QClickedListener { + + void clickedLower(double value); + + void clickedUpper(double value); + } + + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); + + private QClickedListener qClickedListener; + private ClickMode clickMode; + + protected boolean lockClick; + + public ClickableQDTable() { + this.clickMode = ClickMode.NONE; + init(); + } + + public ClickableQDTable(QClickedListener qClickedListener, + ClickMode clickMode) { + this.qClickedListener = qClickedListener; + this.clickMode = clickMode; + init(); + } + + private void init() { + setWidth100(); + setHeight100(); + setSelectionType(SelectionStyle.SINGLE); + setSelectionType(SelectionStyle.SINGLE); + setShowHeaderContextMenu(false); + setShowRecordComponents(true); + setShowRecordComponentsByCell(true); + setEmptyMessage(MESSAGE.empty_table()); + + ListGridField name = new ListGridField("name", MESSAGE.discharge()); + name.setType(ListGridFieldType.TEXT); + name.setWidth("*"); + + ListGridField type = new ListGridField("type", MESSAGE.type()); + type.setType(ListGridFieldType.TEXT); + type.setWidth("20%"); + + final NumberFormat nf = NumberFormat.getDecimalFormat(); + + ListGridField value = new ListGridField("value", MESSAGE.wq_value_q()); + value.setType(ListGridFieldType.FLOAT); + value.setCellFormatter(new CellFormatter() { + + @Override + public String format(Object v, ListGridRecord r, int row, int col) { + if (v == null) { + return null; + } + + try { + double value = Double.valueOf(v.toString()); + return nf.format(value); + } + catch (NumberFormatException nfe) { + return v.toString(); + } + } + }); + value.setWidth("20%"); + + switch (clickMode) { + case NONE: + setFields(name, type, value); + break; + case SINGLE: + initSingleClickMode(name, type, value); + break; + case RANGE: + initRangeClickMode(name, type, value); + break; + } + } + + private void initSingleClickMode(ListGridField name, ListGridField type, + ListGridField value) { + ListGridField select = new ListGridField("select", MESSAGE.selection()); + select.setType(ListGridFieldType.ICON); + select.setWidth(70); + select.setCellIcon(GWT.getHostPageBaseURL() + MESSAGE.markerGreen()); + + addCellClickHandler(new CellClickHandler() { + + @Override + public void onCellClick(CellClickEvent event) { + if (event.getColNum() == 0) { + ListGridRecord r = event.getRecord(); + fireLowerClickEvent(r.getAttributeAsDouble("value")); + } + } + }); + + setFields(select, name, type, value); + } + + private void initRangeClickMode(ListGridField name, ListGridField type, + ListGridField value) { + ListGridField addMin = new ListGridField("min", MESSAGE.to()); + addMin.setType(ListGridFieldType.ICON); + addMin.setWidth(30); + addMin.setCellIcon(GWT.getHostPageBaseURL() + MESSAGE.markerGreen()); + + ListGridField addMax = new ListGridField("max", MESSAGE.from()); + addMax.setType(ListGridFieldType.ICON); + addMax.setWidth(30); + addMax.setCellIcon(GWT.getHostPageBaseURL() + MESSAGE.markerRed()); + + addCellClickHandler(new CellClickHandler() { + + @Override + public void onCellClick(CellClickEvent event) { + if (event.getColNum() == 0) { + ListGridRecord r = event.getRecord(); + fireLowerClickEvent(r.getAttributeAsDouble("value")); + } + + if (event.getColNum() == 1) { + ListGridRecord r = event.getRecord(); + fireUpperClickEvent(r.getAttributeAsDouble("value")); + } + } + }); + + setFields(addMin, addMax, name, type, value); + } + + private void fireLowerClickEvent(double value) { + if (qClickedListener != null) { + qClickedListener.clickedLower(value); + } + } + + private void fireUpperClickEvent(double value) { + if (qClickedListener != null) { + qClickedListener.clickedUpper(value); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/ClickableWTable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/ClickableWTable.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,176 @@ +package org.dive4elements.river.client.client.ui.wq; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.types.SelectionStyle; +import com.smartgwt.client.widgets.grid.CellFormatter; +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.CellClickEvent; +import com.smartgwt.client.widgets.grid.events.CellClickHandler; + +import org.dive4elements.river.client.client.FLYSConstants; + + +public class ClickableWTable extends ListGrid { + + public static enum ClickMode { + NONE, SINGLE, RANGE + } + + private boolean useWaterlevelLabel = false; + + public static interface WClickedListener { + + void clickedLower(double value); + + void clickedUpper(double value); + } + + /** The message class that provides i18n strings. */ + protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); + + private WClickedListener wClickedListener; + private ClickMode clickMode; + + public ClickableWTable() { + this.clickMode = ClickMode.NONE; + init(); + } + + public ClickableWTable(WClickedListener lowerListener, + ClickMode selectionMode, boolean alternativeLabel) { + this.wClickedListener = lowerListener; + this.clickMode = selectionMode; + this.useWaterlevelLabel = alternativeLabel; + init(); + } + + private void init() { + setWidth100(); + setHeight100(); + setSelectionType(SelectionStyle.NONE); + setSelectionType(SelectionStyle.NONE); + setShowHeaderContextMenu(false); + setShowRecordComponents(true); + setShowRecordComponentsByCell(true); + setEmptyMessage(MESSAGE.empty_table()); + + ListGridField name = new ListGridField("name", + useWaterlevelLabel ? MESSAGE.wq_waterlevel_label() : MESSAGE.name() ); + name.setType(ListGridFieldType.TEXT); + name.setWidth("*"); + + ListGridField type = new ListGridField("type", MESSAGE.type()); + type.setType(ListGridFieldType.TEXT); + type.setWidth("50"); + + final NumberFormat nf = NumberFormat.getDecimalFormat(); + + ListGridField value = new ListGridField("value", MESSAGE.wq_value_w()); + value.setType(ListGridFieldType.FLOAT); + value.setCellFormatter(new CellFormatter() { + + @Override + public String format(Object v, ListGridRecord r, int row, int col) { + if (v == null) { + return null; + } + + try { + double value = Double.valueOf(v.toString()); + return nf.format(value); + } + catch (NumberFormatException nfe) { + return v.toString(); + } + } + }); + + switch (clickMode) { + case NONE: + setFields(name, type, value); + break; + case SINGLE: + initSingleClickMode(name, type, value); + break; + case RANGE: + initRangeClickMode(name, type, value); + break; + } + } + + private void initSingleClickMode(ListGridField name, ListGridField type, + ListGridField value) { + ListGridField lower = new ListGridField("selection", + MESSAGE.selection()); + lower.setType(ListGridFieldType.ICON); + lower.setWidth("65"); + lower.setCellIcon(GWT.getHostPageBaseURL() + MESSAGE.markerGreen()); + addCellClickHandler(new CellClickHandler() { + + @Override + public void onCellClick(CellClickEvent event) { + if (event.getColNum() == 0) { + Record r = event.getRecord(); + double val = r.getAttributeAsDouble("value"); + fireLowerClickEvent(val); + } + } + }); + + setFields(lower, name, type, value); + } + + private void initRangeClickMode(ListGridField name, ListGridField type, + ListGridField value) { + ListGridField lower = new ListGridField("lower", MESSAGE.lower()); + lower.setType(ListGridFieldType.ICON); + lower.setWidth("50"); + lower.setCellIcon(GWT.getHostPageBaseURL() + MESSAGE.markerRed()); + addCellClickHandler(new CellClickHandler() { + + @Override + public void onCellClick(CellClickEvent event) { + if (event.getColNum() == 0) { + Record r = event.getRecord(); + double val = r.getAttributeAsDouble("value"); + fireLowerClickEvent(val); + } + } + }); + + ListGridField upper = new ListGridField("upper", MESSAGE.upper()); + upper.setType(ListGridFieldType.ICON); + upper.setWidth("50"); + upper.setCellIcon(GWT.getHostPageBaseURL() + MESSAGE.markerGreen()); + addCellClickHandler(new CellClickHandler() { + + @Override + public void onCellClick(CellClickEvent event) { + if (event.getColNum() == 1) { + Record r = event.getRecord(); + double val = r.getAttributeAsDouble("value"); + fireUpperClickEvent(val); + } + } + }); + + setFields(lower, upper, name, type, value); + } + + private void fireLowerClickEvent(double value) { + if (wClickedListener != null) { + wClickedListener.clickedLower(value); + } + } + + private void fireUpperClickEvent(double value) { + if (wClickedListener != null) { + wClickedListener.clickedUpper(value); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/QDTable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/QDTable.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,126 @@ +package org.dive4elements.river.client.client.ui.wq; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.types.SelectionStyle; +import com.smartgwt.client.widgets.grid.CellFormatter; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.dive4elements.river.client.client.FLYSConstants; + + +/** + * Table showing Q and D main values, allowing for selection. + * @author Ingo Weinzierl + */ +public class QDTable extends ListGrid { + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); + + + protected boolean lockClick; + + public QDTable() { + String baseUrl = GWT.getHostPageBaseURL(); + + setWidth100(); + setHeight100(); + setSelectionType(SelectionStyle.SINGLE); + setSelectionType(SelectionStyle.SINGLE); + setShowHeaderContextMenu(false); + setShowRecordComponents(true); + setShowRecordComponentsByCell(true); + setEmptyMessage(MESSAGE.empty_table()); + + ListGridField addMax = new ListGridField("max", MESSAGE.from()); + addMax.setType(ListGridFieldType.ICON); + addMax.setWidth(30); + addMax.setCellIcon(baseUrl + MESSAGE.markerRed()); + + ListGridField addMin = new ListGridField("min", MESSAGE.to()); + addMin.setType(ListGridFieldType.ICON); + addMin.setWidth(30); + addMin.setCellIcon(baseUrl + MESSAGE.markerGreen()); + + ListGridField select = new ListGridField("select", MESSAGE.selection()); + select.setType(ListGridFieldType.ICON); + select.setWidth(70); + select.setCellIcon(baseUrl + MESSAGE.markerGreen()); + + ListGridField name = new ListGridField("name", MESSAGE.discharge()); + name.setType(ListGridFieldType.TEXT); + name.setWidth("*"); + + ListGridField type = new ListGridField("type", MESSAGE.type()); + type.setType(ListGridFieldType.TEXT); + type.setWidth("20%"); + + final NumberFormat nf = NumberFormat.getDecimalFormat(); + + ListGridField value = new ListGridField("value", MESSAGE.wq_value_q()); + value.setType(ListGridFieldType.FLOAT); + value.setCellFormatter(new CellFormatter() { + @Override + public String format(Object v, ListGridRecord r, int row, int col) { + if (v == null) { + return null; + } + + try { + double value = Double.valueOf(v.toString()); + return nf.format(value); + } + catch (NumberFormatException nfe) { + return v.toString(); + } + } + }); + value.setWidth("20%"); + + setFields(addMax, addMin, select, name, type, value); + } + + public void hideIconFields () { + hideField("max"); + hideField("min"); + hideField("select"); + lockClick = true; + } + + + public void showIconFields() { + showField("max"); + showField("min"); + hideField("select"); + lockClick = false; + } + + public void showSelect() { + showField("select"); + hideField("max"); + hideField("min"); + } + + public boolean isLocked() { + return lockClick; + } + + /** + * Search all records for one with attribute name equals to given name. + * @return null if none found. + * */ + public Double findRecordValue(String name) { + for (ListGridRecord record : getRecords()) { + if (record.getAttribute("name").equals(name)) { + return record.getAttributeAsDouble("value"); + } + } + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/WQAutoTabSet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/WQAutoTabSet.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,98 @@ +package org.dive4elements.river.client.client.ui.wq; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import org.dive4elements.river.client.client.services.WQInfoService; +import org.dive4elements.river.client.client.services.WQInfoServiceAsync; + +import org.dive4elements.river.client.shared.model.WQInfoObject; +import org.dive4elements.river.client.shared.model.WQInfoRecord; + +import org.dive4elements.river.client.client.FLYSConstants; + +import org.dive4elements.river.client.client.Config; + +/** Tabset showing non-selectable W and Q/D values for a gauge. */ +public class WQAutoTabSet extends TabSet { + + /** Service to fetch W/Q/D values. */ + WQInfoServiceAsync wqInfoService = + GWT.create(WQInfoService.class); + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); + + /** Table showing Q/D values. */ + protected QDTable qdTable; + + /** Table showing W values. */ + protected WTable wTable; + + + /** Set up two tabs showing W and Q/D values, fetch and populate tables. */ + public WQAutoTabSet(String riverName, double[] dist) { + super(); + + this.setWidth100(); + this.setHeight100(); + + Tab wTab = new Tab(MESSAGE.wq_table_w()); + Tab qTab = new Tab(MESSAGE.wq_table_q()); + + qdTable = new QDTable(); + qdTable.hideIconFields(); + wTable = new WTable(); + + wTab.setPane(wTable); + qTab.setPane(qdTable); + + this.addTab(wTab, 0); + this.addTab(qTab, 1); + + Config config = Config.getInstance(); + String locale = config.getLocale(); + wqInfoService.getWQInfo(locale, riverName, dist[0], dist[1], + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not recieve wq informations."); + SC.warn(caught.getMessage()); + } + + @Override + public void onSuccess(WQInfoObject[] wqi) { + int num = wqi != null ? wqi.length :0; + GWT.log("Recieved " + num + " wq informations."); + + if (num == 0) { + return; + } + + addWQInfo(wqi); + } + } + ); + } + + + /** Populate tables with one value. */ + private void addWQInfo (WQInfoObject[] wqi) { + for(WQInfoObject wi: wqi) { + WQInfoRecord rec = new WQInfoRecord(wi); + + if (wi.getType().equals("W")) { + wTable.addData(rec); + } + else { + qdTable.addData(rec); + } + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/WTable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/wq/WTable.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,66 @@ +package org.dive4elements.river.client.client.ui.wq; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.types.SelectionStyle; +import com.smartgwt.client.widgets.grid.CellFormatter; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.dive4elements.river.client.client.FLYSConstants; + +/** + * @author Ingo Weinzierl + */ +public class WTable extends ListGrid { + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); + + + public WTable() { + setWidth100(); + setHeight100(); + setSelectionType(SelectionStyle.NONE); + setSelectionType(SelectionStyle.NONE); + setShowHeaderContextMenu(false); + setShowRecordComponents(true); + setShowRecordComponentsByCell(true); + setEmptyMessage(MESSAGE.empty_table()); + + ListGridField name = new ListGridField("name", MESSAGE.name()); + name.setType(ListGridFieldType.TEXT); + name.setWidth("*"); + + ListGridField type = new ListGridField("type", MESSAGE.type()); + type.setType(ListGridFieldType.TEXT); + type.setWidth("50"); + + final NumberFormat nf = NumberFormat.getDecimalFormat(); + + ListGridField value = new ListGridField("value", MESSAGE.wq_value_w()); + value.setType(ListGridFieldType.FLOAT); + value.setCellFormatter(new CellFormatter() { + @Override + public String format(Object v, ListGridRecord r, int row, int col) { + if (v == null) { + return null; + } + + try { + double value = Double.valueOf(v.toString()); + return nf.format(value); + } + catch (NumberFormatException nfe) { + return v.toString(); + } + } + }); + + setFields(name, type, value); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/utils/DoubleValidator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/utils/DoubleValidator.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,81 @@ +package org.dive4elements.river.client.client.utils; + +import java.util.Map; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.widgets.form.fields.FormItem; + +import org.dive4elements.river.client.client.FLYSConstants; + +/** + * @author Raimund Renkert + */ +public class DoubleValidator implements Validator { + + /** The interface that provides i18n messages. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + + /** Statically determine doubility of String value. */ + public static boolean isDouble(Object obj) { + if (obj == null) { + return false; + } + + boolean valid = true; + String v = obj.toString(); + + NumberFormat f = NumberFormat.getDecimalFormat(); + + try { + if (v == null) { + throw new NumberFormatException("empty"); + } + + double value = f.parse(v); + } + catch (NumberFormatException nfe) { + valid = false; + } + return valid; + + } + + + /** + * @return true if items value can be converted to double, if false, + * expect error message in \param errors map. + */ + public boolean validate(FormItem item, Map errors) { + boolean valid = true; + + if(item.getValue() == null) { + return false; + } + String v = item.getValue().toString(); + + NumberFormat f = NumberFormat.getDecimalFormat(); + + try { + if (v == null) { + throw new NumberFormatException("empty"); + } + + double value = f.parse(v); + + errors.remove(item.getFieldName()); + } + catch (NumberFormatException nfe) { + errors.put(item.getFieldName(), MSG.wrongFormat()); + + item.focusInItem(); + + valid = false; + } + return valid; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/utils/EnableDisableCmd.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/utils/EnableDisableCmd.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.client.utils; + + +/** + * @author Ingo Weinzierl + */ +public interface EnableDisableCmd { + + void enable(); + + void disable(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/utils/IntegerValidator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/utils/IntegerValidator.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,45 @@ +package org.dive4elements.river.client.client.utils; + +import java.util.Map; + +import com.google.gwt.core.client.GWT; + +import com.smartgwt.client.widgets.form.fields.FormItem; + +import org.dive4elements.river.client.client.FLYSConstants; + +/** + * @author Raimund Renkert + */ +public class IntegerValidator implements Validator { + + /** The interface that provides i18n messages. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** + * + */ + public boolean validate(FormItem item, Map errors) { + boolean valid = true; + + String v = item.getValue().toString(); + + try { + if (v == null) { + throw new NumberFormatException("empty"); + } + + int value = Integer.parseInt(v); + + errors.remove(item.getFieldName()); + } + catch (NumberFormatException nfe) { + errors.put(item.getFieldName(), MSG.wrongFormat()); + + item.focusInItem(); + + valid = false; + } + return valid; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/utils/Validator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/utils/Validator.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,16 @@ +package org.dive4elements.river.client.client.utils; + +import java.util.Map; + +import com.smartgwt.client.widgets.form.fields.FormItem; + +/** + * @author Raimund Renkert + * + * This validator is used for SmartGWT FormItems. + */ +public interface Validator { + + boolean validate(FormItem item, Map errors); +} + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/widgets/DischargeTablesChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/widgets/DischargeTablesChart.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,90 @@ +package org.dive4elements.river.client.client.widgets; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Img; +import com.smartgwt.client.widgets.events.ResizedEvent; +import com.smartgwt.client.widgets.events.ResizedHandler; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.ArtifactDescription; + + +public class DischargeTablesChart extends Canvas implements ResizedHandler { + + protected Artifact artifact; + + protected Img img; + + public DischargeTablesChart() { + super(); + } + + public DischargeTablesChart(Artifact artifact) { + super(); + this.artifact = artifact; + init(); + } + + private void init() { + addChild(createImage()); + addResizedHandler(this); + setSize("100%", "100%"); + } + + protected Img createImage() { + img = new Img(getUrl()); + img.setSize("100%", "100%"); + + return img; + } + + protected String getUrl() { + String url = GWT.getModuleBaseURL(); + url += "dischargetablesoverview"; + url += "?gauge=" + getGauge(); + url += "&format=png"; + + String[] timerange = getTimerange(); + url += "&lower=" + timerange[0]; + url += "&upper=" + timerange[1]; + + int width = 600; + int height = 400; + if (img != null) { + width = img.getWidth(); + height = img.getHeight(); + } + + url += "&width=" + String.valueOf(width); + url += "&height=" + String.valueOf(height); + + // add time millis to 'deactivate' caching + url += "&timemillis" + System.currentTimeMillis(); + + GWT.log("DischargeTablesService URL = '" + url + "'"); + return url; + } + + protected String getGauge() { + ArtifactDescription desc = artifact.getArtifactDescription(); + return desc.getReferenceGauge(); + } + + protected String[] getTimerange() { + ArtifactDescription desc = artifact.getArtifactDescription(); + String yearStr = desc.getDataValueAsString("year_range"); + + if (yearStr != null && yearStr.length() > 0) { + return yearStr.split(";"); + } + + return new String[2]; + } + + @Override + public void onResized(ResizedEvent event) { + GWT.log("resized discharge tables overview chart"); + img.setSrc(getUrl()); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/widgets/KMSpinner.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/widgets/KMSpinner.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,176 @@ +package org.dive4elements.river.client.client.widgets; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; + +import com.smartgwt.client.data.Record; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.FormItemValueFormatter; +import com.smartgwt.client.widgets.form.FormItemValueParser; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.KeyPressEvent; +import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler; +import com.smartgwt.client.widgets.layout.HLayout; + +import org.dive4elements.river.client.shared.model.FacetRecord; + +import java.util.ArrayList; +import java.util.List; + +/** + * SpinnerItem-like element with text label and up/down buttons. + */ +public class KMSpinner extends HLayout { + protected List listeners = new ArrayList(); + + protected Label label; + protected FacetRecord facetRecord; + protected double value; + + public KMSpinner(double initialValue, FacetRecord facetRecord) { + super(2); + this.facetRecord = facetRecord; + this.value = initialValue; + + setWidth("99%"); + setHeight(18); + + // minusButton shall ask service for previous available cs. + Button minusButton = new Button("-"); + minusButton.setWidth(18); + minusButton.setHeight(18); + minusButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() { + public void onClick(ClickEvent evt) { + fireChangedEvent(value - 0.1d, false); + } + }); + + DynamicForm form = new DynamicForm(); + final TextItem kmField = new TextItem(); + kmField.setValue(initialValue); + kmField.setWidth("*"); + kmField.setTitle(""); + kmField.setHeight(16); + + FormItemValueFormatter doubleFormat = new FormItemValueFormatter() { + public String formatValue(Object value, Record record, DynamicForm form, FormItem item) { + if (value != null) { + NumberFormat nf = NumberFormat.getDecimalFormat(); + try { + double d = Double.valueOf(value.toString()).doubleValue(); + return nf.format(d); + } + catch (Exception e) { + GWT.log("EditorValueFormatter exception: " + e.toString()); + + // Remove junk chars from input string + return doublefyString(value.toString()); + } + } + else { + return null; + } + } + }; + kmField.setEditorValueFormatter(doubleFormat); + + FormItemValueParser doubleParser = new FormItemValueParser() { + public Object parseValue(String value, DynamicForm form, FormItem item) { + if (value == null) + return null; + try { + NumberFormat nf = NumberFormat.getDecimalFormat(); + double d = nf.parse(value.toString()); + return Double.toString(d); + } + catch(NumberFormatException nfe) { + return value; + } + } + }; + kmField.setEditorValueParser(doubleParser); + + // Update on focus lost and enter-pressed. + kmField.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent be) { + if (kmField.getValue() != null) { + try { + fireChangedEvent(Double.parseDouble(kmField.getValue().toString()), true); + } + catch(NumberFormatException nfe) { + GWT.log("entered string cannot be parsed to double."); + } + } + } + }); + kmField.addKeyPressHandler(new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent kpe) { + if (kpe.getKeyName().equals("Enter")) { + kmField.blurItem(); + } + } + }); + + // TODO: i18n Now add all the validators, formatters, editors/parsers etc. + form.setFields(kmField); + form.setTitle(""); + form.setTitlePrefix(""); + form.setTitleSuffix(""); + form.setTitleWidth(0); + form.setWidth(50); + form.setHeight(18); + + // PlusButton shall ask service for next available cs. + Button plusButton = new Button("+"); + plusButton.setWidth(18); + plusButton.setHeight(18); + plusButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() { + public void onClick(ClickEvent evt) { + fireChangedEvent(value + 0.1d, true); + } + }); + + this.addMember(minusButton); + this.addMember(form); + this.addMember(plusButton); + } + + public void addChangeListener(KMSpinnerChangeListener listener) { + this.listeners.add(listener); + } + + protected void fireChangedEvent(double val, boolean up) { + for(KMSpinnerChangeListener listener : listeners) { + listener.spinnerValueEntered(this, val, facetRecord, up); + } + } + + /** + * Remove junk chars from double string. + * This method should work for most locales, but not for + * exotic ones that do not use "." or "," as decimal + * separator. + * @return + */ + protected String doublefyString(String str) { + StringBuilder buf = new StringBuilder(str.length()); + + for (int n = 0; n < str.length(); n++) { + char c = str.charAt(n); + if ((c >= '0' && c <= '9') || c == '.' || c == ',') { + buf.append(c); + } + } + + return buf.toString(); + } +} + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/client/widgets/KMSpinnerChangeListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/widgets/KMSpinnerChangeListener.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,9 @@ +package org.dive4elements.river.client.client.widgets; + +import org.dive4elements.river.client.client.widgets.KMSpinner; + +import org.dive4elements.river.client.shared.model.FacetRecord; + +public interface KMSpinnerChangeListener { + public void spinnerValueEntered(KMSpinner spinner, double km, FacetRecord facetRecord, boolean up); +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/AddArtifactServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/AddArtifactServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,34 @@ +package org.dive4elements.river.client.server; + +import org.apache.log4j.Logger; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.client.services.AddArtifactService; + + +/** + * @author Ingo Weinzierl + */ +public class AddArtifactServiceImpl +extends DescribeCollectionServiceImpl +implements AddArtifactService +{ + private static final Logger logger = + Logger.getLogger(AddArtifactService.class); + + + public Collection add( + Collection collection, + Artifact artifact, + String locale) + throws ServerException + { + logger.info("AddArtifactServiceImpl.add"); + String url = getServletContext().getInitParameter("server-url"); + + return CollectionHelper.addArtifact(collection, artifact, url, locale); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/AdvanceServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/AdvanceServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,86 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.client.services.AdvanceService; + + +/** + * This interface provides artifact specific operation ADVANCE. + * + * @author Ingo Weinzierl + */ +public class AdvanceServiceImpl +extends RemoteServiceServlet +implements AdvanceService +{ + private static final Logger logger = Logger.getLogger(AdvanceService.class); + + public static final String XPATH_RESULT = "/art:result/text()"; + + public static final String OPERATION_FAILURE = "FAILED"; + + public static final String ERROR_ADVANCE_ARTIFACT = "error_advance_artifact"; + + + public Artifact advance( + String locale, + Artifact artifact, + String target) + throws ServerException + { + logger.info("AdvanceServiceImpl.advance"); + + String url = getServletContext().getInitParameter("server-url"); + + Document advance = ClientProtocolUtils.newAdvanceDocument( + artifact.getUuid(), + artifact.getHash(), + target); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document description = (Document) client.advance( + new org.dive4elements.artifacts.httpclient.objects.Artifact( + artifact.getUuid(), + artifact.getHash()), + advance, + new DocumentResponseHandler()); + + if (description == null) { + throw new ServerException(ERROR_ADVANCE_ARTIFACT); + } + + String result = XMLUtils.xpathString( + description, + XPATH_RESULT, + ArtifactNamespaceContext.INSTANCE); + + if (result == null || !result.equals(OPERATION_FAILURE)) { + return (Artifact) new FLYSArtifactCreator().create(description); + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_ADVANCE_ARTIFACT); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ArtifactDescriptionFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ArtifactDescriptionFactory.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,582 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.river.client.shared.model.ArtifactDescription; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.DefaultArtifactDescription; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.DefaultOutputMode; +import org.dive4elements.river.client.shared.model.DoubleArrayData; +import org.dive4elements.river.client.shared.model.DoubleRangeData; +import org.dive4elements.river.client.shared.model.IntegerArrayData; +import org.dive4elements.river.client.shared.model.IntegerRangeData; +import org.dive4elements.river.client.shared.model.IntegerOptionsData; +import org.dive4elements.river.client.shared.model.LongRangeData; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.WQDataItem; + + +/** + * This factory class helps creating an {@link ArtifactDescription} based on the + * DESCRIBE document of an artifact returned by the artifact server. Use the + * {@link createArtifactDescription(org.w3c.dom.Document)} method with the + * DESCRIBE document to create such an {@link ArtifactDescription}. + * + * @author Ingo Weinzierl + */ +public class ArtifactDescriptionFactory { + + private static final Logger logger = + Logger.getLogger(ArtifactDescriptionFactory.class); + + + public static final String XPATH_STATE_NAME = "@art:name"; + + public static final String XPATH_UIPROVIDER = "@art:uiprovider"; + + public static final String XPATH_HELP_TEXT = "@art:helpText"; + + public static final String XPATH_REACHABLE_STATE = "art:state"; + + public static final String XPATH_STATIC_STATE_NODE = "art:state"; + + public static final String XPATH_STATIC_DATA_NODE = "art:data"; + + public static final String XPATH_STATIC_ITEM_NODE = "art:item"; + + public static final String XPATH_RECOMMENDED_ARTIFACTS = + "/art:result/art:recommended-artifacts//*[@factory]"; + + /** + * This method creates the {@link ArtifactDescription} of the DESCRIBE + * document doc. + * + * @param doc A DESCRIBE document. + * + * @return the {@link ArtifactDescription}. + */ + public static ArtifactDescription createArtifactDescription(Document doc) { + logger.debug("ArtifactDescriptionFactory.createArtifactDescription"); + + Node currentState = ClientProtocolUtils.getCurrentState(doc); + Node staticNode = ClientProtocolUtils.getStaticUI(doc); + Node dynamicNode = ClientProtocolUtils.getDynamicUI(doc); + Node reachable = ClientProtocolUtils.getReachableStates(doc); + NodeList outputs = ClientProtocolUtils.getOutputModes(doc); + + String state = (String) XMLUtils.xpath( + currentState, + XPATH_STATE_NAME, + XPathConstants.STRING, + ArtifactNamespaceContext.INSTANCE); + + logger.debug("Current state name: " + state); + + DataList currentData = extractCurrentData(dynamicNode, state); + DataList[] old = extractOldData(staticNode); + String[] states = extractReachableStates(reachable); + OutputMode[] outs = extractOutputModes(outputs); + Recommendation[] rec = extractRecommendedArtifacts(doc); + + return new DefaultArtifactDescription( + old, + currentData, + state, + states, + outs, + rec); + } + + + /** + * This method extracts the data that the user is able to enter in the + * current state of the artifact. + * + * @param dynamicNode The dynamic node of the DESCRIBE document. + * @param state The name of the current state. + * + * @return A {@link Data} object that represents the data which might be + * entered by the user in the current state or null, if no data might be + * entered. + */ + protected static DataList extractCurrentData(Node dynamicNode, String state) { + logger.debug("ArtifactDescriptionFactory.extractCurrentData"); + + NodeList data = ClientProtocolUtils.getSelectNode(dynamicNode); + String help = extractHelpText(dynamicNode); + String uiProvider = extractUIProvider(dynamicNode); + + if (data == null || data.getLength() == 0) { + return null; + } + + int dataNum = data.getLength(); + DataList list = new DataList(state, dataNum, uiProvider, null, help); + + for (int i = 0; i < dataNum; i++) { + Element d = (Element) data.item(i); + String label = ClientProtocolUtils.getLabel(d); + String name = XMLUtils.xpathString( + d, "@art:name", ArtifactNamespaceContext.INSTANCE); + String type = XMLUtils.xpathString( + d, "@art:type", ArtifactNamespaceContext.INSTANCE); + + logger.debug("Create new IntegerRangeData object for: " + name); + logger.debug("New Data is from type: " + type); + + // TODO replace with DataFactory. + + if (type == null || type.length() == 0) { + NodeList choices = ClientProtocolUtils.getItemNodes(d); + DataItem[] dataItems = extractCurrentDataItems(choices); + DataItem def = extractDefaultDataItem(d); + + list.add(new DefaultData(name, label, null, dataItems, def)); + } + else if (type.equals("intrange")) { + String min = ClientProtocolUtils.getMinNode(d); + String max = ClientProtocolUtils.getMaxNode(d); + + String defMin = ClientProtocolUtils.getDefMin(d); + String defMax = ClientProtocolUtils.getDefMax(d); + + try { + int lower = Integer.parseInt(min); + int upper = Integer.parseInt(max); + + if (defMin != null && defMax != null) { + list.add(new IntegerRangeData( + name, label, + lower, upper, + Integer.parseInt(defMin), + Integer.parseInt(defMax))); + } + else { + list.add( + new IntegerRangeData(name, label, lower, upper)); + } + } + catch (NumberFormatException nfe) { + logger.warn("NumberFormatException: ", nfe); + } + } + else if (type.equals("longrange")) { + String min = ClientProtocolUtils.getMinNode(d); + String max = ClientProtocolUtils.getMaxNode(d); + + String defMin = ClientProtocolUtils.getDefMin(d); + String defMax = ClientProtocolUtils.getDefMax(d); + + try { + long lower = Long.valueOf(min); + long upper = Long.valueOf(max); + + if (defMin != null && defMax != null) { + list.add(new LongRangeData( + name, label, + lower, upper, + Long.valueOf(defMin), + Long.valueOf(defMax))); + } + } + catch (NumberFormatException nfe) { + logger.warn("NumberFormatException: ", nfe); + } + } + else if (type.equals("intarray")) { + list.add(new IntegerArrayData(name, label, null)); + } + else if (type.equals("intoptions") && uiProvider.equals("parameter-matrix")) { + list.add(DataFactory.createIntegerOptionsData(d, name, label)); + } + else if (type.equals("options")) { + list.add(DataFactory.createStringOptionsData(d, name, label)); + } + else if (type.equals("intoptions")) { + NodeList choices = ClientProtocolUtils.getItemNodes(d); + DataItem[] opts = extractCurrentDataItems(choices); + + list.add(new IntegerOptionsData(name, label, opts)); + } + else if (type.equals("doublearray")) { + list.add(new DoubleArrayData(name, label, null)); + } + else { + logger.warn("Unrecognized Dynamic data type."); + NodeList choices = ClientProtocolUtils.getItemNodes(d); + DataItem[] dataItems = extractCurrentDataItems(choices); + DataItem def = extractDefaultDataItem(d); + + String min = ClientProtocolUtils.getMinNode(d); + String max = ClientProtocolUtils.getMaxNode(d); + if (min != null && max != null) { + list.add(new DoubleRangeData( + name, label, + Double.valueOf(min), Double.valueOf(max), + Double.valueOf(min), Double.valueOf(max))); + } + + list.add(new DefaultData(name, label, null, dataItems, def)); + } + + } + + return list; + } + + + /** + * This method extracts the default value of a Data object. + * + * @param data The data object node. + * + * @return the default DataItem. + */ + protected static DataItem extractDefaultDataItem(Node data) { + logger.debug("ArtifactDescriptionFactory.extractDefaultDataItem"); + + String value = XMLUtils.xpathString( + data, "@art:defaultValue", ArtifactNamespaceContext.INSTANCE); + + String label = XMLUtils.xpathString( + data, "@art:defaultLabel", ArtifactNamespaceContext.INSTANCE); + + if (value != null && label != null) { + return new DefaultDataItem(label, null, value); + } + + return null; + } + + + /** + * This method extract the {@link DataItem}s of the DESCRIBE document. + * + * @param items The items in the DESCRIBE document. + * + * @return the {@link DataItem}s. + */ + protected static DataItem[] extractCurrentDataItems(NodeList items) { + logger.debug("ArtifactDescriptionFactory.extractCurrentDataItems"); + + if (items == null || items.getLength() == 0) { + logger.debug("No data items found."); + return null; + } + + int count = items.getLength(); + + List dataItems = new ArrayList(count); + + for (int i = 0; i < count; i++) { + Node item = items.item(i); + String label = ClientProtocolUtils.getLabel(item); + String value = ClientProtocolUtils.getValue(item); + + double[] mmQ = extractMinMaxQValues(item); + double[] mmW = extractMinMaxWValues(item); + + if (mmQ != null || mmW != null) { + dataItems.add(new WQDataItem(label, null, value, mmQ, mmW)); + } + else { + dataItems.add(new DefaultDataItem(label, null, value)); + } + } + + return dataItems.toArray(new DataItem[count]); + } + + + protected static double[] extractMinMaxQValues(Node item) { + logger.debug("ArtifactDescriptionFactory.extractMinMaxQValues"); + + if (item == null) { + logger.debug("This node is empty - no min/max Q values."); + return null; + } + + Node node = (Node) XMLUtils.xpath( + item, + "art:range[@art:type='Q']", + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + if (node == null) { + logger.debug("No min/max Q values found."); + return null; + } + + return extractMinMaxValues(node); + } + + + protected static double[] extractMinMaxWValues(Node item) { + logger.debug("ArtifactDescriptionFactory.extractMinMaxWValues"); + + if (item == null) { + logger.debug("This node is empty - no min/max W values."); + return null; + } + + Node node = (Node) XMLUtils.xpath( + item, + "art:range[@art:type='W']", + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + if (node == null) { + logger.debug("No min/max W values found."); + return null; + } + + return extractMinMaxValues(node); + } + + + protected static double[] extractMinMaxValues(Node node) { + logger.debug("ArtifactDescriptionFactory.extractMinMaxValues"); + + String minStr = XMLUtils.xpathString( + node, "art:min/text()", ArtifactNamespaceContext.INSTANCE); + + String maxStr = XMLUtils.xpathString( + node, "art:max/text()", ArtifactNamespaceContext.INSTANCE); + + if (maxStr == null || minStr == null) { + logger.debug("No min/max values found."); + return null; + } + + try { + double min = Double.valueOf(minStr); + double max = Double.valueOf(maxStr); + + return new double[] { min, max }; + } + catch (NumberFormatException nfe) { + logger.debug("Error while parsing min/max values."); + } + + return null; + } + + + /** + * This method extracts the data objects from the data node of the static ui + * part of the DESCRIBE document. + * + * @param staticNode The static ui node of the DESCRIBE. + * + * @return the DataList objects. + */ + protected static DataList[] extractOldData(Node staticNode) { + logger.debug("ArtifactDescriptionFactory.extractOldData()"); + + NodeList stateNodes = (NodeList) XMLUtils.xpath( + staticNode, + XPATH_STATIC_STATE_NODE, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (stateNodes == null || stateNodes.getLength() == 0) { + logger.debug("No old items found."); + return null; + } + + int count = stateNodes.getLength(); + DataList[] data = new DataList[count]; + + for (int i = 0; i < count; i++) { + Node tmp = stateNodes.item(i); + + String name = XMLUtils.xpathString( + tmp, "@art:name", ArtifactNamespaceContext.INSTANCE); + String uiprovider = XMLUtils.xpathString( + tmp, "@art:uiprovider", ArtifactNamespaceContext.INSTANCE); + String label = XMLUtils.xpathString( + tmp, "@art:label", ArtifactNamespaceContext.INSTANCE); + String help = XMLUtils.xpathString( + tmp, "@art:helpText", ArtifactNamespaceContext.INSTANCE); + + NodeList dataNodes = (NodeList) XMLUtils.xpath( + tmp, + XPATH_STATIC_DATA_NODE, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (dataNodes == null || dataNodes.getLength() == 0) { + continue; + } + + int size = dataNodes.getLength(); + DataList list = new DataList(name, size, uiprovider, label, help); + + for (int j = 0; j < size; j++) { + Node dataNode = dataNodes.item(j); + + list.add(DataFactory.createDataFromElement((Element) dataNode)); + + data[i] = list; + } + } + + return data; + } + + + /** + * This method extracts the UIProvider specified by the data node. + * + * @param data The data node. + * + * @return the UIProvider that is specified in the data node. + */ + protected static String extractUIProvider(Node ui) { + return (String) XMLUtils.xpath( + ui, + XPATH_UIPROVIDER, + XPathConstants.STRING, + ArtifactNamespaceContext.INSTANCE); + } + + + /** + * This method extracts the help text specified by the data node. + * + * @param ui The data node. + * + * @return the help text. + */ + protected static String extractHelpText(Node ui) { + return (String) XMLUtils.xpath( + ui, + XPATH_HELP_TEXT, + XPathConstants.STRING, + ArtifactNamespaceContext.INSTANCE); + } + + + /** + * This method extracts the reachable states of the current artifact. + * + * @param reachable The reachable states node. + * + * @return an array with identifiers of reachable states. + */ + protected static String[] extractReachableStates(Node reachable) { + logger.debug("ArtifactDescriptionFactory.extractReachableStates()"); + + NodeList list = (NodeList) XMLUtils.xpath( + reachable, + XPATH_REACHABLE_STATE, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (list == null || list.getLength() == 0) { + return null; + } + + int count = list.getLength(); + + String[] states = new String[count]; + + for (int i = 0; i < count; i++) { + Node state = list.item(i); + + String name = XMLUtils.xpathString( + state, "@art:name", ArtifactNamespaceContext.INSTANCE); + + states[i] = name; + } + + return states; + } + + + /** + * This method extract available output modes of the the current artifact. + * + * @param outputs A list of nodes that contain information about output + * modes. + * + * @return an array of Output modes. + */ + protected static OutputMode[] extractOutputModes(NodeList outputs) { + logger.debug("ArtifactDescriptionFactory.extractOutputModes"); + + if (outputs == null || outputs.getLength() == 0) { + return null; + } + + int size = outputs.getLength(); + + List outs = new ArrayList(size); + + for (int i = 0; i < size; i++) { + Node out = outputs.item(i); + + String name = XMLUtils.xpathString( + out, "@art:name", ArtifactNamespaceContext.INSTANCE); + String desc = XMLUtils.xpathString( + out, "@art:description", ArtifactNamespaceContext.INSTANCE); + String mimeType = XMLUtils.xpathString( + out, "@art:mime-type", ArtifactNamespaceContext.INSTANCE); + + if (name != null) { + outs.add(new DefaultOutputMode(name, desc, mimeType)); + } + else { + logger.debug("Found an invalid output mode."); + } + } + + return (OutputMode[]) outs.toArray(new OutputMode[size]); + } + + + protected static Recommendation[] extractRecommendedArtifacts(Document doc){ + logger.debug("ArtifactDescriptionFactory.extractRecommendedArtifacts."); + + NodeList list = (NodeList) XMLUtils.xpath( + doc, + XPATH_RECOMMENDED_ARTIFACTS, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = list != null ? list.getLength() : 0; + + Recommendation[] rec = new Recommendation[num]; + + for (int i = 0; i < num; i++) { + Element e = (Element) list.item(i); + String factory = e.getAttribute("factory"); + String index = e.getAttribute("ids"); + + if (factory != null && factory.length() > 0) { + rec[i] = new Recommendation(factory, index); + } + } + + return rec; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ArtifactHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ArtifactHelper.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,196 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.CreationFilter; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.utils.ArtifactNamespaceContext; +import org.dive4elements.artifacts.httpclient.utils.XMLUtils; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; + +import org.dive4elements.river.client.shared.model.Recommendation; + +/** + * @author Ingo Weinzierl + */ +public class ArtifactHelper { + + private static final Logger logger = Logger.getLogger(ArtifactHelper.class); + + + /** The error message key that is thrown if an error occured while artifact + * creation.*/ + public static final String ERROR_CREATE_ARTIFACT = "error_create_artifact"; + + /** + * Name of the factory to generate a GaugeDischargeCurveArtifact + */ + private static final String GAUGE_DISCHARGE_CURVE_ARTIFACT = "gaugedischargecurve"; + private static final String SQ_RELATION_ARTIFACT = "staticsqrelation"; + + private ArtifactHelper() { + } + + + /** + * @param factory ArtifactFactory to use. + */ + public static Artifact createArtifact( + String serverUrl, + String locale, + String factory, + Recommendation recommendation) + throws ServerException + { + logger.debug("ArtifactHelper.create"); + + String uuid; + String ids; + CreationFilter filter; + + if (recommendation != null) { + uuid = recommendation.getMasterArtifact(); + ids = recommendation.getIDs(); + filter = convertFilter(recommendation.getFilter()); + } + else { + uuid = null; + ids = null; + filter = null; + } + + Document create = ClientProtocolUtils.newCreateDocument( + factory, uuid, ids, filter); + + return sendCreate(serverUrl, locale, create); + + } + + /** + * Creates a new GaugeDischargeCurverArtifact + * + * @param river the name of the river + * @param reference the reference id of the gauge (official number) + */ + public static Artifact createGaugeDischargeCurveArtifact( + String serverUrl, + String locale, + String river, + Long reference) + throws ServerException + { + Document create = ClientProtocolUtils.newCreateDocument( + GAUGE_DISCHARGE_CURVE_ARTIFACT); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + create, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element root = create.getDocumentElement(); + + Element eriver = ec.create("river"); + ec.addAttr(eriver, "name", river); + + Element egauge = ec.create("gauge"); + ec.addAttr(egauge, "reference", reference.toString()); + + root.appendChild(eriver); + root.appendChild(egauge); + + return sendCreate(serverUrl, locale, create); + } + + /** + * Sends a create document to the artifact server + */ + private static Artifact sendCreate( + String serverUrl, + String locale, + Document doc) + throws ServerException + { + HttpClient client = new HttpClientImpl(serverUrl, locale); + + try { + return (Artifact) client.create(doc, new FLYSArtifactCreator()); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_CREATE_ARTIFACT); + } + + + /** + * Create CreationFilter from Recommendation.Filter. + */ + public static CreationFilter convertFilter(Recommendation.Filter filter) { + + if (filter == null) { + return null; + } + + CreationFilter cf = new CreationFilter(); + + Map> outs = filter.getOuts(); + + for (Map.Entry> entry: + outs.entrySet()) { + List rfs = entry.getValue(); + List cfs = + new ArrayList(rfs.size()); + for (Recommendation.Facet rf: rfs) { + cfs.add(new CreationFilter.Facet(rf.getName(), rf.getIndex())); + } + cf.add(entry.getKey(), cfs); + } + + return cf; + } + + + public static Artifact createSQRelationArtifact( + String serverUrl, + String locale, + String river, + int measurementStation) + throws ServerException + { + Document create = ClientProtocolUtils.newCreateDocument( + SQ_RELATION_ARTIFACT); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + create, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element root = create.getDocumentElement(); + + Element eriver = ec.create("river"); + ec.addAttr(eriver, "name", river); + + Element estation = ec.create("measurement_station"); + ec.addAttr(estation, "number", String.valueOf(measurementStation)); + + root.appendChild(eriver); + root.appendChild(estation); + + return sendCreate(serverUrl, locale, create); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ArtifactServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ArtifactServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,105 @@ +package org.dive4elements.river.client.server; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.client.services.ArtifactService; + +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.Recommendation; + +/** + * This interface provides artifact specific services as CREATE, DESCRIBE, FEED, + * ADVANCE and OUT. + * + * @author Ingo Weinzierl + */ +public class ArtifactServiceImpl +extends RemoteServiceServlet +implements ArtifactService +{ + /** Private logger. */ + private static final Logger logger = + Logger.getLogger(ArtifactServiceImpl.class); + + + /** + * Creates new Artifacts based on a given Recommendation and factory. + * Note, that all the work is done in ArtifactHelper! + * + * @param locale The locale used for HTTP request. + * @param factory The factory that is used to create the new Artifact. + * @param recom Recommendation with details of the artifact to create. + * + * @return a new Artifact. + */ + public Artifact create( + String locale, + String factory, + Recommendation recom + ) + throws ServerException + { + logger.info("ArtifactServiceImpl.create"); + + String url = getServletContext().getInitParameter("server-url"); + + return ArtifactHelper.createArtifact(url, locale, factory, recom); + } + + /** + * Create a new GaugeDischageCurveArtifact + * + * @param river the river + * @param gaugeref reference id of the gauge + */ + public Artifact createGaugeDischargeCurveArtifact( + Collection collection, + String locale, + String river, + Long gaugeref) + throws ServerException + { + logger.info("ArtifactServiceImpl.createGaugeDischargeCurverArtifact"); + String url = getServletContext().getInitParameter("server-url"); + + Artifact artifact = ArtifactHelper.createGaugeDischargeCurveArtifact(url, + locale, river, gaugeref); + if (artifact == null) { + return null; + } + logger.info("GaugeDischargeCurveArtifact created successfully"); + + CollectionHelper.addArtifact(collection, artifact, url, locale); + + return artifact; + } + + @Override + public Artifact createSQRelationArtifact( + Collection collection, + String locale, + String river, + int measurementStation) + throws ServerException + { + logger.info("ArtifactServiceImpl.createSQRelationArtifact"); + String url = getServletContext().getInitParameter("server-url"); + + Artifact artifact = ArtifactHelper.createSQRelationArtifact(url, + locale, river, measurementStation); + if (artifact == null) { + return null; + } + logger.info("SQRelationArtifact created successfully"); + + CollectionHelper.addArtifact(collection, artifact, url, locale); + + return artifact; + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/BaseServletContextListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/BaseServletContextListener.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,62 @@ +package org.dive4elements.river.client.server; + +import java.io.IOException; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.apache.log4j.Logger; + +import org.dive4elements.river.client.server.LoggingConfigurator; +import org.dive4elements.river.client.server.features.Features; +import org.dive4elements.river.client.server.features.XMLFileFeatures; + +/** + * ServletContextListenter to initalize the Features globally for + * all Servlets + */ +public class BaseServletContextListener implements ServletContextListener { + + public static final String LOG4J_PROPERTIES = "FLYS_CLIENT_LOG4J_PROPERIES"; + + public static final Logger logger = Logger.getLogger(BaseServletContextListener.class); + + @Override + public void contextInitialized(ServletContextEvent sce) { + ServletContext sc = sce.getServletContext(); + + this.initLogging(sc); + + String filename = sc.getInitParameter("features-file"); + + logger.debug("Initializing ServletContext"); + try { + XMLFileFeatures features = new XMLFileFeatures(sc.getRealPath(filename)); + sc.setAttribute(Features.CONTEXT_ATTRIBUTE, features); + } catch(IOException e) { + logger.error(e); + } + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + //DO NOTHING + } + + + private void initLogging(ServletContext sc) { + String log4jProperties = System.getenv(LOG4J_PROPERTIES); + + if (log4jProperties == null || log4jProperties.length() == 0) { + String file = sc.getInitParameter("log4j-properties"); + + if (file != null && file.length() > 0) { + log4jProperties = sc.getRealPath(file); + } + } + System.out.println(log4jProperties); + + LoggingConfigurator.init(log4jProperties); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/BedKMChartServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/BedKMChartServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,106 @@ +package org.dive4elements.river.client.server; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.StreamResponseHandler; + +public class BedKMChartServiceImpl extends HttpServlet { + private static final Logger log = + Logger.getLogger(FixingsKMChartServiceImpl.class); + + public static final String SERVICE_NAME = "bed-km-chart"; + + public BedKMChartServiceImpl() { + } + + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + + log.info("BedKMChartServiceImpl.doGet"); + + String url = getServletContext().getInitParameter("server-url"); + String locale = req.getParameter("locale"); + String filter = req.getParameter("filter"); + + if (filter == null || filter.length() == 0) { + log.warn("Missing 'filter' parameter."); + return; + } + + if (locale == null || locale.length() == 0) { + locale = "de"; + } + + Document filterDoc = XMLUtils.jsonToXML(filter); + + if (filterDoc == null) { + log.warn("Creating filter document failed."); + return; + } + + InputStream in; + + try { + HttpClient client = new HttpClientImpl(url, locale); + in = (InputStream)client.callService( + url, // XXX: Why? The URL is passed by construction already. + SERVICE_NAME, + filterDoc, + new StreamResponseHandler()); + } + catch (ConnectionException ce) { + log.error(ce); + return; + } + + resp.setHeader("Content-Type", guessMIMEType(filterDoc)); + + try { + OutputStream out = resp.getOutputStream(); + + byte [] buf = new byte[4096]; + int i = -1; + while ((i = in.read(buf)) >= 0) { + out.write(buf, 0, i); + } + out.flush(); + } + catch (IOException ioe) { + log.error(ioe); + } + finally { + try { in.close(); } + catch (IOException ioe) { /* ignored */ } + } + } + + protected static String guessMIMEType(Document document) { + + NodeList formats = document.getElementsByTagName("format"); + + String format = "png"; + + if (formats.getLength() > 0) { + String type = ((Element)formats.item(0)).getAttribute("type"); + if (type.length() > 0) { + format = type; + } + } + + return "image/" + format; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/BedloadKMChartServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/BedloadKMChartServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,106 @@ +package org.dive4elements.river.client.server; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.StreamResponseHandler; + +public class BedloadKMChartServiceImpl extends HttpServlet { + private static final Logger log = + Logger.getLogger(FixingsKMChartServiceImpl.class); + + public static final String SERVICE_NAME = "bedload-km-chart"; + + public BedloadKMChartServiceImpl() { + } + + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + + log.info("BedloadKMChartServiceImpl.doGet"); + + String url = getServletContext().getInitParameter("server-url"); + String locale = req.getParameter("locale"); + String filter = req.getParameter("filter"); + + if (filter == null || filter.length() == 0) { + log.warn("Missing 'filter' parameter."); + return; + } + + if (locale == null || locale.length() == 0) { + locale = "de"; + } + + Document filterDoc = XMLUtils.jsonToXML(filter); + + if (filterDoc == null) { + log.warn("Creating filter document failed."); + return; + } + + InputStream in; + + try { + HttpClient client = new HttpClientImpl(url, locale); + in = (InputStream)client.callService( + url, // XXX: Why? The URL is passed by construction already. + SERVICE_NAME, + filterDoc, + new StreamResponseHandler()); + } + catch (ConnectionException ce) { + log.error(ce); + return; + } + + resp.setHeader("Content-Type", guessMIMEType(filterDoc)); + + try { + OutputStream out = resp.getOutputStream(); + + byte [] buf = new byte[4096]; + int i = -1; + while ((i = in.read(buf)) >= 0) { + out.write(buf, 0, i); + } + out.flush(); + } + catch (IOException ioe) { + log.error(ioe); + } + finally { + try { in.close(); } + catch (IOException ioe) { /* ignored */ } + } + } + + protected static String guessMIMEType(Document document) { + + NodeList formats = document.getElementsByTagName("format"); + + String format = "png"; + + if (formats.getLength() > 0) { + String type = ((Element)formats.item(0)).getAttribute("type"); + if (type.length() > 0) { + format = type; + } + } + + return "image/" + format; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/CSVExportServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/CSVExportServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,96 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.List; + +import java.io.Reader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.IOException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import au.com.bytecode.opencsv.CSVReader; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.client.services.CSVExportService; + + +/** + * @author Raimund Renkert + */ +public class CSVExportServiceImpl +extends RemoteServiceServlet +implements CSVExportService +{ + private static final Logger logger = + Logger.getLogger(CSVExportServiceImpl.class); + + + public static final String ERROR_NO_EXPORT_FOUND = + "error_no_export_found"; + + public List getCSV( + String locale, + String uuid, + String name) + throws ServerException + { + logger.info("CSVExportServiceImpl.getCSV"); + + String url = getServletContext().getInitParameter("server-url"); + + Document requestDoc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + requestDoc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element action = ec.create("action"); + ec.addAttr(action, "type", "csv", true); + ec.addAttr(action, "name", name, true); + + requestDoc.appendChild(action); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + InputStream in = client.collectionOut(requestDoc, uuid, "export"); + Reader reader = new InputStreamReader (in, "UTF-8"); + CSVReader csvReader = new CSVReader (reader); + + List lines = new ArrayList(); + String[] line = null; + + while ((line = csvReader.readNext()) != null) { + if (line != null) { + if (!line[0].startsWith("#") && line.length > 0) { + if (line[0].replace("'", "").length() > 0) { + lines.add(line); + } + } + } + } + + return lines; + } + catch (IOException ce) { + logger.error(ce.getLocalizedMessage()); + } + + throw new ServerException(ERROR_NO_EXPORT_FOUND); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/CapabilitiesParser.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/CapabilitiesParser.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,401 @@ +package org.dive4elements.river.client.server; + +import java.io.InputStream; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Capabilities; +import org.dive4elements.river.client.shared.model.ContactInformation; +import org.dive4elements.river.client.shared.model.WMSLayer; + + +public class CapabilitiesParser { + + private static final Logger logger = + Logger.getLogger(CapabilitiesParser.class); + + + public static final String ERR_GC_REQUEST_FAILED = + "error_gc_req_failed"; + + public static final String ERR_GC_DOC_NOT_VALID = + "error_gc_doc_not_valid"; + + public static final String ERR_MALFORMED_URL = + "error_malformed_url"; + + + public static final String XPATH_WMS_CAPS = + "/WMS_Capabilities"; + + public static final String XPATH_WMT_CAPS = + "/WMT_MS_Capabilities"; + + public static final String XPATH_TITLE = + "Service/Title/text()"; + + public static final String XPATH_ONLINE_RESOURCE = + "Service/OnlineResource/@href"; + + public static final String XPATH_CONTACT_INFORMATION = + "Service/ContactInformation"; + + public static final String XPATH_CI_PERSON = + "ContactPersonPrimary/ContactPerson/text()"; + + public static final String XPATH_CI_ORGANIZATION = + "ContactPersonPrimary/ContactOrganization/text()"; + + public static final String XPATH_CI_ADDRESS = + "ContactAddress/Address/text()"; + + public static final String XPATH_CI_CITY = + "ContactAddress/City/text()"; + + public static final String XPATH_CI_POSTCODE = + "ContactAddress/PostCode/text()"; + + public static final String XPATH_CI_PHONE = + "ContactVoiceTelephone/text()"; + + public static final String XPATH_CI_EMAIL = + "ContactElectronicMailAddress/text()"; + + public static final String XPATH_FEES = + "Service/Fees/text()"; + + public static final String XPATH_ACCESS_CONSTRAINTS = + "Service/AccessConstraints/text()"; + + public static final String XPATH_LAYERS = + "Capability/Layer"; + + public static final Pattern SRS_PATTERN = Pattern.compile("(EPSG:\\d+)*"); + + + private CapabilitiesParser() { + } + + + public static void main(String[] args) { + logger.info("Do static Capabilities request/parsing."); + + String log4jProperties = System.getenv(BaseServletContextListener.LOG4J_PROPERTIES); + LoggingConfigurator.init(log4jProperties); + + try { + Capabilities caps = getCapabilities(System.getProperty("test.wms")); + + logger.debug(caps.toString()); + } + catch (ServerException se) { + se.printStackTrace(); + } + + logger.info("Finished fetching capabiltiies."); + } + + + public static Capabilities getCapabilities(String urlStr) + throws ServerException + { + try { + URL url = new URL(urlStr); + + logger.debug("Open connection to url: " + urlStr); + + URLConnection conn = url.openConnection(); + conn.connect(); + + InputStream is = conn.getInputStream(); + + return parse(is); + } + catch (MalformedURLException mue) { + logger.warn(mue, mue); + throw new ServerException(ERR_MALFORMED_URL); + } + catch (IOException ioe) { + logger.warn(ioe, ioe); + } + + throw new ServerException(ERR_GC_REQUEST_FAILED); + } + + + protected static Capabilities parse(InputStream is) + throws ServerException + { + logger.debug("GCServiceImpl.parseCapabilitiesResponse"); + + Document doc = XMLUtils.parseDocument(is, false); + + if (doc == null) { + throw new ServerException(ERR_GC_DOC_NOT_VALID); + } + + return CapabilitiesParser.parse(doc); + } + + + public static Capabilities parse(Document doc) + throws ServerException + { + Node capabilities = getCapabilitiesNode(doc); + + String title = (String) XMLUtils.xpath( + capabilities, + XPATH_TITLE, + XPathConstants.STRING); + + String onlineResource = (String) XMLUtils.xpath( + capabilities, + XPATH_ONLINE_RESOURCE, + XPathConstants.STRING); + + String fees = (String) XMLUtils.xpath( + capabilities, + XPATH_FEES, + XPathConstants.STRING); + + String accessConstraints = (String) XMLUtils.xpath( + capabilities, + XPATH_ACCESS_CONSTRAINTS, + XPathConstants.STRING); + + Node contactInformation = (Node) XMLUtils.xpath( + capabilities, + XPATH_CONTACT_INFORMATION, + XPathConstants.NODE); + + ContactInformation ci = parseContactInformation(contactInformation); + + logger.debug("Found fees: " + fees); + logger.debug("Found access constraints: " + accessConstraints); + + NodeList layerNodes = (NodeList) XMLUtils.xpath( + capabilities, + XPATH_LAYERS, + XPathConstants.NODESET); + + List layers = parseLayers(layerNodes, onlineResource); + + return new Capabilities( + title, + onlineResource, + ci, + fees, + accessConstraints, + layers); + } + + + protected static Node getCapabilitiesNode(Document doc) + throws ServerException { + Node capabilities = (Node) XMLUtils.xpath( + doc, + XPATH_WMS_CAPS, + XPathConstants.NODE); + + if (capabilities == null) { + logger.info("No '/WMS_Capabilities' node found."); + logger.info("Try to find a '/WMT_MS_Capabilities' node."); + + capabilities = (Node) XMLUtils.xpath( + doc, + XPATH_WMT_CAPS, + XPathConstants.NODE); + } + + if (capabilities == null) { + throw new ServerException(ERR_GC_DOC_NOT_VALID); + } + + return capabilities; + } + + + protected static ContactInformation parseContactInformation(Node node) { + String person = (String) XMLUtils.xpath( + node, + XPATH_CI_PERSON, + XPathConstants.STRING); + + String organization = (String) XMLUtils.xpath( + node, + XPATH_CI_ORGANIZATION, + XPathConstants.STRING); + + String address = (String) XMLUtils.xpath( + node, + XPATH_CI_ADDRESS, + XPathConstants.STRING); + + String postcode = (String) XMLUtils.xpath( + node, + XPATH_CI_POSTCODE, + XPathConstants.STRING); + + String city = (String) XMLUtils.xpath( + node, + XPATH_CI_CITY, + XPathConstants.STRING); + + String phone = (String) XMLUtils.xpath( + node, + XPATH_CI_PHONE, + XPathConstants.STRING); + + String email = (String) XMLUtils.xpath( + node, + XPATH_CI_EMAIL, + XPathConstants.STRING); + + ContactInformation ci = new ContactInformation(); + ci.setPerson(person); + ci.setOrganization(organization); + ci.setAddress(address); + ci.setPostcode(postcode); + ci.setCity(city); + ci.setPhone(phone); + ci.setEmail(email); + + return ci; + } + + + /** + * @param layersNode + * @param onlineResource + * + * @return + */ + protected static List parseLayers( + NodeList layersNode, + String onlineResource + ) { + int len = layersNode != null ? layersNode.getLength() : 0; + + logger.debug("Node has " + len + " layers."); + + List layers = new ArrayList(len); + + for (int i = 0; i < len; i++) { + layers.add(parseLayer(layersNode.item(i), onlineResource)); + } + + return layers; + } + + + protected static WMSLayer parseLayer(Node layerNode, String onlineResource) { + String title = (String) XMLUtils.xpath( + layerNode, + "Title/text()", + XPathConstants.STRING); + + String name = (String) XMLUtils.xpath( + layerNode, + "Name/text()", + XPathConstants.STRING); + + logger.debug("Found layer: " + title + "(" + name + ")"); + + List srs = parseSRS(layerNode); + + NodeList layersNodes = (NodeList) XMLUtils.xpath( + layerNode, + "Layer", + XPathConstants.NODESET); + + List layers = parseLayers(layersNodes, onlineResource); + + return new WMSLayer(onlineResource, title, name, srs, layers); + } + + + protected static List parseSRS(Node layerNode) { + NodeList srsNodes = ((Element) layerNode).getElementsByTagName("SRS"); + + if (srsNodes.getLength() == 0) { + srsNodes = ((Element) layerNode).getElementsByTagName("CRS"); + + if (srsNodes.getLength() == 0) { + logger.debug("No explicit SRS for this layer specified."); + return null; + } + } + + List allSRS = new ArrayList(); + + for (int i = 0, n = srsNodes.getLength(); i < n; i++) { + List srs = parseSRSItem(srsNodes.item(i).getTextContent()); + + if (srs != null && srs.size() > 0) { + allSRS.addAll(srs); + } + } + + return allSRS; + } + + + protected static List parseSRSItem(String srsStr) { + if (srsStr == null || srsStr.length() == 0) { + return null; + } + + List allSRS = new ArrayList(); + + if (srsStr.indexOf(" ") <= 0) { + String srs = getSRSFromString(srsStr); + if (srs != null && srs.length() > 0) { + allSRS.add(srs); + } + + return allSRS; + } + + String[] splittedSrs = srsStr.split(" "); + + for (String singleSrs: splittedSrs) { + String srs = getSRSFromString(singleSrs); + if (srs != null && srs.length() > 0) { + allSRS.add(srs); + } + } + + return allSRS; + } + + + protected static String getSRSFromString(String singleSrs) { + Matcher m = SRS_PATTERN.matcher(singleSrs); + + if (m.matches()) { + logger.debug("Found SRS '" + m.group(1) + "'"); + return m.group(1); + } + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ChartInfoServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ChartInfoServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,283 @@ +package org.dive4elements.river.client.server; + +import java.io.InputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.shared.Transform2D; +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Axis; +import org.dive4elements.river.client.shared.model.DateAxis; +import org.dive4elements.river.client.shared.model.NumberAxis; +import org.dive4elements.river.client.shared.model.ChartInfo; +import org.dive4elements.river.client.shared.model.Collection; + +import org.dive4elements.river.client.client.services.ChartInfoService; + + +/** + * This service fetches a document that contains meta information for a specific + * chart. + * + * @author Ingo Weinzierl + */ +public class ChartInfoServiceImpl +extends RemoteServiceServlet +implements ChartInfoService +{ + private static final Logger logger = + Logger.getLogger(ChartInfoServiceImpl.class); + + public static final String XPATH_TRANSFORM_MATRIX = + "/art:chartinfo/art:transformation-matrix/art:matrix"; + + public static final String XPATH_X_AXES = + "/art:chartinfo/art:axes/art:domain"; + + public static final String XPATH_Y_AXES = + "/art:chartinfo/art:axes/art:range"; + + public static final String EXCEPTION_STRING = "error_chart_info_service"; + + + public ChartInfo getChartInfo( + Collection collection, + String locale, + String type, + Map attr) + throws ServerException + { + logger.info("ChartInfoServiceImpl.getChartInfo"); + + String url = getServletContext().getInitParameter("server-url"); + + Document request = ClientProtocolUtils.newOutCollectionDocument( + collection.identifier(), + type, + type, + ChartServiceHelper.getChartAttributes(attr)); + + try { + HttpClient client = new HttpClientImpl(url, locale); + InputStream in = client.collectionOut( + request, + collection.identifier(), + type + "_chartinfo"); + + Document info = XMLUtils.parseDocument(in); + + return parseInfoDocument(info); + } + catch (IOException ioe) { + ioe.printStackTrace(); + } + catch (Exception e) { + e.printStackTrace(); + } + + logger.debug("Error while fetching chart info."); + + throw new ServerException(EXCEPTION_STRING); + } + + + /** + * Parse ChartInfo-Part of document, create Transforms and axes + * from it. + */ + protected ChartInfo parseInfoDocument(Document doc) { + Transform2D[] transformer = parseTransformationMatrix(doc); + Axis[] xAxes = parseXAxes(doc); + Axis[] yAxes = parseYAxes(doc); + + return new ChartInfo(xAxes, yAxes, transformer); + } + + + protected Axis[] parseXAxes(Document doc) { + logger.debug("ChartInfoServiceImpl.parseXAxes"); + + NodeList axes = (NodeList) XMLUtils.xpath( + doc, + XPATH_X_AXES, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + return parseAxes(axes); + } + + + protected Axis[] parseYAxes(Document doc) { + logger.debug("ChartInfoServiceImpl.parseYAxes"); + + NodeList axes = (NodeList) XMLUtils.xpath( + doc, + XPATH_Y_AXES, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + return parseAxes(axes); + } + + + protected Axis[] parseAxes(NodeList axes) { + logger.debug("ChartInfoServiceImpl.parseAxes"); + + int count = axes != null ? axes.getLength() : 0; + + logger.debug("Chart has " + count + " axes."); + + if (count == 0) { + return null; + } + + Axis[] result = new Axis[count]; + + String ns = ArtifactNamespaceContext.NAMESPACE_URI; + + for (int i = 0; i < count; i++) { + Element node = (Element) axes.item(i); + + String posStr = node.getAttributeNS(ns, "pos"); + String fromStr = node.getAttributeNS(ns, "from"); + String toStr = node.getAttributeNS(ns, "to"); + String minStr = node.getAttributeNS(ns, "min"); + String maxStr = node.getAttributeNS(ns, "max"); + String axisType = node.getAttributeNS(ns, "axistype"); + + try { + int pos = Integer.parseInt(posStr); + + if (pos >= result.length) { + // this should never happen + logger.debug("The axis is out of valid range: " + pos); + continue; + } + + if (axisType != null && axisType.equals(DateAxis.TYPE)) { + long from = Long.parseLong(fromStr); + long to = Long.parseLong(toStr); + long min = Long.parseLong(minStr); + long max = Long.parseLong(maxStr); + + if (logger.isDebugEnabled()) { + logger.debug("date axis from: " + new Date(from)); + logger.debug("date axis to : " + new Date(to)); + logger.debug("date axis min : " + new Date(min)); + logger.debug("date axis max : " + new Date(max)); + } + + result[pos] = new DateAxis(pos, from, to, min, max); + } + else { + double from = Double.parseDouble(fromStr); + double to = Double.parseDouble(toStr); + double min = Double.parseDouble(minStr); + double max = Double.parseDouble(maxStr); + + result[pos] = new NumberAxis(pos, from, to, min, max); + } + } + catch (NumberFormatException nfe) { + nfe.printStackTrace(); + } + } + + logger.debug("Parsed " + result.length + " axes"); + + return result; + } + + + /** + * Parses the chart info document and extract the Transform2D values. + * + * @param doc The chart info document. + * + * @return a Transform2D object to transfrom pixel coordinates into chart + * coordinates. + */ + protected Transform2D[] parseTransformationMatrix(Document doc) { + logger.debug("ChartInfoServiceImpl.parseTransformationMatrix"); + + NodeList matrix = (NodeList) XMLUtils.xpath( + doc, + XPATH_TRANSFORM_MATRIX, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = matrix != null ? matrix.getLength() : 0; + + List transformer = new ArrayList(num); + + for (int i = 0; i < num; i++) { + Transform2D t = createTransformer((Element) matrix.item(i)); + + if (t == null) { + logger.warn("Broken transformation matrix at pos: " + i); + continue; + } + + transformer.add(t); + } + + return transformer.toArray(new Transform2D[num]); + } + + + protected Transform2D createTransformer(Element matrix) { + String ns = ArtifactNamespaceContext.NAMESPACE_URI; + + String sx = matrix.getAttributeNS(ns, "sx"); + String sy = matrix.getAttributeNS(ns, "sy"); + String tx = matrix.getAttributeNS(ns, "tx"); + String ty = matrix.getAttributeNS(ns, "ty"); + String xType = matrix.getAttributeNS(ns, "xtype"); + String yType = matrix.getAttributeNS(ns, "ytype"); + + xType = xType == null || xType.length() == 0 ? "number" : xType; + yType = yType == null || yType.length() == 0 ? "number" : yType; + + if (sx != null && sy != null && tx != null && ty != null) { + try { + logger.debug("Create new Transform2D with x format: " + xType); + logger.debug("Create new Transform2D with y format: " + yType); + + return new Transform2D( + Double.parseDouble(sx), + Double.parseDouble(sy), + Double.parseDouble(tx), + Double.parseDouble(ty), + xType, yType); + } + catch (NumberFormatException nfe) { + logger.warn("Error while parsing matrix values."); + } + } + + logger.warn("No matrix values found."); + + return new Transform2D(1d, 1d, 0d, 0d); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ChartOutputServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ChartOutputServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,151 @@ +package org.dive4elements.river.client.server; + +import java.io.OutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + + +/** + * This service is used to request a chart from the artifact server. The + * response is directed directly to the output stream, so the image that is + * retrieved is displayed in the UI afterwards. + * + * @author Ingo Weinzierl + */ +public class ChartOutputServiceImpl +extends HttpServlet +{ + private static final Logger logger = + Logger.getLogger(ChartOutputServiceImpl.class); + + + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + logger.info("ChartOutputServiceImpl.doGet"); + + try { + OutputStream out = resp.getOutputStream(); + + String url = getServletContext().getInitParameter("server-url"); + + String uuid = req.getParameter("uuid"); + String type = req.getParameter("type"); + String locale = req.getParameter("locale"); + + prepareHeader(req, resp); + + Document request = ClientProtocolUtils.newOutCollectionDocument( + uuid, type, type, + ChartServiceHelper.getChartAttributes(prepareChartAttributes(req))); + + HttpClient client = new HttpClientImpl(url, locale); + client.collectionOut(request, uuid, "chart", out); + + out.close(); + out.flush(); + } + catch (IOException ioe) { + logger.error(ioe, ioe); + } + catch (Exception e) { + logger.error(e, e); + } + } + + + protected Map prepareChartAttributes(HttpServletRequest req) { + Map attr = new HashMap(); + + Map params = req.getParameterMap(); + + attr.put("width", req.getParameter("width")); + attr.put("height", req.getParameter("height")); + attr.put("minx", req.getParameter("minx")); + attr.put("maxx", req.getParameter("maxx")); + attr.put("miny", req.getParameter("miny")); + attr.put("maxy", req.getParameter("maxy")); + attr.put("format", req.getParameter("format")); + attr.put("km", req.getParameter("currentKm")); + + if (logger.isDebugEnabled()) { + logger.debug("====== ZOOM VALUES ======="); + logger.debug(" min x: " + req.getParameter("minx")); + logger.debug(" max x: " + req.getParameter("maxx")); + logger.debug(" min y: " + req.getParameter("miny")); + logger.debug(" max y: " + req.getParameter("maxy")); + } + + return attr; + } + + + protected void prepareHeader( + HttpServletRequest req, + HttpServletResponse resp + ) { + String export = req.getParameter("export"); + + if (export != null && export.equals("true")) { + String format = req.getParameter("format"); + + if (format == null || format.length() == 0) { + format = "png"; + } + + String fn = "chart_export" + getFileExtension(format); + + resp.setHeader("Content-Disposition", "attachment;filename=" + fn); + resp.setHeader("Content-Type", getMimeType(format)); + } + } + + + protected String getFileExtension(String format) { + if (format.equals("png")) { + return ".png"; + } + else if (format.equals("pdf")) { + return ".pdf"; + } + else if (format.equals("svg")) { + return ".svg"; + } + else if (format.equals("csv")) { + return ".csv"; + } + + return ".png"; + } + + + protected String getMimeType(String format) { + if (format.equals("png")) { + return "image/png"; + } + else if (format.equals("pdf")) { + return "application/pdf"; + } + else if (format.equals("svg")) { + return "svg+xml"; + } + else if (format.equals("csv")) { + return "text/plain"; + } + + return "image/png"; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ChartServiceHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ChartServiceHelper.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,217 @@ +package org.dive4elements.river.client.server; + +import java.util.Map; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; + + +/** + * @author Ingo Weinzierl + */ +public class ChartServiceHelper { + + private static final Logger logger = + Logger.getLogger(ChartServiceHelper.class); + + + /** The default chart width if no value is specified in the request.*/ + public static final int DEFAULT_CHART_WIDTH = 600; + + /** The default chart height if no value is specified in the request.*/ + public static final int DEFAULT_CHART_HEIGHT = 400; + + + private ChartServiceHelper() { + } + + /** + * This method returns a document which might contain parameters to adjust + * chart settings. The document is created using the information that are + * contained in the request object. + * + * @param req The request document. + * + * @return a document to adjust chart settings. + */ + protected static Document getChartAttributes(Map req) { + logger.debug("ChartServiceHelper.getChartAttributes"); + + Document doc = XMLUtils.newDocument(); + + ElementCreator ec = new ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element attributes = ec.create("attributes"); + + appendChartSize(req, attributes, ec); + appendFormat(req, attributes, ec); + appendXRange(req, attributes, ec); + appendYRange(req, attributes, ec); + appendCurrentKm(req, attributes, ec); + + doc.appendChild(attributes); + + return doc; + } + + + /** + * This method extracts the size (width/height) of a chart from request + * object and append those values - if they exist - to the attribute + * document used to adjust chart settings. + * + * @param req The request object that might contain the chart size. + * @param attributes The attributes element used to adjust chart settings. + * @param ec The ElementCreator that might be used to create new Elements. + */ + protected static void appendChartSize( + Map req, + Element attributes, + ElementCreator ec) + { + logger.debug("ChartServiceHelper.appendChartSize"); + + Element size = ec.create("size"); + + String width = req.get("width"); + String height = req.get("height"); + + if (width == null || height == null) { + width = String.valueOf(DEFAULT_CHART_WIDTH); + height = String.valueOf(DEFAULT_CHART_HEIGHT); + } + + ec.addAttr(size, "width", width, true); + ec.addAttr(size, "height", height, true); + + attributes.appendChild(size); + } + + + /** + * This method extracts the x range for the chart from request object and + * appends those range - if it exists - to the attribute document used to + * adjust the chart settings. + * + * @param req The request object that might contain the chart size. + * @param doc The attribute document used to adjust chart settings. + * @param ec The ElementCreator that might be used to create new Elements. + */ + protected static void appendXRange( + Map req, + Element attributes, + ElementCreator ec) + { + logger.debug("ChartServiceHelper.appendXRange"); + + Element range = ec.create("xrange"); + + String from = req.get("minx"); + String to = req.get("maxx"); + + if (from != null && to != null) { + ec.addAttr(range, "from", from, true); + ec.addAttr(range, "to", to, true); + + attributes.appendChild(range); + } + } + + + /** + * This method extracts the x range for the chart from request object and + * appends those range - if it exists - to the attribute document used to + * adjust the chart settings. + * + * @param req The request object that might contain the chart size. + * @param doc The attribute document used to adjust chart settings. + * @param ec The ElementCreator that might be used to create new Elements. + */ + protected static void appendYRange( + Map req, + Element attributes, + ElementCreator ec) + { + logger.debug("ChartServiceHelper.appendYRange"); + + Element range = ec.create("yrange"); + + String from = req.get("miny"); + String to = req.get("maxy"); + + if (from != null && to != null) { + ec.addAttr(range, "from", from, true); + ec.addAttr(range, "to", to, true); + + attributes.appendChild(range); + } + } + + + /** + * This method extracts the format string from request object and appends + * those format - if existing - to the attribute document used to adjust + * the chart settings. + * + * @param req The request object that might contain the chart format. + * @param doc The attribute document used to adjust chart settings. + * @param ec The ElementCreator that might be used to create new Elements. + */ + protected static void appendFormat( + Map req, + Element attributes, + ElementCreator ec + + ) { + logger.debug("ChartServiceHelper.appendFormat"); + + String formatStr = req.get("format"); + if (formatStr == null || formatStr.length() == 0) { + return; + } + + Element format = ec.create("format"); + ec.addAttr(format, "value", formatStr, true); + + attributes.appendChild(format); + } + + + /** + * This method extracts the current km for the chart from request object and + * appends this km - if it exists - to the attribute document used to + * adjust the chart settings. + * + * @param req The request object that might contain the chart size. + * @param doc The attribute document used to adjust chart settings. + * @param ec The ElementCreator that might be used to create new Elements. + */ + protected static void appendCurrentKm( + Map req, + Element attributes, + ElementCreator ec) + { + logger.debug("ChartServiceHelper.appendCurrentKm"); + + Element currentKm = ec.create("currentKm"); + + String km = req.get("km"); + + if (km != null) { + ec.addAttr(currentKm, "km", km, true); + + attributes.appendChild(currentKm); + } + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/CollectionAttributeServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/CollectionAttributeServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,65 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + +import org.dive4elements.river.client.client.services.CollectionAttributeService; + + +/** + * @author Ingo Weinzierl + */ +public class CollectionAttributeServiceImpl +extends DescribeCollectionServiceImpl +implements CollectionAttributeService +{ + private static final Logger logger = + Logger.getLogger(CollectionAttributeServiceImpl.class); + + + public static final String ERROR_UPDATING_COLLECTION_ATTRIBUTE = + "error_update_collection_attribute"; + + + public Collection update(Collection collection, String locale) + throws ServerException + { + logger.info("CollectionAttributeServiceImpl.update"); + + String url = getServletContext().getInitParameter("server-url"); + + Document attribute = CollectionHelper.createAttribute(collection); + Document action = ClientProtocolUtils.newSetAttributeDocument( + collection.identifier(), + attribute); + + try { + HttpClient http = new HttpClientImpl(url, locale); + Document res = (Document) http.doCollectionAction( + action, + collection.identifier(), + new DocumentResponseHandler()); + + logger.debug("Collection attribute successfully set."); + + return describe(collection.identifier(), locale); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_UPDATING_COLLECTION_ATTRIBUTE); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/CollectionHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/CollectionHelper.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,1082 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.AttributedTheme; +import org.dive4elements.river.client.shared.model.ChartMode; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItem; +import org.dive4elements.river.client.shared.model.DefaultCollection; +import org.dive4elements.river.client.shared.model.DefaultCollectionItem; +import org.dive4elements.river.client.shared.model.DefaultFacet; +import org.dive4elements.river.client.shared.model.ExportMode; +import org.dive4elements.river.client.shared.model.Facet; +import org.dive4elements.river.client.shared.model.MapMode; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.OverviewMode; +import org.dive4elements.river.client.shared.model.ReportMode; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.Theme; +import org.dive4elements.river.client.shared.model.ThemeList; +import org.dive4elements.river.client.shared.model.Settings; +import org.dive4elements.river.client.shared.model.Property; +import org.dive4elements.river.client.shared.model.PropertyGroup; +import org.dive4elements.river.client.shared.model.PropertySetting; +import org.dive4elements.river.client.shared.model.StringProperty; +import org.dive4elements.river.client.shared.model.DoubleProperty; +import org.dive4elements.river.client.shared.model.IntegerProperty; +import org.dive4elements.river.client.shared.model.BooleanProperty; +import org.dive4elements.river.client.shared.model.OutputSettings; + +//temporary + +/** + * @author Ingo Weinzierl + */ +public class CollectionHelper { + + private static final Logger logger = + Logger.getLogger(CollectionHelper.class); + + public static final String ERROR_ADD_ARTIFACT = "error_add_artifact"; + + public static final String ERROR_REMOVE_ARTIFACT = "error_remove_artifact"; + + public static final String XPATH_FACETS = "art:facets/art:facet"; + + public static final String XPATH_LOADED_RECOMMENDATIONS = + "/art:artifact-collection/art:attribute/art:loaded-recommendations/art:recommendation"; + + + public static Document createAttribute(Collection collection) { + logger.debug("CollectionHelper.createAttribute"); + + Document doc = XMLUtils.newDocument(); + + ElementCreator cr = new ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element attr = cr.create("attribute"); + + doc.appendChild(attr); + + Map tmpOuts = collection.getOutputModes(); + + Element outs = createOutputElements(cr, collection, tmpOuts); + Element recs = createRecommendationsElements(cr, collection); + + if (outs != null) { + attr.appendChild(outs); + } + + if (recs != null) { + attr.appendChild(recs); + } + + return doc; + } + + + /** + * Creates a whole block with art:output nodes. + * + * @param cr The ElementCreator used to create new elements. + * @param c The collection. + * @param modes The OutputModes that should be included. + * + * @return an element with output modes. + */ + protected static Element createOutputElements( + ElementCreator cr, + Collection c, + Map mmodes) + { + logger.debug("CollectionHelper.createOutputElements"); + + java.util.Collection modes = mmodes != null + ? mmodes.values() + : null; + + if (modes == null || modes.size() == 0) { + logger.debug("Collection has no modes: " + c.identifier()); + return null; + } + + Element outs = cr.create("outputs"); + + for (OutputMode mode: modes) { + Element out = createOutputElement(cr, c, mode); + + if (out != null) { + outs.appendChild(out); + } + } + + return outs; + } + + + /** + * Create a node art:output that further consist of art:theme nodes. + * + * @param cr The ElementCreator used to create new elements. + * @param c The collection. + * @param mode The OutputMode. + * + * @return an element that represents an output mode with its themes. + */ + protected static Element createOutputElement( + ElementCreator cr, + Collection collection, + OutputMode mode) + { + logger.debug("CollectionHelper.createOutputElement"); + + Element out = cr.create("output"); + cr.addAttr(out, "name", mode.getName(), false); + + ThemeList themeList = collection.getThemeList(mode.getName()); + List themes = themeList != null ? themeList.getThemes() : null; + + if (themes == null || themes.size() == 0) { + logger.debug("No themes for output mode: " + mode.getName()); + return null; + } + + for (Theme theme: themes) { + Element t = createThemeElement(cr, collection, theme); + + if (t != null) { + out.appendChild(t); + } + } + + Document doc = out.getOwnerDocument(); + + ElementCreator settingscr = new ElementCreator(doc, "", ""); + + Settings settings = collection.getSettings(mode.getName()); + if (settings == null || + settings.getCategories().size() == 0) + { + logger.debug("No settings for output mode: " + mode.getName()); + } + else { + Element s = createSettingsElement(settingscr, collection, settings); + if (s != null) { + out.appendChild(s); + } + } + logger.info(XMLUtils.toString(out)); + return out; + } + + + /** + * Creates a theme node art:theme that represents a curve in a chart or map. + * + * @param cr The ElementCreator used to create new elements. + * @param collection The collection. + * @param theme The theme whose attributes should be written to an element. + * + * @return an element that contains the informtion of the given theme. + */ + protected static Element createThemeElement( + ElementCreator cr, + Collection collection, + Theme theme) + { + if (theme == null) { + return null; + } + + Element t = cr.create("facet"); + + if (theme instanceof AttributedTheme) { + AttributedTheme at = (AttributedTheme) theme; + Set keys = at.getKeys(); + + for (String key: keys) { + cr.addAttr(t, key, at.getAttr(key), true); + } + } + else { + cr.addAttr(t, "active", Integer.toString(theme.getActive()), true); + cr.addAttr(t, "artifact", theme.getArtifact(), true); + cr.addAttr(t, "facet", theme.getFacet(), true); + cr.addAttr(t, "pos", Integer.toString(theme.getPosition()), true); + cr.addAttr(t, "index", Integer.toString(theme.getIndex()), true); + cr.addAttr(t, "description", theme.getDescription(), true); + cr.addAttr(t, "visible", Integer.toString(theme.getVisible()), true); + } + + return t; + } + + + /** + * Creates a whole block with art:loaded-recommendations nodes. + * + * @param cr The ElementCreator used to create new elements. + * @param c The collection. + * + * @return an element with loaded recommendations. + */ + protected static Element createRecommendationsElements( + ElementCreator cr, + Collection c) + { + logger.debug("CollectionHelper.createRecommendationsElements"); + + List rs = c.getRecommendations(); + + if (rs == null || rs.size() == 0) { + logger.debug("Collection did not load recommendations: " + + c.identifier()); + return null; + } + + Element loaded = cr.create("loaded-recommendations"); + + for (Recommendation r: rs) { + Element recommendation = createRecommendationElement(cr, c, r); + + if (recommendation != null) { + loaded.appendChild(recommendation); + } + } + + return loaded; + } + + + /** + * Create a node art:recommended. + * + * @param cr The ElementCreator used to create new elements. + * @param c The collection. + * @param r The Recommendation. + * + * @return an element that represents an output mode with its themes. + */ + protected static Element createRecommendationElement( + ElementCreator cr, + Collection c, + Recommendation r) + { + logger.debug("CollectionHelper.createRecommendationElement"); + + Element recommendation = cr.create("recommendation"); + cr.addAttr(recommendation, "factory", r.getFactory(), true); + cr.addAttr(recommendation, "ids", r.getIDs(), true); + + return recommendation; + } + + + /** + * + */ + protected static Element createSettingsElement( + ElementCreator cr, + Collection c, + Settings s) + { + logger.debug("CollectionHelper.createSettingsElement"); + Element settings = cr.create("settings"); + + List categories = s.getCategories(); + + for (String category: categories) { + Element cat =cr.create(category); + settings.appendChild(cat); + List props = s.getSettings(category); + for (Property p: props) { + if (p instanceof PropertyGroup) { + Element prop = createPropertyGroupElement(cr, + (PropertyGroup)p); + cat.appendChild(prop); + } + else if (p instanceof PropertySetting) { + Element prop = createPropertyElement (cr, + (PropertySetting)p); + cat.appendChild(prop); + } + } + } + return settings; + } + + + /** + * + */ + protected static Element createPropertyGroupElement( + ElementCreator cr, + PropertyGroup pg) + { + Element e = cr.create(pg.getName()); + + List list = pg.getProperties(); + for (Property p: list) { + Element pe = createPropertyElement(cr, (PropertySetting)p); + e.appendChild(pe); + } + return e; + } + + + /** + * + */ + protected static Element createPropertyElement( + ElementCreator cr, + PropertySetting p) + { + Element e = cr.create(p.getName()); + + if(p instanceof BooleanProperty) { + cr.addAttr(e, "type", "boolean", false); + } + else if(p instanceof DoubleProperty) { + cr.addAttr(e, "type", "double", false); + } + else if(p instanceof IntegerProperty) { + cr.addAttr(e, "type", "integer", false); + } + else if(p instanceof StringProperty) { + cr.addAttr(e, "type", "string", false); + } + + e.setTextContent(p.getValue().toString()); + cr.addAttr(e, "display", p.getAttribute("display"), false); + return e; + } + + + /** + * Take the DESCRIBE document of the Collections describe() + * operation and extracts the information about the collection itself and + * the collection items. + * + * @param description The DESCRIBE document of the Collections describe() + * operation. + * + * @return a Collection with CollectionItems. + */ + public static Collection parseCollection(Document description) { + logger.debug("CollectionHelper.parseCollection"); + + if (description == null) { + logger.warn("The DESCRIBE of the Collection is null!"); + return null; + } + + String uuid = XMLUtils.xpathString( + description, + "art:artifact-collection/@art:uuid", + ArtifactNamespaceContext.INSTANCE); + + String ttlStr = XMLUtils.xpathString( + description, + "art:artifact-collection/@art:ttl", + ArtifactNamespaceContext.INSTANCE); + + String name = XMLUtils.xpathString( + description, + "art:artifact-collection/@art:name", + ArtifactNamespaceContext.INSTANCE); + + if (uuid.length() == 0) { + logger.warn("Found an invalid (zero length uuid) Collection!"); + return null; + } + + if (ttlStr.length() == 0) { + logger.warn("Found an invalid Collection (zero length ttl)!"); + return null; + } + + + long ttl = -1; + try { + ttl = Long.valueOf(ttlStr); + } + catch (NumberFormatException nfe) { + // do nothing + } + + List recommended = parseRecommendations(description); + Map collectionItems = + new HashMap(); + + name = (name != null && name.length() > 0) ? name : uuid; + + Collection c = new DefaultCollection(uuid, ttl, name, recommended); + + NodeList items = (NodeList) XMLUtils.xpath( + description, + "art:artifact-collection/art:artifacts/art:artifact", + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (items == null || items.getLength() == 0) { + logger.debug("No collection item found for this collection."); + + return c; + } + + int size = items.getLength(); + + for (int i = 0; i < size; i++) { + CollectionItem item = parseCollectionItem( + (Element)items.item(i), + i == 0); + + if (item != null) { + c.addItem(item); + collectionItems.put(item.identifier() ,item); + } + } + + Map themeLists = parseThemeLists(description, collectionItems); + c.setThemeLists(themeLists); + + Map outSettings = parseSettings(description); + c.setSettings(outSettings); + logger.debug( + "Found " + c.getItemLength() + " collection items " + + "for the Collection '" + c.identifier() + "'."); + + return c; + } + + + /** + * @param collectionItems map to look up collection item mapping a themes + * (artifact) uuid. + */ + protected static Map parseThemeLists( + Document desc, Map collectionItems + ) { + logger.debug("CollectionHelper.parseThemeLists"); + + NodeList lists = (NodeList) XMLUtils.xpath( + desc, + "/art:artifact-collection/art:attribute/art:outputs/art:output", + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = lists != null ? lists.getLength() : 0; + + Map themeList = new HashMap(num); + + String uri = ArtifactNamespaceContext.NAMESPACE_URI; + + for (int i = 0; i < num; i++) { + Element node = (Element)lists.item(i); + + String outName = node.getAttribute("name"); + + if (outName.length() > 0) { + ThemeList list = parseThemeList(node, collectionItems); + + if (list.getThemeCount() > 0) { + themeList.put(outName, list); + } + } + } + + return themeList; + } + + + /** + * @param collectionItems map to look up collection item mapping a themes + * (artifact) uuid. + */ + protected static ThemeList parseThemeList( + Element node, Map collectionItems + ) { + logger.debug("CollectionHelper.parseThemeList"); + + NodeList themes = node.getElementsByTagNameNS( + ArtifactNamespaceContext.NAMESPACE_URI, + "facet"); + + int num = themes != null ? themes.getLength() : 0; + + List themeList = new ArrayList(num); + + for (int i = 0; i < num; i++) { + Theme theme = parseTheme((Element)themes.item(i)); + theme.setCollectionItem(collectionItems.get(theme.getArtifact())); + + if (theme != null) { + themeList.add(theme); + } + } + + return new ThemeList(themeList); + } + + + protected static Theme parseTheme(Element ele) { + logger.debug("CollectionHelper.parseTheme"); + + String uri = ArtifactNamespaceContext.NAMESPACE_URI; + + NamedNodeMap attrMap = ele.getAttributes(); + int attrNum = attrMap != null ? attrMap.getLength() : 0; + + AttributedTheme t = new AttributedTheme(); + + for (int i = 0; i < attrNum; i++) { + Node attr = attrMap.item(i); + + String prefix = attr.getPrefix(); + String name = attr.getNodeName().replace(prefix + ":", ""); + String value = attr.getNodeValue(); + + t.addAttr(name, value); + } + + return t; + } + + + /** + * Parse Settings elements. + * + * @param description The collection description. + * + * @return Map containing the settings. + */ + protected static Map parseSettings(Document description) { + logger.info("parseSettings"); + + NodeList lists = (NodeList) XMLUtils.xpath( + description, + "/art:artifact-collection/art:attribute/art:outputs/art:output", + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = lists != null ? lists.getLength() : 0; + + Map list = new HashMap(num); + + String uri = ArtifactNamespaceContext.NAMESPACE_URI; + + for (int i = 0; i < num; i++) { + Element node = (Element)lists.item(i); + String outName = node.getAttribute("name"); + Settings s = parseSettings(outName, node); + list.put(outName, s); + } + + return list; + } + + + /** + * From a document, parse the settings for an output and create an + * OutputSettings object. + */ + protected static Settings parseSettings(String outName, Element node) { + OutputSettings set = new OutputSettings(outName); + + NodeList elements = node.getElementsByTagName("settings"); + + if (elements.getLength() == 0 || elements.getLength() > 1) { + return set; + } + + Element settings = (Element)elements.item(0); + + // Get the categories + NodeList catNodes = settings.getChildNodes(); + for (int i = 0; i < catNodes.getLength(); i++) { + Element catNode = (Element)catNodes.item(i); + + // The category name + String category = catNode.getTagName(); + + // list of properties or groups (groups have child nodes). + NodeList list = catNode.getChildNodes(); + + // iterate through all properties or groups. + List props = new ArrayList (); + for (int j = 0; j < list.getLength(); j++) { + Property p; + Element e = (Element)list.item(j); + if (e.hasChildNodes() && + e.getFirstChild().getNodeType() != Node.TEXT_NODE) { + p = parseSettingsGroup(e); + } + else { + p = parseSetting(e); + } + props.add(p); + } + set.setSettings(category, props); + } + return set; + } + + + /** + * + */ + protected static Property parseSettingsGroup(Element group) { + PropertyGroup p = new PropertyGroup(); + p.setName(group.getTagName()); + + NodeList list = group.getChildNodes(); + ArrayList props = new ArrayList(); + for (int i = 0; i < list.getLength(); i++) { + props.add(parseSetting((Element)list.item(i))); + } + p.setProperties(props); + return p; + } + + + /** + * From a property element create a Property object. + */ + protected static Property parseSetting(Element property){ + NamedNodeMap attrMap = property.getAttributes(); + int attrNum = attrMap != null ? attrMap.getLength() : 0; + + Node type = attrMap.getNamedItem("type"); + String t = type.getNodeValue(); + PropertySetting ps = new PropertySetting(); + + if(t.equals("string")) { + ps = new StringProperty(); + } + else if (t.equals("integer")) { + ps = new IntegerProperty(); + } + else if (t.equals("double")) { + ps = new DoubleProperty(); + } + else if (t.equals("boolean")) { + ps = new BooleanProperty(); + } + ps.setName(property.getTagName()); + ps.setValue(property.getTextContent()); + + for (int i = 0; i < attrNum; i++) { + Node attr = attrMap.item(i); + + String name = attr.getNodeName(); + String value = attr.getNodeValue(); + if(name.equals("type")) { + continue; + } + ps.setAttribute(name, value); + } + return ps; + } + + + /** + * This method extracts the CollectionItem from node with its output + * modes. The output modes are parsed using the parseOutputModes() method. + * + * @param node A node that contains information about a CollectionItem. + * + * @return a CollectionItem. + */ + protected static CollectionItem parseCollectionItem( + Element node, + boolean outs + ) { + logger.debug("CollectionHelper.parseCollectionItem"); + + if (node == null) { + logger.debug("The node for parsing CollectionItem is null!"); + return null; + } + + String uri = ArtifactNamespaceContext.NAMESPACE_URI; + + String uuid = node.getAttributeNS(uri, "uuid"); + String hash = node.getAttributeNS(uri, "hash"); + + if (uuid == null || uuid.length() == 0) { + logger.warn("Found an invalid CollectionItem!"); + return null; + } + + List modes = new ArrayList(); + + if (outs) { + NodeList outputmodes = node.getElementsByTagNameNS( + uri, "outputmodes"); + + if (outputmodes.getLength() < 1) { + return null; + } + + Element om = (Element)outputmodes.item(0); + + modes = parseOutputModes(om); + } + + HashMap dataItems = new HashMap(); + + NodeList dataItemNodes = node.getElementsByTagNameNS( + uri, "data-items"); + + Element di = (Element)dataItemNodes.item(0); + dataItems = parseDataItems(di); + + return new DefaultCollectionItem(uuid, hash, modes, dataItems); + } + + + /** + * This method extracts the OutputModes available for a specific + * CollectionItem and returns them as list. + * + * @param node The root node of the outputmodes list. + * + * @return a list of OutputModes. + */ + protected static List parseOutputModes(Element node) { + logger.debug("CollectionHelper.parseOutputModes"); + + if (node == null) { + logger.debug("The node for parsing OutputModes is null!"); + return null; + } + + String uri = ArtifactNamespaceContext.NAMESPACE_URI; + + NodeList list = node.getElementsByTagNameNS(uri, "output"); + + int size = list.getLength(); + + if (size == 0) { + logger.debug("No outputmode nodes found!"); + return null; + } + + List modes = new ArrayList(size); + + for (int i = 0; i < size; i++) { + Element tmp = (Element)list.item(i); + + String name = tmp.getAttributeNS(uri, "name"); + String desc = tmp.getAttributeNS(uri, "description"); + String mime = tmp.getAttributeNS(uri, "mime-type"); + String type = tmp.getAttributeNS(uri, "type"); + + if (name.length() == 0) { + logger.warn("Found an invalid output mode."); + continue; + } + + OutputMode outmode = null; + List fs = extractFacets(tmp); + + if (type.equals("export")) { + outmode = new ExportMode(name, desc, mime, fs); + } + else if (type.equals("report")) { + outmode = new ReportMode(name, desc, mime, fs); + } + else if (type.equals("chart")){ + outmode = new ChartMode(name, desc, mime, fs, type); + } + else if (type.equals("map")){ + outmode = new MapMode(name, desc, mime, fs); + } + else if (type.equals("overview")) { + outmode = new OverviewMode(name, desc, mime, fs, type); + } + else { + logger.warn("Broken Output mode without type found."); + continue; + } + + modes.add(outmode); + } + + return modes; + } + + + /** + * Create a Key/Value map for data nodes of artifact/collectionitem. + */ + protected static HashMap parseDataItems(Element node) { + logger.debug("CollectionHelper.parseDataItems"); + + if (node == null) { + logger.debug("The node for parsing DataItems is null!"); + return null; + } + + String uri = ArtifactNamespaceContext.NAMESPACE_URI; + + NodeList list = node.getElementsByTagNameNS(uri, "data"); + + int size = list.getLength(); + + if (size == 0) { + logger.debug("No static data-item nodes found!"); + } + + HashMap data = new HashMap(size*2); + + for (int i = 0; i < size; i++) { + Element tmp = (Element)list.item(i); + + String key = tmp.getAttributeNS(uri, "name"); + + if (key.length() == 0) { + logger.warn("Found an invalid data item mode."); + continue; + } + + // XXX We are restricted on 1/1 key/values in the data map here. + NodeList valueNodes = tmp.getElementsByTagName("art:item"); + + Element item = (Element) valueNodes.item(0); + String value = item.getAttributeNS(uri, "value"); + logger.debug("Found a data item " + key + " : " + value); + + data.put(key, value); + } + + + // Dynamic data. + list = node.getElementsByTagNameNS(uri, "select"); + + size = list.getLength(); + + if (size == 0) { + logger.debug("No dynamic data-item nodes found!"); + } + + for (int i = 0; i < size; i++) { + Element tmp = (Element)list.item(i); + + String key = tmp.getAttributeNS(uri, "name"); + + if (key.length() == 0) { + logger.warn("Found an invalid data item node (missing key)."); + continue; + } + + String value = tmp.getAttributeNS(uri, "defaultValue"); + + if (value.length() == 0) { + logger.warn("Found an invalid data item node (missing value)."); + continue; + } + + logger.debug("Found a (dyn) data item " + key + " : " + value); + + data.put(key, value); + } + + return data; + } + + protected static List extractFacets(Element outmode) { + logger.debug("CollectionHelper - extractFacets()"); + + NodeList facetList = (NodeList) XMLUtils.xpath( + outmode, + XPATH_FACETS, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = facetList != null ? facetList.getLength() : 0; + + List facets = new ArrayList(num); + + String uri = ArtifactNamespaceContext.NAMESPACE_URI; + + for (int i = 0; i < num; i++) { + Element facetEl = (Element) facetList.item(i); + + String name = facetEl.getAttributeNS(uri, "name"); + String desc = facetEl.getAttributeNS(uri, "description"); + String index = facetEl.getAttributeNS(uri, "index"); + + if (name != null && name.length() > 0 && index != null) { + facets.add(new DefaultFacet(name, Integer.valueOf(index),desc)); + } + } + + return facets; + } + + + public static List parseRecommendations(Document doc) { + logger.debug("CollectionHelper.parseRecommendations"); + + NodeList list = (NodeList) XMLUtils.xpath( + doc, + XPATH_LOADED_RECOMMENDATIONS, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = list != null ? list.getLength() : 0; + + List recs = new ArrayList(num); + + String uri = ArtifactNamespaceContext.NAMESPACE_URI; + + for (int i = 0; i < num; i++) { + Element rec = (Element) list.item(i); + + String factory = rec.getAttributeNS(uri, "factory"); + String dbids = rec.getAttributeNS(uri, "ids"); + + if (factory != null && factory.length() > 0) { + recs.add(new Recommendation(factory, dbids)); + } + } + + return recs; + } + + + /** + * Add an artifact to a collection. + * @param collection Collection to add artifact to. + * @param artifact Artifact to add to collection + */ + public static Collection addArtifact( + Collection collection, + Artifact artifact, + String url, + String locale) + throws ServerException + { + logger.debug("CollectionHelper.addArtifact"); + + if (collection == null) { + logger.warn("The given Collection is null!"); + return null; + } + + Document add = ClientProtocolUtils.newAddArtifactDocument( + artifact.getUuid(), null); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + logger.debug("Do HTTP request now."); + + Document response = (Document) client.doCollectionAction( + add, collection.identifier(), new DocumentResponseHandler()); + + logger.debug( + "Finished HTTP request successfully. Parse Collection now."); + + Collection c = CollectionHelper.parseCollection(response); + + if (c == null) { + throw new ServerException(ERROR_ADD_ARTIFACT); + } + + return c; + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + catch (Exception e) { + logger.error(e, e); + } + + throw new ServerException(ERROR_ADD_ARTIFACT); + } + + + /** + * Remove an artifact from a collection. + * @param collection Collection to remove artifact to. + * @param artifact Artifact to add to collection + */ + public static Collection removeArtifact( + Collection collection, + String artifactId, + String url, + String locale) + throws ServerException + { + logger.debug("CollectionHelper.removeArtifact"); + + if (collection == null) { + logger.warn("The given Collection is null!"); + return null; + } + + Document remove = ClientProtocolUtils.newRemoveArtifactDocument( + artifactId); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + logger.debug("Do HTTP request now."); + + Document response = (Document) client.doCollectionAction( + remove, collection.identifier(), new DocumentResponseHandler()); + + logger.debug( + "Finished HTTP request successfully. Parse Collection now."); + logger.debug(XMLUtils.toString(response)); + + Collection c = CollectionHelper.parseCollection(response); + + if (c == null) { + throw new ServerException(ERROR_REMOVE_ARTIFACT); + } + + return c; + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + catch (Exception e) { + logger.error(e, e); + } + throw new ServerException(ERROR_REMOVE_ARTIFACT); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/CollectionItemAttributeServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/CollectionItemAttributeServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,202 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.client.services.CollectionItemAttributeService; + +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.CollectionItemAttribute; +import org.dive4elements.river.client.shared.model.Style; +import org.dive4elements.river.client.shared.model.StyleSetting; + + +/** + * @author Raimund Renkert + */ +public class CollectionItemAttributeServiceImpl +extends RemoteServiceServlet +implements CollectionItemAttributeService +{ + private static final Logger logger = + Logger.getLogger(CollectionItemAttributeServiceImpl.class); + + + public static final String XPATH_RESULT = "/art:result/text()"; + + public static final String OPERATION_FAILURE = "FAILED"; + + public static final String ERROR_NO_STYLES_FOUND = + "error_no_theme_styles_found"; + + + public CollectionItemAttribute getCollectionItemAttribute( + Collection collection, + String artifact, + String locale) + throws ServerException + { + logger.info( + "CollectionItemAttributeServiceImpl.getCollectionItemAttribute"); + + String url = getServletContext().getInitParameter("server-url"); + + Document requestDoc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + requestDoc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element action = ec.create("action"); + + Element type = ec.create("type"); + ec.addAttr(type, "name", "getitemattribute", false); + + Element art = ec.create("artifact"); + ec.addAttr(art, "uuid", artifact, false); + + type.appendChild(art); + action.appendChild(type); + requestDoc.appendChild (action); + + try { + HttpClient client = new HttpClientImpl(url, locale); + Document res = (Document) client.doCollectionAction( + requestDoc, + collection.identifier(), + new DocumentResponseHandler()); + return readXML (res, artifact); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_STYLES_FOUND); + } + + + public void setCollectionItemAttribute( + Collection collection, + String artifact, + String locale, + CollectionItemAttribute attributes) + throws ServerException + { + logger.info( + "CollectionItemAttributeServiceImpl.setCollectionItemAttribute"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = writeXML(attributes, artifact); + + try { + HttpClient client = new HttpClientImpl(url, locale); + Document res = (Document) client.doCollectionAction( + doc, + collection.identifier(), + new DocumentResponseHandler()); + + return; + } + catch (ConnectionException ce) { + logger.error(ce, ce); + throw new ServerException(ce.getLocalizedMessage()); + } + } + + protected CollectionItemAttribute readXML(Document doc, String artifact) + throws ServerException + { + CollectionItemAttribute cia = new CollectionItemAttribute(); + cia.setArtifact(artifact); + + Element root = doc.getDocumentElement(); + NodeList themes = root.getElementsByTagName("art:themes"); + + if (themes == null || themes.getLength() == 0) { + throw new ServerException(ERROR_NO_STYLES_FOUND); + } + + Element e = (Element) themes.item(0); + NodeList items = e.getElementsByTagName("theme"); + + for (int i = 0; i < items.getLength(); i++) { + Style s = StyleHelper.getStyle ((Element) items.item(i)); + if(s == null) { + throw new ServerException(ERROR_NO_STYLES_FOUND); + } + else { + cia.appendStyle(s); + } + } + + return cia; + } + + + protected Document writeXML ( + CollectionItemAttribute attributes, + String artifact) + { + Document styles = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + styles, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + Element action = ec.create("action"); + Element type = ec.create("type"); + type.setAttribute("name", "setitemattribute"); + Element art = ec.create("artifact"); + art.setAttribute("uuid", artifact); + Element attr = ec.create("attribute"); + Element themes = ec.create("themes"); + action.appendChild(type); + type.appendChild(art); + art.appendChild(attr); + attr.appendChild(themes); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + styles, + "", + ""); + + for (int i = 0; i < attributes.getNumStyles(); i++) { + Style s = attributes.getStyle(i); + Element theme = creator.create("theme"); + theme.setAttribute("name", s.getName()); + theme.setAttribute("facet", s.getFacet()); + theme.setAttribute("index", String.valueOf(s.getIndex())); + for (int j = 0; j < s.getNumSettings(); j++) { + StyleSetting set = s.getSetting(j); + Element field = creator.create("field"); + field.setAttribute("name", set.getName()); + field.setAttribute("display", set.getDisplayName()); + field.setAttribute("default", set.getDefaultValue()); + field.setAttribute("hints", set.getHints()); + field.setAttribute("type", set.getType()); + field.setAttribute("hidden", String.valueOf(set.isHidden())); + theme.appendChild(field); + } + themes.appendChild(theme); + } + styles.appendChild(action); + return styles; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/CreateCollectionServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/CreateCollectionServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,87 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.DefaultCollection; +import org.dive4elements.river.client.client.services.CreateCollectionService; + + +/** + * This interface provides the createCollection service to create new + * collections in the artifact server. + * + * @author Ingo Weinzierl + */ +public class CreateCollectionServiceImpl +extends RemoteServiceServlet +implements CreateCollectionService +{ + /** Private logger. */ + private static final Logger logger = + Logger.getLogger(CreateCollectionServiceImpl.class); + + /** XPath to figure out the uuid of the created collection.*/ + public static final String XPATH_COLLECTION_UUID = + "/art:result/art:artifact-collection/@art:uuid"; + + /** XPath to figure out the ttl of the created collection.*/ + public static final String XPATH_COLLECTION_TTL = + "/art:result/art:artifact-collection/@art:ttl"; + + /** Error message key that is thrown if an error occured while creating + * a new collection.*/ + public static final String ERROR_CREATE_COLLECTION = + "error_create_collection"; + + + /** Attempt creation of Collection. */ + public Collection create(String locale, String ownerId) + throws ServerException + { + logger.info("Start creating a new collection."); + + String url = getServletContext().getInitParameter("server-url"); + + Document create = + ClientProtocolUtils.newCreateCollectionDocument(null); + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document doc = (Document) client.createCollection( + create, ownerId, new DocumentResponseHandler()); + + String uuid = XMLUtils.xpathString( + doc, XPATH_COLLECTION_UUID, ArtifactNamespaceContext.INSTANCE); + + String ttlStr = XMLUtils.xpathString( + doc, XPATH_COLLECTION_TTL, ArtifactNamespaceContext.INSTANCE); + + if (uuid.trim().length() == 0 || ttlStr.length() == 0) { + throw new ServerException(ERROR_CREATE_COLLECTION); + } + + return new DefaultCollection(uuid, Long.valueOf(ttlStr), uuid); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_CREATE_COLLECTION); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/CrossSectionKMServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/CrossSectionKMServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,134 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.client.services.CrossSectionKMService; + +/** + * Interact with not documented service. + */ +public class CrossSectionKMServiceImpl +extends RemoteServiceServlet +implements CrossSectionKMService +{ + private static final Logger logger = + Logger.getLogger(CrossSectionKMServiceImpl.class); + + /** XPath that points to the found cross section measurements. */ + public static final String XPATH_CROSS_SECTIONS + = "/cross-sections/cross-section"; + + /** The error message key that is thrown if an error occured while getting + * new data. */ + public static final String ERROR_GET_CROSS_SECTION + = "error_get_cross_section"; + + + /** + * Fetches positions (kms) at which measurements for given cross-sections + * exists. + * + * @param data Map of Integer (cross-section-id) to km. + * + */ + public Map getCrossSectionKMs( + String locale, + Map data, + int nNeighbours) + throws ServerException + { + logger.info("CrossSectionKMService.getCrossSectionKMs"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + Element crossSection = ec.create("cross-sections"); + + doc.appendChild(crossSection); + + for(Map.Entry oneCrossSection : data.entrySet()) { + Element cs = ec.create("cross-section"); + cs.setAttribute("id", oneCrossSection.getKey().toString()); + cs.setAttribute("km", oneCrossSection.getValue().toString()); + cs.setAttribute("n", Integer.valueOf(nNeighbours).toString()); + crossSection.appendChild(cs); + } + + HttpClient client = new HttpClientImpl(url, locale); + logger.debug("Created httpclient"); + + try { + // Document should contain: + // crosse-sections: + // attribute(id), attribute(km) attribute(n) + Document response = client.callService(url, "cross-section-km", doc); + //... + + NodeList nodeList = (NodeList) XMLUtils.xpath(response, + XPATH_CROSS_SECTIONS, + XPathConstants.NODESET); + + int num = nodeList.getLength(); + + Map result = new HashMap(); + + try{ + for (int i = 0; i < num; i++) { + Element csElement = (Element) nodeList.item(i); + + int idx = Integer.parseInt(csElement.getAttribute("id")); + ArrayList kms = new ArrayList(); + + NodeList lineNodes = csElement.getElementsByTagName("line"); + int numLines = lineNodes.getLength(); + for (int k = 0; k < numLines; k++) { + Element line = (Element) lineNodes.item(k); + double d = Double.parseDouble(line.getAttribute("km")); + kms.add(d); + } + + Double[] doubles = new Double[kms.size()]; + kms.toArray(doubles); + result.put(Integer.valueOf(idx), doubles); + } + } + catch(NumberFormatException nfe) { + logger.error("Response was not parsable"); + } + + return result; + } + catch (ConnectionException ce) { + logger.error("ConnectionExsp", ce); + } + + logger.warn("CrossSectionKMService.getCrossSectionKMS() - FAILED"); + throw new ServerException(ERROR_GET_CROSS_SECTION); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DataFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DataFactory.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,341 @@ +package org.dive4elements.river.client.server; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DefaultData; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.DoubleArrayData; +import org.dive4elements.river.client.shared.model.IntegerArrayData; +import org.dive4elements.river.client.shared.model.IntegerData; +import org.dive4elements.river.client.shared.model.IntegerOptionsData; +import org.dive4elements.river.client.shared.model.IntegerRangeData; +import org.dive4elements.river.client.shared.model.StringData; +import org.dive4elements.river.client.shared.model.StringOptionsData; +import org.dive4elements.river.client.shared.model.LongRangeData; + +import org.dive4elements.river.client.shared.model.IntDataItem; + +/** + * @author Ingo Weinzierl + */ +public class DataFactory { + + private static final Logger logger = Logger.getLogger(DataFactory.class); + + public static final String NS_URI = ArtifactNamespaceContext.NAMESPACE_URI; + + + /** + * Creates a new Data instance based on the art:type attribute of + * element. + * + * @param element The Data element. + * + * @return a Data instance. + */ + public static Data createDataFromElement(Element element) { + String name = element.getAttributeNS(NS_URI, "name"); + String type = element.getAttributeNS(NS_URI, "type"); + String label = element.getAttributeNS(NS_URI, "label"); + + label = label != null && label.length() > 0 ? label : name; + + try { + logger.debug("Create Data instance for: " + name + " | " + type); + + if (type == null || type.length() == 0) { + return createDefaultData(element, name, label); + } + + type = type.toLowerCase(); + + if (type.equals(StringData.TYPE)) { + return createStringData(element, name, label); + } + else if (type.equals(IntegerData.TYPE)) { + return createIntegerData(element, name, label); + } + else if (type.equals(StringOptionsData.TYPE)) { + return createStringOptionsData(element, name, label); + } + else if (type.equals(IntegerOptionsData.TYPE)) { + return createIntegerOptionsData(element, name, label); + } + else if (type.equals(IntegerRangeData.TYPE)) { + return createIntegerRangeData(element, name, label); + } + else if (type.equals(IntegerArrayData.TYPE)) { + return createIntegerArrayData(element, name, label); + } + else if (type.equals(DoubleArrayData.TYPE)) { + return createDoubleArrayData(element, name, label); + } + else if (type.equals(LongRangeData.TYPE)) { + return createLongRangeData(element, name, label); + } + else { + return createDefaultData(element, name, label); + } + } + catch (Exception e) { + logger.error("Error while data creation for: " + name); + } + + return null; + } + + + /** + * This method creates a new instance of DefaultData which has no real type + * set. + * + * @param ele The Data element. + * @param name The name of the Data instance. + * + * @return an instance of DefaultData. + */ + protected static Data createDefaultData(Element ele, String name, String label) { + logger.debug("Create new DefaultData"); + return new DefaultData(name, label, "default", extractDataItems(ele)); + } + + + /** + * This method creates a new instance of StringData which has a type + * "string" set. + * + * @param ele The Data element. + * @param name The name of the Data instance. + * + * @return an instance of StringData. + */ + protected static Data createStringData(Element ele, String name, String label) { + return new StringData(name, label, extractDataItems(ele)); + } + + + /** + * This method creates a new instance of DefaultData which has a type + * "integer" set. + * + * @param ele The Data element. + * @param name The name of the Data instance. + * + * @return an instance of IntegerData. + */ + protected static Data createIntegerData(Element ele, String name, String label) { + return new IntegerData(name, label, extractDataItems(ele)); + } + + + /** + * This method creates a new instance of StringOptionsData which has a type + * "options" set. + * + * @param ele The Data element. + * @param name The name of the Data instance. + * + * @return an instance of StringOptionsData. + */ + protected static Data createStringOptionsData(Element ele, String name, String label) { + return new StringOptionsData(name, label, extractDataItems(ele)); + } + + + /** + * This method creates a new instance of DefaultData which has a type + * "intoptions" set. + * + * @param ele The Data element. + * @param name The name of the Data instance. + * + * @return an instance of IntegerOptionsData. + */ + protected static Data createIntegerOptionsData(Element ele, String name, String label) { + return new IntegerOptionsData(name, label, extractDataItems(ele)); + } + + + /** + * This method creates a new instance of DefaultData which has a type + * "intrange" set. + * + * @param ele The Data element. + * @param name The name of the Data instance. + * + * @return an instance of IntegerRangeData. + */ + protected static Data createIntegerRangeData(Element ele, String name, String label) { + DataItem[] items = extractDataItems(ele); + String rawValue = items[0].getStringValue(); + + String[] minmax = rawValue.split(";"); + + return new IntegerRangeData( + name, + label, + Integer.valueOf(minmax[0]), + Integer.valueOf(minmax[1])); + } + + + /** + * This method creates a new instance of DefaultData which has a type + * "integerarray" set. + * + * @param ele The Data element. + * @param name The name of the Data instance. + * + * @return an instance of IntegerArrayData. + */ + protected static Data createIntegerArrayData(Element ele, String name, String label) { + IntDataItem[] items = extractIntDataItems(ele); + return new IntegerArrayData(name, label, items); + } + + + /** + * This method creates a new instance of DefaultData which has a type + * "doublearray" set. + * + * @param ele The Data element. + * @param name The name of the Data instance. + * + * @return an instance of DoubleArrayData. + */ + protected static Data createDoubleArrayData(Element ele, String name, String label) { + DataItem[] items = extractDataItems(ele); + String rawValue = items[0].getStringValue(); + + String[] values = rawValue.split(";"); + double[] doubles = new double[values.length]; + + for (int i = 0; i < values.length; i++) { + try { + doubles[i] = Double.valueOf(values[i]); + } + catch (NumberFormatException nfe) { + logger.warn("Error while parsing DoubleArrayData: " + nfe); + } + } + + return new DoubleArrayData(name, label, doubles); + } + + + /** + * This method extracts the art:item elements placed under elements. + * + * @param element A data node that contains items. + * + * @return a list of DataItems. + */ + protected static DataItem[] extractDataItems(Element element) { + NodeList itemList = (NodeList) XMLUtils.xpath( + element, + "art:item", + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (itemList == null || itemList.getLength() == 0) { + logger.debug("No data items found."); + return null; + } + + int count = itemList.getLength(); + + DataItem[] items = new DataItem[count]; + + logger.debug("There are " + count + " data items in element."); + + for (int i = 0; i < count; i++) { + Element tmp = (Element) itemList.item(i); + + String value = tmp.getAttributeNS(NS_URI, "value"); + String label = tmp.getAttributeNS(NS_URI, "label"); + + logger.debug("Found data item:"); + logger.debug(" label: " + label); + logger.debug(" value: " + value); + + items[i] = new DefaultDataItem(label, label, value); + } + + return items; + } + + + /** + * This method extracts the art:item elements placed under elements. + * + * @param element A data node that contains items. + * + * @return a list of DataItems. + */ + protected static IntDataItem[] extractIntDataItems(Element element) { + NodeList itemList = (NodeList) XMLUtils.xpath( + element, + "art:item", + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (itemList == null || itemList.getLength() == 0) { + logger.debug("No old data items found."); + return null; + } + + int count = itemList.getLength(); + + IntDataItem[] items = new IntDataItem[count]; + + for (int i = 0; i < count; i++) { + Element tmp = (Element) itemList.item(i); + + String value = tmp.getAttributeNS(NS_URI, "value"); + String label = tmp.getAttributeNS(NS_URI, "label"); + + try { + int data = Integer.parseInt(value); + items[i] = new IntDataItem(label, label, data); + } + catch(NumberFormatException nfe) { + logger.debug(nfe, nfe); + } + } + return items; + } + + /** + * This method creates a new instance of LongRangeData which has a type + * "longrange" set. + * + * @param ele The Data element. + * @param name The name of the Data instance. + * + * @return an instance of IntegerRangeData. + */ + protected static Data createLongRangeData(Element ele, String name, String label) { + DataItem[] items = extractDataItems(ele); + String rawValue = items[0].getStringValue(); + + String[] minmax = rawValue.split(";"); + + return new LongRangeData( + name, + label, + Long.valueOf(minmax[0]), + Long.valueOf(minmax[1])); + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DeleteCollectionServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DeleteCollectionServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,40 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.client.services.DeleteCollectionService; + + +/** + * @author Ingo Weinzierl + */ +public class DeleteCollectionServiceImpl +extends DoCollectionAction +implements DeleteCollectionService +{ + private static final Logger logger = + Logger.getLogger(DeleteCollectionServiceImpl.class); + + + public static final String XPATH_RESULT = "/art:result/text()"; + public static final String OPERATION_FAILURE = "FAILED"; + + public void delete(Collection c) + throws ServerException + { + logger.info("Delete collection: " + c.identifier()); + + String url = getServletContext().getInitParameter("server-url"); + + Document del = ClientProtocolUtils.newDeleteCollectionDocument(); + + doAction(c, del, url); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DescribeArtifactServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DescribeArtifactServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,75 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.client.services.DescribeArtifactService; + + +/** + * This interface provides artifact specific operation DESCRIBE. + * + * @author Ingo Weinzierl + */ +public class DescribeArtifactServiceImpl +extends RemoteServiceServlet +implements DescribeArtifactService +{ + private static final Logger logger = + Logger.getLogger(DescribeArtifactServiceImpl.class); + + + public static final String ERROR_DESCRIBE_ARTIFACT = + "error_describe_artifact"; + + + public Artifact describe(String locale, Artifact artifact) + throws ServerException + { + logger.info("DescribeArtifactServiceImpl.describe"); + + String url = getServletContext().getInitParameter("server-url"); + + Document describe = ClientProtocolUtils.newDescribeDocument( + artifact.getUuid(), + artifact.getHash(), + true); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + logger.debug("Start Http request now."); + + Document description = (Document) client.describe( + new org.dive4elements.artifacts.httpclient.objects.Artifact( + artifact.getUuid(), + artifact.getHash()), + describe, + new DocumentResponseHandler()); + + if (description != null) { + logger.debug("Finished Http request sucessfully!"); + + return (Artifact) new FLYSArtifactCreator().create(description); + } + } + catch (ConnectionException ce) { + ce.printStackTrace(); + } + + throw new ServerException(ERROR_DESCRIBE_ARTIFACT); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DescribeCollectionServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DescribeCollectionServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,76 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + +import org.dive4elements.river.client.client.services.DescribeCollectionService; + + +/** + * This service implements a method that queries the DESCRIBE document of a + * specific collection and returns a Collection object with the information of + * the document. + * + * @author Ingo Weinzierl + */ +public class DescribeCollectionServiceImpl +extends RemoteServiceServlet +implements DescribeCollectionService +{ + private static final Logger logger = + Logger.getLogger(DescribeCollectionServiceImpl.class); + + + /** The error message key that is thrown if an error occured while + * describe() a Collection.*/ + public static final String ERROR_DESCRIBE_COLLECTION = + "error_describe_collection"; + + + public Collection describe(String uuid, String locale) + throws ServerException + { + logger.info("DescribeCollectionServiceImpl.describe"); + + String url = getServletContext().getInitParameter("server-url"); + + Document describe = ClientProtocolUtils.newDescribeCollectionDocument( + uuid); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document response = (Document) client.doCollectionAction( + describe, uuid, new DocumentResponseHandler()); + + Collection c = CollectionHelper.parseCollection(response); + + if (c == null) { + throw new ServerException(ERROR_DESCRIBE_COLLECTION); + } + + logger.debug("Collection successfully parsed."); + + return c; + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_DESCRIBE_COLLECTION); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DischargeInfoServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DischargeInfoServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,138 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.List; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.client.services.DischargeInfoService; +import org.dive4elements.river.client.shared.model.DischargeInfoObject; +import org.dive4elements.river.client.shared.model.DischargeInfoObjectImpl; + + +/** + * @author Raimund Renkert + */ +public class DischargeInfoServiceImpl +extends RemoteServiceServlet +implements DischargeInfoService +{ + private static final Logger logger = + Logger.getLogger(DischargeInfoServiceImpl.class); + + public static final String ERROR_NO_DISCHARGEINFO_FOUND = + "error_no_dischargeinfo_found"; + + public static final String XPATH_DISTANCES = "art:discharges/art:discharge"; + + + public DischargeInfoObject[] getDischargeInfo( + String locale, + long gauge) + throws ServerException + { + logger.info("DichargeInfoServiceImpl.getDischargeInfo"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element gaugeEl = ec.create("gauge"); + gaugeEl.setTextContent(String.valueOf(gauge)); + + doc.appendChild(gaugeEl); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document result = client.callService(url, "dischargeinfo", doc); + + logger.debug("Extract discharge info objects now."); + DischargeInfoObject[] objects = extractDischargeInfoObjects(result); + + if (objects != null && objects.length > 0) { + return objects; + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_DISCHARGEINFO_FOUND); + } + + protected DischargeInfoObject[] extractDischargeInfoObjects( + Document result + ) + throws ServerException { + NodeList list = result.getElementsByTagName("discharge"); + + if (list == null || list.getLength() == 0) { + logger.warn("No discharge info found."); + throw new ServerException(ERROR_NO_DISCHARGEINFO_FOUND); + } + + int num = list.getLength(); + logger.debug("Response contains " + num + " objects."); + + List objects = + new ArrayList(num); + + for (int i = 0; i < num; i++) { + DischargeInfoObject obj = buildDischargeInfoObject( + (Element)list.item(i)); + + if (obj != null) { + objects.add(obj); + } + } + + logger.debug("Retrieved " + objects.size() + " discharges."); + + return (DischargeInfoObject[]) + objects.toArray(new DischargeInfoObject[num]); + + } + + protected DischargeInfoObject buildDischargeInfoObject(Element node) { + + String desc = node.getAttribute("description").trim(); + String start = node.getAttribute("start").trim(); + String end = node.getAttribute("end").trim(); + + if (start.length() > 0 && end.length() > 0) { + try { + Integer startYear = new Integer(start); + Integer endYear = new Integer(end); + return new DischargeInfoObjectImpl(desc, startYear, endYear); + } + catch (NumberFormatException nfe) { + logger.warn(nfe.getLocalizedMessage()); + } + } + + logger.warn("Invalid distance info object found."); + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DischargeInfoXML.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DischargeInfoXML.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,82 @@ +package org.dive4elements.river.client.server; + +import java.io.InputStream; +import java.io.IOException; +import java.io.OutputStream; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.StreamResponseHandler; + + +/** + * @author Raimund Renkert + */ +public class DischargeInfoXML +extends HttpServlet +{ + private static final Logger logger = Logger.getLogger(DischargeInfoXML.class); + + + public static final String ERROR_NO_DISTANCEINFO_FOUND = + "error_no_dischargeinfo_found"; + + + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + logger.info("DischargeInfoXML.doGet"); + + String url = getServletContext().getInitParameter("server-url"); + + String gauge = req.getParameter("gauge"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element gaugeEl = ec.create("gauge"); + gaugeEl.setTextContent(gauge); + + doc.appendChild(gaugeEl); + + HttpClient client = new HttpClientImpl(url); + + try { + InputStream in = (InputStream) client.callService( + url, "dischargeinfo", doc, new StreamResponseHandler()); + + OutputStream out = resp.getOutputStream(); + + byte[] b = new byte[4096]; + int i; + while ((i = in.read(b)) >= 0) { + out.write(b, 0, i); + } + + out.flush(); + out.close(); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + catch (IOException ioe) { + logger.error(ioe, ioe); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DischargeTablesServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DischargeTablesServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,143 @@ +package org.dive4elements.river.client.server; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.text.DateFormat; +import java.util.Date; +import java.util.Locale; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.StreamResponseHandler; + + +public class DischargeTablesServiceImpl extends HttpServlet { + + private static final Logger logger = Logger + .getLogger(DischargeInfoServiceImpl.class); + + private static final DateFormat DATE_FORMAT = DateFormat.getDateInstance( + DateFormat.MEDIUM, Locale.GERMANY); + + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + logger.info("ChartOutputServiceImpl.doGet"); + + String url = getServletContext().getInitParameter("server-url"); + String locale = req.getParameter("locale"); + + prepareHeader(req, resp); + + Document requestDoc = createRequestDoc(req); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + OutputStream out = resp.getOutputStream(); + InputStream stream = (InputStream) client.callService(url, + "dischargetablesoverview", requestDoc, + new StreamResponseHandler()); + + byte[] b = new byte[4096]; + try { + int i; + while ((i = stream.read(b)) >= 0) { + out.write(b, 0, i); + } + } + finally { + stream.close(); + } + } + catch (IOException ioe) { + logger.error("Error while fetching discharge tables chart!", ioe); + } + } + + protected void prepareHeader(HttpServletRequest req, + HttpServletResponse resp) { + resp.setHeader("Content-Type", "image/png"); + } + + protected Document createRequestDoc(HttpServletRequest req) { + Document request = XMLUtils.newDocument(); + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(request, + null, null); + + Element service = creator.create("service"); + Element gauge = creator.create("gauge"); + Element extent = creator.create("extent"); + Element format = creator.create("format"); + Element timerange = creator.create("timerange"); + + creator.addAttr(gauge, "name", extractRequestGauge(req)); + creator.addAttr(extent, "width", extractRequestWidth(req)); + creator.addAttr(extent, "height", extractRequestHeight(req)); + creator.addAttr(format, "type", extractRequestFormat(req)); + creator.addAttr(timerange, "lower", extractRequestLowerTime(req)); + creator.addAttr(timerange, "upper", extractRequestUpperTime(req)); + + request.appendChild(service); + service.appendChild(gauge); + service.appendChild(extent); + service.appendChild(format); + service.appendChild(timerange); + + return request; + } + + protected String extractRequestGauge(HttpServletRequest req) { + return req.getParameter("gauge"); + } + + protected String extractRequestWidth(HttpServletRequest req) { + return req.getParameter("width"); + } + + protected String extractRequestHeight(HttpServletRequest req) { + return req.getParameter("height"); + } + + protected String extractRequestFormat(HttpServletRequest req) { + return req.getParameter("format"); + } + + protected String extractRequestLowerTime(HttpServletRequest req) { + String lowerStr = req.getParameter("lower"); + try { + long lowerMillis = Long.parseLong(lowerStr); + Date lower = new Date(lowerMillis); + + return DATE_FORMAT.format(lower); + } + catch (NumberFormatException nfe) { + logger.warn("Cannot parse time millies.", nfe); + } + + return null; + } + + protected String extractRequestUpperTime(HttpServletRequest req) { + String upperStr = req.getParameter("upper"); + try { + long upperMillis = Long.parseLong(upperStr); + Date upper = new Date(upperMillis); + + return DATE_FORMAT.format(upper); + } + catch (NumberFormatException nfe) { + logger.warn("Cannot parse time millies.", nfe); + } + + return null; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DistanceInfoServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DistanceInfoServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,160 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.List; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.client.services.DistanceInfoService; +import org.dive4elements.river.client.shared.model.DistanceInfoObject; +import org.dive4elements.river.client.shared.model.DistanceInfoObjectImpl; + + +/** + * @author Ingo Weinzierl + */ +public class DistanceInfoServiceImpl +extends RemoteServiceServlet +implements DistanceInfoService +{ + private static final Logger logger = + Logger.getLogger(DistanceInfoServiceImpl.class); + + public static final String ERROR_NO_DISTANCEINFO_FOUND = + "error_no_distanceinfo_found"; + + public static final String XPATH_DISTANCES = "art:distances/art:distance"; + + + public DistanceInfoObject[] getDistanceInfo( + String locale, + String river) + throws ServerException + { + logger.info("DistanceInfoServiceImpl.getDistanceInfo"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element riverEl = ec.create("river"); + + riverEl.setTextContent(river); + + doc.appendChild(riverEl); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document result = client.callService(url, "distanceinfo", doc); + + logger.debug("Extract distance info objects now."); + DistanceInfoObject[] objects = extractDistanceInfoObjects(result); + + if (objects != null && objects.length > 0) { + return objects; + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_DISTANCEINFO_FOUND); + } + + + /** + * Extracts all distance info objects from result document. + * + * @param result The document retrieved by the server. + * + * @return a list of DistanceInfoObjects. + */ + protected DistanceInfoObject[] extractDistanceInfoObjects(Document result) + throws ServerException + { + NodeList list = result.getElementsByTagName("distance"); + + if (list == null || list.getLength() == 0) { + logger.warn("No distance info found."); + throw new ServerException(ERROR_NO_DISTANCEINFO_FOUND); + } + + int num = list.getLength(); + logger.debug("Response contains " + num + " objects."); + + List objects = + new ArrayList(num); + + for (int i = 0; i < num; i++) { + DistanceInfoObject obj = buildDistanceInfoObject( + (Element)list.item(i)); + + if (obj != null) { + objects.add(obj); + } + } + + logger.debug("Retrieved " + objects.size() + " distances."); + + return (DistanceInfoObject[]) + objects.toArray(new DistanceInfoObject[num]); + } + + + /** + * Extracts information for a single distance info object and intializes an + * DistanceInfoObject with them. + * + * @param node The node that contains the information. + * + * @return a valid DistanceInfoObject. + */ + protected DistanceInfoObject buildDistanceInfoObject(Element node) { + + String desc = node.getAttribute("description").trim(); + String from = node.getAttribute("from").trim(); + String to = node.getAttribute("to").trim(); + String riverside = node.getAttribute("riverside").trim(); + String bottom = node.getAttribute("bottom").trim(); + String top = node.getAttribute("top").trim(); + + if (desc.length() > 0 && from.length() > 0) { + try { + Double f = new Double(from); + Double t = to .length() > 0 ? new Double(to) : null; + Double b = bottom.length() > 0 ? new Double(bottom) : null; + Double tp = top .length() > 0 ? new Double(top) : null; + + return new DistanceInfoObjectImpl(desc, f, t, riverside, b, tp); + } + catch (NumberFormatException nfe) { + logger.warn(nfe.getLocalizedMessage()); + } + } + + logger.warn("Invalid distance info object found."); + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DistanceInfoXML.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DistanceInfoXML.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,90 @@ +package org.dive4elements.river.client.server; + +import java.io.InputStream; +import java.io.IOException; +import java.io.OutputStream; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.StreamResponseHandler; + + +/** + * @author Ingo Weinzierl + */ +public class DistanceInfoXML +extends HttpServlet +{ + private static final Logger logger = Logger.getLogger(DistanceInfoXML.class); + + + public static final String ERROR_NO_DISTANCEINFO_FOUND = + "error_no_distanceinfo_found"; + + + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + logger.info("DistanceInfoXML.doGet"); + + String url = getServletContext().getInitParameter("server-url"); + + String river = req.getParameter("river"); + String filter = req.getParameter("filter"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element riverEl = ec.create("river"); + riverEl.setTextContent(river); + + doc.appendChild(riverEl); + + if (filter != null && filter.length() > 0) { + Element typeEl = ec.create("filter"); + typeEl.setTextContent(filter); + + riverEl.appendChild(typeEl); + } + + HttpClient client = new HttpClientImpl(url); + + try { + InputStream in = (InputStream) client.callService( + url, "distanceinfo", doc, new StreamResponseHandler()); + + OutputStream out = resp.getOutputStream(); + + byte[] b = new byte[4096]; + int i; + while ((i = in.read(b)) >= 0) { + out.write(b, 0, i); + } + + out.flush(); + out.close(); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + catch (IOException ioe) { + logger.error(ioe, ioe); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/DoCollectionAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DoCollectionAction.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,62 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; + + +/** + * @author Ingo Weinzierl + */ +public class DoCollectionAction extends RemoteServiceServlet { + + private static final Logger logger = + Logger.getLogger(DoCollectionAction.class); + + + public static final String XPATH_RESULT = "/art:result/text()"; + public static final String OPERATION_FAILURE = "FAILED"; + public static final String FAILURE_EXCEPTION = "collection_action_failed"; + + + protected void doAction(Collection c, Document action, String url) + throws ServerException + { + logger.info("DoCollectionAction.doAction"); + + HttpClient client = new HttpClientImpl(url); + + try { + Document res = (Document) client.doCollectionAction( + action, c.identifier(), + new DocumentResponseHandler()); + + String result = XMLUtils.xpathString( + res, + XPATH_RESULT, + ArtifactNamespaceContext.INSTANCE); + + if (result == null || result.equals(OPERATION_FAILURE)) { + logger.error("Operation failed."); + throw new ServerException(FAILURE_EXCEPTION); + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + throw new ServerException(FAILURE_EXCEPTION); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ExportServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ExportServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,79 @@ +package org.dive4elements.river.client.server; + +import java.io.OutputStream; +import java.io.IOException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + + +/** + * This service is used to request a data export from the artifact server. The + * response is directed directly to the output stream, so that a file dialog is + * opened. + * + * @author Ingo Weinzierl + */ +public class ExportServiceImpl +extends HttpServlet +{ + private static final Logger logger = + Logger.getLogger(ExportServiceImpl.class); + + + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + logger.info("ExportServiceImpl.doGet"); + + try { + OutputStream out = resp.getOutputStream(); + + String url = getServletContext().getInitParameter("server-url"); + String uuid = req.getParameter("uuid"); + String name = req.getParameter("name"); + String mode = req.getParameter("mode"); + String type = req.getParameter("type"); + String locale = req.getParameter("locale"); + String km = req.getParameter("km"); + String fn = name + "." + type; + + resp.setHeader("Content-Disposition", "attachment;filename=" + fn); + + if (logger.isDebugEnabled()) { + logger.debug("Request " + type + " export."); + } + + Document attr = null; + if (km != null && km.length() > 0) { + attr = XMLUtils.newDocument(); + XMLUtils.ElementCreator ec = + new XMLUtils.ElementCreator(attr, null, null); + Element e = ec.create("km"); + e.setTextContent(km); + attr.appendChild(e); + } + Document request = ClientProtocolUtils.newOutCollectionDocument( + uuid, mode, type, attr); + HttpClient client = new HttpClientImpl(url, locale); + client.collectionOut(request, uuid, mode, out); + + out.close(); + out.flush(); + } + catch (IOException ioe) { + logger.error(ioe, ioe); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/FLYSArtifactCreator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/FLYSArtifactCreator.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,211 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; + +import org.dive4elements.artifacts.httpclient.utils.ArtifactCreator; + +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.CalculationMessage; +import org.dive4elements.river.client.shared.model.ChartArtifact; +import org.dive4elements.river.client.shared.model.DefaultArtifact; +import org.dive4elements.river.client.shared.model.FixAnalysisArtifact; +import org.dive4elements.river.client.shared.model.GaugeDischargeCurveArtifact; +import org.dive4elements.river.client.shared.model.MapArtifact; +import org.dive4elements.river.client.shared.model.MINFOArtifact; +import org.dive4elements.river.client.shared.model.StaticSQRelationArtifact; +import org.dive4elements.river.client.shared.model.WINFOArtifact; + + +/** + * An implementation of an {@link ArtifactCreator}. This class uses the document + * that is returned by the artifact server to parse important information (like + * uuid, hash) and returns a new {@link Artifact} instance. + * + * @author Ingo Weinzierl + */ +public class FLYSArtifactCreator implements ArtifactCreator { + + private static final Logger logger = + Logger.getLogger(FLYSArtifactCreator.class); + + + /** The XPath to the artifact's uuid.*/ + public static final String XPATH_UUID = "/art:result/art:uuid/@art:value"; + + /** The XPath to the artifact's hash value.*/ + public static final String XPATH_HASH = "/art:result/art:hash/@art:value"; + + /** The XPath to the artifact's name value.*/ + public static final String XPATH_NAME = "/art:result/art:name/@art:value"; + + /** The XPath to the value that determines if the artifact is processing in + * background.*/ + public static final String XPATH_BACKGROUND_VALUE = + "/art:result/art:background-processing/@art:value"; + + /** The XPath that points to the (if existing) background messages.*/ + public static final String XPATH_BACKGROUND = + "/art:result/art:background-processing"; + + + /** + * Creates a new instance of an {@link ArtifactCreator}. + */ + public FLYSArtifactCreator() { + } + + + /** + * This concreate implementation returns an instance of {@link Artifact} + * that is used in the FLYS GWT Client code. + * + * @param doc A document that describes the artifact that has been created + * in the artifact server. + * + * @return an instance if {@link Artifact}. + */ + public Object create(Document doc) { + Artifact artifact = extractArtifact(doc); + artifact.setArtifactDescription( + ArtifactDescriptionFactory.createArtifactDescription(doc)); + + return artifact; + } + + + /** + * This method extracts the UUID und HASH information of the returned + * artifact document. + * + * @param doc The result of the CREATE operation. + * + * @return an instance of an {@link Artifact}. + */ + protected Artifact extractArtifact(Document doc) { + logger.debug("FLYSArtifactCreator - extractArtifact()"); + + String uuid = XMLUtils.xpathString( + doc, XPATH_UUID, ArtifactNamespaceContext.INSTANCE); + + String hash = XMLUtils.xpathString( + doc, XPATH_HASH, ArtifactNamespaceContext.INSTANCE); + + String name = XMLUtils.xpathString( + doc, XPATH_NAME, ArtifactNamespaceContext.INSTANCE); + + String backgroundStr = XMLUtils.xpathString( + doc, XPATH_BACKGROUND_VALUE, ArtifactNamespaceContext.INSTANCE); + + boolean background = false; + if (backgroundStr != null && backgroundStr.length() > 0) { + background = Boolean.valueOf(backgroundStr); + } + + List msg = parseBackgroundMessages(doc); + + logger.debug("NEW Artifact UUID: " + uuid); + logger.debug("NEW Artifact HASH: " + hash); + logger.debug("NEW Artifact NAME: " + name); + logger.debug("NEW Artifact IN BACKGROUND: " + background); + + if (name == null) { + return new DefaultArtifact(uuid, hash, background, msg); + } + + name = name.trim(); + + if (name.length() > 0 && name.equals("winfo")) { + logger.debug("+++++ NEW WINFO ARTIFACT."); + return new WINFOArtifact(uuid, hash, background, msg); + } + else if (name.length() > 0 && name.equals("new_map")) { + logger.debug("+++++ NEW MAP ARTIFACT."); + return new MapArtifact(uuid, hash, background, msg); + } + else if (name.length() > 0 && name.equals("new_chart")) { + logger.debug("+++++ NEW CHART ARTIFACT."); + return new ChartArtifact(uuid, hash, background, msg); + } + else if (name.length() > 0 && name.equals("minfo")) { + logger.debug("+++++ NEW MINFO ARTIFACT."); + return new MINFOArtifact(uuid, hash, background, msg); + } + else if (name.length() > 0 && name.equals("fixanalysis")) { + logger.debug("+++++ NEW FIXANALYSIS ARTIFACT."); + return new FixAnalysisArtifact(uuid, hash, background, msg); + } + else if (name.length() > 0 && name.equals("gaugedischargecurve")) { + logger.debug("+++++ NEW GAUGEDISCHARGECURVE ARTIFACT."); + return new GaugeDischargeCurveArtifact(uuid, hash, background, msg); + } + else if (name.length() > 0 && name.equals("staticsqrelation")) { + logger.debug("+++++ STATICSQRELATION ARTIFACT."); + return new StaticSQRelationArtifact(uuid, hash, background, msg); + } + + return new DefaultArtifact(uuid, hash, background, msg); + } + + + public static List parseBackgroundMessages(Document d) { + NodeList list = (NodeList) XMLUtils.xpath( + d, XPATH_BACKGROUND, XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int len = list != null ? list.getLength() : 0; + + logger.debug("Found " + len + " background messages."); + + List res = new ArrayList(len); + + for (int i = 0; i < len; i++) { + CalculationMessage msg = parseBackgroundMessage( + (Element) list.item(i)); + + if (msg != null) { + res.add(msg); + } + } + + return res; + } + + + public static CalculationMessage parseBackgroundMessage(Element e) { + String steps = e.getAttribute("art:steps"); + String currentStep = e.getAttribute("art:currentStep"); + String message = e.getTextContent(); + + int lenCurStep = currentStep != null ? currentStep.length() : 0; + int lenSteps = steps != null ? steps.length() : 0; + int lenMessage = message != null ? message.length() : 0; + + if (lenSteps > 0 && lenMessage > 0 && lenCurStep > 0) { + try { + return new CalculationMessage( + Integer.parseInt(steps), + Integer.parseInt(currentStep), + message); + + } + catch (NumberFormatException nfe) { + nfe.printStackTrace(); + } + } + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/FeedServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/FeedServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,172 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.List; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.client.services.FeedService; + +/** + * This interface provides a method that bundles the artifact specific + * operation FEED. + */ +public class FeedServiceImpl +extends RemoteServiceServlet +implements FeedService +{ + private static final Logger logger = Logger.getLogger(FeedServiceImpl.class); + + + /** XPath that points to the result type of a feed or advance operation.*/ + public static final String XPATH_RESULT = "/art:result/@art:type"; + + /** XPath that points to the result type of a feed or advance operation.*/ + public static final String XPATH_RESULT_MSG = "/art:result/text()"; + + /** A constant that marks errors.*/ + public static final String OPERATION_FAILURE = "FAILURE"; + + /** The error message key that is thrown if an error occured while feeding + * new data.*/ + public static final String ERROR_FEED_DATA = "error_feed_data"; + + + /** + * This method triggers the FEED operation. + * + * @param artifact The artifact that needs to be fed. + * @param data An array of Data objects that contain the information that + * are used for the FEED operation. + * + * @return a new artifact parsed from the description of FEED. + */ + public Artifact feed( + String locale, + Artifact artifact, + Data[] data) + throws ServerException + { + logger.info("StepForwardServiceImpl.feed"); + + String url = getServletContext().getInitParameter("server-url"); + + Document feed = ClientProtocolUtils.newFeedDocument( + artifact.getUuid(), + artifact.getHash(), + createKVP(data)); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document description = (Document) client.feed( + new org.dive4elements.artifacts.httpclient.objects.Artifact( + artifact.getUuid(), + artifact.getHash()), + feed, + new DocumentResponseHandler()); + + if (description == null) { + logger.warn("StepForwardService.feed() - FAILED"); + throw new ServerException(ERROR_FEED_DATA); + } + + String result = XMLUtils.xpathString( + description, + XPATH_RESULT, + ArtifactNamespaceContext.INSTANCE); + + if (result == null || !result.equals(OPERATION_FAILURE)) { + logger.debug("StepForwardService.feed() - SUCCESS"); + return (Artifact) new FLYSArtifactCreator().create(description); + } + else if (result != null && result.equals(OPERATION_FAILURE)) { + String msg = XMLUtils.xpathString( + description, + XPATH_RESULT_MSG, + ArtifactNamespaceContext.INSTANCE); + throw new ServerException(msg); + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + logger.warn("StepForwardService.feed() - FAILED"); + throw new ServerException(ERROR_FEED_DATA); + } + + + /** + * Triggers FEED operation, many artifacts, same data item(s). + * + * @param artifacts Artifacts that shall be fed. + * @param data An array of Data objects that contain the information that + * are used for the FEED operation. + * + * @return a new artifact parsed from the description of FEED. + */ + public List feedMany( + String locale, + List artifacts, + Data[] data) + throws ServerException + { + logger.info("StepForwardServiceImpl.feedMany"); + + String url = getServletContext().getInitParameter("server-url"); + + List resultArtifacts = new ArrayList(); + + for (Artifact artifact: artifacts) { + logger.info("feedMany: Relay to StepForwardServiceImpl.feed"); + Artifact fedArtifact = feed(locale, artifact, data); + resultArtifacts.add(fedArtifact); + } + + return resultArtifacts; + } + + + /** + * This method creates an array of key/value pairs from an array of Data + * objects. The string array is used as parameter for the feed() operation. + * + * @param data The data that should be transformed into the string array. + * + * @return a string array that contains key/value pairs. + */ + protected String[][] createKVP(Data[] data) { + String[][] kvp = new String[data.length][]; + + int i = 0; + + for (Data d: data) { + DataItem[] items = d.getItems(); + String key = d.getLabel(); + String value = d.getStringValue(); + + kvp[i++] = new String[] { key, value }; + } + + return kvp; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/FileUploadServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/FileUploadServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,119 @@ +package org.dive4elements.river.client.server; + +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.fileupload.FileItemIterator; +import org.apache.commons.fileupload.FileItemStream; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +public class FileUploadServiceImpl +extends HttpServlet +{ + private static final Logger logger = Logger.getLogger(FileUploadServiceImpl.class); + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) { + logger.debug("handling post request."); + + String url = getServletContext().getInitParameter("server-url"); + + Document request = createFileXML(req); + + if (request == null) { + return; + } + HttpClient client = new HttpClientImpl(url); + + try { + Document result = client.callService(url, "fileupload", request); + + PrintWriter respWriter = resp.getWriter(); + respWriter.write(""); + respWriter.write("
    "); + + if (result == null) { + logger.warn("FileUpload service returned no result."); + respWriter.write("FileUpload service returned no result"); + } + else { + String status = result.getElementsByTagName("status") + .item(0).getTextContent(); + respWriter.write(status); + } + + respWriter.write("
    "); + respWriter.flush(); + + return; + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + catch (IOException e) { + logger.error(e, e); + } + } + + + protected Document createFileXML(HttpServletRequest req) { + ServletFileUpload upload = new ServletFileUpload(); + + try{ + FileItemIterator iter = upload.getItemIterator(req); + + while (iter.hasNext()) { + FileItemStream item = iter.next(); + InputStream stream = item.openStream(); + + // Process the input stream + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int len; + byte[] buffer = new byte[stream.available()]; + while ((len = stream.read(buffer, 0, buffer.length)) != -1) { + out.write(buffer, 0, len); + } + + buffer = Base64.encodeBase64(buffer); + String b64File = new String(buffer); + + Document fileDoc = XMLUtils.newDocument(); + + ElementCreator ec = new ElementCreator(fileDoc, null, null); + Element root = ec.create("upload"); + Element id = ec.create("artifact-uuid"); + id.setTextContent(req.getParameter("uuid")); + + Element data = ec.create("data"); + data.setTextContent(b64File); + + fileDoc.appendChild(root); + root.appendChild(id); + root.appendChild(data); + + return fileDoc; + } + } + catch(Exception e){ + logger.debug("Failed to create xml document containing the file."); + logger.debug(e, e); + } + return null; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/FixingsKMChartServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/FixingsKMChartServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,113 @@ +package org.dive4elements.river.client.server; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; + +import org.dive4elements.artifacts.httpclient.http.response.StreamResponseHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +public class FixingsKMChartServiceImpl +extends HttpServlet +{ + private static final Logger log = + Logger.getLogger(FixingsKMChartServiceImpl.class); + + public static final String SERVICE_NAME = "fixings-km-chart"; + + public FixingsKMChartServiceImpl() { + } + + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + + log.info("FixingsKMChartServiceImpl.doGet"); + + String url = getServletContext().getInitParameter("server-url"); + String locale = req.getParameter("locale"); + String filter = req.getParameter("filter"); + + if (filter == null || filter.length() == 0) { + log.warn("Missing 'filter' parameter."); + return; + } + + if (locale == null || locale.length() == 0) { + locale = "de"; + } + + Document filterDoc = XMLUtils.jsonToXML(filter); + + if (filterDoc == null) { + log.warn("Creating filter document failed."); + return; + } + + InputStream in; + + try { + HttpClient client = new HttpClientImpl(url, locale); + in = (InputStream)client.callService( + url, // XXX: Why? The URL is passed by construction already. + SERVICE_NAME, + filterDoc, + new StreamResponseHandler()); + } + catch (ConnectionException ce) { + log.error(ce); + return; + } + + resp.setHeader("Content-Type", guessMIMEType(filterDoc)); + + try { + OutputStream out = resp.getOutputStream(); + + byte [] buf = new byte[4096]; + int i = -1; + while ((i = in.read(buf)) >= 0) { + out.write(buf, 0, i); + } + out.flush(); + } + catch (IOException ioe) { + log.error(ioe); + } + finally { + try { in.close(); } + catch (IOException ioe) { /* ignored */ } + } + } + + protected static String guessMIMEType(Document document) { + + NodeList formats = document.getElementsByTagName("format"); + + String format = "png"; + + if (formats.getLength() > 0) { + String type = ((Element)formats.item(0)).getAttribute("type"); + if (type.length() > 0) { + format = type; + } + } + + return "image/" + format; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/FixingsOverviewServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/FixingsOverviewServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,240 @@ +package org.dive4elements.river.client.server; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.common.utils.XSLTransformer; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.client.services.FixingsOverviewService; + +import org.dive4elements.river.client.shared.exceptions.ServerException; + +import org.dive4elements.river.client.shared.model.FixingsOverviewInfo.FixEvent; +import org.dive4elements.river.client.shared.model.FixingsOverviewInfo.Sector; + +import org.dive4elements.river.client.shared.model.FixingsOverviewInfo; + +import java.io.IOException; +import java.io.InputStream; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +public class FixingsOverviewServiceImpl +extends RemoteServiceServlet +implements FixingsOverviewService +{ + private static final Logger log = + Logger.getLogger(FixingsOverviewServiceImpl.class); + + public static final String SERVICE_NAME = "fixings-overview"; + + public static final String XSL_TRANSFORM = + "/WEB-INF/stylesheets/fixoverview2html.xsl"; + + protected static final String XPATH_RID = "/fixings/river/@rid"; + protected static final String XPATH_RIVER = "/fixings/river/@name"; + protected static final String XPATH_RFROM = "/fixings/river/@from"; + protected static final String XPATH_RTO = "/fixings/river/@to"; + + protected static final String XPATH_EVENT = "/fixings/events/event"; + + + @Override + public FixingsOverviewInfo generateOverview( + String locale, + String uuid, + String filter, + boolean checkboxes, + String callback + ) + throws ServerException + { + log.info("FixingsOverviewServiceImpl.doGet"); + + if (filter == null || filter.length() == 0) { + log.warn("Missing 'filter' parameter."); + return null; + } + + boolean debug = log.isDebugEnabled(); + + if (debug) { + log.debug("JSON filter: ------------------"); + log.debug(filter); + } + + Document filterDoc = XMLUtils.jsonToXML(filter); + + if (filterDoc == null) { + log.warn("Creating filter document failed."); + return null; + } + + if (debug) { + log.debug("XML filter: ------------------"); + log.debug(XMLUtils.toString(filterDoc)); + } + + try { + String url = getServletContext().getInitParameter("server-url"); + HttpClient client = new HttpClientImpl(url, locale); + Document resultDoc = + client.callService(url, SERVICE_NAME, filterDoc); + + if (debug) { + log.debug("Result XML: -----------"); + log.debug(XMLUtils.toString(resultDoc)); + } + + FixingsOverviewInfo i = getInfo( + locale, resultDoc, uuid, checkboxes, callback); + return i; + } + catch (ConnectionException ce) { + log.error(ce); + } + return null; + } + + + protected FixingsOverviewInfo getInfo( + String locale, + Document doc, + String uuid, + boolean checkboxes, + String callback + ) { + // TODO: Find a more general solution. + locale = locale == null || locale.toLowerCase().startsWith("de") + ? "de" + : "en"; + + InputStream transform = getServletContext() + .getResourceAsStream(XSL_TRANSFORM); + + if (transform == null) { + log.warn("transform not found"); + return null; + } + + String result = null; + try { + XSLTransformer xformer = new XSLTransformer(); + xformer.addParameter("locale", locale); + xformer.addParameter("project-uuid", uuid); + xformer.addParameter( + "render-checkboxes", + checkboxes ? Boolean.TRUE : Boolean.FALSE); + xformer.addParameter("callback", callback); + result = xformer.transform(doc, transform); + } + finally { + try { transform.close(); } + catch (IOException ioe) {} + } + + if (log.isDebugEnabled()) { + log.debug("--------------------------------------"); + log.debug(result); + log.debug("--------------------------------------"); + } + + int rid = -1; + double from = -1; + double to = -1; + + String rid_str = XMLUtils.xpathString(doc, XPATH_RID, null); + String river = XMLUtils.xpathString(doc, XPATH_RIVER, null); + String from_str = XMLUtils.xpathString(doc, XPATH_RFROM, null); + String to_str = XMLUtils.xpathString(doc, XPATH_RTO, null); + + try { + rid = Integer.parseInt(rid_str); + from = Double.parseDouble(from_str); + to = Double.parseDouble(to_str); + } + catch(NumberFormatException nfe) { + log.warn(nfe, nfe); + } + + List fixEvents = getFixEvents(doc); + return new FixingsOverviewInfo( + rid, + river, + from, + to, + fixEvents, + result); + } + + + protected List getFixEvents(Document doc) { + List list = new ArrayList(); + + NodeList events = (NodeList) XMLUtils.xpath( + doc, + XPATH_EVENT, + XPathConstants.NODESET, + null); + + if (events == null || events.getLength() == 0) { + log.warn("No events in Overview!"); + return list; + } + + for (int i = 0, E = events.getLength(); i < E; i++) { + Element n = (Element)events.item(i); + List sectors = getSectors(n); + String cid = n.getAttribute("cid"); + String date = n.getAttribute("date");; + String name = n.getAttribute("description"); + list.add(new FixEvent( cid, date, name, sectors)); + } + return list; + } + + protected List getSectors(Element event) { + NodeList sectors = event.getElementsByTagName("sector"); + + if (sectors.getLength() == 0) { + log.warn("No Sectors in Event!"); + return null; + } + + List list = new ArrayList(); + for (int i = 0, S = sectors.getLength(); i < S; i++) { + Element n = (Element)sectors.item(i); + int cls = -1; + double from = -1; + double to = -1; + String cls_str = n.getAttribute("class"); + String from_str = n.getAttribute("from"); + String to_str = n.getAttribute("to"); + try { + cls = Integer.parseInt(cls_str); + from = Double.parseDouble(from_str); + to = Double.parseDouble(to_str); + } + catch(NumberFormatException nfe) { + log.warn(nfe, nfe); + } + list.add(new Sector(cls, from, to)); + } + return list; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/GCServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/GCServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,30 @@ +package org.dive4elements.river.client.server; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.apache.log4j.Logger; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Capabilities; +import org.dive4elements.river.client.client.services.GCService; + + +/** + * @author Ingo Weinzierl + */ +public class GCServiceImpl +extends RemoteServiceServlet +implements GCService +{ + private static Logger logger = Logger.getLogger(GCServiceImpl.class); + + + public Capabilities query(String path) + throws ServerException + { + logger.info("GCServiceImpl.query"); + + return CapabilitiesParser.getCapabilities(path); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/GFIServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/GFIServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,275 @@ +package org.dive4elements.river.client.server; + +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.AttributedTheme; +import org.dive4elements.river.client.shared.model.FeatureInfo; +import org.dive4elements.river.client.shared.model.FeatureInfoResponse; +import org.dive4elements.river.client.shared.model.Theme; + +import org.dive4elements.river.client.client.services.GFIService; + + +/** + * @author Ingo Weinzierl + */ +public class GFIServiceImpl +extends RemoteServiceServlet +implements GFIService +{ + public static final String ERR_NO_VALID_GFI_URL = + "error_no_valid_gfi_url"; + + public static final String ERR_GFI_REQUEST_FAILED = + "error_gfi_req_failed"; + + public static final String ERR_PARSING_RESPONSE_FAILED = + "error_gfi_parsing_failed"; + + + private static final Logger logger = + Logger.getLogger(GFIServiceImpl.class); + + + /** + * @param theme + * @param format + * @param bbox + * @param height + * @param width + * @param x + * @param y + * + * @return + */ + public FeatureInfoResponse query( + Theme theme, + String format, + String bbox, + String projection, + int height, + int width, + int x, + int y + ) throws ServerException + { + logger.info("GFIServiceImpl.query"); + + String path = createGetFeautureInfoURL( + theme, format, bbox, projection, height, width, x, y); + + logger.debug("URL=" + path); + + try { + URL url = new URL(path); + + URLConnection conn = url.openConnection(); + conn.connect(); + + InputStream is = conn.getInputStream(); + + return parseResponse(is); + + } + catch (IOException ioe) { + logger.warn(ioe, ioe); + } + + throw new ServerException(ERR_GFI_REQUEST_FAILED); + } + + + /** + * @param map + * @param theme + * @param format + * @param x + * @param y + * + * @return + */ + protected String createGetFeautureInfoURL( + Theme theme, + String infoFormat, + String bbox, + String projection, + int height, + int width, + int x, + int y + ) throws ServerException + { + String url = getUrl(theme); + + if (url == null || url.length() == 0) { + throw new ServerException(ERR_NO_VALID_GFI_URL); + } + + String layers = ((AttributedTheme)theme).getAttr("layers"); + + StringBuilder sb = new StringBuilder(); + sb.append(url); + + if (url.indexOf("?") < 0) { + sb.append("?SERVICE=WMS"); + } + else { + sb.append("&SERVICE=WMS"); + } + + sb.append("&VERSION=1.1.1"); + sb.append("&REQUEST=GetFeatureInfo"); + sb.append("&LAYERS=" + layers); + sb.append("&QUERY_LAYERS=" + layers); + sb.append("&BBOX=" + bbox); + sb.append("&HEIGHT=" + height); + sb.append("&WIDTH=" + width); + sb.append("&FORMAT=image/png"); + sb.append("&INFO_FORMAT=" + infoFormat); + sb.append("&SRS=" + projection); + sb.append("&X=" + String.valueOf(x)); + sb.append("&Y=" + String.valueOf(y)); + + return sb.toString(); + } + + + protected String getUrl(Theme theme) { + AttributedTheme attr = (AttributedTheme) theme; + return attr.getAttr("url"); + } + + + protected FeatureInfoResponse parseResponse(InputStream is) { + logger.debug("GFIServiceImpl.parseResponse"); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte [] buf = new byte[1024]; + + int r = -1; + try { + while ((r = is.read(buf)) >= 0) { + baos.write(buf, 0, r); + } + } catch (IOException ex) { + logger.warn("GetFeatureInfo response could not be read: ", ex); + return new FeatureInfoResponse(); + } + + String content; + try { + content = baos.toString("UTF-8"); + } + catch (UnsupportedEncodingException uee) { + content = baos.toString(); + } + + Document response = XMLUtils.parseDocument(content); + if (response != null) { + List features = new ArrayList(); + parseFeatureInfos(response, features); + return new FeatureInfoResponse(features, null); + } + // Unable to parse just return the response as is + return new FeatureInfoResponse(new ArrayList(), content); + } + + + protected void parseFeatureInfos(Node node, List features) { + logger.debug("GFIServiceImpl.parseFeatureInfos"); + + String name = node.getNodeName(); + + if (name.endsWith("_layer")) { + features.add(parseFeature(node)); + + return; + } + + NodeList children = node.getChildNodes(); + + if (children != null && children.getLength() > 0) { + for (int i = 0, n = children.getLength(); i < n; i++) { + parseFeatureInfos(children.item(i), features); + } + } + } + + + protected FeatureInfo parseFeature(Node node) { + logger.debug("GFIServiceImpl.parseFeature"); + + String layername = node.getNodeName(); + + FeatureInfo f = new FeatureInfo(layername); + + NodeList children = node.getChildNodes(); + int numChildren = children != null ? children.getLength() : 0; + + logger.debug("Feature '" + layername + "' has " + numChildren + " nodes."); + + for (int i = 0; i < numChildren; i++) { + Node tmp = children.item(i); + String nodeName = tmp.getNodeName(); + + logger.debug(" node name: '" + nodeName + "'"); + + if (nodeName.equals("gml:name")) { + logger.debug("NAME node has child: " + tmp.getFirstChild().getNodeValue()); + f.setLayername(tmp.getFirstChild().getNodeValue()); + } + else if (nodeName.endsWith("_feature")) { + parseFeatureAttributes(tmp, f); + } + } + + return f; + } + + + protected void parseFeatureAttributes(Node node, FeatureInfo f) { + logger.debug("GFIServiceImpl.parseFeatureAttributes"); + + NodeList children = node.getChildNodes(); + int numChildren = children != null ? children.getLength() : 0; + + logger.debug("Has " + numChildren + " attributes."); + + for (int i = 0; i < numChildren; i++) { + Node tmp = children.item(i); + String name = tmp.getNodeName(); + + logger.debug(" tmp attribute name: '" + name + "'"); + + if (name.equals("gml:boundedBy")) { + // TODO + } + else { + Node child = tmp.getFirstChild(); + if (child != null) { + f.addAttr(name, child.getNodeValue()); + } + } + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/GGInATrustStrategy.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/GGInATrustStrategy.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,20 @@ +package org.dive4elements.river.client.server; + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import org.apache.http.conn.ssl.TrustStrategy; + +public class GGInATrustStrategy implements TrustStrategy { + + /** + * Tempoary class to accept all certificates for GGinA Authentication + */ + + @Override + public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { + // FIXME validate Certificate + return true; + } +} + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/GaugeInfoServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/GaugeInfoServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,155 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.client.services.GaugeInfoService; +import org.dive4elements.river.client.shared.model.Gauge; +import org.dive4elements.river.client.shared.model.GaugeImpl; + + +/** + * @author Ingo Weinzierl + */ +public class GaugeInfoServiceImpl +extends RemoteServiceServlet +implements GaugeInfoService +{ + private static final Logger logger = + Logger.getLogger(GaugeInfoServiceImpl.class); + + + public static final String ERROR_NO_GAUGES_FOUND = + "error_no_gaugeinfo_found"; + + public static final String XPATH_GAUGES = "art:service/art:gauge"; + + + public List getGaugeInfo(String rivername, String refnumber) + throws ServerException + { + logger.info("GaugeInfoServiceImpl.getGaugeInfo"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element river = ec.create("river"); + ec.addAttr(river, "name", rivername); + + if (refnumber != null && refnumber.length() > 0) { + Element filter = ec.create("filter"); + Element gauge = ec.create("gauge"); + gauge.setTextContent(refnumber); + + filter.appendChild(gauge); + river.appendChild(filter); + } + + doc.appendChild(river); + + HttpClient client = new HttpClientImpl(url); + + try { + Document result = client.callService(url, "gaugeinfo", doc); + + logger.debug("Extract gauge info now."); + List gauges = extractGauges(result); + + if (gauges != null && gauges.size() > 0) { + return gauges; + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_GAUGES_FOUND); + } + + + /** + * Extracts all wq info objects from result document. + * + * @param result The document retrieved by the server. + * + * @return a list of WQInfoObjects. + */ + protected List extractGauges(Document result) + throws ServerException + { + List gauges = new ArrayList(); + + NodeList list = (NodeList) XMLUtils.xpath( + result, + XPATH_GAUGES, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (list == null || list.getLength() == 0) { + logger.warn("No gauges found."); + + throw new ServerException(ERROR_NO_GAUGES_FOUND); + } + + int num = list.getLength(); + logger.debug("Response contains " + num + " objects."); + + for (int i = 0; i < num; i++) { + Gauge obj = buildGauge((Element) list.item(i)); + + if (obj != null) { + gauges.add(obj); + } + } + + logger.debug("Retrieved " + gauges.size() + " gauges."); + + return gauges; + } + + + protected Gauge buildGauge(Element ele) { + String name = ele.getAttribute("name"); + String lowerStr = ele.getAttribute("lower"); + String upperStr = ele.getAttribute("upper"); + + if (lowerStr != null && upperStr != null) { + try { + return new GaugeImpl( + name, + Double.valueOf(lowerStr), + Double.valueOf(upperStr)); + } + catch (NumberFormatException nfe) { + logger.warn("Error while Gauge creation: " + nfe.getMessage()); + } + } + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/GetArtifactServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/GetArtifactServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,87 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.client.services.GetArtifactService; + + +/** + * This service provides a method that returns an artifact based on its + * identifier. + * + * @author Ingo Weinzierl + */ +public class GetArtifactServiceImpl +extends RemoteServiceServlet +implements GetArtifactService +{ + private static final Logger logger = + Logger.getLogger(GetArtifactServiceImpl.class); + + + public static final String ERROR_DESCRIBE_ARTIFACT = + "error_describe_artifact"; + + public static final String XPATH_RESULT = "/art:result/text()"; + + public static final String OPERATION_FAILURE = "FAILED"; + + + public Artifact getArtifact( + String locale, + String uuid, + String hash) + throws ServerException + { + logger.info("GetArtifactServiceImpl.getArtifact"); + + String url = getServletContext().getInitParameter("server-url"); + + Document describe = ClientProtocolUtils.newDescribeDocument( + uuid, hash, true); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document description = (Document) client.describe( + new org.dive4elements.artifacts.httpclient.objects.Artifact( + uuid, hash), + describe, + new DocumentResponseHandler()); + + if (description == null) { + throw new ServerException(ERROR_DESCRIBE_ARTIFACT); + } + + String result = XMLUtils.xpathString( + description, + XPATH_RESULT, + ArtifactNamespaceContext.INSTANCE); + + if (result == null || !result.equals(OPERATION_FAILURE)) { + return (Artifact) new FLYSArtifactCreator().create(description); + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_DESCRIBE_ARTIFACT); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/LoadArtifactServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/LoadArtifactServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,147 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.HashMap; + +import org.apache.log4j.Logger; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.Recommendation; + +import org.dive4elements.river.client.client.services.LoadArtifactService; + +/** + * This service creates a new Artifact based on a given Recommendation and puts + * this new artifact into a specified Collection. + * + * @author Ingo Weinzierl + */ +public class LoadArtifactServiceImpl +extends ArtifactServiceImpl +implements LoadArtifactService +{ + private static final Logger logger = + Logger.getLogger(LoadArtifactServiceImpl.class); + + /** Error. */ + public static final String ERROR_LOAD_ARTIFACT = "error_load_artifact"; + + + /** + * Clones or creates a single artifact and adds it to a collection. + * + * Note that in contrast to loadMany, always the given factory is used + * to clone the artifact. + * + * @param parent collection to add recommendation to. + * @param recom recommendation to create clone for. + * @param factory factory to use. + * @param locale the locale to translate messages. + */ + public Artifact load( + Collection parent, + Recommendation recom, + String factory, + String locale + ) + throws ServerException { + logger.info( + "LoadArtifactServiceImpl.load: " + recom.getMasterArtifact()); + + String url = getServletContext().getInitParameter("server-url"); + + // 1) Clone the Artifact specified in >>recom<< + Artifact clone = ArtifactHelper.createArtifact( + url, locale, factory, recom); + + if (clone != null) { + logger.debug("Successfully create Artifact Clone. Add now!"); + Collection c = CollectionHelper.addArtifact( + parent, clone, url, locale); + + if (c != null) { + logger.debug("Successfully added Clone to Collection."); + + return clone; + } + } + + throw new ServerException(ERROR_LOAD_ARTIFACT); + } + + + /** + * Clone/create one or more artifacts and add it to a collection, avoiding + * duplicates. + * + * @param parent Collection where clones will be added to. + * @param recoms definitions of source of clone. + * @param factory name of factory to use when cloning artifacts (can be + * null in which case the recommendations getFactory() will + * be used. + * @param locale the locale to translate messages. + * + * @return cloned artifacts (same artifact might be contained multiple + * times). + */ + public Artifact[] loadMany( + Collection parent, + Recommendation[] recoms, + String factory, + String locale + ) + throws ServerException { + logger.debug("LoadArtifactServiceImpl.loadMany"); + + String url = getServletContext().getInitParameter("server-url"); + + ArrayList artifacts = new ArrayList(); + HashMap cloneMap = + new HashMap(); + + // TODO Respect the index of what to clone. + + // 1) Clone the Artifacts specified in >>recoms<< + for (Recommendation recom : recoms) { + // Do not do two clones of two identical recommendations. + Artifact prevClone = cloneMap.get(recom); + if (prevClone != null) { + // Already cloned a recommendation like this. + logger.debug("LoadArtifactServiceImpl: Avoid reclones, " + + "clone already exists."); + artifacts.add(prevClone); + } + else { + // Not already cloned. + String realFactory = factory != null + ? factory + : recom.getFactory(); + + logger.debug("One will be cloned with : " + realFactory); + + Artifact clone = ArtifactHelper.createArtifact( + url, locale, realFactory, recom); + + if (clone != null) { + logger.debug("LoadArtifactServiceImple: Successfully " + + "loaded Artifact Clone."); + Collection c = CollectionHelper.addArtifact( + parent, clone, url, locale); + + if (c != null) { + artifacts.add(clone); + // Remember we cloned a recommendation like this. + cloneMap.put(recom, clone); + } + else { + throw new ServerException(ERROR_LOAD_ARTIFACT); + } + } + } + } + return artifacts.toArray(new Artifact[artifacts.size()]); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/LoggingConfigurator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/LoggingConfigurator.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,28 @@ +package org.dive4elements.river.client.server; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; + + +public class LoggingConfigurator { + + private static final Logger logger = + Logger.getLogger(LoggingConfigurator.class); + + + private LoggingConfigurator() { + } + + public static void init(String log4jProperties) { + if (log4jProperties != null && log4jProperties.length() > 0) { + PropertyConfigurator.configure(log4jProperties); + logger.info("Log4J logging initialized."); + } + else { + System.out.println("Error while setting up Log4J configuration."); + } + + System.out.println("LoggingConfigurator.init finished"); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/LoginServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/LoginServlet.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,120 @@ +package org.dive4elements.river.client.server; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; + +import org.dive4elements.river.client.server.auth.Authentication; +import org.dive4elements.river.client.server.auth.AuthenticationException; +import org.dive4elements.river.client.server.auth.AuthenticationFactory; +import org.dive4elements.river.client.server.auth.User; +import org.dive4elements.river.client.server.auth.UserClient; +import org.dive4elements.river.client.server.features.Features; + +public class LoginServlet extends HttpServlet { + + private static Logger logger = Logger.getLogger(LoginServlet.class); + + private static final String FLYS_PAGE = "FLYS.html"; + private static final String LOGIN_PAGE = "login.jsp"; + + private void redirectFailure(HttpServletResponse resp, String path) + throws IOException { + resp.sendRedirect(path + "/" + LOGIN_PAGE); + } + + private void redirectFailure(HttpServletResponse resp, String path, + Exception e) throws IOException { + this.redirectFailure(resp, path, e.getMessage()); + } + + private void redirectFailure(HttpServletResponse resp, String path, + String message) throws IOException { + resp.sendRedirect(path + "/" + LOGIN_PAGE + "?error=" + message); + } + + private void redirectSuccess(HttpServletResponse resp, String path, + String uri) throws IOException { + if (uri == null) { + String redirecturl = getServletContext().getInitParameter("redirect-url"); + if (redirecturl == null) { + redirecturl = FLYS_PAGE; + } + uri = "/" + redirecturl; + } + resp.sendRedirect(uri); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + logger.debug("Processing get request"); + this.redirectFailure(resp, req.getContextPath()); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException + { + String encoding = req.getCharacterEncoding(); + String username = req.getParameter("username"); + String password = req.getParameter("password"); + + logger.debug("Processing post request"); + + if (username == null || password == null) { + logger.debug("No username or password provided"); + this.redirectFailure(resp, req.getContextPath()); + return; + } + + try { + Authentication aresp = this.auth(username, password, encoding); + if (aresp == null || !aresp.isSuccess()) { + logger.debug("Authentication not successful"); + this.redirectFailure(resp, req.getContextPath()); + return; + } + User user = aresp.getUser(); + + String url = getServletContext().getInitParameter("server-url"); + UserClient client = new UserClient(url); + if (!client.userExists(user)) { + logger.debug("Creating db user"); + if (!client.createUser(user)) { + this.redirectFailure(resp, req.getContextPath(), + "Could not create new user"); + return; + } + } + + HttpSession session = req.getSession(); + session.setAttribute("user", user); + + String uri = (String)session.getAttribute("requesturi"); + + this.redirectSuccess(resp, req.getContextPath(), uri); + } + catch(AuthenticationException e) { + logger.error(e, e); + this.redirectFailure(resp, req.getContextPath(), e); + } + } + + private Authentication auth(String username, String password, String encoding) + throws AuthenticationException, IOException + { + ServletContext sc = this.getServletContext(); + Features features = (Features)sc.getAttribute(Features.CONTEXT_ATTRIBUTE); + String auth = sc.getInitParameter("authentication"); + return AuthenticationFactory.getInstance(auth).auth(username, password, + encoding, features); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/MapHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/MapHelper.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,91 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.river.client.shared.model.MapConfig; + + +public class MapHelper { + + private static final Logger logger = Logger.getLogger(MapHelper.class); + + + public static final String XPATH_SRID = + "/art:floodmap/art:srid/text()"; + + public static final String XPATH_MAX_EXTENT = + "/art:floodmap/art:maxExtent/text()"; + + public static final String XPATH_INITIAL_EXTENT = + "/art:floodmap/art:initialExtent/text()"; + + + private MapHelper() { + } + + + public static MapConfig parseConfig(Document raw) { + logger.debug("MapHelper.parseConfig"); + + if (logger.isDebugEnabled()) { + logger.debug(XMLUtils.toString(raw)); + } + + MapConfig config = new MapConfig(); + + setSrid(config, raw); + setMaxExtent(config, raw); + setInitialExtent(config, raw); + + return config; + } + + + protected static void setSrid(MapConfig config, Document raw) { + String srid = (String) XMLUtils.xpathString( + raw, + XPATH_SRID, + ArtifactNamespaceContext.INSTANCE); + + logger.debug("Found srid: '" + srid + "'"); + + if (srid != null && srid.length() > 0) { + logger.debug("Set srid: '" + srid + "'"); + config.setSrid(srid); + } + } + + + protected static void setMaxExtent(MapConfig config, Document raw) { + String maxExtent = (String) XMLUtils.xpathString( + raw, + XPATH_MAX_EXTENT, + ArtifactNamespaceContext.INSTANCE); + + logger.debug("Found max extent: '" + maxExtent + "'"); + + if (maxExtent != null && maxExtent.length() > 0) { + logger.debug("Set max extent: '" + maxExtent + "'"); + config.setMaxExtent(maxExtent); + } + } + + + protected static void setInitialExtent(MapConfig config, Document raw) { + String initialExtent = (String) XMLUtils.xpathString( + raw, + XPATH_INITIAL_EXTENT, + ArtifactNamespaceContext.INSTANCE); + + if (initialExtent != null && initialExtent.length() > 0) { + logger.debug("Set initial extent: '" + initialExtent + "'"); + config.setInitialExtent(initialExtent); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/MapInfoServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/MapInfoServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,138 @@ +package org.dive4elements.river.client.server; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.river.client.client.services.MapInfoService; +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.BBox; +import org.dive4elements.river.client.shared.model.MapInfo; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + + +/** + * This service fetches a document that contains meta information for a specific + * chart. + * + * @author Ingo Weinzierl + */ +public class MapInfoServiceImpl +extends RemoteServiceServlet +implements MapInfoService +{ + private static final Logger logger = + Logger.getLogger(MapInfoServiceImpl.class); + + + public static final String XPATH_RIVER = + "/mapinfo/river/@name"; + + public static final String XPATH_SRID = + "/mapinfo/river/srid/@value"; + + public static final String XPATH_BBOX = + "/mapinfo/river/bbox/@value"; + + public static final String XPATH_RIVER_WMS = + "/mapinfo/river/river-wms/@url"; + + public static final String XPATH_RIVER_LAYERS = + "/mapinfo/river/river-wms/@layers"; + + public static final String XPATH_WMS_URL = + "/mapinfo/river/background-wms/@url"; + + public static final String XPATH_WMS_LAYERS = + "/mapinfo/river/background-wms/@layers"; + + public static final String ERROR_NO_MAPINFO_FOUND = + "mapinfo_service_no_result"; + + + @Override + public MapInfo getMapInfo(String locale, String river) + throws ServerException + { + logger.info("MapInfoServiceImpl.getMapInfo"); + + String url = getServletContext().getInitParameter("server-url"); + + Document request = getRequestDocument(river, "rivermap"); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + logger.debug("MapInfoServiceImpl.callService"); + Document result = client.callService(url, "mapinfo", request); + + if (result == null) { + logger.warn("MapInfo service returned no result."); + throw new ServerException(ERROR_NO_MAPINFO_FOUND); + } + + return getMapInfo(result); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_MAPINFO_FOUND); + } + + + public static Document getRequestDocument(String rivername, String maptypeStr) { + logger.debug("MapInfoServiceImpl.getRequestDocument"); + + Document request = XMLUtils.newDocument(); + ElementCreator cr = new ElementCreator(request, null, null); + + Element root = cr.create("mapinfo"); + Element river = cr.create("river"); + Element maptype = cr.create("maptype"); + + river.setTextContent(rivername); + maptype.setTextContent(maptypeStr); + + request.appendChild(root); + root.appendChild(river); + root.appendChild(maptype); + + return request; + } + + + public static MapInfo getMapInfo(Document result) { + logger.debug("MapInfoServiceImpl.getMapInfo"); + + String river = XMLUtils.xpathString(result, XPATH_RIVER, null); + String sridStr = XMLUtils.xpathString(result, XPATH_SRID, null); + String bboxS = XMLUtils.xpathString(result, XPATH_BBOX, null); + BBox bbox = BBox.getBBoxFromString(bboxS); + + String riverWMS = XMLUtils.xpathString(result, XPATH_RIVER_WMS, null); + String riverLayers = XMLUtils.xpathString(result, XPATH_RIVER_LAYERS, null); + String wmsURL = XMLUtils.xpathString(result, XPATH_WMS_URL, null); + String wmsLayers = XMLUtils.xpathString(result, XPATH_WMS_LAYERS, null); + + int srid = 4326; + + try { + srid = Integer.parseInt(sridStr); + } + catch (NumberFormatException nfe) { + GWT.log("Could not parse SRID String: " + sridStr); + } + + return new MapInfo( + river, srid, bbox, riverWMS, riverLayers, wmsURL, wmsLayers); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/MapOutputServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/MapOutputServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,82 @@ +package org.dive4elements.river.client.server; + +import java.io.InputStream; +import java.io.IOException; + +import java.util.Map; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.MapConfig; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.client.services.MapOutputService; + + +public class MapOutputServiceImpl +extends RemoteServiceServlet +implements MapOutputService +{ + + private static final Logger logger = + Logger.getLogger(MapOutputServiceImpl.class); + + + public static final String ERROR_NO_MAP_CONFIG = "error_no_map_config"; + + public static final String ERROR_NO_MAP_OUTPUT_TYPE = "error_no_map_output_type"; + + public MapConfig doOut(Collection collection) + throws ServerException + { + logger.info("MapOutputServiceImpl.doOut"); + + String url = getServletContext().getInitParameter("server-url"); + String uuid = collection.identifier(); + + Map modes = collection.getOutputModes(); + String requestMode = ""; + if (modes.containsKey("floodmap")) { + requestMode = "floodmap"; + } + else if (modes.containsKey("map")) { + requestMode = "map"; + } + else { + throw new ServerException(ERROR_NO_MAP_OUTPUT_TYPE); + } + + try { + Document request = ClientProtocolUtils.newOutCollectionDocument( + uuid, requestMode, requestMode); + + HttpClient client = new HttpClientImpl(url); + InputStream is = client.collectionOut(request, uuid, requestMode); + + Document response = XMLUtils.parseDocument(is); + + return MapHelper.parseConfig(response); + } + catch (ConnectionException e) { + logger.error(e, e); + } + catch (IOException ioe) { + logger.error(ioe, ioe); + } + + throw new ServerException(ERROR_NO_MAP_CONFIG); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/MapPrintServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/MapPrintServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,532 @@ +package org.dive4elements.river.client.server; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.JSON; +import org.dive4elements.artifacts.common.utils.StringUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; +import org.dive4elements.river.client.shared.MapUtils; +import org.dive4elements.river.client.shared.model.MapConfig; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +/* +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +*/ +/* Used by direct API call. -> Enforce GPLv3 +import org.mapfish.print.MapPrinter; +import org.mapfish.print.output.OutputFactory; +import org.mapfish.print.output.OutputFormat; + +import org.mapfish.print.utils.PJsonObject; +*/ + +public class MapPrintServiceImpl +extends HttpServlet +{ + private static final Logger log = + Logger.getLogger(MapPrintServiceImpl.class); + + protected static class Layer implements Comparable { + + protected int pos; + protected String url; + protected String layers; + protected String description; + + public Layer() { + } + + public boolean setup(Element element) { + + Element parent = (Element)element.getParentNode(); + String parentName = parent.getAttribute("name"); + if (!(parentName.equals("map") + || parentName.equals("floodmap"))) { + return false; + } + + String ns = ArtifactNamespaceContext.NAMESPACE_URI; + + String visible = element.getAttributeNS(ns, "visible"); + String active = element.getAttributeNS(ns, "active"); + + if (visible.equals("0") || active.equals("0")) { + return false; + } + + url = element.getAttributeNS(ns, "url"); + layers = element.getAttributeNS(ns, "layers"); + description = element.getAttributeNS(ns, "description"); + + try { + pos = Integer.parseInt(element.getAttributeNS(ns, "pos")); + } + catch (NumberFormatException nfe) { + return false; + } + + return true; + } + + public Map toMap() { + Map layer = new LinkedHashMap(); + + layer.put("type", "WMS"); + List subLayers = new ArrayList(1); + subLayers.add(layers); + layer.put("layers", subLayers); + // XXX: osm.intevation.de mapache only offers low dpi maps + // so we need to use the uncached service + layer.put("baseURL", url.replace("http://osm.intevation.de/mapcache/?", + "http://osm.intevation.de/cgi-bin/germany.fcgi?")); + layer.put("format", "image/png"); // TODO: Make configurable. + + return layer; + } + + @Override + public int compareTo(Layer other) { + int d = pos - other.pos; + if (d < 0) return -1; + return d > 0 ? +1 : 0; + } + } // class Layer + + protected static String generateSpec( + Document descDocument, + MapConfig mapConfig, + Double minX, Double minY, + Double maxX, Double maxY, + Map pageSpecs + ) { + Map spec = new LinkedHashMap(); + int dpi = 254; + spec.put("layout", "A4 landscape"); + spec.put("pageSize", "A4"); + spec.put("landscape", "true"); + spec.put("srs", "EPSG:" + mapConfig.getSrid()); + spec.put("dpi", dpi); + spec.put("units", "m"); + spec.put("geodaetic", "true"); + spec.put("outputFormat", "pdf"); + + spec.putAll(pageSpecs); + + String ns = ArtifactNamespaceContext.NAMESPACE_URI; + + List ls = new ArrayList(); + Layer l = new Layer(); + + NodeList facets = descDocument.getElementsByTagNameNS(ns, "facet"); + + for (int i = 0, N = facets.getLength(); i < N; ++i) { + Element element = (Element)facets.item(i); + if (l.setup(element)) { + ls.add(l); + l = new Layer(); + } + } + + // Establish Z order. + Collections.sort(ls); + + List layers = new ArrayList(ls.size()); + + for (int i = ls.size()-1; i >= 0; --i) { + layers.add(ls.get(i).toMap()); + } + + spec.put("layers", layers); + spec.put("name", "Name"); + + List pages = new ArrayList(1); + + + Map page = new LinkedHashMap(); + + List bounds = new ArrayList(4); + bounds.add(minX); + bounds.add(minY); + bounds.add(maxX); + bounds.add(maxY); + page.put("bbox", bounds); + + /* + bounds.add(Double.valueOf((minX+maxX)*0.5)); + bounds.add(Double.valueOf((minY+maxY)*0.5)); + + page.put("center", bounds); + page.put("scale", Integer.valueOf(50000)); + */ + + page.put("rotation", Integer.valueOf(0)); + + // This may overwrite default settings above + page.putAll(pageSpecs); + + pages.add(page); + spec.put("pages", pages); + + List legends = new ArrayList(layers.size()); + + for (Layer layer: ls) { + Map legend = new LinkedHashMap(); + List classes = new ArrayList(1); + Map clazz = new LinkedHashMap(); + String lgu = MapUtils.getLegendGraphicUrl(layer.url, layer.layers, dpi); + clazz.put("icon", lgu); + clazz.put("name", layer.description); + classes.add(clazz); + legend.put("classes", classes); + legend.put("name", layer.description); + legends.add(legend); + } + + spec.put("legends", legends); + + return JSON.toJSONString(spec); + } + + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException + { + log.info("MapPrintServiceImpl.doGet"); + + String uuid = req.getParameter("uuid"); + + if (uuid == null || !StringUtils.checkUUID(uuid)) { + throw new ServletException("Missing or misspelled UUID"); + } + + String minXS = req.getParameter("minx"); + String maxXS = req.getParameter("maxx"); + String minYS = req.getParameter("miny"); + String maxYS = req.getParameter("maxy"); + + Double minX = null; + Double maxX = null; + Double minY = null; + Double maxY = null; + + if (minXS != null && maxXS != null + && minYS != null && maxYS != null) { + log.debug("all parameters found -> parsing"); + try { + minX = Double.parseDouble(minXS); + minY = Double.parseDouble(minYS); + maxX = Double.parseDouble(maxXS); + maxY = Double.parseDouble(maxYS); + } + catch (NumberFormatException nfe) { + throw new ServletException("Misspelled minX, minY, maxX or maxY"); + } + } + + String mapType = req.getParameter("maptype"); + + if (mapType == null || !mapType.equals("floodmap")) { + mapType = "map"; + } + + // Retrieve print settings from request + Map pageSpecs = new HashMap(); + Map data = new HashMap(); + List payload = new ArrayList(); + data.put("data", payload); + Enumeration paramNames = req.getParameterNames(); + List params = Collections.list(paramNames); + Collections.sort(params); + for (String paramName : params) { + if (paramName.startsWith("mapfish_data_")) { + // You can add mapfish_data variables that will be mapped + // to a info value pairs to provide meta data for the map + // The the info part starts with a number for sorting that + // number will be stripped + String paramValue = req.getParameter(paramName); + Map data3 = new HashMap(); + int order = 0; + try { + order = Integer.parseInt(paramName.substring(13, 14)); + data3.put("info", paramName.substring(14)); + } catch (NumberFormatException nfe) { + data3.put("info", paramName.substring(13)); + payload.add(data3); + } + if (paramValue.equals("null")) + data3.put("value", ""); + else + data3.put("value", paramValue); + payload.add(data3); + } else if (paramName.startsWith("mapfish_")) { + String paramValue = req.getParameter(paramName); + if (paramValue.equals("null")) + paramValue = ""; + pageSpecs.put(paramName.substring(8), paramValue); + } + } + if (!payload.isEmpty()) { + pageSpecs.put("data", data); + List columns = new ArrayList(); + columns.add("info"); + columns.add("value"); + data.put("columns", columns); + } + + String url = getURL(); + + Document requestOut = + ClientProtocolUtils.newOutCollectionDocument( + uuid, mapType, mapType); + Document requestDesc = + ClientProtocolUtils.newDescribeCollectionDocument(uuid); + + Document outDocument; + Document descDocument; + + try { + HttpClient client = new HttpClientImpl(url); + + descDocument = (Document)client.doCollectionAction( + requestDesc, uuid, new DocumentResponseHandler()); + + InputStream is = client.collectionOut( + requestOut, uuid, mapType); + + try { + outDocument = XMLUtils.parseDocument(is); + } + finally { + is.close(); + is = null; + } + + } + catch (ConnectionException ce) { + log.error(ce); + throw new ServletException(ce); + } + + MapConfig mapConfig = MapHelper.parseConfig(outDocument); + + if (minX == null) { + log.debug("parameters missing -> fallback to max extent"); + String [] parts = mapConfig.getMaxExtent().split("\\s+"); + if (parts.length < 4) { + throw new ServletException( + "Max extent has less than 4 values"); + } + try { + minX = Double.valueOf(parts[0]); + minY = Double.valueOf(parts[1]); + maxX = Double.valueOf(parts[2]); + maxY = Double.valueOf(parts[3]); + } + catch (NumberFormatException nfe) { + throw new ServletException(nfe); + } + } + if (log.isDebugEnabled()) { + log.debug("minX: " + minX); + log.debug("maxX: " + maxX); + log.debug("minY: " + minY); + log.debug("maxY: " + maxY); + } + + String spec = generateSpec( + descDocument, + mapConfig, + minX, minY, + maxX, maxY, + pageSpecs); + + if (log.isDebugEnabled()) { + log.debug("Generated spec:"); + log.debug(spec); + //System.err.println(spec); + } + + producePDF(spec, resp); + } + + protected String getURL() throws ServletException { + String url = getServletContext().getInitParameter("server-url"); + if (url == null) { + throw new ServletException("Missing server-url"); + } + return url; + } + + private static final String encode(String s) { + try { + return URLEncoder.encode(s, "UTF-8"); + } + catch (UnsupportedEncodingException usee) { + // Should not happen. + return s; + } + } + + protected void producePDF(String json, HttpServletResponse resp) + throws ServletException, IOException + { + String printUrl = getInitParameter("print-url"); + + if (printUrl == null) { + throw new ServletException("Missing 'print-url' in web.xml"); + } + + String url = printUrl + "/print.pdf?spec=" + encode(json); + + org.apache.commons.httpclient.HttpClient client = + new org.apache.commons.httpclient.HttpClient( + new MultiThreadedHttpConnectionManager()); + + // FIXME: The request is not authenticated. + // Currently this is not a problem because /flys/map-print + // is whitelisted in GGInAFilter. + GetMethod get = new GetMethod(url); + int result = client.executeMethod(get); + InputStream in = get.getResponseBodyAsStream(); + + if (in != null) { + try { + OutputStream out = resp.getOutputStream(); + try { + byte [] buf = new byte[4096]; + int r; + if (result < 200 || result >= 300) { + resp.setContentType("text/plain"); + } else { + // Only send content disposition and filename content + // type when we have a pdf + resp.setHeader("Content-Disposition", + "attachment;filename=flys-karte.pdf"); + resp.setContentType("application/pdf"); + } + while ((r = in.read(buf)) >= 0) { + out.write(buf, 0, r); + } + out.flush(); + } + finally { + out.close(); + } + } + finally { + in.close(); + } + } + } + + /* Use this if you want directly call the MapPrinter. Enforces GPLv3! + + protected MapPrinter getMapPrinter() throws ServletException, IOException { + String configPath = getInitParameter("config"); + if (configPath == null) { + throw new ServletException("Missing configuration in web.xml"); + } + + File configFile = new File(configPath); + if (!configFile.isAbsolute()) { + configFile = new File(getServletContext().getRealPath(configPath)); + } + + if (!configFile.isFile() || !configFile.canRead()) { + throw new ServletException("Cannot read '" + configFile + "'"); + } + + return new MapPrinter(configFile); + } + + protected void producePDF(String json, HttpServletResponse resp) + throws ServletException, IOException + { + PJsonObject jsonSpec = MapPrinter.parseSpec(json); + + MapPrinter printer = getMapPrinter(); + + OutputFormat outputFormat = OutputFactory.create( + printer.getConfig(), jsonSpec); + + resp.setHeader("Content-Disposition", "attachment;filename=print.pdf"); + resp.setHeader("Content-Type", "application/pdf"); + + // XXX: Streaming the generated PDF directly + // to the request out does not work. :-/ + File tmpFile = File.createTempFile("map-printing", null); + + try { + OutputStream out = + new BufferedOutputStream( + new FileOutputStream(tmpFile)); + try { + outputFormat.print(printer, jsonSpec, out, ""); + out.flush(); + } + catch (Exception e) { + log.error(e); + throw new ServletException(e); + } + finally { + printer.stop(); + out.close(); + } + InputStream in = + new BufferedInputStream( + new FileInputStream(tmpFile)); + out = resp.getOutputStream(); + try { + byte [] buf = new byte[4096]; + int r; + while ((r = in.read(buf)) >= 0) { + out.write(buf, 0, r); + } + out.flush(); + } + finally { + in.close(); + out.close(); + } + } + finally { + if (tmpFile.exists()) { + tmpFile.delete(); + } + } + } + */ +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/MapUrlServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/MapUrlServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,50 @@ +package org.dive4elements.river.client.server; + +import java.io.InputStream; + +import java.util.Map; +import java.util.HashMap; + +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.client.services.MapUrlService; + + +public class MapUrlServiceImpl +extends RemoteServiceServlet +implements MapUrlService +{ + + private static final Logger logger = + Logger.getLogger(MapUrlServiceImpl.class); + + + public Map getUrls() + throws ServerException + { + logger.info("MapUrlServiceImpl.getUrls"); + Map urls = new HashMap(); + + InputStream in = getServletContext().getResourceAsStream("/WEB-INF/wms-services.xml"); + + Document doc = XMLUtils.parseDocument(in); + + NodeList list = doc.getElementsByTagName("wms"); + for (int i = 0; i < list.getLength(); i++) { + Element e = (Element) list.item(i); + urls.put(e.getAttribute("url"), e.getAttribute("name")); + } + + return urls; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/MetaDataServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/MetaDataServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,113 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.river.client.shared.exceptions.ServerException; + +import org.dive4elements.river.client.client.services.MetaDataService; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.shared.model.DataCageTree; + +import org.dive4elements.river.client.server.meta.Converter; + +/** + * Service that returns certain meta-data from the backends data, polished to + * inclusion into current project. + */ +public class MetaDataServiceImpl +extends RemoteServiceServlet +implements MetaDataService +{ + /** Our very own logger. */ + private static final Logger logger = + Logger.getLogger(MetaDataServiceImpl.class); + + public static final String ERROR_NO_META_DATA_FOUND = + "error_no_meta_data_found"; + + + /** + * @param locale needed for i18n. + * @param artifactId ID of masterartifact (can be null) + * @param userId can be null + * @param outs can be null + * @param parameters can be null or parameters like "load-system:true;key:value" + */ + @Override + public DataCageTree getMetaData( + String locale, + String artifactId, + String userId, + String outs, + String parameters + ) throws ServerException + { + logger.info("MetaDataService.getMetaData"); + + // Create the query document. + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element meta = ec.create("meta"); + + if (artifactId != null) { + Element artifactEl = ec.create("artifact-id"); + artifactEl.setAttribute("value", artifactId); + meta.appendChild(artifactEl); + } + + if (userId != null) { + Element userEl = ec.create("user-id"); + userEl.setAttribute("value", userId); + meta.appendChild(userEl); + } + + if (outs != null) { + Element outsEl = ec.create("outs"); + outsEl.setAttribute("value", outs); + meta.appendChild(outsEl); + } + + if (parameters != null) { + Element paramsEl = ec.create("parameters"); + paramsEl.setAttribute("value", parameters); + meta.appendChild(paramsEl); + } + + doc.appendChild(meta); + + // Fire. + HttpClient client = new HttpClientImpl(url, locale); + + try { + Converter converter = new Converter(); + return converter.convert(client.callService(url, "metadata", doc)); + } + catch (ConnectionException ce) { + ce.printStackTrace(); + } + + throw new ServerException(ERROR_NO_META_DATA_FOUND); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ModuleServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ModuleServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,99 @@ +package org.dive4elements.river.client.server; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.river.client.client.services.ModuleService; +import org.dive4elements.river.client.server.auth.User; +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.DefaultModule; +import org.dive4elements.river.client.shared.model.Module; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +public class ModuleServiceImpl +extends RemoteServiceServlet +implements ModuleService +{ + private static final Logger logger = + Logger.getLogger(ModuleServiceImpl.class); + + public static final String XPATH_MODULES = "/art:modules/art:module"; + + public static final String ERROR_NO_MODULES_FOUND = + "error_no_module_found"; + + @Override + public Module[] list(String locale) throws ServerException { + User user = this.getUser(); + + logger.info("ModuleService.list"); + + String url = getServletContext().getInitParameter("server-url"); + + // create dummy xml + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element dummy = ec.create("modules"); + doc.appendChild(dummy); + + HttpClient client = new HttpClientImpl(url, locale); + try { + Document result = client.callService(url, "modules", doc); + + NodeList list = (NodeList) XMLUtils.xpath( + result, + XPATH_MODULES, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (list == null) { + logger.warn("No modules found."); + + throw new ServerException(ERROR_NO_MODULES_FOUND); + } + + int num = list.getLength(); + + List modules = new ArrayList(list.getLength()); + for(int i =0; i < num; i++) { + Element em = (Element)list.item(i); + String name = em.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "name"); + String localname = em.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "localname"); + String strselected = em.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "selected"); + boolean selected = strselected == null ? false : + strselected.equalsIgnoreCase("true"); + logger.debug("Found module " + name + " " + localname); + if (user == null || user.canUseFeature("module:" + name)) { + modules.add(new DefaultModule(name, localname, selected)); + } + } + return modules.toArray(new Module[modules.size()]); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_MODULES_FOUND); + } +} + +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 tw=80 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ProxyServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ProxyServlet.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,113 @@ +package org.dive4elements.river.client.server; + +import java.io.InputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Enumeration; + +import javax.servlet.ServletConfig; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.StatusLine; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; + +import org.apache.log4j.Logger; + +import org.dive4elements.river.client.server.auth.User; + +/** + * Implements a Proxy for HTTP Requests + */ +public class ProxyServlet +extends HttpServlet +{ + private static Logger logger = Logger.getLogger(ProxyServlet.class); + private String remoteurl; + + @Override + public void init(ServletConfig config) { + this.remoteurl = config.getInitParameter("remoteurl"); + } + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse resp) { + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) + throws IOException { + HttpClient httpclient = new DefaultHttpClient(); + + String requesturi = req.getRequestURI(); + String query = req.getQueryString(); + + HttpGet httpget = new HttpGet(this.remoteurl + "?" + query); + + boolean debug = logger.isDebugEnabled(); + + for (Enumeration e = req.getHeaderNames(); e.hasMoreElements();) { + String name = (String)e.nextElement(); + for (Enumeration f = req.getHeaders(name); f.hasMoreElements();) { + String value = (String)f.nextElement(); + if (debug) { + logger.debug( + "Adding request header " + name + " : " + value); + } + httpget.addHeader(name, value); + } + } + + HttpResponse response = httpclient.execute(httpget); + + StatusLine statusline = response.getStatusLine(); + if (debug) { + logger.debug("Response statuscode " + statusline.getStatusCode()); + } + resp.setStatus(statusline.getStatusCode()); + + Header[] headers = response.getAllHeaders(); + for(Header header : headers) { + if (debug) { + logger.debug( + "Adding response header " + header.getName() + + " : " + header.getValue()); + } + resp.setHeader(header.getName(), header.getValue()); + } + + HttpEntity entity = response.getEntity(); + if (entity != null) { + InputStream instream = entity.getContent(); + byte [] buf = new byte[4096]; + try { + OutputStream outstream = resp.getOutputStream(); + try { + int read; + while ((read = instream.read(buf)) >= 0) { + outstream.write(buf, 0, read); + } + outstream.flush(); + } + finally { + outstream.close(); + } + } + finally { + instream.close(); + } + } + } + + private User getUser(HttpServletRequest req) { + HttpSession session = req.getSession(); + return (User)session.getAttribute("user"); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/RemoteServiceServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/RemoteServiceServlet.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,18 @@ +package org.dive4elements.river.client.server; + +import org.dive4elements.river.client.server.auth.User; + +import javax.servlet.http.HttpSession; + +public class RemoteServiceServlet +extends com.google.gwt.user.server.rpc.RemoteServiceServlet +{ + /** + * Return the current logged in user from the HTTP Session + */ + public User getUser() { + HttpSession session = this.getThreadLocalRequest().getSession(); + return (User)session.getAttribute("user"); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/RemoveArtifactServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/RemoveArtifactServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,34 @@ +package org.dive4elements.river.client.server; + +import org.apache.log4j.Logger; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.client.services.RemoveArtifactService; + + +/** + * Implementation of RemoveArtifactService . + */ +public class RemoveArtifactServiceImpl +extends DescribeCollectionServiceImpl +implements RemoveArtifactService +{ + private static final Logger logger = + Logger.getLogger(RemoveArtifactServiceImpl.class); + + + public Collection remove( + Collection collection, + String artifactId, + String locale) + throws ServerException + { + logger.info("RemoveArtifactServiceImpl.remove"); + + String url = getServletContext().getInitParameter("server-url"); + + return CollectionHelper.removeArtifact(collection, artifactId, url, locale); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ReportServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ReportServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,118 @@ +package org.dive4elements.river.client.server; + +import java.io.InputStream; +import java.io.IOException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.apache.commons.lang.StringEscapeUtils; + +import org.dive4elements.river.client.client.services.ReportService; + +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +public class ReportServiceImpl +extends RemoteServiceServlet +implements ReportService +{ + private static final Logger logger = + Logger.getLogger(ReportServiceImpl.class); + + + @Override + public String report( + String collectionId, + String locale, + String out + ) { + logger.info("report: " + collectionId + " " + out); + + String url = getServletContext().getInitParameter("server-url"); + + Document request = ClientProtocolUtils.newOutCollectionDocument( + collectionId, + out, + "report"); + + InputStream in = null; + try { + HttpClient client = new HttpClientImpl(url, locale); + in = client.collectionOut(request, collectionId, out); + + if (in == null) { + logger.debug("report: no report"); + return null; + } + + Document report = XMLUtils.parseDocument(in); + + return buildReport(report); + } + catch (IOException ioe) { + ioe.printStackTrace(); + } + catch (Exception e) { + e.printStackTrace(); + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException ioe) { + } + } + } + + return "error processing error report"; + } + + + /** Returns String containing markup that shows the report message. */ + protected static String buildReport(Document document) { + + NodeList problems = document.getElementsByTagName("problem"); + + StringBuilder global = new StringBuilder(); + StringBuilder kms = new StringBuilder(); + + for (int i = 0, N = problems.getLength(); i < N; ++i) { + + Element element = (Element)problems.item(i); + + String km = element.getAttribute("km"); + String msg = element.getTextContent(); + + if (km.length() > 0) { + kms.append("
  • KM ") + .append(StringEscapeUtils.escapeHtml(km)) + .append(": ") + .append(StringEscapeUtils.escapeHtml(msg)) + .append("
  • "); + } + else { + global.append("
  • ") + .append(StringEscapeUtils.escapeHtml(msg)) + .append("
  • "); + } + } + + StringBuilder sb = new StringBuilder("
      ") + .append(global) + .append(kms) + .append("
    "); + + return sb.toString(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/RiverInfoServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/RiverInfoServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,380 @@ +package org.dive4elements.river.client.server; + +import java.text.DateFormat; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.client.services.RiverInfoService; +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.DefaultGaugeInfo; +import org.dive4elements.river.client.shared.model.DefaultMeasurementStation; +import org.dive4elements.river.client.shared.model.DefaultRiverInfo; +import org.dive4elements.river.client.shared.model.GaugeInfo; +import org.dive4elements.river.client.shared.model.MeasurementStation; +import org.dive4elements.river.client.shared.model.RiverInfo; + + +/** + * GWT Service to serve the gauge and measurement station info + * + * @author Björn Ricks + */ +public class RiverInfoServiceImpl +extends RemoteServiceServlet +implements RiverInfoService +{ + private static final Logger logger = + Logger.getLogger(RiverInfoServiceImpl.class); + + public static final String ERROR_NO_RIVER_INFO_FOUND = + "error_no_riverinfo_found"; + + private static final String XPATH_RIVER = + "/art:river-info/art:river"; + + private static final String XPATH_STATIONS = + "/art:river-info/art:measurement-stations/art:measurement-station"; + + private static final String XPATH_GAUGES = "/art:river-info/art:gauges/art:gauge"; + + public static final DateFormat DATE_FORMAT = DateFormat.getDateInstance( + DateFormat.SHORT, Locale.GERMANY); + + public RiverInfo getGauges(String river) throws ServerException { + logger.info("RiverInfoServiceImpl.getRiverInfo"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element riverele = ec.create("river"); + riverele.setTextContent(river); + + doc.appendChild(riverele); + + HttpClient client = new HttpClientImpl(url); + + try { + Document result = client.callService(url, "gaugeoverviewinfo", doc); + + DefaultRiverInfo riverinfo = getRiverInfo(result); + Listgauges = createGauges(result, riverinfo.getName(), + riverinfo.isKmUp(), riverinfo.getWstUnit()); + + + riverinfo.setGauges(gauges); + + logger.debug("Finished RiverInfoService.getGauges."); + + return riverinfo; + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + logger.warn("No gauge found"); + throw new ServerException(ERROR_NO_RIVER_INFO_FOUND); + } + + public RiverInfo getMeasurementStations(String river) throws ServerException { + logger.info("RiverInfoServiceImpl.getMeasurementStations"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element riverele = ec.create("river"); + riverele.setTextContent(river); + + doc.appendChild(riverele); + + HttpClient client = new HttpClientImpl(url); + + try { + Document result = client.callService(url, "measurementstationinfo", doc); + + DefaultRiverInfo riverinfo = getRiverInfo(result); + List mstations = createMeasurementStations( + result, riverinfo.getName(), riverinfo.isKmUp()); + + riverinfo.setMeasurementStations(mstations); + + logger.debug("Finished MeasurementStationInfoService."); + + return riverinfo; + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + logger.warn("No measurement station found"); + throw new ServerException(ERROR_NO_RIVER_INFO_FOUND); + } + + /** + * Avoids NullPointerException when parsing double value + */ + private Double parseDouble(String value) { + if (value == null || value.isEmpty()) { + return null; + } + try { + return Double.valueOf(value); + } + catch(NumberFormatException e) { + logger.error(e, e); + return null; + } + } + + private Long parseLong(String value) { + if (value == null || value.isEmpty()) { + return null; + } + try { + return Long.valueOf(value); + } + catch(NumberFormatException e) { + logger.error(e, e); + return null; + } + } + + private Integer parseInteger(String value) { + if (value == null || value.isEmpty()) { + return null; + } + try { + return Integer.valueOf(value); + } + catch(NumberFormatException e) { + logger.error(e, e); + return null; + } + } + + private Date parseDate(String value) { + if (value == null || value.isEmpty()) { + return null; + } + try { + return DATE_FORMAT.parse(value); + } + catch(ParseException e) { + logger.error(e, e); + return null; + } + } + + private List createMeasurementStations( + Document result, String rivername, boolean kmup) { + + NodeList stationnodes = (NodeList) XMLUtils.xpath( + result, + XPATH_STATIONS, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = stationnodes == null ? 0 : stationnodes.getLength(); + + ArrayList mstations = new ArrayList(num); + + if (num == 0) { + logger.warn("No measurement station found."); + } + else { + logger.debug("Found " + num + " measurement stations."); + + for (int i = 0; i < num; i++) { + Element stationele = (Element)stationnodes.item(i); + + String mname = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "name"); + String mstart = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "start"); + String mend = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "end"); + String mstation = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "station"); + String mtype = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "type"); + String riverside = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "riverside"); + String mid = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "id"); + String moperator = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "operator"); + String mstarttime = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "starttime"); + String mstoptime = stationele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "stoptime"); + + String gaugename = null; + + Element gaugeele = (Element)stationele.getFirstChild(); + if (gaugeele != null) { + gaugename = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "name"); + } + + + logger.debug("Found measurement station with name " + mname); + + MeasurementStation station = new DefaultMeasurementStation( + rivername, + mname, + parseInteger(mid), + parseDouble(mstation), + parseDouble(mstart), + parseDouble(mend), + kmup, + riverside, + mtype, + moperator, + parseDate(mstarttime), + parseDate(mstoptime), + gaugename + ); + + mstations.add(station); + } + } + return mstations; + } + + private List createGauges( + Document result, String rivername, Boolean kmup, String rwstunit) { + NodeList gaugenodes = (NodeList) XMLUtils.xpath( + result, + XPATH_GAUGES, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = gaugenodes == null ? 0 : gaugenodes.getLength(); + + ArrayList gauges = new ArrayList(num); + + if (num == 0) { + logger.warn("No gauge info found."); + } + else { + logger.debug("Found " + num + " gauges."); + + for (int i = 0; i < num; i++) { + Element gaugeele = (Element)gaugenodes.item(i); + + String gname = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "name"); + String gstart = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "start"); + String gend = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "end"); + String gdatum = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "datum"); + String gaeo = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "aeo"); + String gminq = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "minq"); + String gminw = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "minw"); + String gmaxq = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "maxq"); + String gmaxw = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "maxw"); + String gstation = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "station"); + String gofficial = gaugeele.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "official"); + + logger.debug("Found gauge with name " + gname); + + GaugeInfo gaugeinfo = new DefaultGaugeInfo( + rivername, + gname, + kmup, + parseDouble(gstation), + parseDouble(gstart), + parseDouble(gend), + parseDouble(gdatum), + parseDouble(gaeo), + parseDouble(gminq), + parseDouble(gmaxq), + parseDouble(gminw), + parseDouble(gmaxw), + rwstunit, + parseLong(gofficial) + ); + + gauges.add(gaugeinfo); + } + } + return gauges; + } + + private DefaultRiverInfo getRiverInfo(Document result) { + Element riverresp = (Element) XMLUtils.xpath( + result, + XPATH_RIVER, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + String rname = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "name"); + String rkmup = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "kmup"); + String rstart = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "start"); + String rend = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "end"); + String rwstunit = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "wstunit"); + String rminq = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "minq"); + String rmaxq = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "maxq"); + String rofficial = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "official"); + + logger.debug("River is " + rname); + + boolean kmup = rkmup.equalsIgnoreCase("true"); + DefaultRiverInfo riverinfo = new DefaultRiverInfo( + rname, + kmup, + parseDouble(rstart), + parseDouble(rend), + rwstunit, + parseDouble(rminq), + parseDouble(rmaxq), + parseLong(rofficial) + ); + + return riverinfo; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/RiverServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/RiverServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,104 @@ +package org.dive4elements.river.client.server; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.river.client.client.services.RiverService; +import org.dive4elements.river.client.server.auth.User; +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.DefaultRiver; +import org.dive4elements.river.client.shared.model.River; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + + +/** + * This interface provides a method to list the supported rivers of the artifact + * server. + * + * @author Ingo Weinzierl + */ +public class RiverServiceImpl +extends RemoteServiceServlet +implements RiverService +{ + /** Private logger. */ + private static final Logger logger = + Logger.getLogger(RiverServiceImpl.class); + + /** The XPath string that points to the rivers in the resulting document.*/ + public static final String XPATH_RIVERS = "/art:rivers/art:river"; + + /** The error message key that is thrown if an error occured while reading + * the supported rivers from server.*/ + public static final String ERROR_NO_RIVERS_FOUND = "error_no_rivers_found"; + + + /** Get river list. */ + @Override + public River[] list(String locale) + throws ServerException + { + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + doc.appendChild(ec.create("action")); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document res = client.callService(url, "rivers", doc); + + NodeList rivers = (NodeList) XMLUtils.xpath( + res, + XPATH_RIVERS, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (rivers == null || rivers.getLength() == 0) { + throw new ServerException(ERROR_NO_RIVERS_FOUND); + } + + int count = rivers.getLength(); + + List theRivers = new ArrayList(count); + User user = this.getUser(); + + for (int i = 0; i < count; i++) { + Element tmp = (Element)rivers.item(i); + + String name = tmp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "name"); + + if (name.length() > 0 + && (user == null || user.canUseFeature("river:" + name))) { + theRivers.add(new DefaultRiver(name)); + } + } + + return theRivers.toArray(new River[theRivers.size()]); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_RIVERS_FOUND); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/SQKMChartServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/SQKMChartServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,111 @@ +package org.dive4elements.river.client.server; + +import org.apache.log4j.Logger; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.artifacts.httpclient.http.response.StreamResponseHandler; + +public class SQKMChartServiceImpl +extends HttpServlet +{ + private static final Logger log = + Logger.getLogger(FixingsKMChartServiceImpl.class); + + public static final String SERVICE_NAME = "sq-km-chart"; + + public SQKMChartServiceImpl() { + } + + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + + log.info("SQKMChartServiceImpl.doGet"); + + String url = getServletContext().getInitParameter("server-url"); + String locale = req.getParameter("locale"); + String filter = req.getParameter("filter"); + + if (filter == null || filter.length() == 0) { + log.warn("Missing 'filter' parameter."); + return; + } + + if (locale == null || locale.length() == 0) { + locale = "de"; + } + + Document filterDoc = XMLUtils.jsonToXML(filter); + + if (filterDoc == null) { + log.warn("Creating filter document failed."); + return; + } + + InputStream in; + + try { + HttpClient client = new HttpClientImpl(url, locale); + in = (InputStream)client.callService( + url, // XXX: Why? The URL is passed by construction already. + SERVICE_NAME, + filterDoc, + new StreamResponseHandler()); + } + catch (ConnectionException ce) { + log.error(ce); + return; + } + + resp.setHeader("Content-Type", guessMIMEType(filterDoc)); + + try { + OutputStream out = resp.getOutputStream(); + + byte [] buf = new byte[4096]; + int i = -1; + while ((i = in.read(buf)) >= 0) { + out.write(buf, 0, i); + } + out.flush(); + } + catch (IOException ioe) { + log.error(ioe); + } + finally { + try { in.close(); } + catch (IOException ioe) { /* ignored */ } + } + } + + protected static String guessMIMEType(Document document) { + + NodeList formats = document.getElementsByTagName("format"); + + String format = "png"; + + if (formats.getLength() > 0) { + String type = ((Element)formats.item(0)).getAttribute("type"); + if (type.length() > 0) { + format = type; + } + } + + return "image/" + format; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/SedimentLoadInfoServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/SedimentLoadInfoServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,152 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.river.client.client.services.SedimentLoadInfoService; +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoObject; +import org.dive4elements.river.client.shared.model.SedimentLoadInfoObjectImpl; + + +public class SedimentLoadInfoServiceImpl +extends RemoteServiceServlet +implements SedimentLoadInfoService +{ + private static final Logger logger = + Logger.getLogger(SedimentLoadInfoServiceImpl.class); + + public static final String ERROR_NO_SEDIMENTLOADINFO_FOUND = + "error_no_sedimentloadinfo_found"; + + @Override + public SedimentLoadInfoObject[] getSedimentLoadInfo( + String locale, + String river, + String type, + double startKm, + double endKm) + throws ServerException + { + logger.info("SedimentLoadInfoServiceImpl.getSedimentLoadInfo"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element riverEl = ec.create("river"); + Element location = ec.create("location"); + Element from = ec.create("from"); + Element to = ec.create("to"); + Element typeEl = ec.create("type"); + riverEl.setTextContent(river); + from.setTextContent(String.valueOf(startKm)); + to.setTextContent(String.valueOf(endKm)); + typeEl.setTextContent(type); + + location.appendChild(from); + location.appendChild(to); + riverEl.appendChild(location); + riverEl.appendChild(typeEl); + doc.appendChild(riverEl); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document result = client.callService(url, "sedimentloadinfo", doc); + + logger.debug("Extract sedimentload info objects now."); + SedimentLoadInfoObject[] objects = + extractSedimentLoadInfoObjects(result); + + if (objects != null && objects.length > 0) { + return objects; + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_SEDIMENTLOADINFO_FOUND); + } + + + /** + * Extracts all distance info objects from result document. + * + * @param result The document retrieved by the server. + * + * @return a list of DistanceInfoObjects. + */ + protected SedimentLoadInfoObject[] extractSedimentLoadInfoObjects( + Document result) + throws ServerException + { + NodeList list = result.getElementsByTagName("sedimentload"); + + if (list == null || list.getLength() == 0) { + logger.warn("No sedimentload info found."); + throw new ServerException(ERROR_NO_SEDIMENTLOADINFO_FOUND); + } + + int num = list.getLength(); + logger.debug("Response contains " + num + " objects."); + + List objects = + new ArrayList(num); + + for (int i = 0; i < num; i++) { + SedimentLoadInfoObject obj = buildSedimentLoadInfoObject( + (Element)list.item(i)); + + if (obj != null) { + objects.add(obj); + } + } + + logger.debug("Retrieved " + objects.size() + " sediment loads."); + + return (SedimentLoadInfoObject[]) + objects.toArray(new SedimentLoadInfoObject[num]); + } + + + /** + * Extracts information for a single distance info object and intializes an + * DistanceInfoObject with them. + * + * @param node The node that contains the information. + * + * @return a valid DistanceInfoObject. + */ + protected SedimentLoadInfoObject buildSedimentLoadInfoObject(Element node) { + + String desc = node.getAttribute("description").trim(); + String date = node.getAttribute("date").trim(); + + if (desc.length() > 0 && date.length() > 0) { + return new SedimentLoadInfoObjectImpl(desc, date); + } + + logger.warn("Invalid sediment load info object found."); + + return null; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/SetCollectionNameServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/SetCollectionNameServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,38 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.client.services.SetCollectionNameService; + + +/** + * @author Ingo Weinzierl + */ +public class SetCollectionNameServiceImpl +extends DoCollectionAction +implements SetCollectionNameService +{ + private static final Logger logger = + Logger.getLogger(SetCollectionNameServiceImpl.class); + + + public void setName(Collection c) + throws ServerException + { + logger.info("Set name of collection: " + c.identifier()); + + String url = getServletContext().getInitParameter("server-url"); + + String name = c.getName(); + Document set = ClientProtocolUtils.newSetCollectionNameDocument(name); + + doAction(c, set, url); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/SetCollectionTTLServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/SetCollectionTTLServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,53 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.client.services.SetCollectionTTLService; + + +/** + * @author Ingo Weinzierl + */ +public class SetCollectionTTLServiceImpl +extends DoCollectionAction +implements SetCollectionTTLService +{ + private static final Logger logger = + Logger.getLogger(SetCollectionTTLServiceImpl.class); + + + public static final String XPATH_RESULT = "/art:result/text()"; + public static final String OPERATION_FAILURE = "FAILED"; + + public void setTTL(Collection c) + throws ServerException + { + logger.info("Set ttl of collection: " + c.identifier()); + + String url = getServletContext().getInitParameter("server-url"); + + long ttl = c.getTTL(); + String value = null; + + if (ttl == 0) { + value = "INF"; + } + else if (ttl < 0) { + value = "DEFAULT"; + } + else { + value = String.valueOf(ttl); + } + + Document set = ClientProtocolUtils.newSetCollectionTTLDocument(value); + + doAction(c, set, url); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/StepForwardServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/StepForwardServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,179 @@ +package org.dive4elements.river.client.server; + +import org.w3c.dom.Document; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +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.client.services.StepForwardService; + + +/** + * This interface provides a method that bundles the artifact specific + * operations FEED and ADVANCE. + * + * @author Ingo Weinzierl + */ +public class StepForwardServiceImpl +extends AdvanceServiceImpl +implements StepForwardService +{ + private static final Logger logger = + Logger.getLogger(StepForwardServiceImpl.class); + + + /** XPath that points to the result type of a feed or advance operation.*/ + public static final String XPATH_RESULT = "/art:result/@art:type"; + + /** XPath that points to the result type of a feed or advance operation.*/ + public static final String XPATH_RESULT_MSG = "/art:result/text()"; + + /** A constant that marks errors.*/ + public static final String OPERATION_FAILURE = "FAILURE"; + + /** The error message key that is thrown if an error occured while feeding + * new data.*/ + public static final String ERROR_FEED_DATA = "error_feed_data"; + + + /** + * This method wraps the artifact operations FEED and ADVANCE. FEED is + * always triggerd, ADVANCE only, if there is at least one reachable state. + * + * @param locale The locale used for the request. + * @param artifact The artifact that needs to be fed. + * @param data An array of Data objects that contain the information that + * + * @return the modified artifact. + */ + public Artifact go(String locale, Artifact artifact, Data[] data) + throws ServerException + { + logger.info("StepForwardServiceImpl.go"); + + String url = getServletContext().getInitParameter("server-url"); + + Artifact afterFeed = feed(url, locale, artifact, data); + + if (afterFeed == null) { + logger.warn("StepForwardService.feed() - FAILED"); + throw new ServerException(ERROR_FEED_DATA); + } + + ArtifactDescription desc = afterFeed.getArtifactDescription(); + String[] reachable = desc.getReachableStates(); + + if (reachable == null || reachable.length == 0) { + logger.debug("Did not find any reachable state."); + return afterFeed; + } + + // We use the first reachable state as default target, maybe we need to + // change this later. + return advance(locale, afterFeed, reachable[0]); + } + + + /** + * This method triggers the FEED operation. + * + * @param url The url of the artifact server. + * @param artifact The artifact that needs to be fed. + * @param data An array of Data objects that contain the information that + * are used for the FEED operation. + * + * @return a new artifact parsed from the description of FEED. + */ + protected Artifact feed( + String url, + String locale, + Artifact artifact, + Data[] data) + throws ServerException + { + logger.info("StepForwardServiceImpl.feed"); + + Document feed = ClientProtocolUtils.newFeedDocument( + artifact.getUuid(), + artifact.getHash(), + createKVP(data)); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document description = (Document) client.feed( + new org.dive4elements.artifacts.httpclient.objects.Artifact( + artifact.getUuid(), + artifact.getHash()), + feed, + new DocumentResponseHandler()); + + if (description == null) { + logger.warn("StepForwardService.feed() - FAILED"); + throw new ServerException(ERROR_FEED_DATA); + } + + String result = XMLUtils.xpathString( + description, + XPATH_RESULT, + ArtifactNamespaceContext.INSTANCE); + + if (result == null || !result.equals(OPERATION_FAILURE)) { + logger.debug("StepForwardService.feed() - SUCCESS"); + return (Artifact) new FLYSArtifactCreator().create(description); + } + else if (result != null && result.equals(OPERATION_FAILURE)) { + String msg = XMLUtils.xpathString( + description, + XPATH_RESULT_MSG, + ArtifactNamespaceContext.INSTANCE); + throw new ServerException(msg); + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + logger.warn("StepForwardService.feed() - FAILED"); + throw new ServerException(ERROR_FEED_DATA); + } + + + /** + * This method creates an array of key/value pairs from an array of Data + * objects. The string array is used as parameter for the feed() operation. + * + * @param data The data that should be transformed into the string array. + * + * @return a string array that contains key/value pairs. + */ + protected String[][] createKVP(Data[] data) { + String[][] kvp = new String[data.length][]; + + int i = 0; + + for (Data d: data) { + DataItem[] items = d.getItems(); + String key = d.getLabel(); + String value = d.getStringValue(); + + kvp[i++] = new String[] { key, value }; + } + + return kvp; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/StyleHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/StyleHelper.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,48 @@ +package org.dive4elements.river.client.server; + +import org.dive4elements.river.client.shared.model.Style; +import org.dive4elements.river.client.shared.model.StyleSetting; + +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + + +public class StyleHelper { + + public static Style getStyle (Element element) { + if (!element.getTagName().equals("theme")) { + return null; + } + + NodeList list = element.getElementsByTagName("field"); + Style style = new Style(); + + style.setName (element.getAttribute("name")); + style.setFacet (element.getAttribute("facet")); + + try { + int ndx = Integer.parseInt(element.getAttribute("index")); + style.setIndex (ndx); + } + catch(NumberFormatException nfe) { + return null; + } + + for(int i = 0; i < list.getLength(); i++) { + Element e = (Element) list.item(i); + String hints = e.getAttribute("hints"); + + StyleSetting set = new StyleSetting ( + e.getAttribute("name"), + e.getAttribute("default"), + e.getAttribute("display"), + e.getAttribute("hints"), + e.getAttribute("type"), + (hints != null && hints.contains("hidden") ? true : false) + ); + style.appendStyleSetting(set); + } + return style; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/ThemeListingServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ThemeListingServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,107 @@ +package org.dive4elements.river.client.server; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; + +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.client.services.ThemeListingService; + +import org.dive4elements.river.client.shared.exceptions.ServerException; + +import org.dive4elements.river.client.shared.model.Style; + +import java.util.HashMap; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +/** + * This interface provides a method to list themes filtered by name. + * + * @author Raimund Renkert + */ +public class ThemeListingServiceImpl +extends RemoteServiceServlet +implements ThemeListingService +{ + private static final Logger logger = + Logger.getLogger(ThemeListingServiceImpl.class); + + + private static final String XPATH_THEME_GROUPS = "/themes/themegroup"; + /** The error message key that is thrown if an error occured while reading + * the supported rivers from server.*/ + public static final String ERROR_NO_GROUPS_FOUND = "error_no_groups_found"; + + + public Map list(String locale, String name) + throws ServerException + { + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + null, + null); + + Element e = ec.create("theme"); + ec.addAttr(e, "name", name); + doc.appendChild(e); + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document res = client.callService(url, "themelisting", doc); + + NodeList themeGroups = (NodeList) XMLUtils.xpath( + res, + XPATH_THEME_GROUPS, + XPathConstants.NODESET, + null); + + if (themeGroups == null || themeGroups.getLength() == 0) { + throw new ServerException(ERROR_NO_GROUPS_FOUND); + } + + int count = themeGroups.getLength(); + + Map theStyles = new HashMap(count); + + for (int i = 0; i < count; i++) { + Element tmp = (Element)themeGroups.item(i); + + String groupName = tmp.getAttribute("name"); + NodeList theTheme = (NodeList) XMLUtils.xpath( + tmp, + "theme", + XPathConstants.NODESET, + null); + + for (int j = 0; j < theTheme.getLength(); j++) { + Element elem = (Element) theTheme.item(j); + theStyles.put(groupName, StyleHelper.getStyle(elem)); + } + } + + return theStyles; + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_GROUPS_FOUND); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/UserCollectionsServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/UserCollectionsServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,121 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.DefaultCollection; +import org.dive4elements.river.client.client.services.UserCollectionsService; + + +/** + * This service returns a list of collections owned by a specified user. + * NOTE: The Collections returned by this service provide no information + * about the CollectionItems or OutputModes of the Collection. You need to fetch + * these information explicitly using another service. + * + * @author Ingo Weinzierl + */ +public class UserCollectionsServiceImpl +extends RemoteServiceServlet +implements UserCollectionsService +{ + private static final Logger logger = Logger.getLogger( + UserCollectionsServiceImpl.class); + + + public Collection[] getUserCollections(String locale, String userid) { + logger.info("UserCollectionsServiceImpl.getUserCollections"); + + String serverUrl = getServletContext().getInitParameter("server-url"); + HttpClient client = new HttpClientImpl(serverUrl, locale); + + try { + Document result = client.listUserCollections(userid); + + NodeList list = (NodeList) XMLUtils.xpath( + result, + "/art:artifact-collections/art:artifact-collection", + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (list == null || list.getLength() == 0) { + logger.debug("No collection found for user: " + userid); + return null; + } + + int num = list.getLength(); + + List all = new ArrayList(num); + + for (int i = 0; i < num; i++) { + Collection c = createCollection((Element) list.item(i)); + + if (c != null) { + all.add(c); + } + } + + logger.debug("User has " + all.size() + " collections."); + + return all.toArray(new Collection[all.size()]); + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + logger.debug("No user collections found."); + return null; + } + + + /** + * Extracts a SimpleCollection from node. + * + * @param node Contains information about a collection. + * + * @return a list of Simplecollections. + */ + protected Collection createCollection(Element node) { + String uri = ArtifactNamespaceContext.NAMESPACE_URI; + + String creationStr = node.getAttributeNS(uri, "creation"); + String name = node.getAttributeNS(uri, "name"); + String uuid = node.getAttributeNS(uri, "uuid"); + String ttlStr = node.getAttributeNS(uri, "ttl"); + + if (!uuid.isEmpty() && !ttlStr.isEmpty() && !creationStr.isEmpty()) { + try { + long time = Long.parseLong(creationStr); + long ttl = Long.parseLong(ttlStr); + return new DefaultCollection(uuid, ttl, name, new Date(time)); + } + catch (NumberFormatException nfe) { + logger.warn("Error while parsing collection attributes."); + return null; + } + } + + logger.warn("Found an invalid Collection."); + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/UserServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/UserServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,71 @@ +package org.dive4elements.river.client.server; + +import javax.servlet.http.HttpSession; + +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; + +import org.dive4elements.river.client.client.services.UserService; +import org.dive4elements.river.client.server.auth.UserClient; +import org.dive4elements.river.client.shared.exceptions.AuthenticationException; +import org.dive4elements.river.client.shared.model.DefaultUser; +import org.dive4elements.river.client.shared.model.User; + +/** + * @author Ingo Weinzierl + */ +public class UserServiceImpl +extends RemoteServiceServlet +implements UserService +{ + /** Private logger. */ + private static final Logger logger = Logger.getLogger(UserServiceImpl.class); + + public static final String ERROR_NO_SUCH_USER = "error_no_such_user"; + + public static final String ERROR_NO_USERS = "error_no_users"; + + public User getCurrentUser(String locale) + throws AuthenticationException + { + String url = getServletContext().getInitParameter("server-url"); + + UserClient client = new UserClient(url); + org.dive4elements.river.client.server.auth.User loginuser = getUser(); + + if (loginuser == null) { + logger.debug("no session user"); + throw new AuthenticationException(ERROR_NO_SUCH_USER); + } + + try { + Element user = client.findUser(loginuser); + + if (user != null) { + String uuid = user.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "uuid"); + String name = user.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "name"); + + return new DefaultUser(uuid, name); + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + logger.error("No users existing in the server."); + throw new AuthenticationException(ERROR_NO_USERS); + } + + public void logoutCurrentUser() { + HttpSession session = this.getThreadLocalRequest().getSession(); + session.setAttribute("user", null); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/WQInfoServiceImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/WQInfoServiceImpl.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,207 @@ +package org.dive4elements.river.client.server; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import org.apache.log4j.Logger; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.client.services.WQInfoService; +import org.dive4elements.river.client.shared.model.WQInfoObject; +import org.dive4elements.river.client.shared.model.WQInfoObjectImpl; + + +/** + * @author Ingo Weinzierl + */ +public class WQInfoServiceImpl +extends RemoteServiceServlet +implements WQInfoService +{ + private static final Logger logger = + Logger.getLogger(WQInfoServiceImpl.class); + + public static final String ERROR_NO_WQINFO_FOUND = + "error_no_wqinfo_found"; + + public static final String XPATH_WQS = "art:service/art:mainvalues/art:mainvalue"; + + + public WQInfoObject[] getWQInfo( + String locale, + String river, + double from, + double to) + throws ServerException + { + logger.info("WQInfoServiceImpl.getWQInfo"); + + String url = getServletContext().getInitParameter("server-url"); + + Document doc = XMLUtils.newDocument(); + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + doc, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element mainvalues = ec.create("mainvalues"); + Element riverEl = ec.create("river"); + Element startEl = ec.create("start"); + Element endEl = ec.create("end"); + + riverEl.setTextContent(river); + startEl.setTextContent(Double.valueOf(from).toString()); + endEl.setTextContent(Double.valueOf(to).toString()); + + mainvalues.appendChild(riverEl); + mainvalues.appendChild(startEl); + mainvalues.appendChild(endEl); + + doc.appendChild(mainvalues); + + HttpClient client = new HttpClientImpl(url, locale); + + try { + Document result = client.callService(url, "mainvalues", doc); + + logger.debug("Extract wq info objects now."); + WQInfoObject[] objects = extractWQInfoObjects(result); + + if (objects.length > 0) { + return objects; + } + } + catch (ConnectionException ce) { + logger.error(ce, ce); + } + + throw new ServerException(ERROR_NO_WQINFO_FOUND); + } + + + /** + * Extracts all wq info objects from result document. + * + * @param result The document retrieved by the server. + * + * @return a list of WQInfoObjects. + */ + protected WQInfoObject[] extractWQInfoObjects(Document result) + throws ServerException + { + NodeList list = (NodeList) XMLUtils.xpath( + result, + XPATH_WQS, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (list == null || list.getLength() == 0) { + logger.warn("No wq info found."); + + throw new ServerException(ERROR_NO_WQINFO_FOUND); + } + + boolean debug = logger.isDebugEnabled(); + + int num = list.getLength(); + if (debug) { + logger.debug("Response contains " + num + " objects."); + } + + List objects = + new ArrayList(num); + + for (int i = 0; i < num; i++) { + WQInfoObject obj = buildWQInfoObject(list.item(i)); + + if (obj != null) { + objects.add(obj); + } + } + + if (debug) { + logger.debug("Retrieved " + objects.size() + " wq values"); + } + + WQInfoObject [] array = (WQInfoObject[]) + objects.toArray(new WQInfoObject[objects.size()]); + + Arrays.sort(array, WQ_INFO_OBJECT_CMP); + + return array; + } + + public static final Comparator WQ_INFO_OBJECT_CMP = + new Comparator() { + @Override + public int compare(WQInfoObject a, WQInfoObject b) { + + // Descending by type: Qs before Ds + int cmp = a.getType().compareTo(b.getType()); + if (cmp < 0) return +1; + if (cmp > 0) return -1; + + // Ascending by value + double diff = a.getValue() - b.getValue(); + if (diff < 0d) return -1; + if (diff > 0d) return +1; + return 0; + } + }; + + /** + * Extracts information for a single wq info object and intializes an + * WQInfoObject with them. + * + * @param node The node that contains the information. + * + * @return a valid WQInfoObject. + */ + protected static WQInfoObject buildWQInfoObject(Node node) { + + String name = XMLUtils.xpathString( + node, "@name", ArtifactNamespaceContext.INSTANCE); + + String type = XMLUtils.xpathString( + node, "@type", ArtifactNamespaceContext.INSTANCE); + + String value = XMLUtils.xpathString( + node, "@value", ArtifactNamespaceContext.INSTANCE); + + if (name != null && type != null) { + try { + return new WQInfoObjectImpl( + name, + type, + new Double(value)); + } + catch (NumberFormatException nfe) { + logger.warn(nfe.getLocalizedMessage()); + } + } + + logger.warn("Invalid wq info object found."); + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/Authentication.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/Authentication.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,15 @@ +package org.dive4elements.river.client.server.auth; + +/** Interface to represent user authentications + */ +public interface Authentication { + + /** Returns true if the authentication was successfull + */ + public boolean isSuccess(); + + /** Returns a new User object + */ + public User getUser() throws AuthenticationException; + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/AuthenticationException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/AuthenticationException.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,17 @@ +package org.dive4elements.river.client.server.auth; + +/** + * Base class for Authentication related Exceptions + */ +public class AuthenticationException extends Exception { + + public AuthenticationException(String message) { + super(message); + } + + public AuthenticationException(Exception e) { + super(e); + } +} +// vim: set fileencoding=utf-8 ts=4 sw=4 tw=80: + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/AuthenticationFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/AuthenticationFactory.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,31 @@ +package org.dive4elements.river.client.server.auth; + +import org.apache.log4j.Logger; + +public class AuthenticationFactory { + + private static final Logger log = + Logger.getLogger(AuthenticationFactory.class); + + public static Authenticator getInstance(String name) + throws IllegalArgumentException + { + if (name == null) { + throw new IllegalArgumentException("Authentication type name is null"); + } + + if (name.equalsIgnoreCase("was") || + name.equalsIgnoreCase("ggina")) { + log.debug("Using GGinA authenticator."); + return + new org.dive4elements.river.client.server.auth.was.Authenticator(); + } + else if (name.equalsIgnoreCase("plain")) { + log.debug("Using plain authenticator."); + return + new org.dive4elements.river.client.server.auth.plain.Authenticator(); + } + + throw new IllegalArgumentException("Unkown Authentication " + name); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/Authenticator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/Authenticator.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,12 @@ +package org.dive4elements.river.client.server.auth; + +import java.io.IOException; + +import org.dive4elements.river.client.server.features.Features; + +public interface Authenticator { + + public Authentication auth(String username, String password, String encoding, Features features) + throws AuthenticationException, IOException; + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/DefaultUser.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/DefaultUser.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,88 @@ +package org.dive4elements.river.client.server.auth; + +import java.util.List; + +public class DefaultUser +implements User +{ + protected String name; + protected String account; + protected String password; + protected boolean expired; + protected List roles; + protected List features; + + public DefaultUser() { + } + + public DefaultUser( + String name, + String password, + boolean expired, + List roles, + List features + ) { + this.name = name; + this.password = password; + this.expired = expired; + this.roles = roles; + this.features = features; + this.account = name; + } + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public boolean hasExpired() { + return expired; + } + + public void setExpired(boolean expired) { + this.expired = expired; + } + + @Override + public List getRoles() { + // XXX: return clone of the list? + return this.roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + @Override + public boolean canUseFeature(String feature) { + return this.features.contains(feature); + } + + public void setAllowedFeatures(List features) { + this.features = features; + } + + @Override + public String getAccount() { + return this.account; + } + + public void setAccount(String account) { + this.account = account; + } +} +// vim:set ts=4 sw=4 si et fenc=utf8 tw=80: diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/User.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/User.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,42 @@ +package org.dive4elements.river.client.server.auth; + +import java.util.List; + +/** + * User representation after a succesfull login + */ +public interface User { + + /** + * Returns the username as String + */ + public String getName(); + + /** + * Returns the password of the user as String + */ + public String getPassword(); + + /** + * Returns True if the authentication for the user + * has expired. + */ + public boolean hasExpired(); + + /** + * Returns a list of roles corresponsing the the user + */ + public List getRoles(); + + + /** + * Returns true if the user is allowed access the feature + */ + public boolean canUseFeature(String feature); + + /** + * Returns the users account name + */ + public String getAccount(); +} +// vim:set ts=4 sw=4 si et fenc=utf8 tw=80: diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/UserClient.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/UserClient.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,158 @@ +package org.dive4elements.river.client.server.auth; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; + +/** + * UserClient is a class to allow easier communication + * with the REST based artifact user protocol + */ +public class UserClient { + + private static final Logger logger = Logger.getLogger(UserClient.class); + + private String url; + + public UserClient(String url) { + this.url = url; + } + + public boolean userExists(User user) throws ConnectionException { + if (user == null) { + return false; + } + + Element data = this.findUser(user); + + String XPATH_USERACCOUNT = "/art:user/art:account/@art:name"; + + String account = XMLUtils.xpathString( + data, XPATH_USERACCOUNT, ArtifactNamespaceContext.INSTANCE); + + if (account == null) { + return false; + } + + return account.equals(user.getAccount()); + } + + public boolean createUser(User user) throws ConnectionException { + if(user == null) { + logger.warn("createUser: given user is null"); + return false; + } + + logger.debug("Creating new user " + user.getName()); + HttpClient client = new HttpClientImpl(this.url); + + Document document = XMLUtils.newDocument(); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + Element action = creator.create("action"); + + Element type = creator.create("type"); + type.setAttribute("name", "create"); + Element artuser = creator.create("user"); + artuser.setAttribute("name", user.getName()); + Element account = creator.create("account"); + account.setAttribute("name", user.getAccount()); + + //TODO create roles + artuser.appendChild(account); + action.appendChild(type); + action.appendChild(artuser); + document.appendChild(action); + + logger.debug("Create user request xml: " + XMLUtils.toString(document)); + + Document resp = client.createUser(document); + + logger.debug("Create user response xml: " + XMLUtils.toString(resp)); + + String XPATH_RESPONSE = "/art:result"; + Node nresult = (Node) XMLUtils.xpath( + resp, + XPATH_RESPONSE, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + String result = nresult.getTextContent(); + return (result != null && result.equalsIgnoreCase("success")); + } + + public NodeList listUsers() throws ConnectionException { + HttpClient client = new HttpClientImpl(this.url); + + Document users = (Document) client.listUsers(); + + String XPATH_USERS = "/art:users/art:user"; + + return (NodeList) XMLUtils.xpath( + users, + XPATH_USERS, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + } + + public Element findUser(User user) throws ConnectionException { + if(user == null) { + throw new IllegalArgumentException("user is null"); + } + + HttpClient client = new HttpClientImpl(this.url); + + Document document = XMLUtils.newDocument(); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + Element action = creator.create("action"); + + Element type = creator.create("type"); + type.setAttribute("name", "find"); + Element account = creator.create("account"); + account.setAttribute("name", user.getAccount()); + + action.appendChild(type); + action.appendChild(account); + document.appendChild(action); + + boolean debug = logger.isDebugEnabled(); + + if (debug) { + logger.debug("Find user request xml: " + + XMLUtils.toString(document)); + } + + Document resp = client.findUser(document); + + if (debug) { + logger.debug("Find user request response xml: " + + XMLUtils.toString(resp)); + } + + return resp.getDocumentElement(); + } +} +// vim: set si et fileencoding=utf-8 ts=4 sw=4 tw=80: + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/plain/Authenticator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/plain/Authenticator.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,134 @@ +package org.dive4elements.river.client.server.auth.plain; + +import org.dive4elements.river.client.server.auth.AuthenticationException; +import org.dive4elements.river.client.server.auth.DefaultUser; +import org.dive4elements.river.client.server.auth.User; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import org.dive4elements.river.client.server.features.Features; + +/** + * Authenticator that uses a local file as user backend. + */ +public class Authenticator +implements org.dive4elements.river.client.server.auth.Authenticator +{ + private static final Logger log = + Logger.getLogger(Authenticator.class); + + public static class Authentication + implements org.dive4elements.river.client.server.auth.Authentication + { + protected String user; + protected String password; + protected List roles; + protected Features features; + + public Authentication( + String user, + String password, + List roles, + Features features + ) { + this.user = user; + this.password = password; + this.roles = roles; + this.features = features; + } + + @Override + public boolean isSuccess() { + return user != null; + } + + @Override + public User getUser() { + return isSuccess() + ? new DefaultUser(user, password, false, roles, this.features.getFeatures(roles)) + : null; + } + } // class Authentication + + public Authenticator() { + } + + private static File credentialsFile() { + String env = System.getenv("FLYS_USER_FILE"); + if (env == null) { + env = System.getProperty( + "flys.user.file", + System.getProperty("user.home", ".") + + System.getProperty("file.separator") + + "flys_user_file"); + } + log.debug("Using credentials file " + env); + return new File(env); + + } + + @Override + public org.dive4elements.river.client.server.auth.Authentication auth( + String username, + String password, + String encoding, + Features features + ) + throws AuthenticationException, IOException + { + File file = credentialsFile(); + if (!file.canRead() || !file.isFile()) { + log.error("cannot find user file '" + file + "'"); + return new Authentication(null, null, new ArrayList(0), features); + } + + BufferedReader reader = + new BufferedReader( + new FileReader(file)); + try { + String line; + while ((line = reader.readLine()) != null) { + if ((line = line.trim()).length() == 0 + || line.startsWith("#")) { + continue; + } + + String[] parts = line.split("\\s+"); + if (parts.length < 2) { + continue; + } + + if (parts[0].equals(username)) { + log.debug("user '" + username + "' found."); + if (parts[1].equals(password)) { + List roles = + new ArrayList(parts.length - 2); + + for (int i = 2; i < parts.length; i++) { + roles.add(parts[i]); + } + + log.debug("success"); + return new Authentication(username, password, roles, features); + } + // Stop: user found, wrong password + break; + } + } + } + finally { + reader.close(); + } + log.debug("failed"); + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Assertion.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Assertion.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,179 @@ +package org.dive4elements.river.client.server.auth.was; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Iterator; +import java.util.Date; +import java.util.List; +import java.util.LinkedList; + +import org.apache.log4j.Logger; + +import org.jdom.Element; + +public class Assertion { + + private static Logger logger = Logger.getLogger(Assertion.class); + + private Element assertion; + private LinkedList roles; + private String assertion_id; + private String user_id; + private String name_id; + private String group_id; + private String group_name; + private Date notbefore; + private Date notonorafter; + private Signature signature; + + private static final String ATTR_CONT_USER_ID = + "urn:conterra:names:sdi-suite:policy:attribute:user-id"; + private static final String ATTR_CONT_GROUP_ID = + "urn:conterra:names:sdi-suite:policy:attribute:group-id"; + private static final String ATTR_CONT_GROUP_NAME = + "urn:conterra:names:sdi-suite:policy:attribute:group-name"; + private static final String ATTR_CONT_ROLE = + "urn:conterra:names:sdi-suite:policy:attribute:role"; + + + public Assertion(Element assertion) { + this.assertion = assertion; + this.roles = new LinkedList(); + + this.assertion_id = assertion.getAttributeValue("AssertionID"); + + this.parseContition(); + this.parseAttributeStatement(); + } + + private void parseContition() { + Element condition = this.assertion.getChild("Conditions", + Namespaces.SAML_NS_ASSERT); + if (condition != null) { + SimpleDateFormat dateformat = new SimpleDateFormat(); + // format should be "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" but that's only + // available in java 7+ + dateformat.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + String from = condition.getAttributeValue("NotBefore"); + if (from != null) { + try { + this.notbefore = dateformat.parse(from); + } + catch(ParseException e) { + logger.error("Unknown datetime format for Condition " + + "NotBefore " + from); + } + } + + String until = condition.getAttributeValue("NotOnOrAfter"); + logger.debug("Session is valid until " + until); + if (until != null) { + try { + this.notonorafter = dateformat.parse(until); + } + catch(ParseException e) { + logger.error("Unknown datetime format for Condition " + + "NotOnOrAfter " + until); + } + } + } + } + + private void parseAttributeStatement() { + Element attrstatement = this.assertion.getChild("AttributeStatement", + Namespaces.SAML_NS_ASSERT); + if (attrstatement != null) { + + Element subject = attrstatement.getChild("Subject", + Namespaces.SAML_NS_ASSERT); + if (subject != null) { + this.name_id = subject.getChildText("NameIdentifier", + Namespaces.SAML_NS_ASSERT); + } + + List attributes = attrstatement.getChildren("Attribute", + Namespaces.SAML_NS_ASSERT); + for(Iterator i = attributes.iterator(); i.hasNext();) { + Element attr = (Element)i.next(); + String attrname = attr.getAttributeValue("AttributeName"); + if (attrname.equals(ATTR_CONT_USER_ID)) { + this.user_id = this.getAttributeValue(attr); + } + else if (attrname.equals(ATTR_CONT_GROUP_ID)) { + this.group_id = this.getAttributeValue(attr); + } + else if (attrname.equals(ATTR_CONT_GROUP_NAME)) { + this.group_name = this.getAttributeValue(attr); + } + else if (attrname.equals(ATTR_CONT_ROLE)) { + List roles = attr.getChildren("AttributeValue", + Namespaces.SAML_NS_ASSERT); + for(Iterator j = roles.iterator(); j.hasNext();) { + Element role = (Element)j.next(); + this.roles.add(role.getText()); + } + } + else { + logger.debug("Unknown AttributeName " + attrname + + " found while parsing AttributeStatement."); + } + } + } + } + + private String getAttributeValue(Element attr) { + return attr.getChildText("AttributeValue", Namespaces.SAML_NS_ASSERT); + } + + public List getRoles() { + return this.roles; + } + + public Boolean isValid() { + // TODO: + // check signature digest + // check signature value + // check signature cert + return false; + } + + public Signature getSiganture() { + if (this.signature == null) { + Element signature = this.assertion.getChild("Signature", + Namespaces.XML_SIG_NS); + if (signature != null) { + this.signature = new Signature(signature); + } + } + return this.signature; + } + + public String getUserID() { + return this.user_id; + } + + public String getNameID() { + return this.name_id; + } + + public String getGroupID() { + return this.group_id; + } + + public String getGroupName() { + return this.group_name; + } + + public String getID() { + return this.assertion_id; + } + + public Date getFrom() { + return this.notbefore; + } + + public Date getUntil() { + return this.notonorafter; + } +} +// vim: set fileencoding=utf-8 ts=4 sw=4 et si tw=80: diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Authenticator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Authenticator.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,62 @@ +package org.dive4elements.river.client.server.auth.was; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.StatusLine; +import org.apache.http.client.HttpClient; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.impl.client.DefaultHttpClient; + +import org.dive4elements.river.client.server.GGInATrustStrategy; +import org.dive4elements.river.client.server.auth.Authentication; +import org.dive4elements.river.client.server.auth.AuthenticationException; +import org.dive4elements.river.client.server.features.Features; + +public class Authenticator +implements org.dive4elements.river.client.server.auth.Authenticator { + + @Override + public Authentication auth( + String username, + String password, + String encoding, + Features features + ) throws + AuthenticationException, + IOException + { + try { + SSLSocketFactory sf = new SSLSocketFactory( + new GGInATrustStrategy()); + Scheme https = new Scheme("https", 443, sf); + HttpClient httpclient = new DefaultHttpClient(); + httpclient.getConnectionManager().getSchemeRegistry().register( + https); + + Request httpget = new Request("https://geoportal.bafg.de/" + + "administration/WAS", username, password, encoding); + HttpResponse response = httpclient.execute(httpget); + StatusLine stline = response.getStatusLine(); + if (stline.getStatusCode() != 200) { + throw new AuthenticationException("GGInA Server Error. " + + "Statuscode: " + stline.getStatusCode() + + ". Reason: " + stline.getReasonPhrase()); + } + HttpEntity entity = response.getEntity(); + if (entity == null) { + //FIXME throw AuthenticationException + return null; + } + else { + return new Response(entity, username, password, features); + } + } + catch(GeneralSecurityException e) { + throw new AuthenticationException(e); + } + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Namespaces.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Namespaces.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,14 @@ +package org.dive4elements.river.client.server.auth.was; + +import org.jdom.Namespace; + +public class Namespaces { + + public static final Namespace SAML_NS_ASSERT = + Namespace.getNamespace("urn:oasis:names:tc:SAML:1.0:assertion"); + public static final Namespace SAML_NS_PROTO = + Namespace.getNamespace("urn:oasis:names:tc:SAML:1.0:protocol"); + public static final Namespace XML_SIG_NS = + Namespace.getNamespace("http://www.w3.org/2000/09/xmldsig#"); + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Request.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Request.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,59 @@ +package org.dive4elements.river.client.server.auth.was; + +import java.io.UnsupportedEncodingException; +import java.net.URI; + +import org.apache.commons.codec.binary.Base64; +import org.apache.http.client.methods.HttpGet; +import org.apache.log4j.Logger; + +public class Request extends HttpGet { + + private final static String VERSION = "1.1"; + private final static String REQUEST_SAML_RESPONSE = "GetSAMLResponse"; + private final static String METHOD_AUTH_PASSWORD = + "urn:opengeospatial:authNMethod:OWS:1.0:password"; + + private static Logger logger = Logger.getLogger(Request.class); + + public Request(String uri) { + String request = uri + "?VERSION=" + VERSION + "&REQUEST=" + + REQUEST_SAML_RESPONSE + "&METHOD=" + METHOD_AUTH_PASSWORD + + "&ANONYMOUS=TRUE&CREDENTIALS="; + this.setURI(URI.create(request)); + } + + public Request(String uri, String user, String pass, String encoding) { + try { + String base64user = this.toBase64(user, encoding); + String base64pass = this.toBase64(pass, encoding); + + String request = uri + "?VERSION=" + VERSION + "&REQUEST=" + + REQUEST_SAML_RESPONSE + "&METHOD=" + METHOD_AUTH_PASSWORD + + "&CREDENTIALS=" + base64user + "," + base64pass; + + this.setURI(URI.create(request)); + } + catch(UnsupportedEncodingException e) { + logger.error(e); + } + } + + private String toBase64(String value, String encoding) throws + UnsupportedEncodingException { + if (encoding == null) { + encoding = "utf-8"; + } + try { + return new String(Base64.encodeBase64(value.getBytes(encoding))); + } + catch(UnsupportedEncodingException e) { + logger.warn("Can't encode string with encoding " + encoding + + ". Falling back to utf-8. " + e); + return this.toBase64(value, "utf-8"); + } + } + +} +// vim: set et si fileencoding=utf-8 ts=4 sw=4 tw=80: + diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Response.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Response.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,118 @@ +package org.dive4elements.river.client.server.auth.was; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import org.apache.commons.codec.binary.Base64InputStream; + +import org.apache.http.HttpEntity; + +import org.apache.log4j.Logger; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; + +import org.dive4elements.river.client.server.auth.Authentication; +import org.dive4elements.river.client.server.auth.AuthenticationException; + +import org.dive4elements.river.client.server.features.Features; + +public class Response implements Authentication { + + private static Logger logger = Logger.getLogger(Response.class); + + private Element root; + private Assertion assertion; + private String username; + private String password; + private Features features; + + + public Response(HttpEntity entity, String username, String password, Features features) throws AuthenticationException, IOException { + + if (entity == null) { + throw new ServiceException("Invalid response"); + } + + String contenttype = entity.getContentType().getValue(); + + try { + InputStream in = entity.getContent(); + + if (!contenttype.equals("application/vnd.ogc.se_xml")) { + // XXX: Assume base64 encoded content. + in = new Base64InputStream(in); + } + + SAXBuilder builder = new SAXBuilder(); + Document doc = builder.build(in); + Element root = doc.getRootElement(); + String rname = root.getName(); + + if (rname != null && rname.equals("ServiceExceptionReport")) { + throw new ServiceException(root.getChildText("ServiceException")); + } + + this.root = root; + this.username = username; + this.password = password; + this.features = features; + + } + catch(JDOMException e) { + throw new AuthenticationException(e); + } + } + + public Element getRoot() { + return this.root; + } + + @Override + public boolean isSuccess() { + String status = getStatus(); + return status != null && status.equals("samlp:Success"); + } + + public String getStatus() { + Element status = this.root.getChild("Status", Namespaces.SAML_NS_PROTO); + if (status == null) { + return null; + } + Element statuscode = status.getChild("StatusCode", + Namespaces.SAML_NS_PROTO); + if (statuscode == null) { + return null; + } + return statuscode.getAttributeValue("Value"); + } + + public Assertion getAssertion() { + if (this.assertion == null && this.root != null) { + Element assertion = this.root.getChild("Assertion", + Namespaces.SAML_NS_ASSERT); + if (assertion != null) { + this.assertion = new Assertion(assertion); + } + } + return this.assertion; + } + + @Override + public User getUser() throws AuthenticationException { + Assertion assertion = this.getAssertion(); + if (assertion == null) { + throw new AuthenticationException("Response doesn't contain an assertion"); + } + List features = this.features.getFeatures( + this.assertion.getRoles()); + logger.debug("User " + this.username + " with features " + features + + " successfully authenticated."); + return new User(this.username, this.password, assertion.getNameID(), + this.assertion.getRoles(), assertion, features); + } +} +// vim: set si et fileencoding=utf-8 ts=4 sw=4 tw=80: diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/ServiceException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/ServiceException.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,15 @@ +package org.dive4elements.river.client.server.auth.was; + +import org.dive4elements.river.client.server.auth.AuthenticationException; + +public class ServiceException extends AuthenticationException { + + public ServiceException(String message) { + super(message); + } + + public ServiceException(Exception e) { + super(e); + } +} +// vim: set si et fileencoding=utf-8 ts=4 sw=4 tw=80: diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Signature.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/Signature.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,120 @@ +package org.dive4elements.river.client.server.auth.was; + +import java.io.ByteArrayInputStream; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; + +import org.apache.commons.codec.binary.Base64; +import org.apache.log4j.Logger; +import org.jdom.Element; + +public class Signature { + + private static Logger logger = Logger.getLogger(Signature.class); + + private static final String XML_SIG_DIGEST_SHA1 = + "http://www.w3.org/2000/09/xmldsig#sha1"; + private static final String XML_SIG_SIGNATURE_RSA_SHA1 = + "http://www.w3.org/2000/09/xmldsig#rsa-sha1"; + + private final Element signature; + private Certificate cert; + private byte[] value; + private byte[] digestvalue; + private String reference; + + public Signature(Element signature) { + this.signature = signature; + this.parseSignatureInfo(); + this.parseSignatureValue(); + this.parseCertificate(); + } + + private void parseSignatureInfo() { + Element signatureinfo = this.signature.getChild("SignedInfo", + Namespaces.XML_SIG_NS); + if (signatureinfo != null) { + Element signaturemethod = signatureinfo.getChild("SignatureMethod", + Namespaces.XML_SIG_NS); + String algorithm = signaturemethod.getAttributeValue("Algorithm"); + if (!algorithm.equals(XML_SIG_SIGNATURE_RSA_SHA1)) { + logger.warn("Unkown signature alorithm " + algorithm); + } + + // There could be several references in XML-Sig spec but for me it + // doesn't make sense to have more then one in a SAML Assertion + Element reference = signatureinfo.getChild("Reference", + Namespaces.XML_SIG_NS); + // reference must be present but its better to check + if (reference != null) { + String digestvalue = reference.getChildText("DigestValue", + Namespaces.XML_SIG_NS); + String digestmethod = reference.getChildText("DigestMethod", + Namespaces.XML_SIG_NS); + if (!digestmethod.equals(XML_SIG_DIGEST_SHA1)) { + logger.warn("Unknown digest method " + digestmethod); + } + this.digestvalue = Base64.decodeBase64(digestvalue); + + String referenceuri = reference.getAttributeValue("URI"); + if (referenceuri.startsWith("#")) { + this.reference = referenceuri.substring(1); + } + else { + logger.warn("Unkown reference type " + referenceuri); + this.reference = referenceuri; + } + } + } + } + + private void parseSignatureValue() { + String signaturevalue = this.signature.getChildText("SignatureValue", + Namespaces.XML_SIG_NS); + this.value = Base64.decodeBase64(signaturevalue); + } + + private void parseCertificate() { + Element keyinfo = this.signature.getChild("KeyInfo", + Namespaces.XML_SIG_NS); + if (keyinfo != null) { + Element data = keyinfo.getChild("X509Data", Namespaces.XML_SIG_NS); + if (data != null) { + String base64cert = data.getChildText("X509Certificate", + Namespaces.XML_SIG_NS); + if (base64cert != null) { + byte[] bytes = Base64.decodeBase64(base64cert); + try { + CertificateFactory cf = CertificateFactory.getInstance( + "X.509"); + this.cert = cf.generateCertificate( + new ByteArrayInputStream(bytes)); + } + catch(CertificateException e) { + // should never occur + logger.error(e); + } + } + } + } + } + + public Certificate getCertificate() { + return this.cert; + } + + public byte[] getValue() { + return this.value; + } + + public String getReference() { + // In theory there could be several references with digestvalues, ... + return this.reference; + } + + public byte[] getDigestValue() { + return this.digestvalue; + } +} +// vim: set si et fileencoding=utf-8 ts=4 sw=4 tw=80: diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/User.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/auth/was/User.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,40 @@ +package org.dive4elements.river.client.server.auth.was; + +import java.util.Date; +import java.util.List; + +import org.dive4elements.river.client.server.auth.DefaultUser; + +public class User +extends DefaultUser +implements org.dive4elements.river.client.server.auth.User { + + private Assertion assertion; + + public User(String name, + String password, + String account, + List roles, + Assertion assertion, + List features + ) { + this.setName(name); + this.setPassword(password); + this.setRoles(roles); + this.assertion = assertion; + this.setAllowedFeatures(features); + this.setAccount(account); + } + + @Override + public boolean hasExpired() { + Date until = this.assertion.getUntil(); + if (until != null) { + Date current = new Date(); + return !current.after(until); + } + return false; + } +} + +// vim:set ts=4 sw=4 si et fenc=utf8 tw=80: diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/features/Features.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/features/Features.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,13 @@ +package org.dive4elements.river.client.server.features; + +import java.util.List; + +public interface Features { + + public static final String CONTEXT_ATTRIBUTE = "org.dive4elements.river.client.server.features"; + + /** + * Returns all allowed features to a list of roles + */ + public List getFeatures(List roles); +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/features/FeaturesNamespaceContext.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/features/FeaturesNamespaceContext.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,80 @@ +package org.dive4elements.river.client.server.features; + +import java.util.Iterator; + +import javax.xml.XMLConstants; + +import javax.xml.namespace.NamespaceContext; + +public class FeaturesNamespaceContext +implements NamespaceContext { + + /** + * The URI of the namespace of the features. + */ + public final static String NAMESPACE_URI = + "http://www.intevation.de/2012/flys/features"; + + /** + * The XML prefix for the features namespace. + */ + public final static String NAMESPACE_PREFIX = "ftr"; + + /** + * Final instance to be easily used to avoid creation + * of instances. + */ + public static final FeaturesNamespaceContext INSTANCE = + new FeaturesNamespaceContext(); + + /** + * The default constructor. + */ + public FeaturesNamespaceContext() { + } + + /** + * @see javax.xml.namespace.NamespaceContext#getNamespaceURI(String) + * @param prefix The prefix + * @return The corresponing URI + */ + @Override + public String getNamespaceURI(String prefix) { + + if (prefix == null) { + throw new NullPointerException("Null prefix"); + } + + if (NAMESPACE_PREFIX.equals(prefix)) { + return NAMESPACE_URI; + } + + if ("xml".equals(prefix)) { + return XMLConstants.XML_NS_URI; + } + + return XMLConstants.NULL_NS_URI; + } + + /** + * @see javax.xml.namespace.NamespaceContext#getPrefix(String) + * @param uri The URI + * @return nothing. + * @throws java.lang.UnsupportedOperationException + */ + @Override + public String getPrefix(String uri) { + throw new UnsupportedOperationException(); + } + + /** + * @see javax.xml.namespace.NamespaceContext#getPrefixes(java.lang.String) + * @param uri The URI + * @return nothing + * @throws java.lang.UnsupportedOperationException + */ + @Override + public Iterator getPrefixes(String uri) { + throw new UnsupportedOperationException(); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/features/XMLFileFeatures.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/features/XMLFileFeatures.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,96 @@ +package org.dive4elements.river.client.server.features; + +import java.io.FileInputStream; +import java.io.IOException; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +public class XMLFileFeatures implements Features { + + private static final Logger logger = + Logger.getLogger(XMLFileFeatures.class); + + private Map> featuremap = + new HashMap>(); + + private final static String XPATH_FEATURES = "ftr:feature/child::text()"; + private final static String XPATH_ROLES = "/ftr:features/ftr:role"; + + public XMLFileFeatures(String filename) throws IOException { + FileInputStream finput = new FileInputStream(filename); + logger.debug("XMLFileFeatures: " + filename); + try { + Document doc = XMLUtils.parseDocument(finput); + + NodeList roles = (NodeList) XMLUtils.xpath( + doc, + XPATH_ROLES, + XPathConstants.NODESET, + FeaturesNamespaceContext.INSTANCE); + + for(int i = 0, m = roles.getLength(); i < m; i++) { + Element rolenode = (Element)roles.item(i); + + String name = rolenode.getAttribute("name"); + + logger.debug("Found role: " + name); + + NodeList features = (NodeList) XMLUtils.xpath( + rolenode, + XPATH_FEATURES, + XPathConstants.NODESET, + FeaturesNamespaceContext.INSTANCE); + + if (features == null) { + continue; + } + + int N = features.getLength(); + + if (N > 0) { + List allowed = new ArrayList(N); + for (int j = 0; j < N; j++) { + Node featurenode = features.item(j); + String featurename = featurenode.getNodeValue(); + + logger.debug("Found feature: " + featurename); + + allowed.add(featurename); + } + featuremap.put(name, allowed); + } + } + logger.debug("Loaded all features"); + } + finally { + finput.close(); + } + } + + @Override + public List getFeatures(List roles) { + List features = new ArrayList(); + + for (String role: roles) { + List allowed = this.featuremap.get(role); + if (allowed != null) { + features.addAll(allowed); + } + } + return features; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/filter/GGInAFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/filter/GGInAFilter.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,206 @@ +package org.dive4elements.river.client.server.filter; + +import org.dive4elements.river.client.server.auth.Authentication; +import org.dive4elements.river.client.server.auth.AuthenticationException; +import org.dive4elements.river.client.server.auth.AuthenticationFactory; +import org.dive4elements.river.client.server.auth.User; +import org.dive4elements.river.client.server.features.Features; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Enumeration; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; + + +/** ServletFilter used for GGInA authentification and certain authorisation. */ +public class GGInAFilter implements Filter { + + /** Private logger. */ + private static Logger logger = Logger.getLogger(GGInAFilter.class); + + private boolean deactivate = false; + private String authmethod; + private String redirecturl; + private ServletContext sc; + + private static final String LOGIN_JSP = "/login.jsp"; + private static final String LOGIN_SERVLET = "/flys/login"; + private static final String FLYS_CSS = "/FLYS.css"; + + + /** + * Initialize. + * + * Read FilterConfig parameter deactivate + */ + @Override + public void init(FilterConfig config) + throws ServletException + { + String deactivate = config.getInitParameter("deactivate"); + this.sc = config.getServletContext(); + logger.debug("GGInAFilter context " + this.sc.getContextPath()); + this.authmethod = sc.getInitParameter("authentication"); + this.redirecturl = sc.getInitParameter("redirect-url"); + if (deactivate != null && deactivate.equalsIgnoreCase("true")) { + this.deactivate = true; + } + + } + + + /** + * Called when filter in chain invoked. + * @param req request to servlet + * @param resp response of servlet + * @param chain the filter chain + */ + @Override + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) + throws IOException, ServletException + { + if (this.deactivate) { + logger.debug("GGinAFilter is deactivated"); + chain.doFilter(req, resp); + return; + } + + HttpServletRequest sreq = (HttpServletRequest) req; + + String requesturi = sreq.getRequestURI(); + if (logger.isDebugEnabled()) { + for (Enumeration e = req.getAttributeNames() ; e.hasMoreElements() ;) { + logger.debug(e.nextElement()); + } + } + + logger.debug("Request for: " + requesturi); + + // Allow access to localhost + if (isLocalAddress(req)) { + logger.debug("Request to localhost"); + chain.doFilter(req, resp); + return; + } + + // Allow access to login pages + String path = this.sc.getContextPath(); + if (requesturi.equals(path + LOGIN_JSP) + || requesturi.equals(path + LOGIN_SERVLET) + || requesturi.equals(path + FLYS_CSS)) { + logger.debug("Request for login " + requesturi); + chain.doFilter(req, resp); + return; + } + + boolean redirect = false; + + HttpSession session = sreq.getSession(); + + String uri = path + "/" + this.redirecturl; + + /* Redirect if uri is root or redirecturl */ + if (requesturi.equals(uri) || requesturi.equals(path + "/")) { + redirect = true; + } + + String queryString = sreq.getQueryString(); + + if (queryString != null) { + uri += "?" + queryString; + } + session.setAttribute("requesturi", uri); + + User user = (User)session.getAttribute("user"); + if (user == null) { + logger.debug("No user in session: " + requesturi); + this.handleResponse(resp, redirect); + return; + } + if (user.hasExpired()) { + // try to re-authenticate the user + logger.debug("User ticket has expired: " + requesturi); + String encoding = sreq.getCharacterEncoding(); + try { + Authentication auth = this.auth(user, encoding); + if (auth == null || !auth.isSuccess()) { + logger.debug("Re-athentication not successful"); + this.handleResponse(resp, redirect); + } + } + catch(AuthenticationException e) { + logger.error("Failure during re-authentication", e); + this.handleResponse(resp, redirect); + return; + } + } + + chain.doFilter(req, resp); + return; + } + + private void redirect(ServletResponse resp) throws IOException { + logger.debug("Redirect to login"); + ((HttpServletResponse) resp).sendRedirect(this.sc.getContextPath() + + "/login.jsp"); + } + + private void sendNotAuthenticated(ServletResponse resp) throws IOException { + logger.debug("Send not authenticated"); + ((HttpServletResponse)resp).sendError(HttpServletResponse.SC_FORBIDDEN, "User not authenticated"); + } + + private void handleResponse(ServletResponse resp, boolean redirect) throws IOException { + if (redirect) { + this.redirect(resp); + } + else { + this.sendNotAuthenticated(resp); + } + } + + + /** + * Do nothing at destruction. + */ + @Override + public void destroy() { + } + + private Authentication auth(User user, String encoding) + throws AuthenticationException, IOException { + Features features = (Features)sc.getAttribute(Features.CONTEXT_ATTRIBUTE); + return AuthenticationFactory.getInstance(this.authmethod).auth( + user.getName(), user.getPassword(), encoding, features); + } + + /** + * Returns true if the request is from our machine + * @param req The ServletRequest + * @return true if the request is from a loopback interface or from one of + * the interface addresses of the machine + */ + private boolean isLocalAddress(ServletRequest req) { + try { + InetAddress addr = InetAddress.getByName(req.getRemoteAddr()); + return addr.isAnyLocalAddress() || addr.isLoopbackAddress(); + } catch (UnknownHostException e) { + logger.error(e, e); + return false; + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/filter/NoCacheFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/filter/NoCacheFilter.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,72 @@ +package org.dive4elements.river.client.server.filter; + +import java.io.IOException; +import java.util.Date; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +/** ServletFilter to avoid caching for GWTs *.nocache.* files. */ +public class NoCacheFilter implements Filter { + + private static final long DAY = 86400000L; + + private static final String NO_CACHE = ".nocache."; + + private static Logger log = Logger.getLogger(NoCacheFilter.class); + + /** + * Initialize. + */ + @Override + public void init(FilterConfig config) + throws ServletException + { + } + + + /** + * Called when filter in chain invoked. + * @param req request to servlet + * @param resp response of servlet + * @param chain the filter chain + */ + @Override + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) + throws IOException, ServletException + { + HttpServletRequest httpreq = (HttpServletRequest)req; + String uri = httpreq.getRequestURI(); + + if (uri.contains(NO_CACHE)) { + log.debug("Set no-cache for " + uri); + + Date now = new Date(); + HttpServletResponse httpresp = (HttpServletResponse)resp; + httpresp.setDateHeader("Date", now.getTime()); + httpresp.setDateHeader("Expires", now.getTime() - DAY); + httpresp.setHeader("Pragma", "no-cache"); + httpresp.setHeader("Cache-control", + "no-cache, no-store, must-revalidate"); + } + + chain.doFilter(req, resp); + } + + + /** + * Do nothing at destruction. + */ + @Override + public void destroy() { + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/server/meta/Converter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/meta/Converter.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,161 @@ +package org.dive4elements.river.client.server.meta; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Attr; +import org.w3c.dom.NamedNodeMap; + +import org.apache.log4j.Logger; + +import org.dive4elements.river.client.shared.model.DataCageTree; +import org.dive4elements.river.client.shared.model.DataCageNode; +import org.dive4elements.river.client.shared.model.AttrList; + +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; + +import org.dive4elements.artifacts.common.utils.XMLUtils; + +/** + * Converts document parts (meta-data xml) to datacagenodes/trees, + * which are shown in datacage widgets. + */ +public class Converter +{ + private static final Logger logger = Logger.getLogger(Converter.class); + + + public interface NodeConverter + { + DataCageNode convert(Element node, Converter converter); + + } // interface NodeConverter + + public static class NameConverter implements NodeConverter { + public DataCageNode convert(Element node, Converter converter) { + //System.err.println("NameConverter called"); + DataCageNode out = new DataCageNode( + node.getAttribute("name"), + toAttrList(node.getAttributes())); + converter.convertChildren(out, node); + return out; + } + } // class NameConverter + + public static class I18NConverter implements NodeConverter { + public DataCageNode convert(Element node, Converter converter) { + //System.err.println("I18NConverter called"); + + String name = node.getLocalName(); + String desc = node.hasAttribute("description") + ? node.getAttribute("description") + : "${" + name + "}"; + + DataCageNode out = + new DataCageNode(name, desc, toAttrList(node.getAttributes())); + + converter.convertChildren(out, node); + return out; + } + } // I18NConverter + + private static Map converters = new HashMap(); + + public static final NodeConverter NAME_CONVERTER = new NameConverter(); + public static final NodeConverter I18N_CONVERTER = new I18NConverter(); + + static { + converters.put("river", NAME_CONVERTER); + converters.put("gauge", NAME_CONVERTER); + converters.put("historical", NAME_CONVERTER); + converters.put("column", NAME_CONVERTER); + } + + + /** Trivial constructor. */ + public Converter() { + } + + + public DataCageTree convert(Document document) { + logger.debug("convert called"); + + if (logger.isDebugEnabled()) { + logger.debug(XMLUtils.toString(document)); + } + + ArrayList roots = new ArrayList(); + NodeList nodes = document.getChildNodes(); + for (int i = 0, N = nodes.getLength(); i < N; ++i) { + Node node = nodes.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element ele = (Element)node; + roots.add(convertElement(ele)); + } + } + return roots.isEmpty() + ? new DataCageTree() + : new DataCageTree(roots.get(0)); + } + + protected void convertChildren(DataCageNode parent, Element sub) { + //System.err.println("convertChildren called"); + NodeList children = sub.getChildNodes(); + for (int i = 0, N = children.getLength(); i < N; ++i) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Element childele = (Element)child; + parent.addChild(convertElement(childele)); + + if (childele.hasAttribute("description")) + logger.debug("nwd: " + childele.getAttribute("description")); + } + } // for all children + } + + private DataCageNode convertElement(Element element) { + String name = element.getLocalName(); + + logger.debug("search for name: " + name); + + NodeConverter converter = converters.get(name); + if (converter == null) { + converter = I18N_CONVERTER; + } + return converter.convert(element, this); + + } + + + /** + * Creates key/value pairs from Nodes Attributes. + */ + public static AttrList toAttrList(NamedNodeMap nodeMap) { + if (nodeMap == null) { + return null; + } + int N = nodeMap.getLength(); + + if (N == 0) { + return null; + } + + AttrList result = new AttrList(N); + + for (int i = 0; i < N; ++i) { + Node node = nodeMap.item(i); + if (node.getNodeType() == Node.ATTRIBUTE_NODE) { + Attr attr = (Attr)node; + String key = attr.getName(); + String value = attr.getValue(); + result.add(key, value); + } + } + + return result; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/DoubleUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/DoubleUtils.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,81 @@ +package org.dive4elements.river.client.shared; + + +public final class DoubleUtils { + + public static final String DEFAULT_DELIM = " "; + + + private DoubleUtils() { + } + + + public static Double getDouble(String value) { + try { + return Double.valueOf(value); + } + catch (NumberFormatException nfe) { + // do nothing + } + + return null; + } + + + public static double[] getMinMax(String value) { + return getMinMax(value, DEFAULT_DELIM); + } + + + public static double[] getMinMax(String value, String delim) { + if (value == null) { + return null; + } + + String[] values = value.split(delim); + + int len = values != null ? values.length : 0; + double[] mm = new double[] { Double.MAX_VALUE, -Double.MAX_VALUE }; + + for (int i = 0; i < len; i++) { + Double d = getDouble(values[i]); + + if (d != null) { + mm[0] = mm[0] < d ? mm[0] : d; + mm[1] = mm[1] > d ? mm[1] : d; + } + } + + return mm[0] != Double.MAX_VALUE && mm[1] != -Double.MAX_VALUE + ? mm + : null; + } + + /** toIndex is not inclusive, fromIndex is. */ + static void fill(double[] array, int fromIndex, int toIndex, double val) { + for (int i = fromIndex; i < toIndex; i++) { + array[i] = val; + } + } + + /** @see java.util.Arrays.copyOf */ + public static double[] copyOf(double[] toCopy, int newLen) { + double[] nArray = new double[newLen]; + + if (toCopy == null) { + fill(nArray, 0, nArray.length, 0d); + return nArray; + } + + int goTo = (newLen < toCopy.length) + ? newLen + : toCopy.length; + + for (int i = 0; i < goTo; i++) { + nArray[i] = toCopy[i]; + } + fill (nArray, goTo, nArray.length, 0d); + return nArray; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/FieldVerifier.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/FieldVerifier.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,42 @@ +package org.dive4elements.river.client.shared; + +/** + *

    + * FieldVerifier validates that the name the user enters is valid. + *

    + *

    + * This class is in the shared package because we use it in both + * the client code and on the server. On the client, we verify that the name is + * valid before sending an RPC request so the user doesn't have to wait for a + * network round trip to get feedback. On the server, we verify that the name is + * correct to ensure that the input is correct regardless of where the RPC + * originates. + *

    + *

    + * When creating a class that is used on both the client and the server, be sure + * that all code is translatable and does not use native JavaScript. Code that + * is note translatable (such as code that interacts with a database or the file + * system) cannot be compiled into client side JavaScript. Code that uses native + * JavaScript (such as Widgets) cannot be run on the server. + *

    + */ +public class FieldVerifier { + + /** + * Verifies that the specified name is valid for our service. + * + * In this example, we only require that the name is at least four + * characters. In your application, you can use more complex checks to ensure + * that usernames, passwords, email addresses, URLs, and other fields have the + * proper syntax. + * + * @param name the name to validate + * @return true if valid, false if invalid + */ + public static boolean isValidName(String name) { + if (name == null) { + return false; + } + return name.length() > 3; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/MapUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/MapUtils.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,43 @@ +package org.dive4elements.river.client.shared; + +import java.util.Date; + + +public class MapUtils { + + public static final String GET_LEGEND_GRAPHIC_TEMPLATE = + "${SERVER}SERVICE=WMS&VERSION=1.1.1&layer=${LAYER}" + + "&REQUEST=getLegendGraphic&FORMAT=image/png"; + + + private MapUtils() { + } + + public static String getLegendGraphicUrl(String server, String layer) { + return getLegendGraphicUrl(server, layer, -1); + } + + public static String getLegendGraphicUrl(String server, String layer, int dpi) { + if (server == null || layer == null) { + return null; + } + + if (server.contains("osm.intevation.de")) { + // GetLegend is not implemented at osm.intevation.de + // This avoids an error in the print log + return null; + } + server = server.indexOf("?") >= 0 ? server : server + "?"; + + String url = GET_LEGEND_GRAPHIC_TEMPLATE; + url = url.replace("${SERVER}", server); + url = url.replace("${LAYER}", layer); + url = url + "×tamp=" + new Date().getTime(); + if (dpi != -1) { + url+="&legend_options=dpi:" + dpi; + } + + return url; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/Transform2D.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/Transform2D.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,129 @@ +package org.dive4elements.river.client.shared; + +import java.io.Serializable; +import java.util.Date; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; +import com.google.gwt.i18n.client.NumberFormat; + + +/** + * This object supports a linear transformation to transform xy coordinates into + * an other coordinate system based on scale and translation values. + * + * @author Ingo Weinzierl + */ +public class Transform2D implements Serializable { + + protected String xType; + protected String yType; + + protected double sx; + protected double sy; + + protected double tx; + protected double ty; + + + public Transform2D() { + } + + + /** + * Creates a new transformation with scale and translation factors. + * + * @param sx The scale factor for the x axis. + * @param sy The scale factor for the y axis. + * @param tx The translation factor for the x axis. + * @param ty The translation factor for the y axis. + */ + public Transform2D(double sx, double sy, double tx, double ty) { + this(sx, sy, tx, ty, "number", "number"); + } + + + public Transform2D( + double sx, double sy, + double tx, double ty, + String xType, + String yType + ) { + this.xType = xType; + this.yType = yType; + + this.sx = sx; + this.sy = sy; + this.tx = tx; + this.ty = ty; + } + + + /** + * Transforms the pixel x and y into a new coordinate system based on the + * scale and translation values specified in the constructor. + */ + public double[] transform(double x, double y) { + double resX = sx * x + tx; + double resY = sy * y + ty; + + return new double[] { resX, resY }; + } + + + public String[] format(Number[] xy) { + String x = null; + String y = null; + + if (xType.equals("date")) { + x = formatDate(xy[0].longValue()); + } + else { + x = formatNumber(xy[0].doubleValue()); + } + + if (yType.equals("date")) { + y = formatDate(xy[1].longValue()); + } + else { + y = formatNumber(xy[1].doubleValue()); + } + + return new String[] { x, y }; + } + + + protected String formatDate(long time) { + Date date = new Date(time); + DateTimeFormat df = getDateTimeFormat(); + + return df.format(date); + } + + + protected String formatNumber(double number) { + NumberFormat nf = getNumberFormat(); + + return nf.format(number); + } + + + public DateTimeFormat getDateTimeFormat() { + return DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT); + } + + + public NumberFormat getNumberFormat() { + return NumberFormat.getDecimalFormat(); + } + + + public void dumpGWT() { + GWT.log("SX = " + sx); + GWT.log("SY = " + sy); + GWT.log("TX = " + tx); + GWT.log("TY = " + ty); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/exceptions/AuthenticationException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/exceptions/AuthenticationException.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,23 @@ +package org.dive4elements.river.client.shared.exceptions; + +import java.io.Serializable; + + +/** + * This exception class is used if an error occured while user authentication. + * + * @author Ingo Weinzierl + */ +public class AuthenticationException +extends Exception +implements Serializable +{ + public AuthenticationException() { + } + + + public AuthenticationException(String msg) { + super(msg); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/exceptions/ServerException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/exceptions/ServerException.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,17 @@ +package org.dive4elements.river.client.shared.exceptions; + +import java.io.Serializable; + + +public class ServerException +extends Exception +implements Serializable +{ + public ServerException() { + } + + + public ServerException(String msg) { + super(msg); + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Artifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Artifact.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,70 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; +import java.util.List; + + +/** + * This class represents an artifact for the client. It contains the necessary + * information for the client and the communication with the artifact server. + * + * @author Ingo Weinzierl + */ +public interface Artifact extends Serializable { + + /** + * Returns the UUID of the artifact. + * + * @return the UUID. + */ + public String getUuid(); + + + /** + * Returns the hash of the artifact. + * + * @return the hash. + */ + public String getHash(); + + + /** + * Returns the name of the artifact. + * This happens to be the factory name, too. + * + * @return the name. + */ + public String getName(); + + /** + * Returns the ArtifactDescription. + * + * @return the artifact description. + */ + public ArtifactDescription getArtifactDescription(); + + + /** + * Returns true, if the Artifact is in Background mode. + * + * @return true, if the artifact is in background mode. + */ + public boolean isInBackground(); + + + /** + * Return a list of background messages. + * + * @return a list of background messages. + */ + public List getBackgroundMessages(); + + + /** + * Sets a new ArtifactDescription. + * + * @param artifactDescription The new artifact description. + */ + public void setArtifactDescription(ArtifactDescription artifactDescription); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ArtifactDescription.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ArtifactDescription.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,98 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; + + +/** + * The artifact description describes a state of an artifact. There are + * operations defined that return former inserted data, possible input values + * and output targets that are available in the current state of the artifact. + * + * @author Ingo Weinzierl + */ +public interface ArtifactDescription extends Serializable { + + /** + * Returns the data that have been inserted in former states of the + * artifact. + * + * @return the old data of former states. + */ + public DataList[] getOldData(); + + + /** + * Returns the data with all its options that might be inserted in the + * current state of the artifact. + * + * @return the current data. + */ + public DataList getCurrentData(); + + + /** + * Returns the current state as string. + * + * @return the current state. + */ + public String getCurrentState(); + + + /** + * Returns the reachable states as string. + * + * @return the reachable states. + */ + public String[] getReachableStates(); + + + /** + * Returns the name of the selected river. + * + * @return the selected river. + */ + public String getRiver(); + + + /** + * Returns the selected min and max kilomter if existing otherwise null. + * + * @return an array of [min-km, max-km] if existing otherwise null. + */ + public double[] getKMRange(); + + + /** + * Returns the selected reference gauge (which needs to be a data named + * 'reference_gauge'. + * + * @return the selected reference gauge (which needs to be a data named + * 'reference_gauge'. + */ + public String getReferenceGauge(); + + + /** + * Returns the string value of a data object with name dataName. + * + * @return the string value of a data object with name dataName. + */ + public String getDataValueAsString(String dataName); + + + /** + * Returns the available output modes. + * + * @return the available output modes. + */ + public OutputMode[] getOutputModes(); + + + /** + * Returns the recommended artifacts suggested by the server. + * + * @return the recommended artifacts. + */ + public Recommendation[] getRecommendations(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ArtifactFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ArtifactFilter.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,64 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; + +import java.util.HashMap; +import java.util.Map; +import java.util.List; + +public class ArtifactFilter +implements Serializable +{ + protected String factoryName; + + protected Map outFilters; + + public ArtifactFilter() { + outFilters = new HashMap(); + } + + public ArtifactFilter(String factoryName) { + this(); + this.factoryName = factoryName; + } + + public String getFactoryName() { + return factoryName; + } + + public void setFactoryName(String factoryName) { + this.factoryName = factoryName; + } + + public void add(String out, String name, String num) { + if (out == null) { + out = ToLoad.uniqueKey(outFilters); + } + + OutFilter outFilter = outFilters.get(out); + + if (outFilter == null) { + outFilter = new OutFilter(out); + outFilters.put(out, outFilter); + } + outFilter.add(name, num); + } + + public String collectIds() { + StringBuilder sb = new StringBuilder(); + for (OutFilter outFilter: outFilters.values()) { + outFilter.collectIds(sb); + } + return sb.toString(); + } + + public Recommendation.Filter toFilter() { + Recommendation.Filter rf = new Recommendation.Filter(); + for (Map.Entry entry: outFilters.entrySet()) { + List facets = entry.getValue().toFacets(); + rf.add(entry.getKey(), facets); + } + return rf; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttrList.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttrList.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,37 @@ +package org.dive4elements.river.client.shared.model; + +import java.util.List; +import java.util.ArrayList; + +import java.io.Serializable; + +public class AttrList implements Serializable +{ + protected List keyValues; + + public AttrList() { + this(5); + } + + public AttrList(int size) { + keyValues = new ArrayList(size*2); + } + + public int size() { + return keyValues != null ? keyValues.size()/2 : null; + } + + public String getKey(int index) { + return keyValues.get(index*2); + } + + public String getValue(int index) { + return keyValues.get(index*2 + 1); + } + + public void add(String key, String value) { + keyValues.add(key); + keyValues.add(value); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttributedTheme.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttributedTheme.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,197 @@ +package org.dive4elements.river.client.shared.model; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + + +/** + * @author Ingo Weinzierl + */ +public class AttributedTheme implements Theme { + + protected Map attributes; + + /** CollectionItem associated with this facet/themes artifact. */ + protected CollectionItem collectionItem; + + public AttributedTheme() { + this.attributes = new HashMap(); + } + + + public Set getKeys() { + return attributes.keySet(); + } + + + public void addAttr(String name, String value) { + if (name != null && value != null) { + attributes.put(name, value); + } + } + + + public String getAttr(String name) { + return attributes.get(name); + } + + + public Integer getAttrAsInt(String name) { + String attr = getAttr(name); + + if (attr != null && attr.length() > 0) { + try { + return Integer.parseInt(attr); + } + catch (NumberFormatException nfe) { + } + } + + return null; + } + + + public boolean getAttrAsBoolean(String name) { + String attr = getAttr(name); + + if (attr != null) { + try { + int num = Integer.valueOf(attr); + return num > 0; + } + catch (NumberFormatException nfe) { + // do nothing + } + } + + return Boolean.valueOf(attr); + } + + + @Override + public int getPosition() { + Integer pos = getAttrAsInt("pos"); + + return pos != null ? pos.intValue() : -1; + } + + + @Override + public void setPosition(int pos) { + addAttr("pos", String.valueOf(pos)); + } + + + @Override + public int getIndex() { + Integer idx = getAttrAsInt("index"); + + return idx != null ? idx.intValue() : -1; + } + + + @Override + public int getActive() { + return getAttrAsInt("active"); + } + + + @Override + public void setActive(int active) { + addAttr("active", String.valueOf(active)); + } + + + @Override + public String getArtifact() { + return getAttr("artifact"); + } + + + @Override + public String getFacet() { + return getAttr("facet"); + } + + + @Override + public String getDescription() { + return getAttr("description"); + } + + + @Override + public void setDescription(String description) { + if (description != null && description.length() > 0) { + addAttr("description", description); + } + } + + + @Override + public int getVisible() { + return getAttrAsInt("visible"); + } + + + @Override + public void setVisible(int visible) { + addAttr("visible", String.valueOf(visible)); + } + + + @Override + public boolean equals(Object o) { + if (!(o instanceof AttributedTheme)) { + return false; + } + + AttributedTheme other = (AttributedTheme) o; + + if (other.getPosition() != getPosition()) { + return false; + } + + if (!other.getArtifact().equals(getArtifact())) { + return false; + } + + if (other.getActive() != getActive()) { + return false; + } + + if (!other.getFacet().equals(getFacet())) { + return false; + } + + if (!other.getDescription().equals(getDescription())) { + return false; + } + + if (other.getIndex() != getIndex()) { + return false; + } + + if (other.getVisible() != getVisible()) { + return false; + } + + return true; + } + + + /** Get the CollectionItem representing the facets artifact. */ + @Override + public CollectionItem getCollectionItem() { + return collectionItem; + } + + + /** Set the CollectionItem representing the facets artifact. */ + @Override + public void setCollectionItem(CollectionItem ci) { + this.collectionItem = ci; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Axis.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Axis.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,21 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public interface Axis extends Serializable { + + int getPos(); + + Number getFrom(); + + Number getTo(); + + Number getMin(); + + Number getMax(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/BBox.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/BBox.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,74 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; + + +public class BBox implements Serializable { + + public double lowerX; + public double upperX; + public double lowerY; + public double upperY; + + + public BBox() { + } + + + public BBox(double lowerX, double lowerY, double upperX, double upperY) { + this.lowerX = lowerX; + this.lowerY = lowerY; + this.upperX = upperX; + this.upperY = upperY; + } + + + public double getLowerX() { + return lowerX; + } + + + public double getLowerY() { + return lowerY; + } + + + public double getUpperX() { + return upperX; + } + + + public double getUpperY() { + return upperY; + } + + + public String toString() { + return + "(" + lowerX + "," + lowerY + ")" + + "(" + upperX + "," + upperY + ")"; + } + + + public static BBox getBBoxFromString(String bbox) { + String[] coords = bbox != null ? bbox.split(" ") : null; + + if (coords == null || coords.length < 4) { + return null; + } + + try { + return new BBox( + Double.parseDouble(coords[0]), + Double.parseDouble(coords[1]), + Double.parseDouble(coords[2]), + Double.parseDouble(coords[3])); + } + catch (NumberFormatException nfe) { + // do nothing here + } + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/BooleanProperty.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/BooleanProperty.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,53 @@ +package org.dive4elements.river.client.shared.model; + +import java.util.HashMap; + +/** + * @author Raimund Renkert + */ +public class BooleanProperty extends PropertySetting { + + /** + * Create a new BooleanProperty for settings. + */ + public BooleanProperty() { + this.attributes = new HashMap(); + } + + + /** + * Create a new BooleanProperty. + * @param name The attribute name. + * @param value The current value. + */ + public BooleanProperty( + String name, + Boolean value) + { + this.name = name; + this.value = value.toString(); + this.attributes = new HashMap(); + } + + + @Override + public Boolean getValue() { + return Boolean.valueOf(this.value); + } + + + public void setValue(Boolean value) { + this.value = value.toString(); + } + + + public Object clone() { + BooleanProperty clone = new BooleanProperty(this.getName(), + this.getValue()); + for(String s: this.getAttributeList()) { + clone.setAttribute(s, this.getAttribute(s)); + } + return clone; + } + +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/CalculationMessage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/CalculationMessage.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,37 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; + + +public class CalculationMessage implements Serializable { + + protected int steps; + protected int currentStep; + protected String message; + + + public CalculationMessage() { + } + + + public CalculationMessage(int steps, int currentStep, String message) { + this.steps = steps; + this.currentStep = currentStep; + this.message = message; + } + + + public int getSteps() { + return steps; + } + + + public int getCurrentStep() { + return currentStep; + } + + + public String getMessage() { + return message; + } +} diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Capabilities.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Capabilities.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,95 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +public class Capabilities implements Serializable { + + protected String title; + protected String onlineResource; + protected String fees; + protected String accessConstraints; + + protected ContactInformation contactInformation; + + protected List layers; + + + public Capabilities() { + layers = new ArrayList(); + } + + + /** + * @param fees + * @param accessConstraints + * @param layers + */ + public Capabilities( + String title, + String onlineResource, + ContactInformation contactInformation, + String fees, + String accessConstraints, + List layers + ) { + this.title = title; + this.onlineResource = onlineResource; + this.contactInformation = contactInformation; + this.fees = fees; + this.accessConstraints = accessConstraints; + this.layers = layers; + } + + + public String getTitle() { + return title; + } + + + public String getOnlineResource() { + return onlineResource; + } + + + public ContactInformation getContactInformation() { + return contactInformation; + } + + + public String getFees() { + return fees; + } + + + public String getAccessConstraints() { + return accessConstraints; + } + + + public List getLayers() { + return layers; + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("--- Capabilities ---\n"); + sb.append("Title:.............. " + title + "\n"); + sb.append("Online Resource:.... " + onlineResource + "\n"); + sb.append("Contact Information: " + contactInformation + "\n"); + sb.append("Fees:............... " + fees + "\n"); + sb.append("Access Constraints:. " + accessConstraints + "\n"); + sb.append("Layers: "); + + for (WMSLayer layer: layers) { + sb.append(" - " + layer + "\n"); + } + + return sb.toString(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ChartArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ChartArtifact.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,40 @@ +package org.dive4elements.river.client.shared.model; + +import java.util.List; + + +/** + * The Chart implementation of an Artifact. + * + * @author Raimund Renkert + */ +public class ChartArtifact extends DefaultArtifact { + + /** The name of this artifact: 'new_chart'.*/ + public static final String NAME = "new_chart"; + + + public ChartArtifact() { + } + + + public ChartArtifact(String uuid, String hash) { + super(uuid, hash); + } + + + public ChartArtifact( + String uuid, + String hash, + boolean inBackground, + List messages + ) { + super(uuid, hash, inBackground, messages); + } + + + public String getName() { + return NAME; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ChartInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ChartInfo.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,98 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; + +import com.google.gwt.core.client.GWT; + +import org.dive4elements.river.client.shared.Transform2D; + + +/** + * Give information about chart dimension and transform of chart<->pixel + * space. + * @author Ingo Weinzierl + */ +public class ChartInfo implements Serializable { + + protected Axis[] xAxes; + protected Axis[] yAxes; + + protected Transform2D[] transformer; + + + public ChartInfo() { + } + + + public ChartInfo(Axis[] xAxes, Axis[] yAxes, Transform2D[] transformer) { + this.xAxes = xAxes; + this.yAxes = yAxes; + this.transformer = transformer; + } + + + public Transform2D getTransformer(int pos) { + if (pos >= 0 && pos < transformer.length) { + return transformer[pos]; + } + + return null; + } + + + public int getTransformerCount() { + return transformer.length; + } + + + public int getXAxisCount() { + return xAxes.length; + } + + + public int getYAxisCount() { + return yAxes.length; + } + + + public Axis getXAxis(int pos) { + if (pos >= 0 && pos < xAxes.length) { + return xAxes[pos]; + } + + return null; + } + + + public Axis getYAxis(int pos) { + if (pos >= 0 && pos < yAxes.length) { + return yAxes[pos]; + } + + return null; + } + + + public void dumpGWT() { + StringBuilder sb = new StringBuilder(); + + Axis x = getXAxis(0); + + GWT.log("X axis:"); + GWT.log("... from " + x.getFrom() + " to " + x.getTo()); + GWT.log("... min " + x.getMin() + " max " + x.getMax()); + + for (int i = 0, count = getYAxisCount(); i < count; i++) { + Axis y = getYAxis(i); + + GWT.log("Y axis " + i + ":"); + GWT.log("... from " + y.getFrom() + " to " + y.getTo()); + GWT.log("... min " + y.getMin() + " max " + y.getMax()); + } + + for (Transform2D t: transformer) { + t.dumpGWT(); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ChartMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ChartMode.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,50 @@ +package org.dive4elements.river.client.shared.model; + +import java.util.List; + +import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.OutputTab; +import org.dive4elements.river.client.client.ui.chart.ChartOutputTab; +import org.dive4elements.river.client.client.ui.chart.NaviChartOutputTab; + + +/** + * @author Ingo Weinzierl + */ +public class ChartMode extends DefaultOutputMode { + + public ChartMode() { + } + + + public ChartMode(String name, String desc, String mimeType) { + super(name, desc, mimeType); + } + + + public ChartMode( + String name, + String descrition, + String mimeType, + List facets, + String type) + { + super(name, descrition, mimeType, facets); + this.type = type; + } + + + /** Create output tab. Some outs feel better inside a specialized one. */ + @Override + public OutputTab createOutputTab(String t, Collection c, CollectionView p) { + if (this.getName().equals("fix_wq_curve") || + this.getName().equals("extreme_wq_curve") || + this.getName().equals("fix_deltawt_curve") || + this.getName().equals("fix_derivate_curve") || + this.getName().equals("fix_vollmer_wq_curve")){ + return new NaviChartOutputTab(t, c, this, p); + } + return new ChartOutputTab(t, c, this, p); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Collection.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Collection.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,68 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; + + +/** + * The artifact collection. + * + * @author Ingo Weinzierl + */ +public interface Collection extends Serializable { + + public String identifier(); + + public String getName(); + + public void setName(String name); + + public Date getCreationTime(); + + /** TODO never called, trivial implementation. Can be removed? */ + public Date getLastAccess(); + + public long getTTL(); + + public void setTTL(long ttl); + + public void addItem(CollectionItem item); + + public int getItemLength(); + + public CollectionItem getItem(int idx); + + public CollectionItem getItem(String uuid); + + public Map getOutputModes(); + + public ThemeList getThemeList(String outName); + + public Settings getSettings(String outName); + + public void setSettings(Map settings); + + public void addSettings(String name, Settings settings); + + /** Sets mapping outputname to ThemeList. */ + public void setThemeLists(Map map); + + public List getRecommendations(); + + public void addRecommendation(Recommendation recommendation); + + public void addRecommendations(List recommendations); + + public boolean loadedRecommendation(Recommendation recommendation); + + public boolean hasItems(); + + /** + * Returns the name which should be displayed in the client gui + * @return String display name + */ + public String getDisplayName(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/CollectionItem.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/CollectionItem.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,57 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + + +/** + * The CollectionItem interface that provides methods to get information about + * artifacts and its output modes. + * + * @author Ingo Weinzierl + */ +public interface CollectionItem extends Serializable { + + /** + * Returns the identifier of the wrapped artifact. + * + * @return the identifier of the wrapped artifact. + */ + String identifier(); + + + /** + * Returns the hash of the wrapped artifact. + * + * @return the hash of the wrapped artifact. + */ + String hash(); + + + /** + * Returns the output modes of the wrapped artifact. + * + * @return the output modes of the wrapped artifact. + */ + List getOutputModes(); + + + /** + * Returns the facets of the wrapped artifact for a specific output mode. + * + * @param outputmode The name of an output mode that is supported by this + * item. + * + * @return the facets of the wrapped artifact for a specific output mode. + */ + List getFacets(String outputmode); + + + /** + * Returns data key/value map. + * @return key/value data map + */ + Map getData(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r d9901a08d0a6 -r 5aa05a7a34b7 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/CollectionItemAttribute.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/CollectionItemAttribute.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,106 @@ +package org.dive4elements.river.client.shared.model; + +import java.io.Serializable; + +import java.util.List; +import java.util.ArrayList; + + +/** + * @author Raimund Renkert + */ +public class CollectionItemAttribute implements Serializable { + + /** The list of styles. */ + protected List