03/13: Utilisation d'un nouvel handler pour gérer la zone de notification
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8255 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 2488271da21803a1723b47c1f907c7963cad1749 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Apr 19 10:53:45 2016 +0200 Utilisation d'un nouvel handler pour gérer la zone de notification --- .../IndividualObservationBatchRowModel.java | 16 ++ .../IndividualObservationBatchTableHandler.java | 34 +-- ...dividualObservationNotificationZoneHandler.java | 260 +++++++++++++++++++++ .../frequency/IndividualObservationUICache.java | 195 +++++----------- .../species/frequency/SpeciesFrequencyUI.jcss | 4 - .../frequency/SpeciesFrequencyUIHandler.java | 7 +- .../resources/i18n/tutti-ui-swing_en_GB.properties | 1 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 3 +- 8 files changed, 354 insertions(+), 166 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowModel.java index 8244875..9895745 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowModel.java @@ -34,6 +34,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; 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.service.sampling.IndividualObservationSamplingStatus; import fr.ifremer.tutti.service.sampling.SamplingCodePrefix; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; @@ -95,6 +96,13 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel */ protected SamplingCodePrefix samplingCodePrefix; + /** + * Le statut venant du cache des observations individuelles. + * + * @since 4.5 + */ + protected IndividualObservationSamplingStatus individualObservationSamplingStatus; + protected static final Binder<IndividualObservationBatch, IndividualObservationBatchRowModel> fromBeanBinder = BinderFactory.newBinder(IndividualObservationBatch.class, IndividualObservationBatchRowModel.class); @@ -136,6 +144,14 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel firePropertyChange(PROPERTY_DEFAULT_CARACTERISTICS, oldValue, defaultCaracteristics); } + public IndividualObservationSamplingStatus getIndividualObservationSamplingStatus() { + return individualObservationSamplingStatus; + } + + public void setIndividualObservationSamplingStatus(IndividualObservationSamplingStatus individualObservationSamplingStatus) { + this.individualObservationSamplingStatus = individualObservationSamplingStatus; + } + //------------------------------------------------------------------------// //-- AbstractTuttiBeanUIModel --// //------------------------------------------------------------------------// diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java index 3652e9b..cdd6e9d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java @@ -479,23 +479,23 @@ public class IndividualObservationBatchTableHandler implements Closeable { }); - individualObservationTable.getSelectionModel().addListSelectionListener(e -> { - - if (!model.isInRafaleRowCreation()) { - uiHandler.resetSamplingLabel(); - } - - IndividualObservationBatchRowModel selectedRow = null; - - if (!individualObservationTable.getSelectionModel().isSelectionEmpty()) { - if (individualObservationTable.getSelectedRowCount() == 1) { - selectedRow = individualObservationTableModel.getEntry(individualObservationTable.getSelectedRow()); - - } - } - - individualObservationUICache.updateSelectedRow(selectedRow); - }); +// individualObservationTable.getSelectionModel().addListSelectionListener(e -> { +// +// if (!model.isInRafaleRowCreation()) { +// uiHandler.resetSamplingLabel(); +// } +// +// IndividualObservationBatchRowModel selectedRow = null; +// +// if (!individualObservationTable.getSelectionModel().isSelectionEmpty()) { +// if (individualObservationTable.getSelectedRowCount() == 1) { +// selectedRow = individualObservationTableModel.getEntry(individualObservationTable.getSelectedRow()); +// +// } +// } +// +// individualObservationUICache.updateSelectedRow(selectedRow); +// }); model2.addPropertyChangeListener(IndividualObservationBatchUIModel.PROPERTY_ROWS, evt -> individualObservationTableModel.setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue())); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationNotificationZoneHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationNotificationZoneHandler.java new file mode 100644 index 0000000..806258c --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationNotificationZoneHandler.java @@ -0,0 +1,260 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; +import fr.ifremer.tutti.persistence.entities.protocol.Zone; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.sampling.CalcifiedPiecesSamplingAlgorithmEntryNotFoundException; +import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingContext; +import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingStatus; +import fr.ifremer.tutti.service.sampling.SamplingListener; +import fr.ifremer.tutti.service.sampling.SizeNotDefinedOnIndividualObservationException; +import fr.ifremer.tutti.service.sampling.ZoneNotDefinedOnFishingOperationException; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; +import fr.ifremer.tutti.util.Numbers; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.decorator.Decorator; + +import javax.swing.JLabel; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionListener; +import java.awt.Color; +import java.io.Closeable; + +import static org.nuiton.i18n.I18n.t; + +/** + * Pour gérer la zone de notification des observations individuelles. + * + * Created on 18/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class IndividualObservationNotificationZoneHandler implements Closeable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(IndividualObservationNotificationZoneHandler.class); + + private final SpeciesFrequencyUI ui; + private final SpeciesFrequencyUIModel uiModel; + private final SpeciesFrequencyUIHandler uiHandler; + private final IndividualObservationUICache individualObservationUICache; + private final IndividualObservationBatchTableModel individualObservationTableModel; + private final JLabel samplingWarningLabel; + private final JLabel samplingSummaryLabel; + private final SamplingListener samplingListener; + private final ListSelectionListener listSelectionListener; + private final Decorator<Integer> infiniteDecorator; + private final Decorator<Species> speciesDecorator; + + public IndividualObservationNotificationZoneHandler(SpeciesFrequencyUI ui) { + this.ui = ui; + this.uiModel = ui.getModel(); + this.samplingWarningLabel = ui.getSamplingWarningLabel(); + this.samplingSummaryLabel = ui.getSamplingResumeLabel(); + this.individualObservationTableModel = (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); + this.uiHandler = ui.getHandler(); + this.individualObservationUICache = uiHandler.getIndividualObservationUICache(); + this.infiniteDecorator = ui.getHandler().getDecorator(Integer.class, DecoratorService.NULL_INFINITE); + this.speciesDecorator = ui.getHandler().getDecorator(Species.class, DecoratorService.WITH_SURVEY_CODE); + // Ecoute sur le cache de données pour savoir quand il faut afficher les notifications de prélèvements + this.samplingListener = event -> { + + if (uiModel.isCanDisplayNotifications()) { + + whenSamplingNeeded(event.getStatus()); + + } + }; + + listSelectionListener = e -> { + + ListSelectionModel source = (ListSelectionModel) e.getSource(); + + if (e.getValueIsAdjusting()) { + return; + } + + if (source.isSelectionEmpty()) { + whenCanNotUseSampling("Aucune observation individuelle sélectionnée."); + return; + } + + if (getSelectedRowCount(source) > 1) { + whenCanNotUseSampling("Plusieurs observations individuelles sélectionnées."); + return; + } + + IndividualObservationBatchRowModel selectedRow = individualObservationTableModel.getEntry(source.getMinSelectionIndex()); + updateSelectedRow(selectedRow); + + }; + + } + + public void editBatch(SpeciesBatchRowModel speciesBatch) { + + if (log.isInfoEnabled()) { + log.info("Edit batch for " + speciesBatch); + } + + samplingWarningLabel.setText(""); + samplingSummaryLabel.setText(""); + + if (!uiHandler.getContext().isProtocolFilled()) { + + // pas de protocole + whenCanNotUseSampling("Pas de protocole défini."); + return; + } + + if (!uiHandler.getContext().getDataContext().getProtocol().isUseCalcifiedPieceSampling()) { + + // pas d'utilisation de l'algorithme de prélèvement des pièces calcifiées + whenCanNotUseSampling("L'utilisation de l'algorithme n'est pas activée dans le protocole."); + return; + } + + if (!individualObservationUICache.isFishingOperationWithZone()) { + + // pas de zone définie sur l'opération de pêche + whenCanNotUseSampling("Le trait n'est pas dans une zone."); + return; + } + + if (!individualObservationUICache.isSpeciesDefinedInCalcifiedPiecesSampling()) { + + // pas de définition d'algorithme sur cette espèce + whenCanNotUseSampling("L'espèce du lot n'est pas connue dans la définition de l'algorithme."); + return; + } + + individualObservationUICache.getCruiseSamplingCache().addSamplingListener(samplingListener); + + ui.getObsTable().getSelectionModel().addListSelectionListener(listSelectionListener); + + // on vide volontairement la sélection pour que la zone de notification soit bien mise à jour + whenCanNotUseSampling("Aucune observation individuelle sélectionnée."); + + + } + + @Override + public void close() { + + ui.getObsTable().getSelectionModel().removeListSelectionListener(listSelectionListener); + if (individualObservationUICache.useCruiseSamplingCache()) { + individualObservationUICache.getCruiseSamplingCache().removeSamplingListener(samplingListener); + } + + } + + public void updateSelectedRow(IndividualObservationBatchRowModel selectedRow) { + + try { + + IndividualObservationSamplingStatus status = individualObservationUICache.getIndividualObservationStatus(selectedRow); + selectedRow.setIndividualObservationSamplingStatus(status); + whenUpdateSummary(status); + + } catch (CalcifiedPiecesSamplingAlgorithmEntryNotFoundException e) { + whenCanNotUseSampling("Pas de correspondance sur l'observation individuelle sélectionnée dans le protocole."); + } catch (SizeNotDefinedOnIndividualObservationException e) { + whenCanNotUseSampling("La taille n'est pas définie sur l'observation individuelle sélectionnée."); + } catch (ZoneNotDefinedOnFishingOperationException e) { + whenCanNotUseSampling("Le trait n'est pas dans une zone."); + } + + } + + private void whenCanNotUseSampling(String message) { + samplingWarningLabel.setText("< L'algorithme de prélèvements des pièces calcifiées n'est pas utilisé >"); + samplingWarningLabel.setForeground(null); + samplingWarningLabel.setBackground(Color.LIGHT_GRAY); + samplingSummaryLabel.setText(message); + } + + private void whenSamplingNeeded(IndividualObservationSamplingStatus status) { + + if (log.isInfoEnabled()) { + log.info("samplingNeeded for " + status); + } + + samplingWarningLabel.setText(t("tutti.editSpeciesFrequencies.samplingNeeded.warning")); + samplingWarningLabel.setForeground(uiHandler.getConfig().getColorHighlightInfoForeground()); + samplingWarningLabel.setBackground(uiHandler.getConfig().getColorHighlightInfoBackground()); + displaySummary(status); + + } + + private void whenUpdateSummary(IndividualObservationSamplingStatus status) { + if (status.isOneTotalCountIsAttained()) { + samplingWarningLabel.setText(t("tutti.editSpeciesFrequencies.samplingTotalCountAttained.warning")); + samplingWarningLabel.setForeground(null); + samplingWarningLabel.setBackground(Color.LIGHT_GRAY); + } else { + samplingWarningLabel.setText(null); + } + displaySummary(status); + } + + private void displaySummary(IndividualObservationSamplingStatus event) { + + IndividualObservationSamplingContext individualObservationSamplingContext = event.getIndividualObservationSamplingContext(); + + CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = event.getCalcifiedPiecesSamplingDefinition(); + + int nbForOperation = event.getSamplingCountInFishingOperation(); + int nbForZone = event.getSamplingCountInZone(); + int nbForCruise = event.getSamplingCountInCruise(); + + String nbForOperationLabel = getLabelForSamplingNumber(nbForOperation, calcifiedPiecesSamplingDefinition.getOperationLimitation()); + String nbForZoneLabel = getLabelForSamplingNumber(nbForZone, calcifiedPiecesSamplingDefinition.getZoneLimitation()); + String nbForCruiseLabel = getLabelForSamplingNumber(nbForCruise, calcifiedPiecesSamplingDefinition.getMaxByLenghtStep()); + + String key = speciesDecorator.toString(individualObservationSamplingContext.getSpecies()) + + " " + Numbers.convertFromMm(individualObservationSamplingContext.getLengthStep(), uiModel.getLengthStepCaracteristicUnit()) + + " " + uiModel.getLengthStepCaracteristicUnit(); + if (individualObservationSamplingContext.withGender()) { + key += " " + individualObservationSamplingContext.getGender().getDescription(); + } + if (individualObservationSamplingContext.withMaturity()) { + if (individualObservationSamplingContext.getMaturity()) { + key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.mature"); + } else { + key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.immature"); + } + } + + Decorator<Zone> zoneDecorator = ui.getHandler().getDecorator(Zone.class, null); + String zone = zoneDecorator.toString(individualObservationSamplingContext.getZone()); + String summary = t("tutti.editSpeciesFrequencies.samplingNeeded.summary", key, nbForOperationLabel, zone, nbForZoneLabel, nbForCruiseLabel); + + samplingSummaryLabel.setText(summary); + } + + /** + * Returns the number of selected rows. + * + * @return the number of selected rows, 0 if no rows are selected + */ + private int getSelectedRowCount(ListSelectionModel selectionModel) { + int iMin = selectionModel.getMinSelectionIndex(); + int iMax = selectionModel.getMaxSelectionIndex(); + int count = 0; + + for (int i = iMin; i <= iMax; i++) { + if (selectionModel.isSelectedIndex(i)) { + count++; + } + } + return count; + } + + + private String getLabelForSamplingNumber(int value, Integer max) { + + return "<strong>" + infiniteDecorator.toString(value) + "</strong> (" + infiniteDecorator.toString(max) + ")"; + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java index ebe8de6..926a62c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java @@ -25,33 +25,30 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; */ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; import fr.ifremer.tutti.persistence.entities.protocol.Zone; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; -import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.cruise.CruiseCache; +import fr.ifremer.tutti.service.sampling.CalcifiedPiecesSamplingAlgorithmEntryNotFoundException; import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; +import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingStatus; import fr.ifremer.tutti.service.sampling.SamplingCodeCache; import fr.ifremer.tutti.service.sampling.SamplingCodePrefix; -import fr.ifremer.tutti.service.sampling.SamplingEvent; -import fr.ifremer.tutti.service.sampling.SamplingListener; +import fr.ifremer.tutti.service.sampling.SizeNotDefinedOnIndividualObservationException; +import fr.ifremer.tutti.service.sampling.ZoneNotDefinedOnFishingOperationException; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; -import fr.ifremer.tutti.util.Numbers; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.decorator.Decorator; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.Closeable; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.TreeSet; -import static org.nuiton.i18n.I18n.t; - /** * Cache des observations individuelles. * @@ -66,27 +63,26 @@ public class IndividualObservationUICache implements Closeable { /** Logger. */ private static final Log log = LogFactory.getLog(IndividualObservationUICache.class); - private final SamplingListener samplingListener; - private final CruiseCache cruiseCache; + private final CruiseSamplingCache cruiseSamplingCache; private final SamplingCodeCache samplingCodeCache; + + private final boolean useCruiseSamplingCache; + private boolean speciesDefinedInCalcifiedPiecesSampling; + private final SpeciesFrequencyUIModel uiModel; private final IndividualObservationBatchUIModel individualObservationModel; - private final boolean withSamplingCache; - private final CruiseSamplingCache cruiseSamplingCache; - private SpeciesBatchRowModel speciesEditRow; private FishingOperation fishingOperation; + private Zone fishingOperationZone; + private SpeciesBatchRowModel speciesEditRow; private Species species; - private SpeciesFrequencyUI ui; - /** * Contient les codes de prélèvements qu'on sait non utilisables. * * Au chargement de l'écran, on remplit cet ensemble avec les codes des observations individuelles du lot. */ private final Set<Integer> samplingCodesNotAvailable = new TreeSet<>(); - /** * Contient les codes de prélèvements qu'on sait utilisables. * @@ -99,8 +95,7 @@ public class IndividualObservationUICache implements Closeable { private boolean on; public IndividualObservationUICache(CruiseCache cruiseCache, SpeciesFrequencyUIModel uiModel) { - this.cruiseCache = cruiseCache; - this.withSamplingCache = cruiseCache.useSamplingCache(); + this.useCruiseSamplingCache = cruiseCache.useSamplingCache(); this.cruiseSamplingCache = cruiseCache.getSamplingCruiseCache().orElse(null); this.samplingCodeCache = cruiseCache.getSamplingCodeCache(); this.uiModel = uiModel; @@ -135,45 +130,10 @@ public class IndividualObservationUICache implements Closeable { } }); - // Ecoute sur le cache de données pour savoir quand il faut afficher les notifications de prélèvements - this.samplingListener = new SamplingListener() { - - @Override - public void samplingNeeded(SamplingEvent event) { - - if (uiModel.isCanDisplayNotifications()) { - CalcifiedPiecesSamplingDefinition cpsDef = event.getCpsDef(); - if (log.isInfoEnabled()) { - log.info("samplingNeeded for " + cpsDef); - } - - int nbForOperation = event.getNbSamplingForOperation(); - int nbForZone = event.getNbSamplingForZone(); - int nbForCruise = event.getNbSamplingForCruise(); - - if (log.isInfoEnabled()) { - - Integer operationLimitation = cpsDef.getOperationLimitation(); - Integer zoneLimitation = cpsDef.getZoneLimitation(); - Integer maxByLenghtStep = cpsDef.getMaxByLenghtStep(); - - log.info(String.format("nbForOperation: %d/%s - nbForZone: %d/%s - nbForCruise: %d/%s", - nbForOperation, operationLimitation == null ? "∞" : operationLimitation, - nbForZone, zoneLimitation == null ? "∞" : zoneLimitation, - nbForCruise, maxByLenghtStep == null ? "∞" : maxByLenghtStep)); - } - - ui.getSamplingWarningLabel().setVisible(true); - } - } - - @Override - public void summaryUpdated(SamplingEvent event) { - displaySummary(event); - } - - }; + } + public boolean useCruiseSamplingCache() { + return useCruiseSamplingCache; } public void init(SpeciesFrequencyUI ui, SpeciesBatchRowModel speciesEditRow, FishingOperation fishingOperation, List<IndividualObservationBatchRowModel> individualObservationRows) { @@ -183,12 +143,19 @@ public class IndividualObservationUICache implements Closeable { Objects.requireNonNull(speciesEditRow.getSpecies()); Objects.requireNonNull(fishingOperation); - this.ui = ui; this.speciesEditRow = speciesEditRow; this.species = speciesEditRow.getSpecies(); this.fishingOperation = fishingOperation; - if (withSamplingCache) { - cruiseSamplingCache.addSamplingListener(samplingListener); + if (useCruiseSamplingCache) { + + // calcule de la zone associée à l'opération de pêche + + Optional<Zone> optionalZone = cruiseSamplingCache.tryFindZone(fishingOperation); + fishingOperationZone = optionalZone.orElse(null); + + // est-ce que l'espèce du lot existe dans l'algortihme des pièces calcifiées + speciesDefinedInCalcifiedPiecesSampling = cruiseSamplingCache.isSpeciesDefined(species); + } this.samplingCodesAvailable.clear(); @@ -199,16 +166,34 @@ public class IndividualObservationUICache implements Closeable { .forEach(individualObservationRow -> addSamplingCodeNotAvailable(individualObservationRow.getSamplingCode())); } + public CruiseSamplingCache getCruiseSamplingCache() { + return cruiseSamplingCache; + } + + public boolean isFishingOperationWithZone() { + return fishingOperationZone != null; + } + + public boolean isSpeciesDefinedInCalcifiedPiecesSampling() { + return speciesDefinedInCalcifiedPiecesSampling; + } @Override public void close() { - this.ui = null; this.speciesEditRow = null; this.species = null; this.fishingOperation = null; - if (withSamplingCache) { - cruiseSamplingCache.removeSamplingListener(samplingListener); - } + } + + public IndividualObservationSamplingStatus getIndividualObservationStatus(IndividualObservationBatchRowModel row) throws CalcifiedPiecesSamplingAlgorithmEntryNotFoundException, SizeNotDefinedOnIndividualObservationException, ZoneNotDefinedOnFishingOperationException { + + Float size = row.getSize(); + return cruiseSamplingCache.getIndividualObservationSamplingStatus(fishingOperation, + row, + size == null ? null : uiModel.getLengthStepInMm(size), + individualObservationModel.getGender(row), + individualObservationModel.getMaturityValue(row)); + } /** @@ -250,7 +235,7 @@ public class IndividualObservationUICache implements Closeable { return; } - if (withSamplingCache) { + if (useCruiseSamplingCache) { Boolean maturity = cruiseSamplingCache.getMaturity(species.getReferenceTaxonId(), maturityQualitativeValue); cruiseSamplingCache.addIndividualObservation(fishingOperation, @@ -284,7 +269,7 @@ public class IndividualObservationUICache implements Closeable { return; } - if (withSamplingCache) { + if (useCruiseSamplingCache) { Boolean maturity = cruiseSamplingCache.getMaturity(species.getReferenceTaxonId(), maturityQualitativeValue); int lengthStepInMm = uiModel.getLengthStepInMm(lengthStep); @@ -351,7 +336,7 @@ public class IndividualObservationUICache implements Closeable { decrementsSamplingCode(samplingCode); } - if (withSamplingCache) { + if (useCruiseSamplingCache) { Boolean maturity = cruiseSamplingCache.getMaturity(species.getReferenceTaxonId(), maturityQualitativeValue); cruiseSamplingCache.removeIndividualObservation(fishingOperation, @@ -378,7 +363,7 @@ public class IndividualObservationUICache implements Closeable { return; } - if (withSamplingCache) { + if (useCruiseSamplingCache) { Boolean maturity = cruiseSamplingCache.getMaturity(species.getReferenceTaxonId(), maturityQualitativeValue); cruiseSamplingCache.removeSampling(fishingOperation, @@ -445,82 +430,6 @@ public class IndividualObservationUICache implements Closeable { return samplingCodesAvailable.contains(samplingCode); } - public void updateSelectedRow(IndividualObservationBatchRowModel selectedRow) { - - SamplingEvent event = null; - - if (withSamplingCache && selectedRow != null && selectedRow.withSize()) { - - CaracteristicQualitativeValue maturityQualitativeValue = individualObservationModel.getMaturityValue(selectedRow); - Boolean maturity = cruiseSamplingCache.getMaturity(selectedRow.getSpecies().getReferenceTaxonId(), maturityQualitativeValue); - int lengthstep = uiModel.getLengthStepInMm(selectedRow.getSize()); - - event = cruiseSamplingCache.getEventForSummary(fishingOperation, species, maturity, individualObservationModel.getGender(selectedRow), lengthstep).orElse(null); - - } - - displaySummary(event); - } - - protected void displaySummary(SamplingEvent event) { - - if (isInit()) { - String summary = null; - - if (event != null && uiModel.isCanDisplayNotifications()) { - - CalcifiedPiecesSamplingDefinition cpsDef = event.getCpsDef(); - if (log.isInfoEnabled()) { - log.info("displaySummary for " + cpsDef); - } - - int nbForOperation = event.getNbSamplingForOperation(); - int nbForZone = event.getNbSamplingForZone(); - int nbForCruise = event.getNbSamplingForCruise(); - - String nbForOperationLabel = getLabelForSamplingNumber(nbForOperation, cpsDef.getOperationLimitation()); - String nbForZoneLabel = getLabelForSamplingNumber(nbForZone, cpsDef.getZoneLimitation()); - String nbForCruiseLabel = getLabelForSamplingNumber(nbForCruise, cpsDef.getMaxByLenghtStep()); - - Decorator<Species> speciesDecorator = ui.getHandler().getDecorator(Species.class, DecoratorService.WITH_SURVEY_CODE); - String key = speciesDecorator.toString(species) - + " " + Numbers.convertFromMm(event.getLengthStep(), uiModel.getLengthStepCaracteristicUnit()) - + " " + uiModel.getLengthStepCaracteristicUnit(); - if (event.getGender() != null) { - key += " " + event.getGender().getDescription(); - } - if (event.getMaturity() != null) { - if (event.getMaturity()) { - key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.mature"); - } else { - key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.immature"); - } - } - if (event.getZone() != null) { - Decorator<Zone> zoneDecorator = ui.getHandler().getDecorator(Zone.class, null); - String zone = zoneDecorator.toString(event.getZone()); - summary = t("tutti.editSpeciesFrequencies.samplingNeeded.summary", key, nbForOperationLabel, zone, nbForZoneLabel, nbForCruiseLabel); - } else { - summary = t("tutti.editSpeciesFrequencies.samplingNeeded.summary.noZone", key, nbForOperationLabel, nbForZoneLabel, nbForCruiseLabel); - } - } - - if (log.isInfoEnabled()) { - log.info("getSamplingResumeLabel: " + summary); - } - ui.getSamplingResumeLabel().setText(summary); - } - } - - private boolean isInit() { - return ui != null; - } - - private String getLabelForSamplingNumber(int value, Integer max) { - Decorator<Integer> valueDecorator = ui.getHandler().getDecorator(Integer.class, DecoratorService.NULL_INFINITE); - return "<strong>" + valueDecorator.toString(value) + "</strong> (" + valueDecorator.toString(max) + ")"; - } - public void decrementsSamplingCode(String samplingCode) { samplingCodeCache.removeSamplingCode(species.getReferenceTaxonId(), samplingCode); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss index cb41d94..948b1d0 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss @@ -394,11 +394,7 @@ ComputableDataEditor { } #samplingWarningLabel { - text: "tutti.editSpeciesFrequencies.samplingNeeded.warning"; - visible: false; opaque: true; - foreground: {handler.getConfig().getColorHighlightInfoForeground()}; - background: {handler.getConfig().getColorHighlightInfoBackground()}; horizontalAlignment: {SwingConstants.CENTER}; font-size: 16; border: {BorderFactory.createEmptyBorder(3, 10, 5, 10)}; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index f9049fa..592561c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -136,6 +136,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci protected IndividualObservationBatchTableHandler individualObservationBatchTableHandler; protected AverageWeightsHistogramHandler averageWeightsHistogramHandler; protected FrequenciesHistogramHandler frequenciesHistogramHandler; + protected IndividualObservationNotificationZoneHandler individualObservationNotificationZoneHandler; protected Decorator<Caracteristic> caracteristicDecorator; protected Decorator<Caracteristic> caracteristicTipDecorator; @@ -480,6 +481,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci this.individualObservationBatchTableHandler = new IndividualObservationBatchTableHandler(ui); this.averageWeightsHistogramHandler = new AverageWeightsHistogramHandler(ui); this.frequenciesHistogramHandler = new FrequenciesHistogramHandler(ui); + this.individualObservationNotificationZoneHandler = new IndividualObservationNotificationZoneHandler(ui); listenValidatorValid(ui.getValidator(), model); @@ -508,6 +510,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci IOUtils.closeQuietly(individualObservationBatchTableHandler); IOUtils.closeQuietly(averageWeightsHistogramHandler); IOUtils.closeQuietly(frequenciesHistogramHandler); + IOUtils.closeQuietly(individualObservationBatchTableHandler); // resetSamplingLabel(); @@ -644,7 +647,9 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci loadFrequenciesAndObservations(frequency, individualObservations); - individualObservationBatchTableHandler.initObservationsCache(frequencyEditor.getEditRow(), getDataContext().getFishingOperation()); + individualObservationBatchTableHandler.initObservationsCache(speciesBatch, getDataContext().getFishingOperation()); + + individualObservationNotificationZoneHandler.editBatch(speciesBatch); // individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getRows()); diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index f7e654d..a1df422 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -1651,6 +1651,7 @@ tutti.editSpeciesFrequencies.samplingNeeded.resume.noZone= tutti.editSpeciesFrequencies.samplingNeeded.summary= tutti.editSpeciesFrequencies.samplingNeeded.summary.noZone= tutti.editSpeciesFrequencies.samplingNeeded.warning= +tutti.editSpeciesFrequencies.samplingTotalCountAttained.warning= tutti.editSpeciesFrequencies.simpleCountingAndFrequencies= tutti.editSpeciesFrequencies.table.header.lengthStep= tutti.editSpeciesFrequencies.table.header.number= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index a99f983..4f46f12 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -1534,7 +1534,8 @@ tutti.editSpeciesFrequencies.samplingNeeded.mature=Mature tutti.editSpeciesFrequencies.samplingNeeded.max=max tutti.editSpeciesFrequencies.samplingNeeded.summary=<html><body><strong>%s</strong> \: Trait \: %s | %s \: %s | Campagne \: %s tutti.editSpeciesFrequencies.samplingNeeded.summary.noZone=<html><body><strong>%s</strong> \: Trait \: %s | (pas dans une zone) | Campagne \: %s -tutti.editSpeciesFrequencies.samplingNeeded.warning=<html><body><strong>Prélevez les pièces calcifiées \!</body></html> +tutti.editSpeciesFrequencies.samplingNeeded.warning= +tutti.editSpeciesFrequencies.samplingTotalCountAttained.warning=<html><body><strong>Le nombre de prélèvements requis est atteint \!</body></html> tutti.editSpeciesFrequencies.simpleCountingAndFrequencies=Des mensurations ont été saisies dans le tableau. Saisir un simple dénombrement les effacera. tutti.editSpeciesFrequencies.table.header.lengthStep=Classe de taille tutti.editSpeciesFrequencies.table.header.number=Nombre -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm