This is an automated email from the git hooks/post-receive script. New commit to branch feature/6855 in repository observe. See http://git.codelutin.com/observe.git commit 48b30c868253f39ba71c8f418677ddcfd57febed Author: Tony Chemit <chemit@codelutin.com> Date: Tue Mar 24 16:39:13 2015 +0000 refs #6855: debut d'interface graphique --- .../main/java/fr/ird/observe/db/DataContext.java | 4 + .../ui/content/open/impl/seine/TripSeineUI.css | 1 + .../ui/content/open/impl/seine/TripSeineUI.jaxx | 345 ++++++++++----------- .../open/impl/seine/TripSeineUIHandler.java | 28 +- .../content/open/impl/seine/TripSeineUIModel.java | 6 +- .../ui/content/table/ContentTableUIHandler.java | 8 +- .../table/impl/seine/GearUseFeaturesSeineUI.css | 61 ++++ .../table/impl/seine/GearUseFeaturesSeineUI.jaxx | 135 ++++++++ .../impl/seine/GearUseFeaturesSeineUIHandler.java | 174 +++++++++++ .../impl/seine/GearUseFeaturesSeineUIModel.java | 79 +++++ .../resources/i18n/observe-swing_en_GB.properties | 21 +- .../resources/i18n/observe-swing_es_ES.properties | 19 ++ .../resources/i18n/observe-swing_fr_FR.properties | 15 + ...UseFeaturesSeine-n1-update-error-validation.xml | 46 +++ ...1-update-gearUseFeatures-warning-validation.xml | 41 +++ .../i18n/observe-validation_fr_FR.properties | 3 + .../validation/BeanValidatorDetectorTest.java | 7 +- 17 files changed, 792 insertions(+), 201 deletions(-) diff --git a/observe-business/src/main/java/fr/ird/observe/db/DataContext.java b/observe-business/src/main/java/fr/ird/observe/db/DataContext.java index 77c1b6b..b64f10f 100644 --- a/observe-business/src/main/java/fr/ird/observe/db/DataContext.java +++ b/observe-business/src/main/java/fr/ird/observe/db/DataContext.java @@ -199,6 +199,10 @@ public class DataContext extends AbstractSerializableBean { firePropertyChange(PROPERTY_SELECTED_TRIP_ID, oldValue, this.selectedTripId); } + public boolean isSelectedTripLongline() { + return selectedTripId != null && selectedTripId.contains("Longline"); + } + public String getSelectedRouteId() { return selectedRouteId; } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUI.css b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUI.css index fc43d24..4be1629 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUI.css +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUI.css @@ -44,6 +44,7 @@ NumberEditor { #caracteristicTab { title:{t("observe.tripSeine.tab.caracteristics")}; icon:{getHandler().getErrorIconIfFalse(model.isCaracteristicsTabValid())}; + enabled:{!model.isCreatingMode()}; } #observerLabel { diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUI.jaxx b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUI.jaxx index 0a21730..49b576d 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUI.jaxx +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUI.jaxx @@ -33,6 +33,8 @@ fr.ird.observe.entities.referentiel.Person fr.ird.observe.entities.referentiel.Ocean + fr.ird.observe.ui.content.table.impl.seine.GearUseFeaturesSeineUI + org.jdesktop.swingx.JXDatePicker jaxx.runtime.swing.editor.NumberEditor @@ -82,198 +84,163 @@ protected boolean canEditOcean(java.util.List<Route> routes) { <JTabbedPane id='fishingOperationTabPane'> <tab id='generalTab'> - <Table fill="both" weightx="1"> - <!-- captain --> - <row> - <cell anchor='west'> - <JLabel id='captainLabel'/> - </cell> - <cell anchor='east'> - <BeanComboBox id='captain' constructorParams='this' genericType='Person'/> - </cell> - </row> - - <!-- observer --> - <row> - <cell anchor='west'> - <JLabel id='observerLabel'/> - </cell> - <cell anchor='east'> - <BeanComboBox id='observer' constructorParams='this' genericType='Person'/> - </cell> - </row> - - <!-- dataEntryOperator --> - <row> - <cell anchor='west'> - <JLabel id='dataEntryOperatorLabel'/> - </cell> - <cell anchor='east'> - <BeanComboBox id='dataEntryOperator' constructorParams='this' genericType='Person'/> - </cell> - </row> - - <!-- vessel --> - <row> - <cell anchor='west'> - <JLabel id='vesselLabel'/> - </cell> - <cell anchor='east' weightx="1" fill="both"> - <BeanComboBox id='vessel' constructorParams='this' genericType='Vessel'/> - </cell> - </row> - - <!-- ocean (editable uniquement si pas de route saisie) --> - <row> - <cell anchor='west'> - <JLabel id='oceanLabel'/> - </cell> - <cell anchor='east' weightx="1" fill="both"> - <BeanComboBox id='ocean' genericType='Ocean' constructorParams='this'/> - </cell> - </row> - - <!-- departureHarbour --> - <row> - <cell anchor='west'> - <JLabel id='departureHarbourLabel'/> - </cell> - <cell anchor='east' weightx="1" fill="both"> - <BeanComboBox id='departureHarbour' genericType='Harbour' constructorParams='this'/> - </cell> - </row> - - <!-- landingHarbour --> - <row> - <cell anchor='west'> - <JLabel id='landingHarbourLabel'/> - </cell> - <cell anchor='east' weightx="1" fill="both"> - <BeanComboBox id='landingHarbour' genericType='Harbour' constructorParams='this'/> - </cell> - </row> - - <!-- id ers --> - <row> - - <cell anchor='west'> - <JLabel id='ersIdLabel'/> - </cell> - <cell anchor='east' weightx="1" fill="both"> - <JPanel layout='{new BorderLayout()}'> - <JToolBar id='ersIdToolbar' constraints='BorderLayout.WEST'> - <JButton id='resetErsId' constraints='BorderLayout.WEST' styleClass='resetButton'/> - </JToolBar> - <JTextField id='ersId' constraints='BorderLayout.CENTER'/> - </JPanel> - </cell> - </row> - - <!-- startDate --> - <row> - <cell anchor='west'> - <JLabel id='startDateLabel'/> - </cell> - <cell anchor='west' weightx="0.5"> - <JXDatePicker id='startDate'/> - </cell> - </row> - - <!-- endDate --> - <row> - <cell anchor='west'> - <JLabel id='endDateLabel'/> - </cell> - <cell anchor='west' weightx="0.5"> - <JXDatePicker id='endDate'/> - </cell> - </row> - - <!-- formsUrl --> - <row> - <cell anchor="west"> - <JLabel id='formsUrlLabel'/> - </cell> - <cell anchor='east' weightx="1" fill="both"> - <JPanel layout='{new BorderLayout()}'> - <JToolBar id='formsUrlToolbar' constraints='BorderLayout.WEST'> - <JButton id='resetFormsUrl' constraints='BorderLayout.WEST' styleClass='resetButton'/> - </JToolBar> - <JTextField id='formsUrl' constraints='BorderLayout.CENTER'/> - <JToolBar id='formsUrlToolbar2' constraints='BorderLayout.EAST'> - <JButton id='openLinkFormulairesUrl' - onActionPerformed='getHandler().openLink(getModel().getBean().getFormsUrl())'/> - </JToolBar> - - </JPanel> - </cell> - </row> - - <!-- reportsUrl --> - <row> - <cell anchor="west"> - <JLabel id='reportsUrlLabel'/> - </cell> - <cell anchor='east' weightx="1" fill="both"> - <JPanel layout='{new BorderLayout()}'> - <JToolBar id='reportsUrlToolbar' constraints='BorderLayout.WEST'> - <JButton id='resetReportsUrl' constraints='BorderLayout.WEST' styleClass='resetButton'/> - </JToolBar> - <JTextField id='reportsUrl' constraints='BorderLayout.CENTER'/> - - <JToolBar id='reportsUrlToolbar2' constraints='BorderLayout.EAST'> - <JButton id='openLinkRapportsUrl' constraints='BorderLayout.EAST' - onActionPerformed='getHandler().openLink(getModel().getBean().getReportsUrl())'/> - </JToolBar> - </JPanel> - </cell> - </row> - - </Table> - + <JPanel layout="{new BorderLayout()}"> + <Table fill="both" weightx="1" constraints='BorderLayout.NORTH'> + <!-- captain --> + <row> + <cell anchor='west'> + <JLabel id='captainLabel'/> + </cell> + <cell anchor='east'> + <BeanComboBox id='captain' constructorParams='this' genericType='Person'/> + </cell> + </row> + + <!-- observer --> + <row> + <cell anchor='west'> + <JLabel id='observerLabel'/> + </cell> + <cell anchor='east'> + <BeanComboBox id='observer' constructorParams='this' genericType='Person'/> + </cell> + </row> + + <!-- dataEntryOperator --> + <row> + <cell anchor='west'> + <JLabel id='dataEntryOperatorLabel'/> + </cell> + <cell anchor='east'> + <BeanComboBox id='dataEntryOperator' constructorParams='this' genericType='Person'/> + </cell> + </row> + + <!-- vessel --> + <row> + <cell anchor='west'> + <JLabel id='vesselLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <BeanComboBox id='vessel' constructorParams='this' genericType='Vessel'/> + </cell> + </row> + + <!-- ocean (editable uniquement si pas de route saisie) --> + <row> + <cell anchor='west'> + <JLabel id='oceanLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <BeanComboBox id='ocean' genericType='Ocean' constructorParams='this'/> + </cell> + </row> + + <!-- departureHarbour --> + <row> + <cell anchor='west'> + <JLabel id='departureHarbourLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <BeanComboBox id='departureHarbour' genericType='Harbour' constructorParams='this'/> + </cell> + </row> + + <!-- landingHarbour --> + <row> + <cell anchor='west'> + <JLabel id='landingHarbourLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <BeanComboBox id='landingHarbour' genericType='Harbour' constructorParams='this'/> + </cell> + </row> + + <!-- id ers --> + <row> + + <cell anchor='west'> + <JLabel id='ersIdLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <JPanel layout='{new BorderLayout()}'> + <JToolBar id='ersIdToolbar' constraints='BorderLayout.WEST'> + <JButton id='resetErsId' constraints='BorderLayout.WEST' styleClass='resetButton'/> + </JToolBar> + <JTextField id='ersId' constraints='BorderLayout.CENTER'/> + </JPanel> + </cell> + </row> + + <!-- startDate --> + <row> + <cell anchor='west'> + <JLabel id='startDateLabel'/> + </cell> + <cell anchor='west' weightx="0.5"> + <JXDatePicker id='startDate'/> + </cell> + </row> + + <!-- endDate --> + <row> + <cell anchor='west'> + <JLabel id='endDateLabel'/> + </cell> + <cell anchor='west' weightx="0.5"> + <JXDatePicker id='endDate'/> + </cell> + </row> + + <!-- formsUrl --> + <row> + <cell anchor="west"> + <JLabel id='formsUrlLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <JPanel layout='{new BorderLayout()}'> + <JToolBar id='formsUrlToolbar' constraints='BorderLayout.WEST'> + <JButton id='resetFormsUrl' constraints='BorderLayout.WEST' styleClass='resetButton'/> + </JToolBar> + <JTextField id='formsUrl' constraints='BorderLayout.CENTER'/> + <JToolBar id='formsUrlToolbar2' constraints='BorderLayout.EAST'> + <JButton id='openLinkFormulairesUrl' + onActionPerformed='getHandler().openLink(getModel().getBean().getFormsUrl())'/> + </JToolBar> + + </JPanel> + </cell> + </row> + + <!-- reportsUrl --> + <row> + <cell anchor="west"> + <JLabel id='reportsUrlLabel'/> + </cell> + <cell anchor='east' weightx="1" fill="both"> + <JPanel layout='{new BorderLayout()}'> + <JToolBar id='reportsUrlToolbar' constraints='BorderLayout.WEST'> + <JButton id='resetReportsUrl' constraints='BorderLayout.WEST' styleClass='resetButton'/> + </JToolBar> + <JTextField id='reportsUrl' constraints='BorderLayout.CENTER'/> + + <JToolBar id='reportsUrlToolbar2' constraints='BorderLayout.EAST'> + <JButton id='openLinkRapportsUrl' constraints='BorderLayout.EAST' + onActionPerformed='getHandler().openLink(getModel().getBean().getReportsUrl())'/> + </JToolBar> + </JPanel> + </cell> + </row> + + </Table> + </JPanel> </tab> <tab id='caracteristicTab'> - - <!--<Table fill="both" weightx="1">--> - - <!--<!– senne –>--> - <!--<row>--> - <!--<cell anchor='west' columns="2">--> - <!--<Table fill="both" id='senneContainer'>--> - <!--<row>--> - <!--<cell anchor='west'>--> - <!--<JLabel id='seineCircumferenceLabel'/>--> - <!--</cell>--> - <!--<cell anchor='east' weightx="1" fill="both">--> - <!--<NumberEditor id='seineCircumference' constructorParams='this'/>--> - <!--</cell>--> - <!--</row>--> - <!--<row>--> - <!--<cell>--> - <!--<JLabel id='seineDepthLabel'/>--> - <!--</cell>--> - <!--<cell>--> - <!--<NumberEditor id='seineDepth' constructorParams='this'/>--> - <!--</cell>--> - <!--</row>--> - <!--<row>--> - <!--<cell>--> - <!--<JLabel id='seineBallastWeightLabel'/>--> - <!--</cell>--> - <!--<cell>--> - <!--<NumberEditor id='seineBallastWeight' constructorParams='this'/>--> - <!--</cell>--> - <!--</row>--> - <!--</Table>--> - <!--</cell>--> - <!--</row>--> - <!--<row>--> - <!--<cell weighty="1">--> - <!--<JLabel/>--> - <!--</cell>--> - <!--</row>--> - <!--</Table>--> + <JPanel id='caracteristicPane' layout='{new BorderLayout()}'> + <GearUseFeaturesSeineUI id='gearUseFeaturesSeineUI' constructorParams='this' + constraints='BorderLayout.NORTH'/> + </JPanel> </tab> </JTabbedPane> diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIHandler.java index a489f2c..c1ec978 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIHandler.java @@ -33,6 +33,7 @@ import fr.ird.observe.entities.seine.TripSeine; import fr.ird.observe.ui.content.ContentMode; import fr.ird.observe.ui.content.open.ContentOpenableUIHandler; import fr.ird.observe.ui.content.open.ContentOpenableUIModel; +import fr.ird.observe.ui.content.table.impl.seine.GearUseFeaturesSeineUI; import jaxx.runtime.validator.swing.SwingValidatorMessage; import jaxx.runtime.validator.swing.SwingValidatorMessageTableModel; import org.apache.commons.logging.Log; @@ -118,6 +119,11 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { // listen messages to see if required to add getUi().getErrorTableModel().addTableModelListener(computeTabValidStateListener); + GearUseFeaturesSeineUI gearUseFeaturesSeineUI = getUi().getGearUseFeaturesSeineUI(); + gearUseFeaturesSeineUI.init(); + getUi().getCaracteristicPane().remove(gearUseFeaturesSeineUI); + getUi().getCaracteristicPane().add(gearUseFeaturesSeineUI.getBody()); + } @Override @@ -145,11 +151,12 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { // create mode + getUi().getFishingOperationTabPane().setSelectedIndex(0); + if (log.isInfoEnabled()) { log.info(prefix + "create a new trip"); } dataService.preCreate(source, programId, bean, getLoadBinder(), getPreCreateExecutor()); - } else { // update mode @@ -163,6 +170,10 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { // on force le trie des routes Routes.sort(bean.getRoute()); } + + GearUseFeaturesSeineUI gearUseFeaturesSeineUI = getUi().getGearUseFeaturesSeineUI(); + gearUseFeaturesSeineUI.open(); + } SwingValidatorMessageTableModel errorTableModel = getUi().getErrorTableModel(); @@ -201,6 +212,7 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { ui.getValidator().setContext(contextName); if (create) { + addInfoMessage(t("observe.tripSeine.message.creating")); } else { addInfoMessage(t("observe.tripSeine.message.updating")); @@ -208,7 +220,9 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { addInfoMessage(t("observe.message.historical.data")); } + getUi().getGearUseFeaturesSeineUI().startEdit(null); } + // date is current day if (model.getMode() == ContentMode.UPDATE) { if (getBean().getEndDate() == null) { @@ -284,7 +298,9 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { @Override protected TripSeine onUpdate(TopiaContext tx, Object parentBean, TripSeine beanToSave) throws TopiaException { - getLoadBinder().copyExcluding(getBean(), beanToSave, TripSeine.PROPERTY_ROUTE); + getLoadBinder().copyExcluding(getBean(), beanToSave, TripSeine.PROPERTY_ROUTE, TripSeine.PROPERTY_GEAR_USE_FEATURES_SEINE); + + getUi().getGearUseFeaturesSeineUI().getHandler().onUpdate(tx, parentBean, beanToSave); return beanToSave; } @@ -324,6 +340,14 @@ public class TripSeineUIHandler extends ContentOpenableUIHandler<TripSeine> { } + @Override + protected void afterSave(boolean refresh) { + super.afterSave(refresh); + + getUi().getGearUseFeaturesSeineUI().getHandler().afterSave(refresh); + + } + protected void computeTabValidState(SwingValidatorMessageTableModel errorTableModel) { Set<String> errorProperties = new HashSet<String>(); diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIModel.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIModel.java index 73bc4c5..de1b92e 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIModel.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/open/impl/seine/TripSeineUIModel.java @@ -60,7 +60,7 @@ public class TripSeineUIModel extends ContentOpenableUIModel<TripSeine> { TripSeine.PROPERTY_REPORTS_URL).build(); public static final Set<String> CARACTERISTICS_TAB_PROPERTIES = - ImmutableSet.<String>builder().add(TripSeine.PROPERTY_GEAR_USE_FEATURES).build(); + ImmutableSet.<String>builder().add(TripSeine.PROPERTY_GEAR_USE_FEATURES_SEINE).build(); private static final long serialVersionUID = 1L; @@ -111,14 +111,14 @@ public class TripSeineUIModel extends ContentOpenableUIModel<TripSeine> { TripSeine.PROPERTY_LANDING_HARBOUR, TripSeine.PROPERTY_PROGRAM, TripSeine.PROPERTY_ROUTE, - TripSeine.PROPERTY_GEAR_USE_FEATURES, + TripSeine.PROPERTY_GEAR_USE_FEATURES_SEINE, TripSeine.PROPERTY_ERS_ID, TripSeine.PROPERTY_OPEN); // on ajoute la recopie de l'association route builder.addCollectionStrategy(Binder.CollectionStrategy.duplicate, TripSeine.PROPERTY_ROUTE); // on ajoute la recopie de l'association gearUseFeatues - builder.addCollectionStrategy(Binder.CollectionStrategy.duplicate, TripSeine.PROPERTY_GEAR_USE_FEATURES); + builder.addCollectionStrategy(Binder.CollectionStrategy.duplicate, TripSeine.PROPERTY_GEAR_USE_FEATURES_SEINE); return builder; diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIHandler.java index 062c97f..45375f8 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/ContentTableUIHandler.java @@ -316,14 +316,18 @@ public abstract class ContentTableUIHandler<E extends TopiaEntity, D extends Top @Override public void startEditUI(String... binding) { + + addUpdateInfoMessage(); + super.startEditUI(binding); + } + + protected void addUpdateInfoMessage() { String message = n("observe.entity.message.updating"); ObserveNode node = getTreeHelper(getUi()).getSelectedNode(); String entityLabel = getEntityLabel(node.getParent().getInternalClass()); message = t(message, t(entityLabel)); addMessage(getUi(), NuitonValidatorScope.INFO, entityLabel, message); - - super.startEditUI(binding); } public void removeSelectedRow(int selectedRow) { diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUI.css b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUI.css new file mode 100644 index 0000000..9b6878f --- /dev/null +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUI.css @@ -0,0 +1,61 @@ +/* + * #%L + * ObServe :: Swing + * %% + * Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + * %% + * This program 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, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +#gearLabel { + text:"observe.gearUseFeaturesSeine.gear"; + labelFor:{gear}; +} + +#gear { + property:{GearUseFeaturesSeine.PROPERTY_GEAR}; + selectedItem:{tableEditBean.getGear()}; +} + +#numberLabel { + text:"observe.gearUseFeaturesSeine.number"; + labelFor:{number}; +} + +#number { + property:{GearUseFeaturesSeine.PROPERTY_NUMBER}; + model:{tableEditBean.getNumber()}; + numberPattern:{fr.ird.observe.ui.UIHelper.INT_6_DIGITS_PATTERN}; +} + +#usedInTripLabel { + text:"observe.gearUseFeaturesSeine.usedInTrip"; + labelFor:{usedInTrip}; +} + +#usedInTrip { + booleanValue:{tableEditBean.getUsedInTrip()}; + _tablePropertyName:{GearUseFeaturesSeine.PROPERTY_USED_IN_TRIP}; +} + +#comment { + columnHeaderView:{new JLabel(t("observe.gearUseFeaturesSeine.comment"))}; + minimumSize:{new Dimension(10,80)}; +} + +#comment2 { + text:{getStringValue(tableEditBean.getComment())}; +} diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUI.jaxx b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUI.jaxx new file mode 100644 index 0000000..f1aca39 --- /dev/null +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUI.jaxx @@ -0,0 +1,135 @@ +<!-- + #%L + ObServe :: Swing + %% + Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + %% + This program 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, either version 3 of the + License, or (at your option) any later version. + + This program 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 this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> + +<fr.ird.observe.ui.content.table.ContentTableUI + superGenericType='TripSeine, GearUseFeaturesSeine' + contentTitle='{n("observe.gearUseFeaturesSeine.title")}' + saveNewEntryText='{n("observe.action.create.gearUseFeaturesSeine")}' + saveNewEntryTip='{n("observe.action.create.gearUseFeaturesSeine.tip")}'> + + <style source="../../CommonTable.css"/> + + <import> + fr.ird.observe.entities.CommentableEntity + fr.ird.observe.entities.seine.TripSeine + fr.ird.observe.entities.seine.GearUseFeaturesSeine + fr.ird.observe.entities.referentiel.Gear + fr.ird.observe.ui.content.table.* + fr.ird.observe.ui.util.BooleanEditor + + jaxx.runtime.swing.editor.NumberEditor + jaxx.runtime.swing.editor.bean.BeanComboBox + + java.awt.Dimension + + static fr.ird.observe.ui.UIHelper.getStringValue + static org.nuiton.i18n.I18n.n + </import> + + <!-- handler --> + <GearUseFeaturesSeineUIHandler id='handler' constructorParams='this'/> + + <!-- model --> + <GearUseFeaturesSeineUIModel id='model' constructorParams='this'/> + + <!-- edit bean --> + <TripSeine id='bean'/> + + <!-- table edit bean --> + <GearUseFeaturesSeine id='tableEditBean'/> + + <!-- table model --> + <ContentTableModel id='tableModel'/> + + <!-- le validateur de l'écran --> + <BeanValidator id='validator' + beanClass='fr.ird.observe.entities.seine.TripSeine' + errorTableModel='{getErrorTableModel()}' + context='n1-update-gearUseFeatures'/> + + <!-- le validateur d'une entrée de tableau --> + <BeanValidator id='validatorTable' + autoField='true' + beanClass='fr.ird.observe.entities.seine.GearUseFeaturesSeine' + errorTableModel='{getErrorTableModel()}' + context='n1-update'/> + + <!--<JTabbedPane id='gearUseFeaturesTabPane'>--> + + <!--<tab id='generalTab'>--> + <!--<JPanel layout="{new BorderLayout()}">--> + <!--</JPanel>--> + <!--</tab>--> + <!--<tab id='measurementsTab'>--> + <!--<JPanel layout="{new BorderLayout()}">--> + <!--</JPanel>--> + <!--</tab>--> + <!--</JTabbedPane>--> + + <Table id='editorPanel' fill='both' insets='1'> + + <!-- gear --> + <row> + <cell> + <JLabel id='gearLabel'/> + </cell> + <cell weightx='1' anchor='east'> + <BeanComboBox id='gear' constructorParams='this' genericType='Gear'/> + </cell> + </row> + + <!-- number --> + <row> + <cell> + <JLabel id='numberLabel'/> + </cell> + <cell weightx='1' anchor='east'> + <NumberEditor id='number' constructorParams='this'/> + </cell> + </row> + + <!-- usedInTrip --> + <row> + <cell> + <JLabel id='usedInTripLabel'/> + </cell> + <cell weightx='1' anchor='east'> + <BooleanEditor id='usedInTrip'/> + </cell> + </row> + + <!-- comment --> + <row> + <cell columns='2' weighty='1'> + <JScrollPane id='comment' onFocusGained='comment2.requestFocus()'> + <JTextArea id='comment2' onKeyReleased='getTableEditBean().setComment(comment2.getText())'/> + </JScrollPane> + </cell> + </row> + + </Table> + + <Table id='extraZone' fill='both' weightx='1' insets='0'> + + </Table> + +</fr.ird.observe.ui.content.table.ContentTableUI> diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUIHandler.java new file mode 100644 index 0000000..76b17db --- /dev/null +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUIHandler.java @@ -0,0 +1,174 @@ +package fr.ird.observe.ui.content.table.impl.seine; + +import fr.ird.observe.DataService; +import fr.ird.observe.ObserveDAOHelper; +import fr.ird.observe.db.DataContext; +import fr.ird.observe.db.DataSource; +import fr.ird.observe.db.constants.DataContextType; +import fr.ird.observe.entities.referentiel.Gear; +import fr.ird.observe.entities.seine.GearUseFeaturesSeine; +import fr.ird.observe.entities.seine.TripSeine; +import fr.ird.observe.ui.UIHelper; +import fr.ird.observe.ui.content.ContentMode; +import fr.ird.observe.ui.content.table.ContentTableUIHandler; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.persistence.TopiaDAO; +import org.nuiton.topia.persistence.util.EntityListUpdator; +import org.nuiton.topia.persistence.util.Loador; + +import javax.swing.JTable; +import javax.swing.table.DefaultTableCellRenderer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static org.nuiton.i18n.I18n.n; +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 3/24/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.16 + */ +public class GearUseFeaturesSeineUIHandler extends ContentTableUIHandler<TripSeine, GearUseFeaturesSeine> { + + /** Logger */ + static private Log log = + LogFactory.getLog(GearUseFeaturesSeineUIHandler.class); + + public GearUseFeaturesSeineUIHandler(GearUseFeaturesSeineUI ui) { + super(ui, DataContextType.SetSeine); + } + + @Override + public GearUseFeaturesSeineUI getUi() { + return (GearUseFeaturesSeineUI) super.getUi(); + } + + @Override + protected ContentMode getContentMode(DataContext dataContext) { + + // par defaut, on suppose qu'on peut afficher les données + getModel().setShowData(true); + + String selectedTripId = dataContext.getSelectedTripId(); + + if (selectedTripId.equals(dataContext.getOpenTripId())) { + + // mode mise a jour + return ContentMode.UPDATE; + } + + // mode lecture + + if (dataContext.isSelectedTripLongline()) { + + addInfoMessage(t("observe.tripLongline.message.not.open")); + + } else { + + addInfoMessage(t("observe.tripSeine.message.not.open")); + + } + + return ContentMode.READ; + } + + @Override + protected void addUpdateInfoMessage() { + // No message to display + } + + @Override + protected String getEditBeanIdToLoad(DataContext dataContext, DataService dataService, DataSource dataSource) { + return dataContext.getSelectedTripId(); + } + + @Override + protected void onSelectedRowChanged(int editingRow, GearUseFeaturesSeine bean, boolean create) { + if (log.isDebugEnabled()) { + log.debug("Row has changed to " + editingRow); + } + if (getTableModel().isEditable()) { + getUi().getGear().requestFocus(); + } + } + + @Override + protected void initTableUI(DefaultTableCellRenderer renderer) { + JTable table = getUi().getTable(); + + UIHelper.setI18nTableHeaderRenderer(table, + n("observe.gearUseFeaturesSeine.table.gear"), + n("observe.gearUseFeaturesSeine.table.gear.tip"), + n("observe.gearUseFeaturesSeine.table.number"), + n("observe.gearUseFeaturesSeine.table.number.tip"), + n("observe.gearUseFeaturesSeine.table.usedInTrip"), + n("observe.gearUseFeaturesSeine.table.usedInTrip.tip"), + n("observe.gearUseFeaturesSeine.table.comment"), + n("observe.gearUseFeaturesSeine.table.comment.tip")); + + UIHelper.setTableColumnRenderer(table, 0, UIHelper.newDecorateTableCellRenderer(renderer, Gear.class)); + UIHelper.setTableColumnRenderer(table, 1, UIHelper.newEmptyNumberTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 2, UIHelper.newBooleanTableCellRenderer(renderer)); + UIHelper.setTableColumnRenderer(table, 3, UIHelper.newStringTableCellRenderer(renderer, 10, true)); + + } + + @Override + public void afterSave(boolean refresh) { + super.afterSave(refresh); + } + + @Override + public TripSeine onUpdate(TopiaContext tx, Object parentBean, TripSeine beanToSave) throws TopiaException { + + List<GearUseFeaturesSeine> childs = getUi().getTableModel().getData(); + + Loador<GearUseFeaturesSeine> childBinder = getModel().getChildLoador(); + + EntityListUpdator<TripSeine, GearUseFeaturesSeine> childUpdator = getModel().getChildsUpdator(); + + // on conserve l'ancienne liste des fils (pour traitement ultérieure) + Collection<GearUseFeaturesSeine> oldChilds = new ArrayList<GearUseFeaturesSeine>(beanToSave.getGearUseFeaturesSeine()); + + beanToSave.clearGearUseFeaturesSeine(); + + TopiaDAO<GearUseFeaturesSeine> dao = ObserveDAOHelper.getDAO(tx, getModel().getChildType()); + + for (GearUseFeaturesSeine child : childs) { + + GearUseFeaturesSeine childToSave; + + if (child.getTopiaId() == null) { + + // creation du fils + Map<String, Object> map = childBinder.obtainProperties(child); + childToSave = dao.create(map); + + } else { + + // mise a jour du fils + + childToSave = dao.findByTopiaId(child.getTopiaId()); + + childBinder.load(child, childToSave, false); + } + + // ajout du fils au bean à sauver + childUpdator.addToList(beanToSave, childToSave); + } + + // on donne la main aux implantations pour faire des traitements + // supplémentaires + onUpdateFinalize(tx, beanToSave, oldChilds); + + return beanToSave; + } + +} \ No newline at end of file diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUIModel.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUIModel.java new file mode 100644 index 0000000..0802322 --- /dev/null +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/GearUseFeaturesSeineUIModel.java @@ -0,0 +1,79 @@ +package fr.ird.observe.ui.content.table.impl.seine; + +import com.google.common.collect.Lists; +import fr.ird.observe.BinderService; +import fr.ird.observe.ObserveServiceHelper; +import fr.ird.observe.entities.seine.GearUseFeaturesMeasurementSeine; +import fr.ird.observe.entities.seine.GearUseFeaturesSeine; +import fr.ird.observe.entities.seine.TripSeine; +import fr.ird.observe.ui.content.table.ContentTableMeta; +import fr.ird.observe.ui.content.table.ContentTableModel; +import fr.ird.observe.ui.content.table.ContentTableUIModel; +import org.nuiton.topia.persistence.util.TopiaEntityBinder; +import org.nuiton.util.beans.BinderModelBuilder; + +import java.util.List; + +/** + * Created on 3/24/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.16 + */ +public class GearUseFeaturesSeineUIModel extends ContentTableUIModel<TripSeine, GearUseFeaturesSeine> { + + private static final long serialVersionUID = 1L; + + private TopiaEntityBinder<GearUseFeaturesMeasurementSeine> gearUseFeaturesMeasurementLoador; + + public GearUseFeaturesSeineUIModel(GearUseFeaturesSeineUI ui) { + + super(TripSeine.class, + GearUseFeaturesSeine.class, + new String[]{TripSeine.PROPERTY_GEAR_USE_FEATURES_SEINE, TripSeine.PROPERTY_COMMENT}, + new String[]{ + GearUseFeaturesSeine.PROPERTY_COMMENT, + GearUseFeaturesSeine.PROPERTY_GEAR, + GearUseFeaturesSeine.PROPERTY_NUMBER, + GearUseFeaturesSeine.PROPERTY_USED_IN_TRIP, + GearUseFeaturesSeine.PROPERTY_GEAR_USE_FEATURES_MEASUREMENT, + }); + + List<ContentTableMeta<GearUseFeaturesSeine>> metas = Lists.newArrayList( + ContentTableModel.newTableMeta(GearUseFeaturesSeine.class, GearUseFeaturesSeine.PROPERTY_GEAR, false), + ContentTableModel.newTableMeta(GearUseFeaturesSeine.class, GearUseFeaturesSeine.PROPERTY_NUMBER, false), + ContentTableModel.newTableMeta(GearUseFeaturesSeine.class, GearUseFeaturesSeine.PROPERTY_USED_IN_TRIP, false), + ContentTableModel.newTableMeta(GearUseFeaturesSeine.class, GearUseFeaturesSeine.PROPERTY_COMMENT, false)); + + initModel(ui, metas); + + } + + @Override + protected BinderModelBuilder<GearUseFeaturesSeine, GearUseFeaturesSeine> prepareChildLoador(BinderService binderService, String binderName) { + + BinderModelBuilder<GearUseFeaturesSeine, GearUseFeaturesSeine> builder = super.prepareChildLoador(binderService, binderName); + builder.addCollectionBinder(getGearUseFeaturesMeasurementLoador(), GearUseFeaturesSeine.PROPERTY_GEAR_USE_FEATURES_MEASUREMENT); + return builder; + + } + + public TopiaEntityBinder<GearUseFeaturesMeasurementSeine> getGearUseFeaturesMeasurementLoador() { + if (gearUseFeaturesMeasurementLoador == null) { + + BinderService binderService = ObserveServiceHelper.get().getBinderService(); + + String binderName = getClass().getName() + "-open"; + + BinderModelBuilder<GearUseFeaturesMeasurementSeine, GearUseFeaturesMeasurementSeine> builder = + binderService.newBinderBuilder(GearUseFeaturesMeasurementSeine.class, + GearUseFeaturesMeasurementSeine.PROPERTY_GEAR_CARACTERISTIC, + GearUseFeaturesMeasurementSeine.PROPERTY_MEASUREMENT_VALUE); + + gearUseFeaturesMeasurementLoador = binderService.registerTopiaBinder(GearUseFeaturesMeasurementSeine.class, builder, binderName); + + } + return gearUseFeaturesMeasurementLoador; + } + +} \ No newline at end of file diff --git a/observe-swing/src/main/resources/i18n/observe-swing_en_GB.properties b/observe-swing/src/main/resources/i18n/observe-swing_en_GB.properties index d9c0ea4..faeabf7 100644 --- a/observe-swing/src/main/resources/i18n/observe-swing_en_GB.properties +++ b/observe-swing/src/main/resources/i18n/observe-swing_en_GB.properties @@ -96,6 +96,8 @@ observe.action.create=Create observe.action.create.activity=Create a new activity observe.action.create.activity.tip= observe.action.create.entry.tip= +observe.action.create.gearUseFeaturesSeine= +observe.action.create.gearUseFeaturesSeine.tip= observe.action.create.maree=Create a new maree observe.action.create.maree.tip= observe.action.create.nonTargetCatch= @@ -1050,12 +1052,25 @@ observe.floatlinesComposition.table.proportion=Proportion observe.floatlinesComposition.table.proportion.tip=Proportion observe.floatlinesComposition.title=Floatines observe.gear.availableGearCaracteristic=Available caracteristics -observe.gear.gearCaracteristic= -observe.gear.gearCaracteristicType= +observe.gear.gearCaracteristic=Gear caracteristic +observe.gear.gearCaracteristicType=Gear caracteristic type observe.gear.selectedGearCaracteristic=Selected caracteristics observe.gear.tab.gearCaracteristic=Caracteristics of the gear observe.gear.tab.general=General caracteristics -observe.gear.unit= +observe.gear.unit=Unit +observe.gearUseFeaturesSeine.comment=Comment +observe.gearUseFeaturesSeine.gear=Gear +observe.gearUseFeaturesSeine.number=Number +observe.gearUseFeaturesSeine.table.comment=Comment +observe.gearUseFeaturesSeine.table.comment.tip=Comment +observe.gearUseFeaturesSeine.table.gear=Gear +observe.gearUseFeaturesSeine.table.gear.tip=Gear +observe.gearUseFeaturesSeine.table.number=Number +observe.gearUseFeaturesSeine.table.number.tip=Number +observe.gearUseFeaturesSeine.table.usedInTrip=Used +observe.gearUseFeaturesSeine.table.usedInTrip.tip=Used in trip +observe.gearUseFeaturesSeine.title= +observe.gearUseFeaturesSeine.usedInTrip=Used in trip observe.harbour.coordinates= observe.harbour.locode= observe.harbour.name= diff --git a/observe-swing/src/main/resources/i18n/observe-swing_es_ES.properties b/observe-swing/src/main/resources/i18n/observe-swing_es_ES.properties index fb64e19..a47492c 100644 --- a/observe-swing/src/main/resources/i18n/observe-swing_es_ES.properties +++ b/observe-swing/src/main/resources/i18n/observe-swing_es_ES.properties @@ -1,3 +1,4 @@ +observe.GearUseFeaturesSeine.usedInTrip= observe.about.message=<h3>ObServe</h3><a href\="http\://www.ird.fr/informatique-scientifique/projets/observe/">Système d'Information, d'Observation et de Suivi des pêches thonières tropicales de surface.</a><hr/><p>Aplicación de adquisición Application de datos de observadores y de consulta de estos datos desde una base <i>Obstuna</i>.</p> <p>Este projecto se ha iniciado en 2009 por la unidad US 007-OSIRIS del <a href\="http\://www.ird.fr">IRD</a> dentro del marco de <a href\="http\://ww [...] observe.about.translate.content=<h2>Comment traduire ObServe</h2>Vous pouvez nous aider à traduire l'application.<hr/><br/><ul><li>Récupérer le fichier <a href\="%s">observe-i18n.csv</a> dans le répertoire <strong>i18n</strong></li><li>ouvrez le avec un tableur avec les options suivantes \: <ul><li>caractère séparateur \: <strong><i>|</i></strong></li><li>encoding <strong><i>UTF-8</i></strong></li><li>texte encapsulé par des <strong><i>"</i></strong></li></ul></li><li>Traduisez, Améliore [...] observe.about.translate.title=Traducir ObServe @@ -96,6 +97,8 @@ observe.action.create=Crear observe.action.create.activity=Crear una nueva actividad observe.action.create.activity.tip=Crear una nueva actividad para la ruta actual observe.action.create.entry.tip=Crear una nueva entrada +observe.action.create.gearUseFeaturesSeine= +observe.action.create.gearUseFeaturesSeine.tip= observe.action.create.maree=Crear nueva marea observe.action.create.maree.tip=Crear nueva marea para el programa actual observe.action.create.nonTargetCatch=Insertar esta especie/peso/objectFate @@ -1055,6 +1058,22 @@ observe.gear.selectedGearCaracteristic= observe.gear.tab.gearCaracteristic= observe.gear.tab.general= observe.gear.unit= +observe.gearUseFeaturesSeine.comment= +observe.gearUseFeaturesSeine.gear= +observe.gearUseFeaturesSeine.gearCaracteristic= +observe.gearUseFeaturesSeine.number= +observe.gearUseFeaturesSeine.table.comment= +observe.gearUseFeaturesSeine.table.comment.tip= +observe.gearUseFeaturesSeine.table.gear= +observe.gearUseFeaturesSeine.table.gear.tip= +observe.gearUseFeaturesSeine.table.gearCaracteristic= +observe.gearUseFeaturesSeine.table.gearCaracteristic.tip= +observe.gearUseFeaturesSeine.table.number= +observe.gearUseFeaturesSeine.table.number.tip= +observe.gearUseFeaturesSeine.table.usedInTrip= +observe.gearUseFeaturesSeine.table.usedInTrip.tip= +observe.gearUseFeaturesSeine.title= +observe.gearUseFeaturesSeine.usedInTrip= observe.harbour.coordinates= observe.harbour.locode= observe.harbour.name= diff --git a/observe-swing/src/main/resources/i18n/observe-swing_fr_FR.properties b/observe-swing/src/main/resources/i18n/observe-swing_fr_FR.properties index 53d04b2..09225ea 100644 --- a/observe-swing/src/main/resources/i18n/observe-swing_fr_FR.properties +++ b/observe-swing/src/main/resources/i18n/observe-swing_fr_FR.properties @@ -96,6 +96,8 @@ observe.action.create=Créer observe.action.create.activity=Créer une nouvelle activité observe.action.create.activity.tip=Créer une nouvelle activité pour la route courante observe.action.create.entry.tip=Créer une nouvelle entrée +observe.action.create.gearUseFeaturesSeine= +observe.action.create.gearUseFeaturesSeine.tip= observe.action.create.maree=Créer une nouvelle marée observe.action.create.maree.tip=Créer une nouvelle marée pour le programme courant observe.action.create.nonTargetCatch=Insérer cette espèce / poids / devenir @@ -1055,6 +1057,19 @@ observe.gear.selectedGearCaracteristic=Caractéristiques utilisées observe.gear.tab.gearCaracteristic=Caractéristiques de l'équipement observe.gear.tab.general=Caractéristiques générales observe.gear.unit=Unité +observe.gearUseFeaturesSeine.comment=Commentaire +observe.gearUseFeaturesSeine.gear=Équipement +observe.gearUseFeaturesSeine.number=Nombre +observe.gearUseFeaturesSeine.table.comment=Commentaire +observe.gearUseFeaturesSeine.table.comment.tip=Commentaire +observe.gearUseFeaturesSeine.table.gear=Équipement +observe.gearUseFeaturesSeine.table.gear.tip=Équipement +observe.gearUseFeaturesSeine.table.number=Nombre +observe.gearUseFeaturesSeine.table.number.tip=Nombre +observe.gearUseFeaturesSeine.table.usedInTrip=Utilisé +observe.gearUseFeaturesSeine.table.usedInTrip.tip=Utilisé dans la marée +observe.gearUseFeaturesSeine.title= +observe.gearUseFeaturesSeine.usedInTrip=Utilisé dans la marée observe.harbour.coordinates=Nom observe.harbour.locode=Locode observe.harbour.name=Nom diff --git a/observe-validation/src/main/resources/fr/ird/observe/entities/seine/GearUseFeaturesSeine-n1-update-error-validation.xml b/observe-validation/src/main/resources/fr/ird/observe/entities/seine/GearUseFeaturesSeine-n1-update-error-validation.xml new file mode 100644 index 0000000..5ea0400 --- /dev/null +++ b/observe-validation/src/main/resources/fr/ird/observe/entities/seine/GearUseFeaturesSeine-n1-update-error-validation.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + ObServe :: Validation + %% + Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + %% + This program 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, either version 3 of the + License, or (at your option) any later version. + + This program 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 this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> + +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="gear"> + + <!-- pas d'équipement selectionnee --> + <field-validator type="required" short-circuit="true"> + <message>validator.trip.required.gear</message> + </field-validator> + + <!-- équipement desactive --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ gear.enabled ]]> + </param> + <message>validator.trip.desactivated.gear</message> + </field-validator> + + </field> + +</validators> diff --git a/observe-validation/src/main/resources/fr/ird/observe/entities/seine/TripSeine-n1-update-gearUseFeatures-warning-validation.xml b/observe-validation/src/main/resources/fr/ird/observe/entities/seine/TripSeine-n1-update-gearUseFeatures-warning-validation.xml new file mode 100644 index 0000000..dc25516 --- /dev/null +++ b/observe-validation/src/main/resources/fr/ird/observe/entities/seine/TripSeine-n1-update-gearUseFeatures-warning-validation.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + ObServe :: Validation + %% + Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit + %% + This program 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, either version 3 of the + License, or (at your option) any later version. + + This program 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 this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> + +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="gearUseFeaturesSeine"> + + <!-- pas d'équipement --> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ gearUseFeaturesSeine == null || gearUseFeaturesSeine.empty ]]> + </param> + <message>validator.trip.null.gearUseFeature</message> + </field-validator> + + </field> + +</validators> diff --git a/observe-validation/src/main/resources/i18n/observe-validation_fr_FR.properties b/observe-validation/src/main/resources/i18n/observe-validation_fr_FR.properties index 809099d..58ef142 100644 --- a/observe-validation/src/main/resources/i18n/observe-validation_fr_FR.properties +++ b/observe-validation/src/main/resources/i18n/observe-validation_fr_FR.properties @@ -17,6 +17,7 @@ validator.activity.invalid.quadrant=Le quadrant n'est pas cohérent par rapport validator.activity.invalid.seaSurfaceTemperature=La température surface (%1$s) ne peut pas varier de plus de 12° par rapport à la température surface (%2$s) de l'activité précédente %3$s. validator.activity.invalid.speed=La vitesse de l'activité courante est de %s nd, alors que la vitesse maximale autorisée est %s nd validator.activity.null.dcp=Aucun objet flottant saisi. +validator.trip.null.gearUseFeature=Vous n'avez pas saisi d'équipement (Senne conseillée). validator.activity.null.fpaZone=La sélection d'une zone FPA est obligatoire. validator.activity.null.observedSystem=Aucun système observé sélectionné. validator.activity.null.observedSystemDistance=La distance au système observé n'est pas renseignée. @@ -388,6 +389,8 @@ validator.trip.required.comment.for.observer=Un commentaire est requis pour l'ob validator.trip.required.comment.for.ocean=Un commentaire est requis pour l'ocean sélectionné. validator.trip.required.comment.for.tripType=Un commentaire est requis pour le type de marée sélectionné. validator.trip.required.comment.for.vessel=Un commentaire est requis pour le navire sélectionné. +validator.trip.required.gear=L'équipement est obligatoire. +validator.trip.desactivated.gear=L'équipement sélectionné est désactivé. validator.trip.required.departureHarbour=La sélection d'un port de départ est obligatoire. validator.trip.required.endDate=La date de fin de marée est obligatoire. validator.trip.required.observer=La sélection d'un observateur est obligatoire. diff --git a/observe-validation/src/test/java/fr/ird/observe/validation/BeanValidatorDetectorTest.java b/observe-validation/src/test/java/fr/ird/observe/validation/BeanValidatorDetectorTest.java index 707ed05..c8c27f7 100644 --- a/observe-validation/src/test/java/fr/ird/observe/validation/BeanValidatorDetectorTest.java +++ b/observe-validation/src/test/java/fr/ird/observe/validation/BeanValidatorDetectorTest.java @@ -97,6 +97,7 @@ import fr.ird.observe.entities.referentiel.seine.WeightCategory; import fr.ird.observe.entities.referentiel.seine.Wind; import fr.ird.observe.entities.seine.ActivitySeine; import fr.ird.observe.entities.seine.FloatingObject; +import fr.ird.observe.entities.seine.GearUseFeaturesSeine; import fr.ird.observe.entities.seine.NonTargetCatch; import fr.ird.observe.entities.seine.NonTargetLength; import fr.ird.observe.entities.seine.NonTargetSample; @@ -154,7 +155,7 @@ public class BeanValidatorDetectorTest extends AbstractValidatorDetectorTest { SortedSet<NuitonValidator<?>> validators = detectValidators(ALL_TYPES); assertFalse(validators.isEmpty()); - assertEquals(172, validators.size()); + assertEquals(174, validators.size()); } @@ -264,6 +265,7 @@ public class BeanValidatorDetectorTest extends AbstractValidatorDetectorTest { Gear.class, GearCaracteristic.class, GearCaracteristicType.class, + GearUseFeaturesSeine.class, Harbour.class, Healthness.class, HookPosition.class, @@ -358,7 +360,8 @@ public class BeanValidatorDetectorTest extends AbstractValidatorDetectorTest { contextName + "-targetCatch", SetSeine.class, contextName + "-targetDiscarded", SetSeine.class, contextName + "-targetCatch", TargetCatch.class, - contextName + "-targetDiscarded", TargetCatch.class + contextName + "-targetDiscarded", TargetCatch.class, + contextName + "-gearUseFeatures", TripSeine.class ); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.