r758 - in trunk: . tutti-persistence/src/main/xmi tutti-ui-swing/src/main/filtered-resources tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics tutti-ui-swing/src/main/java
Author: kmorin Date: 2013-04-10 16:16:08 +0200 (Wed, 10 Apr 2013) New Revision: 758 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/758 Log: refs #1867 [CAPTURE] - Observations individuelles Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/RemoveIndividualObservationBatchAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapCellComponent.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUIModel.java trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/individualObservation/ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/individualObservation/create/ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/individualObservation/create/CreateIndividualObservationBatchUIModel-error-validation.xml Modified: trunk/pom.xml trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-04-08 16:07:19 UTC (rev 757) +++ trunk/pom.xml 2013-04-10 14:16:08 UTC (rev 758) @@ -132,7 +132,7 @@ <eugenePluginVersion>2.6.2</eugenePluginVersion> <hibernateVersion>3.6.10.Final</hibernateVersion> - <jaxxVersion>2.5.16</jaxxVersion> + <jaxxVersion>2.5.17-SNAPSHOT</jaxxVersion> <swingXVersion>1.6.4</swingXVersion> <xworkVersion>2.3.7</xworkVersion> Modified: trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo =================================================================== (Binary files differ) Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-04-08 16:07:19 UTC (rev 757) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-04-10 14:16:08 UTC (rev 758) @@ -1,28 +1,5 @@ -### -# #%L -# Tutti :: UI -# $Id$ -# $HeadURL$ -# %% -# Copyright (C) 2012 - 2013 Ifremer -# %% -# 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% -### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Fri Mar 29 10:09:57 CET 2013 +#Tue Apr 09 12:35:56 CEST 2013 tutti.createBenthosBatch.action.addSpecies.help=createBenthosBatch.html\#actions tutti.createBenthosBatch.action.cancel.help=createBenthosBatch.html\#actions tutti.createBenthosBatch.action.save.help=createBenthosBatch.html\#actions @@ -30,6 +7,11 @@ tutti.createBenthosBatch.field.sortedUnsortedCategory.help=createBenthosBatch.html\#fields tutti.createBenthosBatch.field.species.help=createBenthosBatch.html\#fields tutti.createBenthosBatch.help=createBenthosBatch.html +tutti.createIndividualObservationBatch.field.individualObservationLengthStepCaracteristic.help= +tutti.createIndividualObservationBatch.field.individualObservationSize.help= +tutti.createIndividualObservationBatch.field.individualObservationSpecies.help= +tutti.createIndividualObservationBatch.field.individualObservationWeight.help= +tutti.createIndividualObservationBatch.help= tutti.createMarineLitterBatch.action.cancel.help= tutti.createMarineLitterBatch.action.save.help= tutti.createMarineLitterBatch.field.marineLitterCategory.help= @@ -147,6 +129,8 @@ tutti.editFishingOperation.field.trawlDistance.help=editFishingOperation.html\#fields tutti.editFishingOperation.field.vessel.help=editFishingOperation.html\#fields tutti.editFishingOperation.help=editFishingOperation.html +tutti.editIndividualObservationBatch.action.createBatch.help= +tutti.editIndividualObservationBatch.action.removeBatch.help= tutti.editMarineLitterBatch.action.createBatch.help= tutti.editMarineLitterBatch.action.removeBatch.help= tutti.editMarineLitterBatch.field.marineLitterTotalWeight.help= @@ -272,6 +256,7 @@ tutti.splitSpeciesBatch.help=splitSpeciesBatch.html tuttihelp.config.help=config.help tuttihelp.editAccidentalBatch.help=editAccidentalBatch.html +tuttihelp.editIndividualObservationBatch.help= tuttihelp.editMacroWasteBatch.help= tuttihelp.editMarineLitterBatch.help=editMarineLitterBatch.html tuttihelp.editPlanktonBatch.help=editPlanktonBatch.html Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-04-08 16:07:19 UTC (rev 757) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-04-10 14:16:08 UTC (rev 758) @@ -1,28 +1,5 @@ -### -# #%L -# Tutti :: UI -# $Id$ -# $HeadURL$ -# %% -# Copyright (C) 2012 - 2013 Ifremer -# %% -# 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% -### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Fri Mar 29 10:09:57 CET 2013 +#Tue Apr 09 12:35:56 CEST 2013 tutti.createBenthosBatch.action.addSpecies.help=createBenthosBatch.html\#actions tutti.createBenthosBatch.action.cancel.help=createBenthosBatch.html\#actions tutti.createBenthosBatch.action.save.help=createBenthosBatch.html\#actions @@ -30,6 +7,11 @@ tutti.createBenthosBatch.field.sortedUnsortedCategory.help=createBenthosBatch.html\#fields tutti.createBenthosBatch.field.species.help=createBenthosBatch.html\#fields tutti.createBenthosBatch.help=createBenthosBatch.html +tutti.createIndividualObservationBatch.field.individualObservationLengthStepCaracteristic.help= +tutti.createIndividualObservationBatch.field.individualObservationSize.help= +tutti.createIndividualObservationBatch.field.individualObservationSpecies.help= +tutti.createIndividualObservationBatch.field.individualObservationWeight.help= +tutti.createIndividualObservationBatch.help= tutti.createMarineLitterBatch.action.cancel.help= tutti.createMarineLitterBatch.action.save.help= tutti.createMarineLitterBatch.field.marineLitterCategory.help= @@ -156,6 +138,8 @@ tutti.editFishingOperation.field.trawlDistance.help=editFishingOperation.html\#fields tutti.editFishingOperation.field.vessel.help=editFishingOperation.html\#fields tutti.editFishingOperation.help=editFishingOperation.html +tutti.editIndividualObservationBatch.action.createBatch.help= +tutti.editIndividualObservationBatch.action.removeBatch.help= tutti.editMarineLitterBatch.action.createBatch.help= tutti.editMarineLitterBatch.action.removeBatch.help= tutti.editMarineLitterBatch.field.marineLitterTotalWeight.help= @@ -281,6 +265,7 @@ tutti.splitSpeciesBatch.help=splitSpeciesBatch.html tuttihelp.config.help=config.help tuttihelp.editAccidentalBatch.help=editAccidentalBatch.html +tuttihelp.editIndividualObservationBatch.help= tuttihelp.editMacroWasteBatch.help= tuttihelp.editMarineLitterBatch.help=editMarineLitterBatch.html tuttihelp.editPlanktonBatch.help=editPlanktonBatch.html Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java 2013-04-08 16:07:19 UTC (rev 757) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java 2013-04-10 14:16:08 UTC (rev 758) @@ -560,6 +560,7 @@ ui.getSpeciesTabFishingOperationReminderLabel().setTitle(fishingOperationText); ui.getBenthosTabFishingOperationReminderLabel().setTitle(fishingOperationText); ui.getMarineLitterTabFishingOperationReminderLabel().setTitle(fishingOperationText); + ui.getIndividualObservationTabFishingOperationReminderLabel().setTitle(fishingOperationText); // ui.getPlanktonTabFishingOperationReminderLabel().setTitle(fishingOperationText); // ui.getAccidentalTabFishingOperationReminderLabel().setTitle(fishingOperationText); @@ -570,6 +571,7 @@ ui.getSpeciesTabContent().getHandler().selectFishingOperation(batch == null ? null : bean); ui.getBenthosTabContent().getHandler().selectFishingOperation(batch == null ? null : bean); ui.getMarineLitterTabContent().getHandler().selectFishingOperation(batch == null ? null : bean); + ui.getIndividualObservationTabContent().getHandler().selectFishingOperation(batch == null ? null : bean); // ui.getPlanktonTabContent().getHandler().selectFishingOperation(bean); // ui.getAccidentalTabContent().getHandler().selectFishingOperation(bean); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css 2013-04-08 16:07:19 UTC (rev 757) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css 2013-04-10 14:16:08 UTC (rev 758) @@ -302,10 +302,14 @@ enabled: {false}; } -#observationIndividuelTab { - enabled: {false}; +#individualObservationTabPanel { + layout:{individualObservationTabPanelLayout}; } +#individualObservationTable { + border: {BorderFactory.createTitledBorder(_("tutti.editCatchBatch.legend.individualObservation"))}; +} + #importPupitriButton { actionIcon: pupitri-import; text: "tutti.editCatchBatch.action.importPupitri"; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx 2013-04-08 16:07:19 UTC (rev 757) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx 2013-04-10 14:16:08 UTC (rev 758) @@ -36,6 +36,9 @@ fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.create.CreateBenthosBatchUI fr.ifremer.tutti.ui.swing.content.operation.catches.benthos.split.SplitBenthosBatchUI fr.ifremer.tutti.ui.swing.content.operation.catches.marinelitter.MarineLitterBatchUI + fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchUI + fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.create.CreateIndividualObservationBatchUI + fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.caracteristics.CaracteristicMapEditorUI fr.ifremer.tutti.ui.swing.content.operation.catches.plankton.PlanktonBatchUI fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUI fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI @@ -100,6 +103,9 @@ <CardLayout2Ext id='marineLitterTabPanelLayout' constructorParams='this, "marineLitterTabPanel"'/> + <CardLayout2Ext id='individualObservationTabPanelLayout' + constructorParams='this, "individualObservationTabPanel"'/> + <TuttiHelpBroker id='broker' constructorParams='"tutti.editCatchBatch.help"'/> <JToolBar id='catchesCaracteristicsTabToolBar'> @@ -372,11 +378,25 @@ <AccidentalBatchUI id='accidentalTabContent' constructorParams='this'/> </JXTitledPanel--> </tab> - <tab id='observationIndividuelTab' - title='tutti.label.tab.observationIndividuel'> - <!--JXTitledPanel id='observationTabFishingOperationReminderLabel'> - <JLabel text='tutti.to.be.done' horizontalAlignment='{JLabel.CENTER}'/> - </JXTitledPanel--> + <tab id='individualObservationTab' + title='tutti.label.tab.individualObservation'> + <JPanel id='individualObservationTabPanel'> + <JXTitledPanel id='individualObservationTabFishingOperationReminderLabel' + constraints='EditCatchesUIHandler.MAIN_CARD'> + <IndividualObservationBatchUI id='individualObservationTabContent' + constructorParams='this'/> + </JXTitledPanel> + <JXTitledPanel id='individualObservationTabCreateBatchReminderLabel' + constraints='EditCatchesUIHandler.CREATE_BATCH_CARD'> + <CreateIndividualObservationBatchUI id='individualObservationTabCreateBatch' + constructorParams='this'/> + </JXTitledPanel> + <JXTitledPanel id='CaracteristicMapEditorReminderLabel' + constraints='EditCatchesUIHandler.EDIT_CARACTERISTICS_CARD'> + <CaracteristicMapEditorUI id='caracteristicMapEditor' + constructorParams='individualObservationTabContent'/> + </JXTitledPanel> + </JPanel> </tab> </JTabbedPane> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-04-08 16:07:19 UTC (rev 757) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-04-10 14:16:08 UTC (rev 758) @@ -61,6 +61,8 @@ public static final String EDIT_FREQUENCY_CARD = "editFrequency"; + public static final String EDIT_CARACTERISTICS_CARD = "caracteristicsCard"; + public static final String CAROUSSEL_TREMIE_VESSEL = "carousselTremieVessel"; public static final String CLASSIC_VESSEL = "classicVessel"; @@ -381,4 +383,39 @@ } } + public void setIndividualObservationSelectedCard(String card) { + JPanel panel = ui.getIndividualObservationTabPanel(); + CardLayout2Ext layout = (CardLayout2Ext) panel.getLayout(); + if (!card.equals(layout.getSelected())) { + layout.setSelected(card); + + JPanel actionPanel = getUI().getCreateFishingOperationActions(); + if (MAIN_CARD.equals(card)) { + registerValidators(); + actionPanel.setVisible(true); + } else { + actionPanel.setVisible(false); + TuttiUI tuttiUi = null; + JXTitledPanel titlePanel = null; + String title = ""; + if (CREATE_BATCH_CARD.equals(card)) { + tuttiUi = ui.getIndividualObservationTabCreateBatch(); + titlePanel = ui.getIndividualObservationTabCreateBatchReminderLabel(); + title = n_("tutti.createIndividualObservationBatch.title"); + + } else if (EDIT_CARACTERISTICS_CARD.equals(card)) { + titlePanel = ui.getIndividualObservationTabFishingOperationReminderLabel(); + title = n_("tutti.editCaracteristics.title"); + } + + if (tuttiUi != null) { + registerValidators(tuttiUi.getHandler().getValidator()); + } + if (titlePanel != null) { + titlePanel.setTitle(ui.getIndividualObservationTabCreateBatchReminderLabel().getTitle() + " - " + _(title)); + } + } + } + } + } \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,218 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation; + +import com.google.common.collect.Lists; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; +import fr.ifremer.tutti.persistence.entities.data.*; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; +import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentModelAware; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +import java.util.Collection; +import java.util.List; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel<IndividualObservationBatch, IndividualObservationBatchRowModel> + implements AttachmentModelAware, IndividualObservationBatch { + + private static final long serialVersionUID = 1L; + + /** + * Delegate edit object. + * + * @since 1.3 + */ + protected final IndividualObservationBatch editObject = + TuttiBeanFactory.newIndividualObservationBatch(); + + /** + * Attachments (should never be null). + * + * @since 0.2 + */ + protected final List<Attachment> attachment = Lists.newArrayList(); + + protected static final Binder<IndividualObservationBatch, IndividualObservationBatchRowModel> fromBeanBinder = + BinderFactory.newBinder(IndividualObservationBatch.class, + IndividualObservationBatchRowModel.class); + + protected static final Binder<IndividualObservationBatchRowModel, IndividualObservationBatch> toBeanBinder = + BinderFactory.newBinder(IndividualObservationBatchRowModel.class, + IndividualObservationBatch.class); + + public IndividualObservationBatchRowModel() { + super(IndividualObservationBatch.class, fromBeanBinder, toBeanBinder); + } + + public IndividualObservationBatchRowModel(IndividualObservationBatch aBatch, + List<Attachment> attachments) { + this(); + fromBean(aBatch); + this.attachment.addAll(attachments); + } + + @Override + protected IndividualObservationBatch newEntity() { + return TuttiBeanFactory.newIndividualObservationBatch(); + } + + //------------------------------------------------------------------------// + //-- MarineLitterBatch --// + //------------------------------------------------------------------------// + + @Override + public FishingOperation getFishingOperation() { + return editObject.getFishingOperation(); + } + + @Override + public void setFishingOperation(FishingOperation fishingOperation) { + editObject.setFishingOperation(fishingOperation); + } + + @Override + public Float getWeight() { + return editObject.getWeight(); + } + + @Override + public void setWeight(Float weight) { + Object oldValue = getWeight(); + editObject.setWeight(weight); + firePropertyChange(PROPERTY_WEIGHT, oldValue, weight); + } + + @Override + public Species getSpecies() { + return editObject.getSpecies(); + } + + @Override + public void setSpecies(Species species) { + Object oldValue = getSpecies(); + editObject.setSpecies(species); + firePropertyChange(PROPERTY_SPECIES, oldValue, species); + } + + @Override + public Float getSize() { + return editObject.getSize(); + } + + @Override + public void setSize(Float size) { + Object oldValue = getSize(); + editObject.setSize(size); + firePropertyChange(PROPERTY_SIZE, oldValue, size); + } + + @Override + public Caracteristic getLengthStepCaracteristic() { + return editObject.getLengthStepCaracteristic(); + } + + @Override + public void setLengthStepCaracteristic(Caracteristic lengthStepCaracteristic) { + Object oldValue = getLengthStepCaracteristic(); + editObject.setLengthStepCaracteristic(lengthStepCaracteristic); + firePropertyChange(PROPERTY_LENGTH_STEP_CARACTERISTIC, oldValue, lengthStepCaracteristic); + } + + @Override + public CaracteristicMap getCaracteristics() { + return editObject.getCaracteristics(); + } + + @Override + public void setCaracteristics(CaracteristicMap caracteristics) { + Object oldValue = getCaracteristics(); + editObject.setCaracteristics(caracteristics); + firePropertyChange(PROPERTY_CARACTERISTICS, oldValue, caracteristics); + } + + @Override + public String getSamplingCode() { + return editObject.getSamplingCode(); + } + + @Override + public void setSamplingCode(String samplingCode) { + Object oldValue = getSamplingCode(); + editObject.setSamplingCode(samplingCode); + firePropertyChange(PROPERTY_SAMPLING_CODE, oldValue, samplingCode); + } + + @Override + public Integer getCalcifiedPieceSamplingCode() { + return editObject.getCalcifiedPieceSamplingCode(); + } + + @Override + public void setCalcifiedPieceSamplingCode(Integer calcifiedPieceSamplingCode) { + Object oldValue = getCalcifiedPieceSamplingCode(); + editObject.setCalcifiedPieceSamplingCode(calcifiedPieceSamplingCode); + firePropertyChange(PROPERTY_CALCIFIED_PIECE_SAMPLING_CODE, oldValue, calcifiedPieceSamplingCode); + } + + @Override + public String getComment() { + return editObject.getComment(); + } + + @Override + public void setComment(String comment) { + Object oldValue = getComment(); + editObject.setComment(comment); + firePropertyChange(PROPERTY_COMMENT, oldValue, comment); + } + + //------------------------------------------------------------------------// + //-- AttachmentModelAware --// + //------------------------------------------------------------------------// + + @Override + public AttachementObjectTypeEnum getObjectType() { + return AttachementObjectTypeEnum.SAMPLE; + } + + @Override + public String getObjectId() { + return getId(); + } + + @Override + public List<Attachment> getAttachment() { + return attachment; + } + + @Override + public void addAllAttachment(Collection<Attachment> attachments) { + this.attachment.addAll(attachments); + firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment()); + } + + @Override + public void addAttachment(Attachment attachment) { + this.attachment.add(attachment); + firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment()); + } + + @Override + public void removeAllAttachment(Collection<Attachment> attachments) { + this.attachment.removeAll(attachments); + firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment()); + } + + @Override + public void removeAttachment(Attachment attachment) { + this.attachment.remove(attachment); + firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment()); + } +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,76 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation; + +import fr.ifremer.tutti.ui.swing.content.operation.catches.marinelitter.MarineLitterBatchRowModel; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; +import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; +import org.jdesktop.swingx.table.TableColumnModelExt; + +import static org.nuiton.i18n.I18n.n_; + +/** + * @author kmorin <kmorin@codelutin.com> + */ +public class IndividualObservationBatchTableModel extends AbstractTuttiTableModel<IndividualObservationBatchRowModel> { + + private static final long serialVersionUID = 1L; + + public static final ColumnIdentifier<IndividualObservationBatchRowModel> SPECIES = ColumnIdentifier.newId( + IndividualObservationBatchRowModel.PROPERTY_SPECIES, + n_("tutti.editIndividualObservationBatch.table.header.species"), + n_("tutti.editIndividualObservationBatch.table.header.species.tip")); + + public static final ColumnIdentifier<IndividualObservationBatchRowModel> WEIGHT = ColumnIdentifier.newId( + IndividualObservationBatchRowModel.PROPERTY_WEIGHT, + n_("tutti.editIndividualObservationBatch.table.header.weight"), + n_("tutti.editIndividualObservationBatch.table.header.weight.tip")); + + public static final ColumnIdentifier<IndividualObservationBatchRowModel> SIZE = ColumnIdentifier.newId( + IndividualObservationBatchRowModel.PROPERTY_SIZE, + n_("tutti.editIndividualObservationBatch.table.header.size"), + n_("tutti.editIndividualObservationBatch.table.header.size.tip")); + + public static final ColumnIdentifier<IndividualObservationBatchRowModel> LENGTH_STEP_CARACTERISTIC = ColumnIdentifier.newId( + IndividualObservationBatchRowModel.PROPERTY_LENGTH_STEP_CARACTERISTIC, + n_("tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic"), + n_("tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic.tip")); + + public static final ColumnIdentifier<IndividualObservationBatchRowModel> OTHER_CARACTERISTICS = ColumnIdentifier.newId( + IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS, + n_("tutti.editIndividualObservationBatch.table.header.otherCaracteristics"), + n_("tutti.editIndividualObservationBatch.table.header.otherCaracteristics.tip")); + + public static final ColumnIdentifier<IndividualObservationBatchRowModel> CALCIFIED_PIECE_SAMPLING_CODE = ColumnIdentifier.newId( + IndividualObservationBatchRowModel.PROPERTY_CALCIFIED_PIECE_SAMPLING_CODE, + n_("tutti.editIndividualObservationBatch.table.header.calcifiedPieceSamplingCode"), + n_("tutti.editIndividualObservationBatch.table.header.calcifiedPieceSamplingCode.tip")); + + public static final ColumnIdentifier<IndividualObservationBatchRowModel> SAMPLING_CODE = ColumnIdentifier.newId( + IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE, + n_("tutti.editIndividualObservationBatch.table.header.samplingCode"), + n_("tutti.editIndividualObservationBatch.table.header.samplingCode.tip")); + + public static final ColumnIdentifier<IndividualObservationBatchRowModel> COMMENT = ColumnIdentifier.newId( + IndividualObservationBatchRowModel.PROPERTY_COMMENT, + n_("tutti.editIndividualObservationBatch.table.header.comment"), + n_("tutti.editIndividualObservationBatch.table.header.comment.tip")); + + public static final ColumnIdentifier<IndividualObservationBatchRowModel> ATTACHMENT = ColumnIdentifier.newReadOnlyId( + IndividualObservationBatchRowModel.PROPERTY_ATTACHMENT, + n_("tutti.editIndividualObservationBatch.table.header.file"), + n_("tutti.editIndividualObservationBatch.table.header.file.tip")); + + public IndividualObservationBatchTableModel(TableColumnModelExt columnModel) { + super(columnModel, false, false); + + setNoneEditableCols(); + } + + @Override + public IndividualObservationBatchRowModel createNewRow() { + IndividualObservationBatchRowModel result = new IndividualObservationBatchRowModel(); + + // by default empty row is not valid + result.setValid(false); + return result; + } +} Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.css (from rev 757, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/MarineLitterBatchUI.css) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.css (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.css 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,66 @@ +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 Ifremer + * %% + * 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% + */ + +#editIndividualObservationBatchTopPanel { + _help: {"tuttihelp.editIndividualObservationBatch.help"}; +} + +#individualObservationBatchTabToolBar { + floatable: false; + opaque: false; + borderPainted: false; +} + +#individualObservationBatchAttachmentsButton { + enabled: {model.getObjectId() != null}; +} + +#tablePopup { + label: "tutti.editIndividualObservationBatch.title.batchActions"; +} + +#table { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; +} + +#createIndividualObservationBatchButton { + actionIcon: batch-create; + text: "tutti.editIndividualObservationBatch.action.createBatch"; + toolTipText: "tutti.editIndividualObservationBatch.action.createBatch.tip"; + i18nMnemonic: "tutti.editIndividualObservationBatch.action.createBatch.mnemonic"; + _help: {"tutti.editIndividualObservationBatch.action.createBatch.help"}; +} + +#removeIndividualObservationBatchMenu { + actionIcon: batch-delete; + text: "tutti.editIndividualObservationBatch.action.removeBatch"; + toolTipText: "tutti.editIndividualObservationBatch.action.removeBatch.tip"; + i18nMnemonic: "tutti.editIndividualObservationBatch.action.removeBatch.mnemonic"; + _tuttiAction: {RemoveIndividualObservationBatchAction.class}; + enabled: {model.isRemoveBatchEnabled()}; + _help: {"tutti.editIndividualObservationBatch.action.removeBatch.help"}; +} \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.jaxx (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.jaxx 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,78 @@ + +<JPanel id='editIndividualObservationBatchTopPanel' layout='{new BorderLayout()}' + decorator='help' + implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<IndividualObservationBatchUIModel, IndividualObservationBatchUIHandler>'> + + <import> + fr.ifremer.tutti.ui.swing.TuttiHelpBroker + fr.ifremer.tutti.ui.swing.TuttiUIContext + fr.ifremer.tutti.ui.swing.util.TuttiUI + fr.ifremer.tutti.ui.swing.util.attachment.ButtonAttachment + + jaxx.runtime.swing.editor.NumberEditor + + org.jdesktop.swingx.JXTable + + javax.swing.ListSelectionModel + + java.awt.Color + + static org.nuiton.i18n.I18n._ + </import> + + <script><![CDATA[ + +public IndividualObservationBatchUI(TuttiUI<?,?> parentUI) { + JAXXUtil.initContext(this, parentUI); + IndividualObservationBatchUIHandler handler = new IndividualObservationBatchUIHandler(parentUI, this); + setContextValue(handler); + handler.beforeInitUI(); +} + +protected void $afterCompleteSetup() { handler.afterInitUI(); } + ]]></script> + + <IndividualObservationBatchUIHandler id='handler' + initializer='getContextValue(IndividualObservationBatchUIHandler.class)'/> + + <IndividualObservationBatchUIModel id='model' + initializer='getContextValue(IndividualObservationBatchUIModel.class)'/> + + <BeanValidator id='validator' bean='model' + uiClass='jaxx.runtime.validator.swing.ui.ImageValidationUI'> + </BeanValidator> + + <TuttiHelpBroker id='broker' + constructorParams='"tuttihelp.editIndividualObservationBatch.help"'/> + + <JToolBar id='individualObservationBatchTabToolBar'> + <ButtonAttachment id='individualObservationBatchAttachmentsButton' + constructorParams='getHandler().getContext(), getModel()'/> + </JToolBar> + + <JPopupMenu id='tablePopup'> + <JMenuItem id='removeIndividualObservationBatchMenu'/> + </JPopupMenu> + + <Table id='form' fill='both' constraints='BorderLayout.NORTH'> + + <!-- Toolbar / Filter --> + <row> + <cell columns="2"> + <JPanel id='tableToolbar' layout='{new BorderLayout()}'> + <JPanel layout='{new GridLayout(1,0)}' + constraints='BorderLayout.WEST'> + <JButton id='createIndividualObservationBatchButton' + onActionPerformed='handler.createBatch()'/> + </JPanel> + </JPanel> + </cell> + </row> + </Table> + + <JScrollPane id='tableScrollPane' constraints='BorderLayout.CENTER'> + <JXTable id='table' + onMouseClicked='handler.autoSelectRowInTable(event, tablePopup)'/> + </JScrollPane> + +</JPanel> \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUIHandler.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUIHandler.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,438 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation; + +import com.google.common.collect.Lists; +import fr.ifremer.tutti.PropagatePropertyChangeListener; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.Attachment; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchTableUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.caracteristics.CaracteristicMapCellComponent; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.create.CreateIndividualObservationBatchUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.create.CreateIndividualObservationBatchUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchTableModel; +import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; +import fr.ifremer.tutti.ui.swing.util.TuttiUI; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentCellEditor; +import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentCellRenderer; +import fr.ifremer.tutti.ui.swing.util.comment.CommentCellEditor; +import fr.ifremer.tutti.ui.swing.util.comment.CommentCellRenderer; +import fr.ifremer.tutti.ui.swing.util.table.AbstractSelectTableAction; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.decorator.ComponentAdapter; +import org.jdesktop.swingx.decorator.HighlightPredicate; +import org.jdesktop.swingx.decorator.Highlighter; +import org.jdesktop.swingx.table.DefaultTableColumnModelExt; +import org.nuiton.util.decorator.Decorator; + +import java.awt.*; +import java.util.Collection; +import java.util.List; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class IndividualObservationBatchUIHandler + extends AbstractTuttiBatchTableUIHandler<IndividualObservationBatchRowModel, IndividualObservationBatchUIModel, IndividualObservationBatchUI> { + + private static final Log log = + LogFactory.getLog(IndividualObservationBatchUIHandler.class); + + public IndividualObservationBatchUIHandler(TuttiUI<?, ?> parentUi, IndividualObservationBatchUI ui) { + super(parentUi, ui, + IndividualObservationBatchRowModel.PROPERTY_SPECIES, + IndividualObservationBatchRowModel.PROPERTY_WEIGHT, + IndividualObservationBatchRowModel.PROPERTY_SIZE, + IndividualObservationBatchRowModel.PROPERTY_LENGTH_STEP_CARACTERISTIC, + IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS, + IndividualObservationBatchRowModel.PROPERTY_CALCIFIED_PIECE_SAMPLING_CODE, + IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE, + IndividualObservationBatchRowModel.PROPERTY_COMMENT, + IndividualObservationBatchRowModel.PROPERTY_ATTACHMENT); + } + + //------------------------------------------------------------------------// + //-- AbstractTuttiBatchTableUIHandler methods --// + //------------------------------------------------------------------------// + + @Override + public void selectFishingOperation(FishingOperation bean) { + + boolean empty = bean == null; + + IndividualObservationBatchUIModel model = getModel(); + + List<IndividualObservationBatchRowModel> rows; + + if (empty) { + rows = null; + } else { + + if (log.isInfoEnabled()) { + log.info("Get individualObservation batch for fishingOperation: " + + bean.getId()); + } + rows = Lists.newArrayList(); + +// if (!TuttiEntities.isNew(bean)) { +// +// } + } + model.setRows(rows); + recomputeBatchActionEnable(); + } + + protected IndividualObservationBatchRowModel loadBatch(IndividualObservationBatch aBatch) { + + Integer id = aBatch.getIdAsInt(); + + List<Attachment> attachments = + persistenceService.getAllAttachments(id); + + IndividualObservationBatchRowModel newRow = + new IndividualObservationBatchRowModel(aBatch, attachments); + + return newRow; + } + + //------------------------------------------------------------------------// + //-- AbstractTuttiTableUIHandler methods --// + //------------------------------------------------------------------------// + + @Override + public IndividualObservationBatchTableModel getTableModel() { + return (IndividualObservationBatchTableModel) getTable().getModel(); + } + + @Override + public JXTable getTable() { + return ui.getTable(); + } + + @Override + protected boolean isRowValid(IndividualObservationBatchRowModel row) { +// boolean result = row.getMarineLitterCategory() != null && +// row.getMarineLitterSizeCategory() != null && +// row.getNumber() != null; +// return result; + return true; + } + + @Override + protected void onRowModified(int rowIndex, + IndividualObservationBatchRowModel row, + String propertyName, + Object oldValue, + Object newValue) { + recomputeRowValidState(row); + + saveSelectedRowIfNeeded(); + + // when row valid state has changed, recompute action enabled states + recomputeBatchActionEnable(); + } + + @Override + protected void saveSelectedRowIfRequired(TuttiBeanMonitor<IndividualObservationBatchRowModel> rowMonitor, + IndividualObservationBatchRowModel row) { + + if (row != null && row.isValid() && rowMonitor.wasModified()) { + + // monitored bean was modified, save it + if (log.isInfoEnabled()) { + log.info("Row " + row + " was modified, will save it"); + } + + rowMonitor.setBean(null); + saveRow(row); + rowMonitor.setBean(row); + + // clear modified flag on the monitor + rowMonitor.clearModified(); + } + } + + @Override + protected void onRowValidStateChanged(int rowIndex, + IndividualObservationBatchRowModel row, + Boolean oldValue, + Boolean newValue) { + super.onRowValidStateChanged(rowIndex, row, oldValue, newValue); + + // when row valid state has changed, recompute action enabled states + recomputeBatchActionEnable(); + } + + @Override + protected void onAfterSelectedRowChanged(int oldRowIndex, + IndividualObservationBatchRowModel oldRow, + int newRowIndex, + IndividualObservationBatchRowModel newRow) { + super.onAfterSelectedRowChanged(oldRowIndex, oldRow, newRowIndex, newRow); + + // when selected row has changed, recompute action enabled states + recomputeBatchActionEnable(); + } + + @Override + protected void addHighlighters(JXTable table) { + super.addHighlighters(table); + + // paint in a special color for comment cell (with not null value) + Color cellWithValueColor = getConfig().getColorCellWithValue(); + + Highlighter commentHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( + new HighlightPredicate.AndHighlightPredicate( + new HighlightPredicate.IdentifierHighlightPredicate(IndividualObservationBatchTableModel.COMMENT), + // for not null value + new HighlightPredicate() { + @Override + public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { + String value = (String) adapter.getValue(); + return StringUtils.isNotBlank(value); + } + }), cellWithValueColor); + table.addHighlighter(commentHighlighter); + + // paint in a special color for attachment cell (when some attachments) + + Highlighter attachmentHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( + new HighlightPredicate.AndHighlightPredicate( + new HighlightPredicate.IdentifierHighlightPredicate(IndividualObservationBatchTableModel.ATTACHMENT), + // for not null value + new HighlightPredicate() { + @Override + public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { + Collection attachments = (Collection) adapter.getValue(); + return CollectionUtils.isNotEmpty(attachments); + } + } + ), cellWithValueColor); + table.addHighlighter(attachmentHighlighter); + } + + //------------------------------------------------------------------------// + //-- AbstractTuttiUIHandler methods --// + //------------------------------------------------------------------------// + + @Override + public SwingValidator<IndividualObservationBatchUIModel> getValidator() { + return ui.getValidator(); + } + + @Override + public void beforeInitUI() { + + if (log.isInfoEnabled()) { + log.info("beforeInit: " + ui); + } + + EditCatchesUIModel catchesUIModel = + ui.getContextValue(EditCatchesUIModel.class); + + IndividualObservationBatchUIModel model = new IndividualObservationBatchUIModel(catchesUIModel); + ui.setContextValue(model); + + // propagate when value is changing + PropagatePropertyChangeListener.listenAndPropagate( + catchesUIModel, + model, + EditCatchesUIModel.PROPERTY_MARINE_LITTER_TOTAL_WEIGHT, + EditCatchesUIModel.PROPERTY_MARINE_LITTER_TOTAL_WEIGHT); + } + + @Override + public void afterInitUI() { + + if (log.isDebugEnabled()) { + log.debug("afterInit: " + ui); + } + + initUI(ui); + + JXTable table = getTable(); + + // can show / hide some columns in model + table.setColumnControlVisible(true); + + // create table column model + DefaultTableColumnModelExt columnModel = + new DefaultTableColumnModelExt(); + Decorator<Caracteristic> caracteristicDecorator = + getDecorator(Caracteristic.class, null); + + { // Species column + + Decorator<Species> speciesDecorator = getDecorator( + Species.class, DecoratorService.FROM_PROTOCOL); + addComboDataColumnToModel(columnModel, + IndividualObservationBatchTableModel.SPECIES, + speciesDecorator, getDataContext().getReferentSpecies()); + } + + { // Weight column + + addFloatColumnToModel(columnModel, + IndividualObservationBatchTableModel.WEIGHT, + TuttiUI.DECIMAL3_PATTERN); + } + + { // Size column + + addFloatColumnToModel(columnModel, + IndividualObservationBatchTableModel.SIZE, + TuttiUI.DECIMAL3_PATTERN); + } + + { // Length step caracteristic column + + addComboDataColumnToModel(columnModel, + IndividualObservationBatchTableModel.LENGTH_STEP_CARACTERISTIC, + caracteristicDecorator, getDataContext().getLengthStepCaracteristics()); + + } + + { // Other caracteristics column + + Color computedDataColor = getConfig().getColorComputedWeights(); + addColumnToModel(columnModel, + CaracteristicMapCellComponent.newEditor(ui), + CaracteristicMapCellComponent.newRender(getContext()), + IndividualObservationBatchTableModel.OTHER_CARACTERISTICS); + + } + + { // Calcified piece sampling code column + + addColumnToModel(columnModel, + IndividualObservationBatchTableModel.CALCIFIED_PIECE_SAMPLING_CODE); + } + + { // Sampling code column + + addColumnToModel(columnModel, + IndividualObservationBatchTableModel.SAMPLING_CODE); + } + + { // Comment column + + addColumnToModel(columnModel, + CommentCellEditor.newEditor(ui), + CommentCellRenderer.newRender(), + IndividualObservationBatchTableModel.COMMENT); + } + + { // File column + + addColumnToModel(columnModel, + AttachmentCellEditor.newEditor(ui), + AttachmentCellRenderer.newRender(getDecorator(Attachment.class, null)), + IndividualObservationBatchTableModel.ATTACHMENT); + } + + // create table model + IndividualObservationBatchTableModel tableModel = + new IndividualObservationBatchTableModel(columnModel); + + table.setModel(tableModel); + table.setColumnModel(columnModel); + + initBatchTable(table, columnModel, tableModel); + recomputeBatchActionEnable(); + } + + @Override + public void onCloseUI() { + if (log.isDebugEnabled()) { + log.debug("closing: " + ui); + } + ui.getIndividualObservationBatchAttachmentsButton().onCloseUI(); + } + + //------------------------------------------------------------------------// + //-- Public methods --// + //------------------------------------------------------------------------// + + public void createBatch() { + + EditCatchesUI parent = SwingUtil.getParentContainer(ui, EditCatchesUI.class); + CreateIndividualObservationBatchUI createBatchEditor = parent.getIndividualObservationTabCreateBatch(); + + createBatchEditor.getHandler().openUI(); + parent.getHandler().setIndividualObservationSelectedCard(EditCatchesUIHandler.CREATE_BATCH_CARD); + } + + public void addBatch(CreateIndividualObservationBatchUIModel model) { + if (model.isValid()) { + + IndividualObservationBatchTableModel tableModel = getTableModel(); + + IndividualObservationBatchRowModel newRow = tableModel.createNewRow(); + newRow.setSpecies(model.getSpecies()); + newRow.setWeight(model.getWeight()); + newRow.setSize(model.getSize()); + newRow.setLengthStepCaracteristic(model.getLengthStepCaracteristic()); + + recomputeRowValidState(newRow); + + saveRow(newRow); + + tableModel.addNewRow(newRow); + AbstractSelectTableAction.doSelectCell(getTable(), tableModel.getRowCount() - 1, 0); + } + + recomputeBatchActionEnable(); + } + + //------------------------------------------------------------------------// + //-- Internal methods --// + //------------------------------------------------------------------------// + + protected void recomputeBatchActionEnable() { + + int rowIndex = getTable().getSelectedRow(); + + boolean enableRemove = false; + + if (rowIndex != -1) { + + // there is a selected row + enableRemove = true; + } + IndividualObservationBatchUIModel model = getModel(); + model.setRemoveBatchEnabled(enableRemove); + } + + protected void saveRow(IndividualObservationBatchRowModel row) { + +// IndividualObservationBatch catchBean = row.toBean(); +// +// FishingOperation fishingOperation = getModel().getFishingOperation(); +// catchBean.setFishingOperation(fishingOperation); +// if (log.isInfoEnabled()) { +// log.info("Selected fishingOperation: " + fishingOperation.getId()); +// } +// +// if (TuttiEntities.isNew(catchBean)) { +// +// catchBean = persistenceService.createMarineLitterBatch(catchBean); +// row.setId(catchBean.getId()); +// } else { +// persistenceService.saveMarineLitterBatch(catchBean); +// } + } +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUIModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUIModel.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,134 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation; + +import com.google.common.collect.Lists; +import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; +import fr.ifremer.tutti.persistence.entities.data.Attachment; +import fr.ifremer.tutti.ui.swing.content.operation.AbstractTuttiBatchUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.marinelitter.MarineLitterBatchRowModel; +import fr.ifremer.tutti.ui.swing.util.TabContentModel; +import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentModelAware; +import org.apache.commons.collections.CollectionUtils; + +import java.util.Collection; +import java.util.List; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class IndividualObservationBatchUIModel extends AbstractTuttiBatchUIModel<IndividualObservationBatchRowModel, IndividualObservationBatchUIModel> + implements AttachmentModelAware, TabContentModel { + + private static final long serialVersionUID = 1L; + + public static final String PROPERTY_REMOVE_BATCH_ENABLED = "removeBatchEnabled"; + + protected final List<Attachment> attachment = Lists.newArrayList(); + + /** + * Can user remove a selected batch? + */ + protected boolean removeBatchEnabled; + + private String rootBatchId; + + public IndividualObservationBatchUIModel(EditCatchesUIModel catchesUIModel) { + super(catchesUIModel); + } + + public boolean isRemoveBatchEnabled() { + return removeBatchEnabled; + } + + public void setRemoveBatchEnabled(boolean removeBatchEnabled) { + Object oldValue = isRemoveBatchEnabled(); + this.removeBatchEnabled = removeBatchEnabled; + firePropertyChange(PROPERTY_REMOVE_BATCH_ENABLED, oldValue, removeBatchEnabled); + } + + public void setRootBatchId(String rootBatchId) { + String oldValue = getObjectId(); + this.rootBatchId = rootBatchId; + firePropertyChange(PROPERTY_OBJECT_ID, oldValue, getObjectId()); + } + + public String getRootBatchId() { + return rootBatchId; + } + + //------------------------------------------------------------------------// + //-- AttachmentModelAware --// + //------------------------------------------------------------------------// + + @Override + public AttachementObjectTypeEnum getObjectType() { + return AttachementObjectTypeEnum.CATCH_BATCH; + } + + @Override + public String getObjectId() { + return rootBatchId; + } + + @Override + public List<Attachment> getAttachment() { + return attachment; + } + + @Override + public void addAllAttachment(Collection<Attachment> attachments) { + this.attachment.addAll(attachments); + firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment()); + } + + @Override + public void addAttachment(Attachment attachment) { + this.attachment.add(attachment); + firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment()); + } + + @Override + public void removeAllAttachment(Collection<Attachment> attachments) { + this.attachment.removeAll(attachments); + firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment()); + } + + @Override + public void removeAttachment(Attachment attachment) { + this.attachment.remove(attachment); + firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment()); + } + + //------------------------------------------------------------------------// + //-- TabContentModel --// + //------------------------------------------------------------------------// + + @Override + public boolean isEmpty() { + boolean result = CollectionUtils.isEmpty(getAttachment()); + if (result && CollectionUtils.isNotEmpty(getRows())) { + + // check if every line is not valid + for (IndividualObservationBatchRowModel row : rows) { + if (row.isValid()) { + + // found a valid row so not empty + result = false; + break; + } + } + } + return result; + } + + @Override + public String getTitle() { + return "tutti.label.tab.individualObservations"; + } + + @Override + public String getIcon() { + return null; + } +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/RemoveIndividualObservationBatchAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/RemoveIndividualObservationBatchAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/RemoveIndividualObservationBatchAction.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,85 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation; + +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.TuttiPersistence; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.ui.swing.content.operation.catches.marinelitter.RemoveMarineLitterBatchAction; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.RemoveSpeciesSubBatchAction; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.util.table.AbstractSelectTableAction; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; + +/** + * @author kmorin <kmorin@codelutin.com> + */ +public class RemoveIndividualObservationBatchAction + extends AbstractTuttiAction<IndividualObservationBatchUIModel, IndividualObservationBatchUI, IndividualObservationBatchUIHandler> { + + private static final Log log = + LogFactory.getLog(RemoveMarineLitterBatchAction.class); + + protected RemoveSpeciesSubBatchAction removeSpeciesSubBatchAction; + + public RemoveIndividualObservationBatchAction(IndividualObservationBatchUIHandler handler) { + super(handler, false); + } + + int rowIndex; + + @Override + protected void doAction() throws Exception { + + JXTable table = handler.getTable(); + + rowIndex = table.getSelectedRow(); + + Preconditions.checkState(rowIndex != -1, + "Cant remove batch if none is selected"); + + IndividualObservationBatchTableModel tableModel = handler.getTableModel(); + IndividualObservationBatchRowModel selectedBatch = tableModel.getEntry(rowIndex); + + boolean persisted = !TuttiEntities.isNew(selectedBatch); + + if (persisted) { + + // remove it from db + + String id = selectedBatch.getId(); + + if (log.isInfoEnabled()) { + log.info("Remove marineLitter with id: " + id); + } + + TuttiPersistence persistenceService = + getContext().getPersistenceService(); + +// persistenceService.deleteMarineLitterBatch(id); + } + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + + JXTable table = handler.getTable(); + + IndividualObservationBatchTableModel tableModel = handler.getTableModel(); + + tableModel.removeRow(rowIndex); + + if (!tableModel.getRows().isEmpty()) { + + // select first row + AbstractSelectTableAction.doSelectCell(table, 0, 0); + } + + if (table.isEditing()) { + + // but no edit it + table.getCellEditor().stopCellEditing(); + } + } +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapCellComponent.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapCellComponent.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapCellComponent.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,255 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.caracteristics; + +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchUI; +import fr.ifremer.tutti.ui.swing.util.table.AbstractSelectTableAction; +import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; +import jaxx.runtime.SwingUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.decorator.Decorator; + +import javax.swing.*; +import javax.swing.border.LineBorder; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; +import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * @author kmorin <kmorin@codelutin.com> + */ +public class CaracteristicMapCellComponent extends DefaultTableCellRenderer { + + private static final long serialVersionUID = 1L; + + /** Logger. */ + private static final Log log = + LogFactory.getLog(CaracteristicMapCellComponent.class); + + protected Decorator<Caracteristic> caracteristicDecorator; + + protected Decorator<CaracteristicQualitativeValue> valueDecorator; + + protected Color computedDataColor; + + public CaracteristicMapCellComponent(TuttiUIContext context) { + super(); + this.caracteristicDecorator = + context.getDecoratorService().getDecoratorByType(Caracteristic.class); + this.valueDecorator = + context.getDecoratorService().getDecoratorByType(CaracteristicQualitativeValue.class); + this.computedDataColor = context.getConfig().getColorComputedWeights(); + + setHorizontalAlignment(CENTER); + setIcon(SwingUtil.createActionIcon("show-frequency")); + } + + public void setText(CaracteristicMap map) { + String s = "-"; + if (map != null && map.size() > 0) { + s = String.valueOf(map.size()); + } + setText(s); + Font f = this.getFont(); + f = f.deriveFont(Font.ITALIC); + setFont(f); + setForeground(computedDataColor); + } + + public void setToolTipText(CaracteristicMap map) { + String tooltipText = null; + if (map != null) { + tooltipText = "<html><ul>"; + for (Caracteristic caracteristic : map.keySet()) { + tooltipText += "<li>" + caracteristicDecorator.toString(caracteristic) + + " : " + valueDecorator.toString(map.get(caracteristic)) + "</li>"; + } + tooltipText += "</ul></html>"; + } + setToolTipText(tooltipText); + } + + public static TableCellRenderer newRender(TuttiUIContext context) { + return new CaracteristicMapCellRenderer(context); + } + + public static TableCellEditor newEditor(IndividualObservationBatchUI ui) { + return new CaracteristicMapCellEditor(ui); + } + + public static class CaracteristicMapCellEditor extends AbstractCellEditor implements TableCellEditor { + + private static final long serialVersionUID = 1L; + + protected final CaracteristicMapCellComponent component; + + protected final IndividualObservationBatchUI ui; + + protected JTable table; + + protected IndividualObservationBatchTableModel tableModel; + + protected ColumnIdentifier<IndividualObservationBatchRowModel> columnIdentifier; + + protected IndividualObservationBatchRowModel editRow; + + protected Integer rowIndex; + + protected Integer columnIndex; + + public CaracteristicMapCellEditor(IndividualObservationBatchUI ui) { + this.ui = ui; + component = new CaracteristicMapCellComponent(ui.getHandler().getContext()); + component.setBorder(new LineBorder(Color.BLACK)); + component.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER || + e.getKeyCode() == KeyEvent.VK_SPACE) { + e.consume(); + startEdit(); + } + } + }); + + component.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + e.consume(); + startEdit(); + } + }); + } + + protected void startEdit() { + + Preconditions.checkNotNull(tableModel, "No table model assigned."); + + // open frequency dialog + + Preconditions.checkNotNull(editRow, "No editRow found."); + + if (log.isInfoEnabled()) { + log.info("Will edit frequencies for row: " + rowIndex); + } + + EditCatchesUI parent = SwingUtil.getParentContainer(ui, EditCatchesUI.class); + CaracteristicMapEditorUI caracteristicMapEditor = parent.getCaracteristicMapEditor(); + caracteristicMapEditor.getHandler().editBatch(editRow, this); + + // open frequency editor + parent.getHandler().setIndividualObservationSelectedCard(EditCatchesUIHandler.EDIT_CARACTERISTICS_CARD); + } + + public void validateEdition(CaracteristicMapEditorUIModel caracteristicMapEditorModel) { + if (caracteristicMapEditorModel.isValid()) { + + CaracteristicMap map = caracteristicMapEditorModel.getCaracteristicMap(); + component.setText(map); + component.setToolTipText(map); + editRow.setCaracteristics(map); + } + + int r = rowIndex; + int c = columnIndex; + + // stop edition + stopCellEditing(); + + // reselect this cell + AbstractSelectTableAction.doSelectCell(table, r, c); + table.requestFocus(); + } + + @Override + public Component getTableCellEditorComponent(JTable table, + Object value, + boolean isSelected, + int row, + int column) { + tableModel = (IndividualObservationBatchTableModel) table.getModel(); + this.table = table; + columnIdentifier = IndividualObservationBatchTableModel.OTHER_CARACTERISTICS; + if (log.isDebugEnabled()) { + log.debug("Set columnIdentifier (" + column + ") :: " + columnIdentifier.getPropertyName()); + } + + rowIndex = row; + columnIndex = column; + + editRow = tableModel.getEntry(row); + + component.setText(editRow.getCaracteristics()); + component.setToolTipText(editRow.getCaracteristics()); + + return component; + } + + @Override + public Object getCellEditorValue() { + + Preconditions.checkNotNull(editRow, "No editRow found in editor."); + + Object result = null; + if (columnIdentifier == IndividualObservationBatchTableModel.OTHER_CARACTERISTICS) { + result = editRow.getCaracteristics(); + } + if (log.isDebugEnabled()) { + log.debug("editor value (" + columnIdentifier + "): " + result); + } + + return result; + } + + @Override + public void cancelCellEditing() { + super.cancelCellEditing(); + rowIndex = null; + columnIndex = null; + editRow = null; + } + } + + public static class CaracteristicMapCellRenderer implements TableCellRenderer { + + protected final CaracteristicMapCellComponent component; + + public CaracteristicMapCellRenderer(TuttiUIContext context) { + component = new CaracteristicMapCellComponent(context); + } + + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, + boolean isSelected, + boolean hasFocus, + int row, + int column) { + + CaracteristicMapCellComponent result = + (CaracteristicMapCellComponent) component.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + + boolean editable = table.isCellEditable(row, column); + result.setEnabled(editable); + + CaracteristicMap map = (CaracteristicMap) value; + result.setText(map); + result.setToolTipText(map); + + return result; + } + } +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorRowModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorRowModel.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,12 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.caracteristics; + +import fr.ifremer.tutti.ui.swing.content.operation.fishing.AbstractCaracteristicRowModel; + +/** + * @author kmorin <kmorin@codelutin.com> + */ +public class CaracteristicMapEditorRowModel extends AbstractCaracteristicRowModel<CaracteristicMapEditorRowModel> { + + private static final long serialVersionUID = 1L; + +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorTableModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorTableModel.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,37 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.caracteristics; + +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; +import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; +import org.jdesktop.swingx.table.TableColumnModelExt; + +import static org.nuiton.i18n.I18n.n_; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class CaracteristicMapEditorTableModel extends AbstractTuttiTableModel<CaracteristicMapEditorRowModel> { + + private static final long serialVersionUID = 1L; + + public static final ColumnIdentifier<CaracteristicMapEditorRowModel> KEY = ColumnIdentifier.newId( + CaracteristicMapEditorRowModel.PROPERTY_KEY, + n_("tutti.caracteristicMapEditorTable.table.header.key"), + n_("tutti.caracteristicMapEditorTable.table.header.key")); + + public static final ColumnIdentifier<CaracteristicMapEditorRowModel> VALUE = ColumnIdentifier.newId( + CaracteristicMapEditorRowModel.PROPERTY_VALUE, + n_("tutti.caracteristicMapEditorTable.table.header.value"), + n_("tutti.caracteristicMapEditorTable.table.header.value")); + + public CaracteristicMapEditorTableModel(TableColumnModelExt columnModel) { + super(columnModel, false, false); + setNoneEditableCols(KEY); + } + + @Override + public CaracteristicMapEditorRowModel createNewRow() { + CaracteristicMapEditorRowModel result = new CaracteristicMapEditorRowModel(); + return result; + } +} Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUI.css (from rev 757, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/GearUseFeatureTabUI.css) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUI.css (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUI.css 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,38 @@ +BeanFilterableComboBox { + i18nPrefix: "tutti.property."; + showReset: true; +} + +#newRowKey { + property: selectedCaracteristic; + enabled: {!newRowKey.isEmpty()}; +} + +#addRow { + actionIcon: add; + enabled: {newRowKey.getSelectedItem() != null}; +} + +#caracteristicMapEditorTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; +} + +#cancelButton { + actionIcon: cancel; + text: "tutti.editSpeciesFrequencies.action.cancel"; + toolTipText: "tutti.editSpeciesFrequencies.action.cancel.tip"; + i18nMnemonic: "tutti.editSpeciesFrequencies.action.cancel.mnemonic"; + _help: {"tutti.editSpeciesFrequencies.action.cancel.help"}; +} + +#saveButton { + actionIcon: save; + text: "tutti.editSpeciesFrequencies.action.save"; + toolTipText: "tutti.editSpeciesFrequencies.action.save.tip"; + i18nMnemonic: "tutti.editSpeciesFrequencies.action.save.mnemonic"; + enabled: {model.isValid()}; + _help: {"tutti.editSpeciesFrequencies.action.save.help"}; +} \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUI.jaxx (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUI.jaxx 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,66 @@ +<Table implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<CaracteristicMapEditorUIModel, CaracteristicMapEditorUIHandler>'> + + <import> + fr.ifremer.tutti.persistence.entities.referential.Caracteristic + fr.ifremer.tutti.ui.swing.util.TuttiUI + + jaxx.runtime.swing.editor.bean.BeanFilterableComboBox + org.jdesktop.swingx.JXTable + javax.swing.ListSelectionModel + java.awt.Color + </import> + + <CaracteristicMapEditorUIHandler id='handler' + initializer='getContextValue(CaracteristicMapEditorUIHandler.class)'/> + + <CaracteristicMapEditorUIModel id='model' + initializer='getContextValue(CaracteristicMapEditorUIModel.class)'/> + + <JPopupMenu id='tablePopup'> + <JMenuItem id='removeCaracteristicMenu' + onActionPerformed='handler.removeCaracteristic()'/> + </JPopupMenu> + + <row fill='both'> + <cell fill='both' weightx='1'> + <BeanFilterableComboBox id='newRowKey' constructorParams='this' + genericType='Caracteristic'/> + </cell> + <cell fill='both'> + <JButton id='addRow' onActionPerformed='handler.addRow()'/> + </cell> + </row> + <row fill='both' weighty='1'> + <cell fill='both' columns='2'> + <JScrollPane> + <JXTable id='caracteristicMapEditorTable' + onMouseClicked='handler.autoSelectRowInTable(event, tablePopup)'/> + </JScrollPane> + </cell> + </row> + + <!-- Form Actions --> + <row fill='both'> + <cell fill='both' columns='2'> + <JPanel layout='{new GridLayout(1, 0)}'> + <JButton id='cancelButton' onActionPerformed='handler.cancel()'/> + <JButton id='saveButton' onActionPerformed='handler.save()'/> + </JPanel> + </cell> + </row> + <script><![CDATA[ + +public CaracteristicMapEditorUI(TuttiUI parentUI) { + JAXXUtil.initContext(this, parentUI); + CaracteristicMapEditorUIHandler handler = new CaracteristicMapEditorUIHandler(parentUI, this); + setContextValue(handler); + handler.beforeInitUI(); +} + +protected void $afterCompleteSetup() { + handler.afterInitUI(); +} + + ]]></script> + +</Table> \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUIHandler.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUIHandler.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,314 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.caracteristics; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.util.Cancelable; +import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; +import fr.ifremer.tutti.ui.swing.util.TuttiUI; +import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueEditor; +import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueRenderer; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.table.DefaultTableColumnModelExt; + +import java.util.List; + +import static fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.caracteristics.CaracteristicMapCellComponent.CaracteristicMapCellEditor; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class CaracteristicMapEditorUIHandler + extends AbstractTuttiTableUIHandler<CaracteristicMapEditorRowModel, CaracteristicMapEditorUIModel, CaracteristicMapEditorUI> + implements Cancelable { + + private final static Log log = + LogFactory.getLog(CaracteristicMapEditorUIHandler.class); + + protected CaracteristicMapCellEditor caracteristicMapCellEditor; + + public CaracteristicMapEditorUIHandler(TuttiUI parentUi, + CaracteristicMapEditorUI ui) { + super(parentUi.getHandler().getContext(), ui, CaracteristicMapEditorRowModel.PROPERTY_VALUE); + } + + @Override + public CaracteristicMapEditorTableModel getTableModel() { + return (CaracteristicMapEditorTableModel) getTable().getModel(); + } + + @Override + public JXTable getTable() { + return ui.getCaracteristicMapEditorTable(); + } + + @Override + protected boolean isRowValid(CaracteristicMapEditorRowModel row) { + return row.getKey() != null && row.getValue() != null; + } + + @Override + protected void onRowModified(int rowIndex, CaracteristicMapEditorRowModel row, + String propertyName, Object oldValue, Object newValue) { + recomputeRowValidState(row); + super.onRowModified(rowIndex, row, propertyName, oldValue, newValue); + saveSelectedRowIfNeeded(); + } + + @Override + protected void saveSelectedRowIfRequired(TuttiBeanMonitor<CaracteristicMapEditorRowModel> rowMonitor, + CaracteristicMapEditorRowModel row) { + if (row.isValid()) { + // there is a valid bean attached to the monitor + + if (rowMonitor.wasModified()) { + + // monitored bean was modified, save it + if (log.isInfoEnabled()) { + log.info("Row " + row + " was modified, will save it"); + } + + saveRow(row); + + } + } + } + + @Override + public void beforeInitUI() { + CaracteristicMapEditorUIModel model = createModel(); + getUI().setContextValue(model); + } + + @Override + public void afterInitUI() { + initUI(getUI()); + + initBeanFilterableComboBox(getKeyCombo(), Lists.<Caracteristic>newArrayList(), null); + getModel().setAvailableCaracteristics(getDataContext().getCaracteristics()); + + JXTable table = getTable(); + + // create table column model + DefaultTableColumnModelExt columnModel = + new DefaultTableColumnModelExt(); + + { + + addColumnToModel(columnModel, + null, + newTableCellRender(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT), + CaracteristicMapEditorTableModel.KEY); + } + + { + + addColumnToModel(columnModel, + new CaracteristicValueEditor(context), + new CaracteristicValueRenderer(context), + CaracteristicMapEditorTableModel.VALUE); + } + + // create table model + CaracteristicMapEditorTableModel tableModel = + new CaracteristicMapEditorTableModel(columnModel); + + table.setModel(tableModel); + table.setColumnModel(columnModel); + + initTable(table); + } + + @Override + public void onCloseUI() { + if (log.isDebugEnabled()) { + log.debug("closing: " + ui); + } + + // when canceling always invalid model (in that way) + getModel().setValid(false); + + EditCatchesUI parent = SwingUtil.getParentContainer(ui, EditCatchesUI.class); + parent.getHandler().setIndividualObservationSelectedCard(EditCatchesUIHandler.MAIN_CARD); + } + + @Override + public SwingValidator<CaracteristicMapEditorUIModel> getValidator() { + return null; + } + + @Override + public void cancel() { + + if (log.isInfoEnabled()) { + log.info("Cancel UI " + ui); + } + + // close dialog + closeUI(ui); + } + + protected BeanFilterableComboBox<Caracteristic> getKeyCombo() { + return ui.getNewRowKey(); + } + + protected CaracteristicMapEditorUIModel createModel() { + return new CaracteristicMapEditorUIModel(); + } + + protected CaracteristicMap getCaracteristics(IndividualObservationBatch individualObservation) { + return individualObservation.getCaracteristics(); + } + + protected List<String> getProtocolPmfmIds(TuttiProtocol protocol) { + return protocol.getGearUseFeaturePmfmId(); + } + + protected void saveRow(CaracteristicMapEditorRowModel row) { + + if (row.isValid()) { + CaracteristicMap caracteristics = getModel().getCaracteristicMap(); + Preconditions.checkNotNull(caracteristics); + + caracteristics.put(row.getKey(), row.getValue()); + } + } + + //------------------------------------------------------------------------// + //-- Public methods --// + //------------------------------------------------------------------------// + + /** Adds a row with the parameter selected in the combo box */ + public void addRow() { + BeanFilterableComboBox<Caracteristic> keyCombo = getKeyCombo(); + Caracteristic selectedItem = (Caracteristic) keyCombo.getSelectedItem(); + CaracteristicMapEditorTableModel tableModel = getTableModel(); + + CaracteristicMapEditorRowModel row = tableModel.createNewRow(); + row.setKey(selectedItem); +// tableModel.addNewRow(row); + getModel().getRows().add(row); + + int rowIndex = tableModel.getRowCount() - 1; + tableModel.fireTableRowsInserted(rowIndex, rowIndex); + + keyCombo.getHandler().removeItem(selectedItem); + + CaracteristicMapEditorUIModel model = getModel(); + model.setModify(true); + recomputeRowValidState(row); + } + + public void editBatch(IndividualObservationBatchRowModel individualObservation, + CaracteristicMapCellEditor caracteristicMapCellEditor) { + + this.caracteristicMapCellEditor = caracteristicMapCellEditor; + + CaracteristicMapEditorTableModel tableModel = getTableModel(); + CaracteristicMapEditorUIModel model = getModel(); + + CaracteristicMap caracteristicMap = getCaracteristics(individualObservation); + if (caracteristicMap == null) { + caracteristicMap = new CaracteristicMap(); + } + model.setCaracteristicMap(caracteristicMap); + + TuttiProtocol protocol = getDataContext().getProtocol(); + List<String> pmfmIds = Lists.newArrayList(); + if (protocol != null) { + List<String> protocolPmfmId = getProtocolPmfmIds(protocol); + if (protocolPmfmId != null) { + pmfmIds.addAll(protocolPmfmId); + } + } + + List<CaracteristicMapEditorRowModel> rows = Lists.newArrayList(); + List<Caracteristic> caracteristics = Lists.newArrayList(caracteristicMap.keySet()); + + List<Caracteristic> availableCaracteristics = model.getAvailableCaracteristics(); + for (String id : pmfmIds) { + Caracteristic caracteristic = TuttiEntities.findById(availableCaracteristics, id); + if (!caracteristics.contains(caracteristic)) { + caracteristics.add(caracteristic); + } + } + + for (Caracteristic key : caracteristics) { + CaracteristicMapEditorRowModel newRow = tableModel.createNewRow(); + newRow.setKey(key); + newRow.setValue(caracteristicMap.get(key)); + rows.add(newRow); + } + + model.setRows(rows); + + List<Caracteristic> caracteristicList = Lists.newArrayList(); + + for (Caracteristic caracteristic : availableCaracteristics) { + if (!caracteristics.contains(caracteristic)) { + caracteristicList.add(caracteristic); + } + } + + BeanFilterableComboBox<Caracteristic> keyCombo = getKeyCombo(); + keyCombo.setData(caracteristicList); +// selectFirstInCombo(keyCombo); + keyCombo.getHandler().reset(); + model.setModify(false); + } + + public void removeCaracteristic() { + int rowIndex = getTable().getSelectedRow(); + + Preconditions.checkState( + rowIndex != -1, + "Cant remove caracteristic if no caracteristic selected"); + + CaracteristicMapEditorRowModel row = getTableModel().getEntry(rowIndex); + + CaracteristicMap caracteristicMap = getModel().getCaracteristicMap(); + if (caracteristicMap != null) { + caracteristicMap.remove(row.getKey()); + } + + //add the row in the combo + BeanFilterableComboBox keyCombo = getKeyCombo(); + keyCombo.addItem(row.getKey()); +// selectFirstInCombo(keyCombo); + keyCombo.getHandler().reset(); + + // remove the row from the model + getModel().getRows().remove(rowIndex); + + // refresh all the table + getTableModel().fireTableRowsDeleted(rowIndex, rowIndex); + + getModel().removeRowInError(row); + } + + public void save() { + + if (log.isInfoEnabled()) { + log.info("Save UI " + ui); + } + + caracteristicMapCellEditor.validateEdition(getModel()); + + closeUI(ui); + } +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUIModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/caracteristics/CaracteristicMapEditorUIModel.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,81 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.caracteristics; + +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.ui.swing.content.operation.fishing.AbstractCaracteristicRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.fishing.AbstractCaracteristicTabUIModel; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; + +import java.util.List; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class CaracteristicMapEditorUIModel extends AbstractTuttiTableUIModel<Object, CaracteristicMapEditorRowModel, CaracteristicMapEditorUIModel> { + + public static final String PROPERTY_CARACTERISTIC_MAP = "caracteristicMap"; + + public static final String PROPERTY_REMOVE_CARACTERISTIC_ENABLED = "removeCaracteristicEnabled"; + + public static final String PROPERTY_AVAILABLE_CARACTERISTICS = "availableCaracteristics"; + + private static final long serialVersionUID = 1L; + + protected List<Caracteristic> availableCaracteristics; + + /** + * Caracteristics + * + * @since 1.0 + */ + protected CaracteristicMap caracteristicMap; + + /** + * Can user remove a selected caracteristic? + * + * @since 1.0 + */ + protected boolean removeCaracteristicEnabled; + + public CaracteristicMapEditorUIModel() { + super(Object.class, null, null); + } + + public List<Caracteristic> getAvailableCaracteristics() { + return availableCaracteristics; + } + + public void setAvailableCaracteristics(List<Caracteristic> availableCaracteristics) { + Object oldValue = getAvailableCaracteristics(); + this.availableCaracteristics = availableCaracteristics; + firePropertyChange(PROPERTY_AVAILABLE_CARACTERISTICS, oldValue, availableCaracteristics); + } + + public CaracteristicMap getCaracteristicMap() { + return caracteristicMap; + } + + public void setCaracteristicMap(CaracteristicMap caracteristicMap) { + Object oldValue = getCaracteristicMap(); + this.caracteristicMap = caracteristicMap != null ? (CaracteristicMap) caracteristicMap.clone() : null; + firePropertyChange(PROPERTY_CARACTERISTIC_MAP, oldValue, this.caracteristicMap); + } + + public boolean isRemoveCaracteristicEnabled() { + return removeCaracteristicEnabled; + } + + public void setRemoveCaracteristicEnabled(boolean removeCaracteristicEnabled) { + Object oldValue = isRemoveCaracteristicEnabled(); + this.removeCaracteristicEnabled = removeCaracteristicEnabled; + firePropertyChange(PROPERTY_REMOVE_CARACTERISTIC_ENABLED, oldValue, removeCaracteristicEnabled); + } + + @Override + protected Object newEntity() { + return null; + } +} Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUI.css (from rev 757, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/create/CreateMarineLitterBatchUI.css) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUI.css (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUI.css 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,84 @@ +BeanFilterableComboBox { + showReset: true; + i18nPrefix: "tutti.property."; + bean: {model}; +} + +NumberEditor { + autoPopup: {handler.getConfig().isAutoPopupNumberEditor()}; + showPopupButton: {handler.getConfig().isShowNumberEditorButton()}; + showReset: true; +} + +#createIndividualObservationBatchTopPanel { + _help: {"tutti.createIndividualObservationBatch.help"}; +} + +#individualObservationSpeciesLabel { + text: "tutti.createIndividualObservationBatch.field.individualObservationSpecies"; + toolTipText: "tutti.createIndividualObservationBatch.field.individualObservationSpecies.tip"; + labelFor: {individualObservationSpeciesComboBox}; + _help: {"tutti.createIndividualObservationBatch.field.individualObservationSpecies.help"}; +} + +#individualObservationSpeciesComboBox { + property: species; + selectedItem: {model.getSpecies()}; +} + +#individualObservationWeightLabel { + text: "tutti.createIndividualObservationBatch.field.individualObservationWeight"; + toolTipText: "tutti.createIndividualObservationBatch.field.individualObservationWeight.tip"; + labelFor: {individualObservationWeightField}; + _help: {"tutti.createIndividualObservationBatch.field.individualObservationWeight.help"}; +} + +#individualObservationWeightField { + property: weight; + useFloat: true; + numberPattern: {DECIMAL3_PATTERN}; + bean: {model}; +} + +#individualObservationSizeLabel { + text: "tutti.createIndividualObservationBatch.field.individualObservationSize"; + toolTipText: "tutti.createIndividualObservationBatch.field.individualObservationSize.tip"; + labelFor: {individualObservationSizeField}; + _help: {"tutti.createIndividualObservationBatch.field.individualObservationSize.help"}; +} + +#individualObservationSizeField { + property: size; + useFloat: true; + numberPattern: {DECIMAL3_PATTERN}; + bean: {model}; +} + +#individualObservationLengthStepCaracteristicLabel { + text: "tutti.createIndividualObservationBatch.field.individualObservationLengthStepCaracteristic"; + toolTipText: "tutti.createIndividualObservationBatch.field.individualObservationLengthStepCaracteristic.tip"; + labelFor: {individualObservationLengthStepCaracteristicComboBox}; + _help: {"tutti.createIndividualObservationBatch.field.individualObservationLengthStepCaracteristic.help"}; +} + +#individualObservationLengthStepCaracteristicComboBox { + property: lengthStepCaracteristic; + selectedItem: {model.getLengthStepCaracteristic()}; +} + +#saveButton { + actionIcon: save; + text: "tutti.createMarineLitterBatch.action.save"; + toolTipText: "tutti.createMarineLitterBatch.action.save.tip"; + i18nMnemonic: "tutti.createMarineLitterBatch.action.save.mnemonic"; + enabled: {model.isValid()}; + _help: {"tutti.createMarineLitterBatch.action.save.help"}; +} + +#cancelButton { + actionIcon: cancel; + text: "tutti.createMarineLitterBatch.action.cancel"; + toolTipText: "tutti.createMarineLitterBatch.action.cancel.tip"; + i18nMnemonic: "tutti.createMarineLitterBatch.action.cancel.mnemonic"; + _help: {"tutti.createMarineLitterBatch.action.cancel.help"}; +} \ No newline at end of file Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUI.jaxx (from rev 757, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/create/CreateMarineLitterBatchUI.jaxx) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUI.jaxx (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUI.jaxx 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,105 @@ +<JPanel id='createIndividualObservationBatchTopPanel' layout='{new BorderLayout()}' + decorator='help' + implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<CreateIndividualObservationBatchUIModel, CreateIndividualObservationBatchUIHandler>'> + <import> + + fr.ifremer.tutti.persistence.entities.referential.Species + fr.ifremer.tutti.persistence.entities.referential.Caracteristic + + fr.ifremer.tutti.ui.swing.TuttiHelpBroker + fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI + fr.ifremer.tutti.ui.swing.util.TuttiUI + + jaxx.runtime.swing.editor.bean.BeanFilterableComboBox + jaxx.runtime.swing.editor.NumberEditor + + static org.nuiton.i18n.I18n._ + </import> + + <script><![CDATA[ + +public CreateIndividualObservationBatchUI(EditCatchesUI parentUI) { + JAXXUtil.initContext(this, parentUI); + CreateIndividualObservationBatchUIHandler handler = new CreateIndividualObservationBatchUIHandler(parentUI, this); + setContextValue(handler); + handler.beforeInitUI(); +} + +protected void $afterCompleteSetup() { handler.afterInitUI(); } + ]]></script> + + <CreateIndividualObservationBatchUIHandler id='handler' + initializer='getContextValue(CreateIndividualObservationBatchUIHandler.class)'/> + + <CreateIndividualObservationBatchUIModel id='model' + initializer='getContextValue(CreateIndividualObservationBatchUIModel.class)'/> + + <BeanValidator id='validator' bean='model' + uiClass='jaxx.runtime.validator.swing.ui.ImageValidationUI'> + <field name='species' + component='individualObservationSpeciesComboBox'/> + <field name='weight' + component='individualObservationWeightField'/> + <field name='size' + component='individualObservationSizeField'/> + <field name='lengthStepCaracteristic' + component='individualObservationLengthStepCaracteristicComboBox'/> + </BeanValidator> + + <TuttiHelpBroker id='broker' + constructorParams='"tutti.createMarineLitterBatch.help"'/> + + <Table id='configurationPanel' constraints='BorderLayout.CENTER' fill='both'> + + <!-- IndividualObservation species --> + <row> + <cell anchor='west'> + <JLabel id='individualObservationSpeciesLabel'/> + </cell> + <cell weightx='1.0'> + <BeanFilterableComboBox id='individualObservationSpeciesComboBox' + constructorParams='this' + genericType='Species'/> + </cell> + </row> + + <!-- IndividualObservation weight --> + <row> + <cell anchor='west'> + <JLabel id='individualObservationWeightLabel'/> + </cell> + <cell weightx='1.0' columns='2'> + <NumberEditor id='individualObservationWeightField' constructorParams='this'/> + </cell> + </row> + + <!-- IndividualObservation size --> + <row> + <cell anchor='west'> + <JLabel id='individualObservationSizeLabel'/> + </cell> + <cell weightx='1.0' columns='2'> + <NumberEditor id='individualObservationSizeField' constructorParams='this'/> + </cell> + </row> + + <!-- IndividualObservation LengthStepCaracteristic --> + <row> + <cell anchor='west'> + <JLabel id='individualObservationLengthStepCaracteristicLabel'/> + </cell> + <cell weightx='1.0' columns='2'> + <BeanFilterableComboBox id='individualObservationLengthStepCaracteristicComboBox' + constructorParams='this' + genericType='Caracteristic'/> + </cell> + </row> + + </Table> + + <!-- Form Actions --> + <JPanel layout='{new GridLayout(1, 0)}' constraints='BorderLayout.SOUTH'> + <JButton id='cancelButton' onActionPerformed='handler.cancel()'/> + <JButton id='saveButton' onActionPerformed='handler.save()'/> + </JPanel> +</JPanel> \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUIHandler.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUIHandler.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,141 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.create; + +import fr.ifremer.tutti.persistence.TuttiPersistence; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.marinelitter.create.CreateMarineLitterBatchUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.marinelitter.create.CreateMarineLitterBatchUIModel; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; +import fr.ifremer.tutti.ui.swing.util.Cancelable; +import fr.ifremer.tutti.ui.swing.util.TuttiUI; +import fr.ifremer.tutti.ui.swing.util.species.SelectSpeciesUI; +import fr.ifremer.tutti.ui.swing.util.species.SelectSpeciesUIModel; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.awt.*; +import java.util.List; + +/** + * @author kmorin <kmorin@codelutin.com> + */ +public class CreateIndividualObservationBatchUIHandler extends AbstractTuttiUIHandler<CreateIndividualObservationBatchUIModel, CreateIndividualObservationBatchUI> + implements Cancelable { + + private static final Log log = + LogFactory.getLog(CreateIndividualObservationBatchUIHandler.class); + + private final TuttiPersistence persistenceService; + + public CreateIndividualObservationBatchUIHandler(TuttiUI parentUi, + CreateIndividualObservationBatchUI ui) { + super(parentUi.getHandler().getContext(), ui); + this.persistenceService = context.getPersistenceService(); + } + + //------------------------------------------------------------------------// + //-- AbstractTuttiUIHandler methods --// + //------------------------------------------------------------------------// + + @Override + public void beforeInitUI() { + CreateIndividualObservationBatchUIModel model = new CreateIndividualObservationBatchUIModel(); + ui.setContextValue(model); + listModelIsModify(model); + } + + @Override + public void afterInitUI() { + + initUI(ui); + + initBeanFilterableComboBox(ui.getIndividualObservationSpeciesComboBox(), + getDataContext().getReferentSpecies(), + null); + + initBeanFilterableComboBox(ui.getIndividualObservationLengthStepCaracteristicComboBox(), + getDataContext().getLengthStepCaracteristics(), + null); + + listenValidatorValid(ui.getValidator(), getModel()); + } + + @Override + public void onCloseUI() { + + if (log.isDebugEnabled()) { + log.debug("closing: " + ui); + } + + // evict model from validator + ui.getValidator().setBean(null); + + // when canceling always invalid model + getModel().setValid(false); + + EditCatchesUI parent = SwingUtil.getParentContainer(ui, EditCatchesUI.class); + parent.getHandler().setIndividualObservationSelectedCard(EditCatchesUIHandler.MAIN_CARD); + } + + @Override + public SwingValidator<CreateIndividualObservationBatchUIModel> getValidator() { + return ui.getValidator(); + } + + //------------------------------------------------------------------------// + //-- Cancelable methods --// + //------------------------------------------------------------------------// + + @Override + public void cancel() { + if (log.isInfoEnabled()) { + log.info("Cancel UI " + ui); + } + closeUI(ui); + } + + //------------------------------------------------------------------------// + //-- Public methods --// + //------------------------------------------------------------------------// + + public void openUI() { + + CreateIndividualObservationBatchUIModel model = getModel(); + + // connect model to validator + ui.getValidator().setBean(model); + + model.reset(); + + ui.getIndividualObservationSpeciesComboBox().requestFocus(); + } + + public void save() { + + if (log.isInfoEnabled()) { + log.info("Save UI " + ui); + } + + EditCatchesUI parent = SwingUtil.getParentContainer(ui, EditCatchesUI.class); + parent.getIndividualObservationTabContent().getHandler().addBatch(getModel()); + + // close dialog + closeUI(ui); + } + + public Species openAddSpeciesDialog(String title, List<Species> species) { + SelectSpeciesUI dialogContent = new SelectSpeciesUI(ui); + SelectSpeciesUIModel model = dialogContent.getModel(); + model.setSelectedSpecies(null); + model.setSpecies(species); + + openDialog(dialogContent, title, new Dimension(400, 130)); + + Species result = model.getSelectedSpecies(); + return result; + } +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUIModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/create/CreateIndividualObservationBatchUIModel.java 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,81 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.create; + +import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; +import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class CreateIndividualObservationBatchUIModel extends AbstractTuttiBeanUIModel<CreateIndividualObservationBatchUIModel, CreateIndividualObservationBatchUIModel> { + + + private static final long serialVersionUID = 1L; + + /** + * Delegate edit object. + * + * @since 1.3 + */ + protected final IndividualObservationBatch editObject = + TuttiBeanFactory.newIndividualObservationBatch(); + + public CreateIndividualObservationBatchUIModel() { + super(CreateIndividualObservationBatchUIModel.class, null, null); + } + + public Species getSpecies() { + return editObject.getSpecies(); + } + + public void setSpecies(Species individualObservationSpecies) { + Object oldValue = getSpecies(); + editObject.setSpecies(individualObservationSpecies); + firePropertyChange(IndividualObservationBatch.PROPERTY_SPECIES, oldValue, individualObservationSpecies); + } + + public Float getWeight() { + return editObject.getWeight(); + } + + public void setWeight(Float individualObservationWeight) { + Object oldValue = getWeight(); + editObject.setWeight(individualObservationWeight); + firePropertyChange(IndividualObservationBatch.PROPERTY_WEIGHT, oldValue, individualObservationWeight); + } + + public Float getSize() { + return editObject.getSize(); + } + + public void setSize(Float individualObservationSize) { + Object oldValue = getSize(); + editObject.setSize(individualObservationSize); + firePropertyChange(IndividualObservationBatch.PROPERTY_SIZE, oldValue, individualObservationSize); + } + + public Caracteristic getLengthStepCaracteristic() { + return editObject.getLengthStepCaracteristic(); + } + + public void setLengthStepCaracteristic(Caracteristic individualObservationLengthStepCaracteristic) { + Object oldValue = getLengthStepCaracteristic(); + editObject.setLengthStepCaracteristic(individualObservationLengthStepCaracteristic); + firePropertyChange(IndividualObservationBatch.PROPERTY_LENGTH_STEP_CARACTERISTIC, oldValue, individualObservationLengthStepCaracteristic); + } + + @Override + protected CreateIndividualObservationBatchUIModel newEntity() { + return new CreateIndividualObservationBatchUIModel(); + } + + public void reset() { + setSpecies(null); + setWeight(null); + setSize(null); + setLengthStepCaracteristic(null); + } +} Added: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/individualObservation/create/CreateIndividualObservationBatchUIModel-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/individualObservation/create/CreateIndividualObservationBatchUIModel-error-validation.xml (rev 0) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/individualObservation/create/CreateIndividualObservationBatchUIModel-error-validation.xml 2013-04-10 14:16:08 UTC (rev 758) @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!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="species"> + <field-validator type="required" short-circuit="true"> + <message> + tutti.validator.error.createIndividualObservationBatch.individualObservationSpecies.required + </message> + </field-validator> + </field> + +</validators> \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-04-08 16:07:19 UTC (rev 757) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-04-10 14:16:08 UTC (rev 758) @@ -42,6 +42,8 @@ tutti.attachmentEditor.saveAttachment.warning.title= tutti.attachmentEditor.text= tutti.attachmentEditor.title= +tutti.caracteristicMapEditorTable.table.header.key= +tutti.caracteristicMapEditorTable.table.header.value= tutti.commentEditor.action.close.tip= tutti.commentEditor.action.tip= tutti.commentEditor.none.tip= @@ -119,6 +121,15 @@ tutti.createBenthosBatch.title= tutti.createBenthosMelag.error.message= tutti.createBenthosMelag.error.title= +tutti.createIndividualObservationBatch.field.individualObservationLengthStepCaracteristic= +tutti.createIndividualObservationBatch.field.individualObservationLengthStepCaracteristic.tip= +tutti.createIndividualObservationBatch.field.individualObservationSize= +tutti.createIndividualObservationBatch.field.individualObservationSize.tip= +tutti.createIndividualObservationBatch.field.individualObservationSpecies= +tutti.createIndividualObservationBatch.field.individualObservationSpecies.tip= +tutti.createIndividualObservationBatch.field.individualObservationWeight= +tutti.createIndividualObservationBatch.field.individualObservationWeight.tip= +tutti.createIndividualObservationBatch.title= tutti.createMarineLitterBatch.action.cancel= tutti.createMarineLitterBatch.action.cancel.mnemonic= tutti.createMarineLitterBatch.action.cancel.tip= @@ -290,6 +301,7 @@ tutti.editBenthosFrequencies.label.no.configuration= tutti.editBenthosFrequencies.simpleCountingAndFrequencies= tutti.editBenthosFrequencies.title= +tutti.editCaracteristics.title= tutti.editCatchBatch.action.cancelEditCatchBatch= tutti.editCatchBatch.action.cancelEditCatchBatch.mnemonic= tutti.editCatchBatch.action.cancelEditCatchBatch.tip= @@ -494,6 +506,30 @@ tutti.editFishingOperation.label.traitReminder.inCreation= tutti.editFishingOperation.pane.other= tutti.editFishingOperation.tab.general= +tutti.editIndividualObservationBatch.action.createBatch= +tutti.editIndividualObservationBatch.action.createBatch.mnemonic= +tutti.editIndividualObservationBatch.action.createBatch.tip= +tutti.editIndividualObservationBatch.action.removeBatch= +tutti.editIndividualObservationBatch.action.removeBatch.mnemonic= +tutti.editIndividualObservationBatch.action.removeBatch.tip= +tutti.editIndividualObservationBatch.table.header.calcifiedPieceSamplingCode= +tutti.editIndividualObservationBatch.table.header.calcifiedPieceSamplingCode.tip= +tutti.editIndividualObservationBatch.table.header.comment= +tutti.editIndividualObservationBatch.table.header.comment.tip= +tutti.editIndividualObservationBatch.table.header.file= +tutti.editIndividualObservationBatch.table.header.file.tip= +tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic= +tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic.tip= +tutti.editIndividualObservationBatch.table.header.otherCaracteristics= +tutti.editIndividualObservationBatch.table.header.otherCaracteristics.tip= +tutti.editIndividualObservationBatch.table.header.samplingCode= +tutti.editIndividualObservationBatch.table.header.samplingCode.tip= +tutti.editIndividualObservationBatch.table.header.size= +tutti.editIndividualObservationBatch.table.header.size.tip= +tutti.editIndividualObservationBatch.table.header.species= +tutti.editIndividualObservationBatch.table.header.species.tip= +tutti.editIndividualObservationBatch.table.header.weight= +tutti.editIndividualObservationBatch.table.header.weight.tip= tutti.editMarineLitterBatch.action.createBatch= tutti.editMarineLitterBatch.action.createBatch.mnemonic= tutti.editMarineLitterBatch.action.createBatch.tip= @@ -792,6 +828,7 @@ tutti.label.tab.catches= tutti.label.tab.catchesCaracteristics= tutti.label.tab.fishingOperation= +tutti.label.tab.individualObservation= tutti.label.tab.marineLitter= tutti.label.tab.observationIndividuel= tutti.label.tab.plancton= @@ -1030,6 +1067,7 @@ tutti.update.jre= tutti.update.tutti= tutti.validator.error.comment.too.long= +tutti.validator.error.createIndividualObservationBatch.individualObservationSpecies.required= tutti.validator.error.createMarineLitterBatch.marineLitterCategory.required= tutti.validator.error.createMarineLitterBatch.marineLitterSizeCategory.required= tutti.validator.error.createMarineLitterBatch.number.invalidValue= Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-04-08 16:07:19 UTC (rev 757) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-04-10 14:16:08 UTC (rev 758) @@ -40,6 +40,8 @@ tutti.attachmentEditor.saveAttachment.warning.title=Fichier existant tutti.attachmentEditor.text=(%s) tutti.attachmentEditor.title=Pièces jointes +tutti.caracteristicMapEditorTable.table.header.key=Caractéristique +tutti.caracteristicMapEditorTable.table.header.value=Valeur tutti.commentEditor.action.close.tip=Fermer la fenêtre des commentaires tutti.commentEditor.action.tip=Commentaire tutti.commentEditor.none.tip=Pas de commentaire @@ -54,7 +56,6 @@ tutti.common.cancel=Annuler tutti.common.cancel.mnemonic=A tutti.common.file.csv=Extension d'un fichier csv -tutti.common.file.ibts= tutti.common.file.protocol=Extension d'un fichier de protocole Tutti tutti.common.file.zip=Extension d'une archive zip tutti.common.validate=Valider @@ -121,6 +122,15 @@ tutti.createBenthosMelag.error.title=Erreur tutti.createBenthosMelag.message=Combien pesait le MELAG (kg) ? tutti.createBenthosMelag.title=Poids du MELAG (kg) +tutti.createIndividualObservationBatch.field.individualObservationLengthStepCaracteristic=Classe de taille +tutti.createIndividualObservationBatch.field.individualObservationLengthStepCaracteristic.tip=Classe de taille +tutti.createIndividualObservationBatch.field.individualObservationSize=Taille +tutti.createIndividualObservationBatch.field.individualObservationSize.tip=Taille +tutti.createIndividualObservationBatch.field.individualObservationSpecies=Espèce +tutti.createIndividualObservationBatch.field.individualObservationSpecies.tip=Espèce +tutti.createIndividualObservationBatch.field.individualObservationWeight=Poids +tutti.createIndividualObservationBatch.field.individualObservationWeight.tip=Poids +tutti.createIndividualObservationBatch.title=Créer une observation tutti.createMarineLitterBatch.action.cancel=Annuler tutti.createMarineLitterBatch.action.cancel.mnemonic=A tutti.createMarineLitterBatch.action.cancel.tip=Annuler la création du lôt macro-déchet @@ -298,6 +308,7 @@ tutti.editBenthosFrequencies.table.header.number=Nombre tutti.editBenthosFrequencies.table.header.weight=Poids observé (kg) tutti.editBenthosFrequencies.title=Mensuration +tutti.editCaracteristics.title=Autres caractéristiques tutti.editCatchBatch.action.cancelEditCatchBatch=Réinitialiser tutti.editCatchBatch.action.cancelEditCatchBatch.mnemonic=R tutti.editCatchBatch.action.cancelEditCatchBatch.tip=Réinitialiser l'édition de la capture @@ -361,6 +372,7 @@ tutti.editCatchBatch.field.speciesTotalWeight=Poids TOTAL (kg) tutti.editCatchBatch.field.speciesTotalWeight.tip= tutti.editCatchBatch.legend.benthos=Benthos +tutti.editCatchBatch.legend.individualObservation=Observations individuelles tutti.editCatchBatch.legend.marineLitter=Macro déchets tutti.editCatchBatch.legend.species=Espèces tutti.editCatchBatch.legend.total=Capture @@ -500,6 +512,30 @@ tutti.editFishingOperation.label.traitReminder.inCreation=en cours de création tutti.editFishingOperation.pane.other=Autres caractéristiques tutti.editFishingOperation.tab.general=Trait +tutti.editIndividualObservationBatch.action.createBatch=Créer une observation +tutti.editIndividualObservationBatch.action.createBatch.mnemonic=C +tutti.editIndividualObservationBatch.action.createBatch.tip=Créer une nouvelle observation +tutti.editIndividualObservationBatch.action.removeBatch=Supprimer la ligne sélectionnée +tutti.editIndividualObservationBatch.action.removeBatch.mnemonic=S +tutti.editIndividualObservationBatch.action.removeBatch.tip=Supprimer la ligne sélectionnée +tutti.editIndividualObservationBatch.table.header.calcifiedPieceSamplingCode=Code de prélèvement pièce calcifiée +tutti.editIndividualObservationBatch.table.header.calcifiedPieceSamplingCode.tip=Code de prélèvement pièce calcifiée +tutti.editIndividualObservationBatch.table.header.comment=Commentaire +tutti.editIndividualObservationBatch.table.header.comment.tip=Commentaire +tutti.editIndividualObservationBatch.table.header.file=Pièces jointes +tutti.editIndividualObservationBatch.table.header.file.tip=Pièces jointes +tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic=Classe de taille +tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic.tip=Classe de taille +tutti.editIndividualObservationBatch.table.header.otherCaracteristics=Autres caractéristiques +tutti.editIndividualObservationBatch.table.header.otherCaracteristics.tip=Autres caractéristiques +tutti.editIndividualObservationBatch.table.header.samplingCode=Code prélèvement autre +tutti.editIndividualObservationBatch.table.header.samplingCode.tip=Code prélèvement autre +tutti.editIndividualObservationBatch.table.header.size=Taille +tutti.editIndividualObservationBatch.table.header.size.tip=Taille +tutti.editIndividualObservationBatch.table.header.species=Espèce +tutti.editIndividualObservationBatch.table.header.species.tip=Espèce +tutti.editIndividualObservationBatch.table.header.weight=Poids +tutti.editIndividualObservationBatch.table.header.weight.tip=Poids (Kg) tutti.editMarineLitterBatch.action.createBatch=Créer un lot de déchet tutti.editMarineLitterBatch.action.createBatch.mnemonic=C tutti.editMarineLitterBatch.action.createBatch.tip=Créer un nouveau lot de déchet @@ -796,8 +832,8 @@ tutti.label.tab.catches=Captures tutti.label.tab.catchesCaracteristics=Résumé tutti.label.tab.fishingOperation=Trait +tutti.label.tab.individualObservation=Observations individuelles tutti.label.tab.marineLitter=Macro déchets -tutti.label.tab.observationIndividuel=Observations individuelles tutti.label.tab.plancton=Plancton tutti.label.tab.species=Espèces tutti.legend.frequencyConfiguration=Configuration @@ -1033,6 +1069,7 @@ tutti.update.jre=Java tutti.update.tutti=Tutti tutti.validator.error.comment.too.long=Taille de commentaire trop longue (limitée à %s caractères) +tutti.validator.error.createIndividualObservationBatch.individualObservationSpecies.required= tutti.validator.error.createMarineLitterBatch.marineLitterCategory.required= tutti.validator.error.createMarineLitterBatch.marineLitterSizeCategory.required= tutti.validator.error.createMarineLitterBatch.number.invalidValue=
participants (1)
-
kmorin@users.forge.codelutin.com