This is an automated email from the git hooks/post-receive script. New commit to branch feature/8145 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit a8ef33d1ecf304f42635b17899ff4f2848bd2568 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Mar 19 16:35:42 2016 +0100 Création d'un cache d'ui et suppression du code du handler --- .../IndividualObservationBatchRowModel.java | 20 +- .../frequency/IndividualObservationUICache.java | 303 +++++++++++++++++++++ .../frequency/SpeciesFrequencyUIHandler.java | 211 +++++--------- .../species/frequency/SpeciesFrequencyUIModel.java | 18 ++ .../actions/CancelEditSpeciesFrequencyAction.java | 5 +- .../frequency/actions/RemoveObservationAction.java | 5 +- .../actions/ResetSpeciesFrequencyAction.java | 5 +- 7 files changed, 414 insertions(+), 153 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java index 5029d7d..f7b2b0d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java @@ -32,6 +32,7 @@ import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatchs; 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.type.WeightUnit; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; @@ -399,11 +400,11 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel public boolean isEmpty(Collection<Caracteristic> caracteristicsToIgnore) { return getSize() == null - && getWeight() == null - && (getCaracteristics() == null || !getCaracteristics().hasNonNullValues(caracteristicsToIgnore)) - && (getDefaultCaracteristics() == null || !getDefaultCaracteristics().hasNonNullValues(caracteristicsToIgnore)) - && getComment() == null - && (getAttachment() == null || getAttachment().isEmpty()); + && getWeight() == null + && (getCaracteristics() == null || !getCaracteristics().hasNonNullValues(caracteristicsToIgnore)) + && (getDefaultCaracteristics() == null || !getDefaultCaracteristics().hasNonNullValues(caracteristicsToIgnore)) + && getComment() == null + && (getAttachment() == null || getAttachment().isEmpty()); } public void copy(IndividualObservationBatchRowModel source) { @@ -424,4 +425,13 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel allCaracteristics.putAll(getCaracteristics()); return allCaracteristics.get(caracteristic); } + + public CaracteristicQualitativeValue getGender(Caracteristic sexCaracteristic) { + return (CaracteristicQualitativeValue) getCaracteristicValue(sexCaracteristic); + } + + // FIXME Add it. + public Boolean getMaturityState() { + return null; + } } 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 new file mode 100644 index 0000000..7e57a8a --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java @@ -0,0 +1,303 @@ +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.CalcifiedPiecesSamplingDefinitions; +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.samplingCache.CruiseSamplingCache; +import fr.ifremer.tutti.service.samplingCache.SamplingEvent; +import fr.ifremer.tutti.service.samplingCache.SamplingListener; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.Closeable; +import java.util.Objects; +import java.util.Optional; + +import static org.nuiton.i18n.I18n.t; + +/** + * Cache des observations individuelles. + * + * Gère notamment le cache de prélèvement des pièces calcifiés, mais aussi le cache des codes de prélèvements. + * + * Created on 19/03/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class IndividualObservationUICache implements Closeable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(IndividualObservationUICache.class); + + private final SamplingListener samplingListener; + private final Optional<CruiseSamplingCache> samplingCache; + private final Caracteristic sexCaracteristic; + private final SpeciesFrequencyUIModel uiModel; + + private SpeciesBatchRowModel speciesEditRow; + private FishingOperation fishingOperation; + private Species species; + private SpeciesFrequencyUI ui; + + /** + * Est-ce que le cache est actif ? + */ + private boolean on; + + + public IndividualObservationUICache(Optional<CruiseSamplingCache> samplingCache, SpeciesFrequencyUIModel uiModel, Caracteristic sexCaracteristic) { + + this.samplingCache = samplingCache; + this.uiModel = uiModel; + this.sexCaracteristic = sexCaracteristic; + + // Ecoute sur le modèle de l'ui pour savoir quand on peut activer le cache (i.e uand le modèle n'est pas en construction) + this.uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INIT_BATCH_EDITION, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + Boolean newValue = (Boolean) evt.getNewValue(); + if (newValue) { + + // model is loading, + on = false; + if (log.isInfoEnabled()) { + log.info("Cache is off while loading ui model."); + } + } else { + + // model no more loading, cache is on if data cache is present + on = samplingCache.isPresent(); + if (log.isInfoEnabled()) { + if (on) { + log.info("Cache is on : ui model loading is done and sampling cache is present"); + } else { + log.info("Cache is off : ui model loading is done bu not sampling cache present"); + } + } + + } + } + }); + + // 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) { + + CalcifiedPiecesSamplingDefinition cpsDef = event.getCpsDef(); + if (log.isInfoEnabled()) { + log.info("samplingNeeded for " + cpsDef); + } + + int nbForOperation = event.getNbForOperation(); + int nbForZone = event.getNbForZone(); + int nbForCruise = event.getNbForCruise(); + + Integer operationLimitation = cpsDef.getOperationLimitation(); + Integer zoneLimitation = cpsDef.getZoneLimitation(); + Integer maxByLenghtStep = cpsDef.getMaxByLenghtStep(); + + if (log.isInfoEnabled()) { + 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)); + } + + boolean operationValueUpperMax = CalcifiedPiecesSamplingDefinitions.isOperationValueUpperMax(cpsDef, nbForOperation); + boolean zoneValueUpperMax = CalcifiedPiecesSamplingDefinitions.isZoneValueUpperMax(cpsDef, nbForZone); + boolean cruiseValueUpperMax = CalcifiedPiecesSamplingDefinitions.isCruiseValueUpperMax(cpsDef, nbForCruise); + + boolean showSamplingWarning = !operationValueUpperMax && !zoneValueUpperMax && !cruiseValueUpperMax; + if (log.isInfoEnabled()) { + log.info("showSamplingWarning " + showSamplingWarning); + } + ui.getSamplingWarningLabel().setVisible(showSamplingWarning); + + String nbForOperationLabel = getLabelForSamplingNumber(operationValueUpperMax, nbForOperation, operationLimitation); + String nbForZoneLabel = getLabelForSamplingNumber(zoneValueUpperMax, nbForZone, zoneLimitation); + String nbForCruiseLabel = getLabelForSamplingNumber(cruiseValueUpperMax, nbForCruise, maxByLenghtStep); + + //TODO add mauturity + String key = event.getLengthStep() + " " + 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"); + } + } + ui.getSamplingResumeLabel().setText(t("tutti.editSpeciesFrequencies.samplingNeeded.resume", key, nbForOperationLabel, nbForZoneLabel, nbForCruiseLabel)); + + } + + String getLabelForSamplingNumber(boolean valueUpperMax, int value, Integer max) { + String result; + if (valueUpperMax) { + result = t("tutti.editSpeciesFrequencies.samplingNeeded.max"); + } else { + // min à 0 (pour le cas où on ne soit pas dans une zone (pas de strate ou de sous strate définie)) + result = String.valueOf(Math.max(0, value - 1)); + } + return result; + } + }; + + } + + public void init(SpeciesFrequencyUI ui, SpeciesBatchRowModel speciesEditRow, FishingOperation fishingOperation) { + + Objects.requireNonNull(ui); + Objects.requireNonNull(speciesEditRow); + Objects.requireNonNull(speciesEditRow.getSpecies()); + Objects.requireNonNull(fishingOperation); + + this.ui = ui; + this.speciesEditRow = speciesEditRow; + this.species = speciesEditRow.getSpecies(); + this.fishingOperation = fishingOperation; + if (samplingCache.isPresent()) { + samplingCache.get().addSamplingListener(samplingListener); + } + } + + @Override + public void close() { + this.ui = null; + this.speciesEditRow = null; + this.species = null; + this.fishingOperation = null; + if (samplingCache.isPresent()) { + samplingCache.get().removeSamplingListener(samplingListener); + } + } + + /** + * Ajoute une observation individuelle dans le cache. + * + * @param row la ligne à ajouter au cache + */ + public void increments(IndividualObservationBatchRowModel row) { + + increments(row.getGender(sexCaracteristic), row.getMaturityState(), row.getSize()); + + } + + /** + * Ajoute une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. + * + * @param gender le sexe + * @param maturity l'état de maturité + * @param lengthStep la classe de taille + */ + public void increments(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip increments individual observations in cache."); + } + return; + } + + samplingCache.get().increment(fishingOperation, + species, + gender, + maturity, + uiModel.getLengthStep(lengthStep)); + } + + /** + * Retire une observation individuelle dans le cache. + * + * @param row la ligne à retirer du cache + */ + public void decrements(IndividualObservationBatchRowModel row) { + + decrements(row.getGender(sexCaracteristic), row.getMaturityState(), row.getSize()); + + } + + /** + * Retire une observation individuelle via ses composantes (sexe, maturité, classe de taille) dans le cache. + * + * @param gender le sexe + * @param maturity l'état de maturité + * @param lengthStep la classe de taille + */ + public void decrements(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip decrements individual observations in cache."); + } + return; + } + + samplingCache.get().decrement(fishingOperation, + species, + gender, + maturity, + uiModel.getLengthStep(lengthStep)); + + } + + /** + * Retire toutes les observations individuelles contenues dans le modèle d'UI du cache. + */ + public void decrementsAll() { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip decrements all individual observations in cache."); + } + return; + } + + uiModel.getIndividualObservationRows() + .stream() + .filter(IndividualObservationBatchRowModel::withSize) + .forEach(this::decrements); + + } + + /** + * Réinitialise le cache en oubiant toutes les modifications sur les observations individuelles du modèle. + * + * <ul> + * <li>Retire toutes les observations indivudelles contenues dans le modèle d'UI ({@link #decrementsAll()})</li> + * <li>Ajoute toutes les observations individuelles contenues dans le modèle d'origine (i.e en base)</li> + * </ul> + * + * Cette méthode est utilisée quand l'utilisateur quitte l'écran en annulant toutes ses modifications. + */ + public void reset() { + + if (!on) { + if (log.isDebugEnabled()) { + log.debug("Cache is off, skip reset individual observations in cache."); + } + return; + } + + decrementsAll(); + + speciesEditRow.getIndividualObservation() + .stream() + .filter(IndividualObservationBatchRowModel::withSize) + .forEach(this::increments); + + } + +} 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 b82607c..846ae02 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 @@ -33,7 +33,6 @@ import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; import fr.ifremer.tutti.persistence.entities.data.SampleCategory; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; -import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; import fr.ifremer.tutti.persistence.entities.protocol.Rtp; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; @@ -44,14 +43,12 @@ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.TaxonCache; import fr.ifremer.tutti.persistence.entities.referential.TaxonCaches; import fr.ifremer.tutti.service.DecoratorService; -import fr.ifremer.tutti.service.samplingCache.SamplingEvent; -import fr.ifremer.tutti.service.samplingCache.SamplingListener; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.TuttiUIContext; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.EditSpeciesBatchPanelUI; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; 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.species.EditSpeciesBatchPanelUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyCellComponent.FrequencyCellEditor; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions.ApplySpeciesFrequencyRafaleAction; @@ -170,7 +167,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci */ protected final FeedReaderListener feedReaderListener; - protected final SamplingListener samplingListener; + protected IndividualObservationUICache individualObservationUICache; protected ApplySpeciesFrequencyRafaleAction applySpeciesFrequencyRafaleAction; @@ -178,9 +175,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci protected Optional<CaracteristicColumnIdentifier> maturityColumnId = Optional.empty(); - // Flag to mark when preparing the batch edition - private boolean initBatchEdition; - protected SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; public SpeciesFrequencyUIHandler() { @@ -207,47 +201,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } }; - this.samplingListener = new SamplingListener() { - - @Override - public void samplingNeeded(SamplingEvent event) { - - if (log.isInfoEnabled()) { - log.info("samplingNeeded"); - } - - CalcifiedPiecesSamplingDefinition cpsDef = event.getCpsDef(); - - boolean showSamplingWarning = !isValueUpperMax(event.getNbForOperation(), cpsDef.getOperationLimitation()) - && !isValueUpperMax(event.getNbForZone(), cpsDef.getZoneLimitation()) - && !isValueUpperMax(event.getNbForCruise(), cpsDef.getMaxByLenghtStep()); - if (log.isInfoEnabled()) { - log.info("showSamplingWarning " + showSamplingWarning); - } - ui.getSamplingWarningLabel().setVisible(showSamplingWarning); - - String nbForOperation = getLabelForSamplingNumber(event.getNbForOperation(), cpsDef.getOperationLimitation()); - String nbForZone = getLabelForSamplingNumber(event.getNbForZone(), cpsDef.getZoneLimitation()); - String nbForCruise = getLabelForSamplingNumber(event.getNbForCruise(), cpsDef.getMaxByLenghtStep()); - - //TODO add mauturity - String key = event.getLengthStep() + " " + getModel().getLengthStepCaracteristicUnit(); - if (event.getGender() != null) { - key += " " + event.getGender().getDescription(); - } - if (event.getMaturity() != null) - if (event.getMaturity() != null) { - if (event.getMaturity()) { - key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.mature"); - } else { - key += " " + t("tutti.editSpeciesFrequencies.samplingNeeded.immature"); - } - } - ui.getSamplingResumeLabel().setText(t("tutti.editSpeciesFrequencies.samplingNeeded.resume", key, nbForOperation, nbForZone, nbForCruise)); - - } - }; - this.obsChangedListener = new PropertyChangeListener() { @Override @@ -258,7 +211,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); String propertyName = evt.getPropertyName(); - CaracteristicQualitativeValue gender = getRowGender(row); + CaracteristicQualitativeValue gender = row.getGender(sexCaracteristic); // we only update the frequencies if the row is valid if (row.isValid()) { @@ -272,10 +225,10 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci Float newValue = (Float) evt.getNewValue(); if (oldValue != null) { - decrementSampling(gender, null, oldValue); + individualObservationUICache.decrements(gender, null, oldValue); } if (newValue != null) { - incrementSampling(gender, null, newValue); + individualObservationUICache.increments(gender, null, newValue); } if (getModel().mustCopyIndividualObservationSize()) { @@ -323,8 +276,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci CaracteristicQualitativeValue oldGender = (CaracteristicQualitativeValue) oldValue.get(sexCaracteristic); CaracteristicQualitativeValue newGender = (CaracteristicQualitativeValue) newValue.get(sexCaracteristic); if (!Objects.equals(oldGender, newGender)) { - decrementSampling(oldGender, null, row.getSize()); - incrementSampling(newGender, null, row.getSize()); + individualObservationUICache.decrements(oldGender, null, row.getSize()); + individualObservationUICache.increments(newGender, null, row.getSize()); } } } @@ -338,13 +291,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (oldValue && getModel().mustCopyIndividualObservationSize()) { updateFrequencyRowsNumbers(row.getSize(), null); - decrementSampling(gender, null, row.getSize()); + individualObservationUICache.decrements(gender, null, row.getSize()); } if (newValue) { if (getModel().mustCopyIndividualObservationSize()) { updateFrequencyRowsNumbers(null, row.getSize()); if (row.withSize()) { - incrementSampling(gender, null, row.getSize()); + individualObservationUICache.increments(gender, null, row.getSize()); } } if (getModel().mustCopyIndividualObservationWeight()) { @@ -501,6 +454,9 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SwingUtilities.invokeLater(this::updateLogVisibility); }); + + this.individualObservationUICache = new IndividualObservationUICache( + getDataContext().getOptionalCruiseSamplingCache(), model, sexCaracteristic); } @Override @@ -663,10 +619,11 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // Pour bloquer le changement du mode de recopie des observations individuelles → mensurations model.addVetoableChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { + SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); CopyIndividualObservationMode oldCopyMode = (CopyIndividualObservationMode) evt.getOldValue(); CopyIndividualObservationMode newCopyMode = (CopyIndividualObservationMode) evt.getNewValue(); - if (initBatchEdition) { + if (source.isInitBatchEdition()) { if (log.isInfoEnabled()) { log.info("Skip ask user to confirm copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); @@ -726,8 +683,10 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } + SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); + // si on est en initialisation, ca ne sert à rien de regénérer les lignes, elles sont sensées être chargées - if (initBatchEdition) { + if (source.isInitBatchEdition()) { if (log.isInfoEnabled()) { log.info("Skip recompute frequencies from indivudal observations (flag initBatchEdition is on), copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); @@ -824,38 +783,41 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci getContext().getIchtyometerReader().removeFeedModeReaderListener(feedReaderListener); } - if (getDataContext().isCruiseSamplingCacheLoaded()) { - getDataContext().getCruiseSamplingCache().removeSamplingListener(samplingListener); - } + individualObservationUICache.close(); +// if (getDataContext().isCruiseSamplingCacheLoaded()) { +// getDataContext().getCruiseSamplingCache().removeSamplingListener(samplingListener); +// } } public void editBatch(FrequencyCellEditor editor, Optional<String> optionalTitle) { - initBatchEdition = true; - try { + SpeciesBatchRowModel speciesBatch = editor.getEditRow(); + Objects.requireNonNull(speciesBatch, "Impossible d'éditer un lot non renseigné"); - // on enlève la colonne spécifique à l'espèce précédente - if (maturityColumnId.isPresent()) { - TableColumnExt maturityColumn = ui.getObsTable().getColumnExt(maturityColumnId.get()); - ui.getObsTable().removeColumn(maturityColumn); - maturityColumnId = Optional.empty(); - } + // on enlève la colonne spécifique à l'espèce précédente + if (maturityColumnId.isPresent()) { + TableColumnExt maturityColumn = ui.getObsTable().getColumnExt(maturityColumnId.get()); + ui.getObsTable().removeColumn(maturityColumn); + maturityColumnId = Optional.empty(); + } - FrequencyConfigurationMode mode = FrequencyConfigurationMode.FREQUENCIES; - FrequencyConfigurationMode frequenciesMode = FrequencyConfigurationMode.AUTO_GEN; + if (optionalTitle.isPresent()) { - if (optionalTitle.isPresent()) { + String title = optionalTitle.get(); + frequenciesHistogramPopup.setTitle(title + t("tutti.editSpeciesFrequencies.title")); + averageWeightsHistogramPopup.setTitle(title + weightUnit.decorateLabel(t("tutti.editSpeciesFrequencies.field.graphAverageWeight"))); - String title = optionalTitle.get(); - frequenciesHistogramPopup.setTitle(title + t("tutti.editSpeciesFrequencies.title")); - averageWeightsHistogramPopup.setTitle(title + weightUnit.decorateLabel(t("tutti.editSpeciesFrequencies.field.graphAverageWeight"))); + } - } + SpeciesFrequencyUIModel model = getModel(); + + model.setInitBatchEdition(true); - SpeciesBatchRowModel speciesBatch = editor.getEditRow(); - Objects.requireNonNull(speciesBatch, "Impossible d'éditer un lot non renseigné"); + try { + + FrequencyConfigurationMode mode = FrequencyConfigurationMode.FREQUENCIES; + FrequencyConfigurationMode frequenciesMode = FrequencyConfigurationMode.AUTO_GEN; - SpeciesFrequencyUIModel model = getModel(); model.setNextEditableRowIndex(editor.getNextEditableRowIndex()); model.setTotalNumber(null); model.setTotalComputedWeight(null); @@ -1114,59 +1076,20 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } - if (getDataContext().isCruiseSamplingCacheLoaded()) { - getDataContext().getCruiseSamplingCache().addSamplingListener(samplingListener); - } + individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation()); model.setModify(false); } finally { - initBatchEdition = false; - } - - } - - //TODO maturity - public void incrementSampling(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { - - if (!initBatchEdition && getDataContext().isCruiseSamplingCacheLoaded()) { - SpeciesBatchRowModel batch = getModel().getBatch(); - - getDataContext().getCruiseSamplingCache().increment(getDataContext().getFishingOperation(), - batch.getSpecies(), - gender, - maturity, - getModel().getLengthStep(lengthStep)); + model.setInitBatchEdition(false); + //FIXME Voir si c'est nécessaire ? + model.setModify(false); } - } - - public void decrementSampling(CaracteristicQualitativeValue gender, Boolean maturity, float lengthStep) { - if (!initBatchEdition && getDataContext().isCruiseSamplingCacheLoaded()) { - SpeciesBatchRowModel batch = getModel().getBatch(); - getDataContext().getCruiseSamplingCache().decrement(getDataContext().getFishingOperation(), - batch.getSpecies(), - gender, - maturity, - getModel().getLengthStep(lengthStep)); - } } - public void decrementAllSamplings() { - if (!initBatchEdition && getDataContext().isCruiseSamplingCacheLoaded()) { - getModel().getIndividualObservationRows().forEach(row -> { - if (row.withSize()) { - decrementSampling(getRowGender(row), null, row.getSize()); - } - }); - } - } - public void resetSamplings() { - if (!initBatchEdition && getDataContext().isCruiseSamplingCacheLoaded()) { - frequencyEditor.getEditRow().getIndividualObservation().stream() - .filter(IndividualObservationBatchRowModel::withSize) - .forEach(row -> incrementSampling(getRowGender(row), null, row.getSize())); - } + public IndividualObservationUICache getIndividualObservationUICache() { + return individualObservationUICache; } public void updateFrequencyRowsNumbers(Float lengthStepToDec, Float lengthStepToInc) { @@ -1230,9 +1153,9 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } } - public CaracteristicQualitativeValue getRowGender(IndividualObservationBatchRowModel row) { - return (CaracteristicQualitativeValue) row.getCaracteristicValue(sexCaracteristic); - } +// public CaracteristicQualitativeValue getGender(IndividualObservationBatchRowModel row) { +// return (CaracteristicQualitativeValue) row.getCaracteristicValue(sexCaracteristic); +// } //------------------------------------------------------------------------// //-- Internal methods --// @@ -1596,8 +1519,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } protected void resetSamplingLabels() { - if (log.isInfoEnabled()) { - log.info("reset smapling panel"); + if (log.isDebugEnabled()) { + log.debug("reset smapling panel"); } ui.getSamplingWarningLabel().setVisible(false); ui.getSamplingResumeLabel().setText(null); @@ -1865,20 +1788,20 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.reloadRows(); } - protected boolean isValueUpperMax(int value, Integer max) { - return max != null && max > 0 && value > max; - } - - protected String getLabelForSamplingNumber(int value, Integer max) { - String result; - if (isValueUpperMax(value, max)) { - result = t("tutti.editSpeciesFrequencies.samplingNeeded.max"); - } else { - // min à 0 (pour le cas où on ne soit pas dans une zone (pas de strate ou de sous strate définie)) - result = String.valueOf(Math.max(0, value - 1)); - } - return result; - } +// protected boolean isValueUpperMax(int value, Integer max) { +// return max != null && max > 0 && value > max; +// } +// +// protected String getLabelForSamplingNumber(int value, Integer max) { +// String result; +// if (isValueUpperMax(value, max)) { +// result = t("tutti.editSpeciesFrequencies.samplingNeeded.max"); +// } else { +// // min à 0 (pour le cas où on ne soit pas dans une zone (pas de strate ou de sous strate définie)) +// result = String.valueOf(Math.max(0, value - 1)); +// } +// return result; +// } @Override public <E> void initBeanFilterableComboBox(BeanFilterableComboBox<E> comboBox, List<E> data, E selectedData) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java index 03b13cf..1dd8fa7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java @@ -118,6 +118,9 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa public static final String PROPERTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR = "individualObservationRowsInError"; public static final String PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR = "nonEmptyIndividualObservationRowsInError"; + + public static final String PROPERTY_INIT_BATCH_EDITION = "initBatchEdition"; + private final SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; /** @@ -295,6 +298,11 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa protected boolean rowComputationInProgress; + /** + * Is the model is loading? + */ + protected boolean initBatchEdition; + protected final PropertyChangeListener rowInErrorChangedListener = new PropertyChangeListener() { @Override @@ -334,6 +342,16 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa setIndividualObservationRowsInError(new HashSet<>()); } + public boolean isInitBatchEdition() { + return initBatchEdition; + } + + public void setInitBatchEdition(boolean initBatchEdition) { + Object oldValue = isInitBatchEdition(); + this.initBatchEdition = initBatchEdition; + firePropertyChange(PROPERTY_INIT_BATCH_EDITION, oldValue, initBatchEdition); + } + public void reloadRows() { setEmptyRows(new HashSet<>()); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/CancelEditSpeciesFrequencyAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/CancelEditSpeciesFrequencyAction.java index 7f97f8d..0b02ca6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/CancelEditSpeciesFrequencyAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/CancelEditSpeciesFrequencyAction.java @@ -24,6 +24,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationUICache; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; @@ -95,8 +96,8 @@ public class CancelEditSpeciesFrequencyAction extends LongActionSupport<SpeciesF log.debug("Cancel UI " + getUI()); } - handler.decrementAllSamplings(); - handler.resetSamplings(); + IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); + individualObservationUICache.reset(); // close dialog getHandler().onCloseUI(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java index d538cbc..0a39e57 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java @@ -26,6 +26,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac 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.species.frequency.IndividualObservationUICache; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; @@ -78,6 +79,8 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc SpeciesFrequencyUIModel model = ui.getModel(); SpeciesFrequencyUIHandler handler = ui.getHandler(); + + IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); rowsToDelete.forEach(row -> { if (row.withSize()) { @@ -89,7 +92,7 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc handler.updateFrequencyRowsWeights(row.getSize(), -row.getWeight()); } - handler.decrementSampling(handler.getRowGender(row), null, row.getSize()); + individualObservationUICache.decrements(row); } model.removeIndividualObservationRowInError(row); }); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java index d4e5fe6..c3643f2 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java @@ -24,6 +24,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationUICache; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; @@ -94,7 +95,9 @@ public class ResetSpeciesFrequencyAction extends LongActionSupport<SpeciesFreque model.setRows(new ArrayList<>()); // remove all individual observations - handler.decrementAllSamplings(); + IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); + + individualObservationUICache.decrementsAll(); model.setIndividualObservationRows(new ArrayList<>()); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.