branch feature/revue_algorithme updated (2488271 -> 7de63b3)
This is an automated email from the git hooks/post-receive script. New change to branch feature/revue_algorithme in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git from 2488271 Utilisation d'un nouvel handler pour gérer la zone de notification new 9025fe4 Ajout d'états sur le cache d'ui new e7dec7b Revue de la zone de notification new 2ce988a Suppression des listeners sur le cache + revue du code du cache new 41059a9 Suppression du statut de la ligne d'une observation (cela pose des problème sur la sélection dans par exemple l'éditeur des code de prélèvement qui se déclanche avant que la ligne soit sélectionnée) new 48d0e06 Revue du modèle de la zone de notification et de son handler new e899b8a traduction perdue new af55cbb Renommage méthode + suppression méthode non utilisée new 7de63b3 Normalement on a le bon flow pour la rafraichissement de la zone de notification des prélèvements + nettoyage de code The 8 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 7de63b3196d6cab28a601e6d1d7cfd88b589b0b6 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:27:52 2016 +0200 Normalement on a le bon flow pour la rafraichissement de la zone de notification des prélèvements + nettoyage de code commit af55cbb697ba72eda6aafeef1e2a769230855b46 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:17:38 2016 +0200 Renommage méthode + suppression méthode non utilisée commit e899b8ab8b822120a6c46d62938d24f881c3ef9f Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:17:14 2016 +0200 traduction perdue commit 48d0e067104b56a4afa32d552e77d17f264dcf71 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:16:51 2016 +0200 Revue du modèle de la zone de notification et de son handler commit 41059a9cd2a86b5359d3715376f7899125a0aa23 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:15:11 2016 +0200 Suppression du statut de la ligne d'une observation (cela pose des problème sur la sélection dans par exemple l'éditeur des code de prélèvement qui se déclanche avant que la ligne soit sélectionnée) commit 2ce988a985c99d24a6a35772bd7dadb57a53b314 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:14:13 2016 +0200 Suppression des listeners sur le cache + revue du code du cache commit e7dec7b3385ffdb9537990bd65767a1ec9bf95bd Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Apr 19 15:16:27 2016 +0200 Revue de la zone de notification commit 9025fe4882840061fa5b88291dc4a25a59f61d98 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Apr 19 15:16:15 2016 +0200 Ajout d'états sur le cache d'ui Summary of changes: .../service/sampling/CruiseSamplingCache.java | 76 +---- .../IndividualObservationSamplingStatus.java | 14 + .../tutti/service/sampling/SamplingEvent.java | 51 ---- .../tutti/service/sampling/SamplingListener.java | 38 --- .../IndividualObservationBatchRowModel.java | 16 - .../IndividualObservationBatchTableHandler.java | 139 ++------- .../IndividualObservationBatchUIModel.java | 7 + ...dividualObservationNotificationZoneHandler.java | 260 ---------------- .../frequency/IndividualObservationUICache.java | 21 +- .../frequency/SamplingNotificationZoneHandler.java | 331 +++++++++++++++++++++ .../frequency/SamplingNotificationZoneModel.java | 56 ++++ .../frequency/SamplingNotificationZoneStatus.java | 15 + .../frequency/SpeciesFrequencyUIHandler.java | 15 +- .../resources/i18n/tutti-ui-swing_fr_FR.properties | 3 +- 14 files changed, 486 insertions(+), 556 deletions(-) delete mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java delete mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingListener.java delete mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationNotificationZoneHandler.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneStatus.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/revue_algorithme in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 9025fe4882840061fa5b88291dc4a25a59f61d98 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Apr 19 15:16:15 2016 +0200 Ajout d'états sur le cache d'ui --- .../frequency/IndividualObservationBatchTableHandler.java | 2 +- .../species/frequency/IndividualObservationUICache.java | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) 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 cdd6e9d..c68e7d3 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 @@ -103,7 +103,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { if (!optionalCruiseCache.isPresent()) { throw new IllegalStateException("Can't find cruise cache"); } - this.individualObservationUICache = new IndividualObservationUICache(optionalCruiseCache.get(), model); + this.individualObservationUICache = new IndividualObservationUICache(optionalCruiseCache.get(), model, uiHandler.getDataContext()); this.individualObservationTable = ui.getObsTable(); this.frequencyTableModel = uiHandler.getTableModel(); this.individualObservationToFrequencyEngine = new IndividualObservationToFrequencyEngine(model2.getIndividualObservationWeightUnit()); 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 926a62c..23a149a 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 @@ -28,6 +28,7 @@ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; 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.TuttiDataContext; import fr.ifremer.tutti.service.cruise.CruiseCache; import fr.ifremer.tutti.service.sampling.CalcifiedPiecesSamplingAlgorithmEntryNotFoundException; import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; @@ -67,6 +68,8 @@ public class IndividualObservationUICache implements Closeable { private final SamplingCodeCache samplingCodeCache; private final boolean useCruiseSamplingCache; + private final boolean protocolFilled; + private final boolean protocolUseCalcifiedPieceSampling; private boolean speciesDefinedInCalcifiedPiecesSampling; private final SpeciesFrequencyUIModel uiModel; @@ -94,12 +97,14 @@ public class IndividualObservationUICache implements Closeable { */ private boolean on; - public IndividualObservationUICache(CruiseCache cruiseCache, SpeciesFrequencyUIModel uiModel) { + public IndividualObservationUICache(CruiseCache cruiseCache, SpeciesFrequencyUIModel uiModel, TuttiDataContext tuttiDataContext) { this.useCruiseSamplingCache = cruiseCache.useSamplingCache(); this.cruiseSamplingCache = cruiseCache.getSamplingCruiseCache().orElse(null); this.samplingCodeCache = cruiseCache.getSamplingCodeCache(); this.uiModel = uiModel; this.individualObservationModel = uiModel.getIndividualObservationModel(); + this.protocolFilled = tuttiDataContext.isProgramFilled(); + this.protocolUseCalcifiedPieceSampling = protocolFilled && tuttiDataContext.getProtocol().isUseCalcifiedPieceSampling(); // 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() { @@ -174,6 +179,14 @@ public class IndividualObservationUICache implements Closeable { return fishingOperationZone != null; } + public boolean isProtocolFilled() { + return protocolFilled; + } + + public boolean isProtocolUseCalcifiedPieceSampling() { + return protocolUseCalcifiedPieceSampling; + } + public boolean isSpeciesDefinedInCalcifiedPiecesSampling() { return speciesDefinedInCalcifiedPiecesSampling; } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/revue_algorithme in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit e7dec7b3385ffdb9537990bd65767a1ec9bf95bd Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Apr 19 15:16:27 2016 +0200 Revue de la zone de notification --- ...dividualObservationNotificationZoneHandler.java | 260 ---------------- .../frequency/SamplingNotificationZoneHandler.java | 331 +++++++++++++++++++++ .../frequency/SamplingNotificationZoneModel.java | 44 +++ .../frequency/SamplingNotificationZoneStatus.java | 15 + .../frequency/SpeciesFrequencyUIHandler.java | 6 +- 5 files changed, 393 insertions(+), 263 deletions(-) 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 deleted file mode 100644 index 806258c..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationNotificationZoneHandler.java +++ /dev/null @@ -1,260 +0,0 @@ -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/SamplingNotificationZoneHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java new file mode 100644 index 0000000..0587d90 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java @@ -0,0 +1,331 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import com.google.common.base.Preconditions; +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.beans.PropertyChangeListener; +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 SamplingNotificationZoneHandler implements Closeable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(SamplingNotificationZoneHandler.class); + + private final SpeciesFrequencyUIModel uiModel; + private final SamplingNotificationZoneModel model; + private final IndividualObservationBatchTableModel individualObservationTableModel; + private final ListSelectionModel listSelectionModel; + + private final IndividualObservationUICache individualObservationUICache; + + private final JLabel samplingWarningLabel; + private final JLabel samplingSummaryLabel; + + private final SamplingListener samplingListener; + private final ListSelectionListener listSelectionListener; + private final PropertyChangeListener modelSummaryTextChanged; + private final PropertyChangeListener modelStatusChanged; + + private final Decorator<Integer> infiniteDecorator; + private final Decorator<Species> speciesDecorator; + private final Decorator<Zone> zoneDecorator; + + private final Color colorHighlightInfoForeground; + private final Color colorHighlightInfoBackground; + + public SamplingNotificationZoneHandler(SpeciesFrequencyUI ui) { + this.uiModel = ui.getModel(); + this.samplingWarningLabel = ui.getSamplingWarningLabel(); + this.samplingSummaryLabel = ui.getSamplingResumeLabel(); + this.individualObservationTableModel = (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); + this.model = new SamplingNotificationZoneModel(); + this.listSelectionModel = ui.getObsTable().getSelectionModel(); + + SpeciesFrequencyUIHandler uiHandler = ui.getHandler(); + this.individualObservationUICache = uiHandler.getIndividualObservationUICache(); + this.infiniteDecorator = uiHandler.getDecorator(Integer.class, DecoratorService.NULL_INFINITE); + this.speciesDecorator = uiHandler.getDecorator(Species.class, DecoratorService.WITH_SURVEY_CODE); + this.zoneDecorator = uiHandler.getDecorator(Zone.class, null); + this.colorHighlightInfoForeground = uiHandler.getConfig().getColorHighlightInfoForeground(); + this.colorHighlightInfoBackground = uiHandler.getConfig().getColorHighlightInfoBackground(); + + // 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()); + + } + }; + + // Ecoute le changement d'état de la zone de notification pour mettre à jour le statut + this.modelStatusChanged = event -> { + + SamplingNotificationZoneStatus newValue = (SamplingNotificationZoneStatus) event.getNewValue(); + + switch (newValue) { + + case DISABLED: + + 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); + + break; + case NEED_SAMPLING: + + samplingWarningLabel.setText(t("tutti.editSpeciesFrequencies.samplingNeeded.warning")); + samplingWarningLabel.setForeground(colorHighlightInfoForeground); + samplingWarningLabel.setBackground(colorHighlightInfoBackground); + + break; + case COUNT_ATTAINED: + + samplingWarningLabel.setText(t("tutti.editSpeciesFrequencies.samplingTotalCountAttained.warning")); + samplingWarningLabel.setForeground(null); + samplingWarningLabel.setBackground(Color.LIGHT_GRAY); + + break; + case NONE: + + samplingWarningLabel.setText(null); + samplingWarningLabel.setForeground(null); + samplingWarningLabel.setBackground(null); + + break; + } + }; + + // Ecoute le changement du texte de la zone de notification pour mettre à jour l'ui + this.modelSummaryTextChanged = event -> { + + String newValue = (String) event.getNewValue(); + samplingSummaryLabel.setText(newValue); + + }; + + // Ecoute la sélection sur le tableau des observations individuelles pour rafraîchir la zone de notification + this.listSelectionListener = event -> { + + ListSelectionModel source = (ListSelectionModel) event.getSource(); + + if (event.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()); + + // on commence toujours par supprimer le status de cette ligne + selectedRow.setIndividualObservationSamplingStatus(null); + + 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."); + } + + }; + + } + + public void editBatch(SpeciesBatchRowModel speciesBatch) { + + if (log.isInfoEnabled()) { + log.info("Edit batch for " + speciesBatch); + } + + // toujours supprimer les listeners + listSelectionModel.removeListSelectionListener(listSelectionListener); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); + if (individualObservationUICache.useCruiseSamplingCache()) { + individualObservationUICache.getCruiseSamplingCache().removeSamplingListener(samplingListener); + } + + // on les ajoutent (on peut en avoir besoin pour désactiver la zone de notification) + model.addPropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.addPropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); + + if (!individualObservationUICache.isProtocolFilled()) { + + // pas de protocole + stopUsingStatusNotication("Pas de protocole défini."); + return; + } + + if (!individualObservationUICache.isProtocolUseCalcifiedPieceSampling()) { + + // pas d'utilisation de l'algorithme de prélèvement des pièces calcifiées + stopUsingStatusNotication("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 + stopUsingStatusNotication("Le trait n'est pas dans une zone."); + return; + } + + if (!individualObservationUICache.isSpeciesDefinedInCalcifiedPiecesSampling()) { + + // pas de définition d'algorithme sur cette espèce + stopUsingStatusNotication("L'espèce du lot n'est pas connue dans la définition de l'algorithme."); + return; + } + + Preconditions.checkState(individualObservationUICache.useCruiseSamplingCache()); + + model.reset(); + + individualObservationUICache.getCruiseSamplingCache().addSamplingListener(samplingListener); + listSelectionModel.addListSelectionListener(listSelectionListener); + + } + + @Override + public void close() { + + listSelectionModel.removeListSelectionListener(listSelectionListener); + if (individualObservationUICache.useCruiseSamplingCache()) { + individualObservationUICache.getCruiseSamplingCache().removeSamplingListener(samplingListener); + } + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); + + } + + private void whenCanNotUseSampling(String message) { + model.setSummaryText(message); + model.setSamplingNotificationZoneStatus(SamplingNotificationZoneStatus.DISABLED); + } + + private void stopUsingStatusNotication(String message) { + + whenCanNotUseSampling(message); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); + + } + + private void whenSamplingNeeded(IndividualObservationSamplingStatus status) { + + model.setSummaryText(getSummaryText(status)); + model.setSamplingNotificationZoneStatus(SamplingNotificationZoneStatus.NEED_SAMPLING); + + } + + private void whenUpdateSummary(IndividualObservationSamplingStatus status) { + + model.setSummaryText(getSummaryText(status)); + + SamplingNotificationZoneStatus zoneStatus = status.isOneTotalCountIsAttained() ? + SamplingNotificationZoneStatus.COUNT_ATTAINED : + SamplingNotificationZoneStatus.NONE; + model.setSamplingNotificationZoneStatus(zoneStatus); + + } + + private String getSummaryText(IndividualObservationSamplingStatus status) { + + IndividualObservationSamplingContext individualObservationSamplingContext = status.getIndividualObservationSamplingContext(); + + CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = status.getCalcifiedPiecesSamplingDefinition(); + + int nbForOperation = status.getSamplingCountInFishingOperation(); + int nbForZone = status.getSamplingCountInZone(); + int nbForCruise = status.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"); + } + } + + String zone = zoneDecorator.toString(individualObservationSamplingContext.getZone()); + + return t("tutti.editSpeciesFrequencies.samplingNeeded.summary", key, nbForOperationLabel, zone, nbForZoneLabel, nbForCruiseLabel); + + } + + /** + * 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/SamplingNotificationZoneModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java new file mode 100644 index 0000000..6e6547d --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java @@ -0,0 +1,44 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import org.jdesktop.beans.AbstractSerializableBean; + +/** + * Created on 19/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class SamplingNotificationZoneModel extends AbstractSerializableBean { + + public static final String PROPERTY_SAMPLING_STATUS = "samplingNotificationZoneStatus"; + public static final String PROPERTY_SUMMARY_TEXT = "summaryText"; + + private SamplingNotificationZoneStatus samplingNotificationZoneStatus; + private String summaryText; + + public SamplingNotificationZoneStatus getSamplingNotificationZoneStatus() { + return samplingNotificationZoneStatus; + } + + public void setSamplingNotificationZoneStatus(SamplingNotificationZoneStatus samplingNotificationZoneStatus) { + Object oldValue = getSamplingNotificationZoneStatus(); + this.samplingNotificationZoneStatus = samplingNotificationZoneStatus; + firePropertyChange(PROPERTY_SAMPLING_STATUS, oldValue, samplingNotificationZoneStatus); + } + + public String getSummaryText() { + return summaryText; + } + + public void setSummaryText(String summaryText) { + Object oldValue = getSummaryText(); + this.summaryText = summaryText; + firePropertyChange(PROPERTY_SUMMARY_TEXT, oldValue, summaryText); + } + + public void reset() { + + setSamplingNotificationZoneStatus(SamplingNotificationZoneStatus.DISABLED); + setSummaryText("Aucune observation individuelle sélectionnée."); + + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneStatus.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneStatus.java new file mode 100644 index 0000000..6806581 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneStatus.java @@ -0,0 +1,15 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +/** + * Pour définir les différents états de la zone de notification des prélèvements. + * + * Created on 19/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public enum SamplingNotificationZoneStatus { + DISABLED, /* Not using algorithm */ + NEED_SAMPLING, /* Selected indivdual observation need sampling */ + COUNT_ATTAINED, /* Selected individual observation has attained one of his total count */ + NONE /* Nothing in special */ +} 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 592561c..d400df7 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,7 +136,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci protected IndividualObservationBatchTableHandler individualObservationBatchTableHandler; protected AverageWeightsHistogramHandler averageWeightsHistogramHandler; protected FrequenciesHistogramHandler frequenciesHistogramHandler; - protected IndividualObservationNotificationZoneHandler individualObservationNotificationZoneHandler; + protected SamplingNotificationZoneHandler samplingNotificationZoneHandler; protected Decorator<Caracteristic> caracteristicDecorator; protected Decorator<Caracteristic> caracteristicTipDecorator; @@ -481,7 +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); + this.samplingNotificationZoneHandler = new SamplingNotificationZoneHandler(ui); listenValidatorValid(ui.getValidator(), model); @@ -649,7 +649,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci individualObservationBatchTableHandler.initObservationsCache(speciesBatch, getDataContext().getFishingOperation()); - individualObservationNotificationZoneHandler.editBatch(speciesBatch); + samplingNotificationZoneHandler.editBatch(speciesBatch); // individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getRows()); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/revue_algorithme in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 2ce988a985c99d24a6a35772bd7dadb57a53b314 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:14:13 2016 +0200 Suppression des listeners sur le cache + revue du code du cache --- .../service/sampling/CruiseSamplingCache.java | 76 ++++------------------ .../IndividualObservationSamplingStatus.java | 14 ++++ .../tutti/service/sampling/SamplingEvent.java | 51 --------------- .../tutti/service/sampling/SamplingListener.java | 38 ----------- 4 files changed, 27 insertions(+), 152 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index 61507f6..7d8bed0 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -43,7 +43,6 @@ import fr.ifremer.tutti.util.Numbers; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import javax.swing.event.EventListenerList; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -98,10 +97,6 @@ public class CruiseSamplingCache implements CruiseCacheAble { */ private final Map<Integer, CaracteristicQualitativeValue> sexQualitativeValues; /** - * La liste des listeners. - */ - private final EventListenerList listeners = new EventListenerList(); - /** * Un drapeau pour indiquer qu'on est en train de construire le cache et donc ne déclancher aucun listener. */ private boolean loading; @@ -160,8 +155,6 @@ public class CruiseSamplingCache implements CruiseCacheAble { try { - int fishingOperationId = fishingOperation.getIdAsInt(); - for (IndividualObservationBatch individualObservationBatch : individualObservations) { Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = @@ -186,8 +179,6 @@ public class CruiseSamplingCache implements CruiseCacheAble { CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); -// CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = optionalCalcifiedPiecesSamplingDefinition.get(); - IndividualObservationSamplingContext individualObservationSamplingContext = createContext(fishingOperation.getIdAsInt(), species, @@ -236,8 +227,6 @@ public class CruiseSamplingCache implements CruiseCacheAble { try { - int fishingOperationId = fishingOperation.getIdAsInt(); - for (IndividualObservationBatch individualObservationBatch : individualObservations) { Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = @@ -260,8 +249,6 @@ public class CruiseSamplingCache implements CruiseCacheAble { CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); -// CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = optionalCalcifiedPiecesSamplingDefinition.get(); - IndividualObservationSamplingContext individualObservationSamplingContext = createContext(fishingOperation.getIdAsInt(), species, @@ -362,11 +349,6 @@ public class CruiseSamplingCache implements CruiseCacheAble { cpsDefinitionsBySpecies.clear(); maturityCaracteristicBySpecies.clear(); matureStatesByMaturityCracteristic.clear(); - SamplingListener[] samplingListeners = listeners.getListeners(SamplingListener.class); - for (SamplingListener listener : samplingListeners) { - removeSamplingListener(listener); - } - } @Override @@ -428,8 +410,16 @@ public class CruiseSamplingCache implements CruiseCacheAble { String fishingOperationSamplingKey = context.getFishingOperationSamplingKey(); CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.getSamplingData(fishingOperationSamplingKey); - return new IndividualObservationSamplingStatus(context, cruiseSamplingData, zoneSamplingData, fishingOperationSamplingData); + boolean needSampling; + if (individualObservationBatch.getSamplingCode() != null) { + needSampling = false; + } else { + int samplingInterval = context.getCalcifiedPiecesSamplingDefinition().getSamplingInterval(); + int cruiseIndividualObservationCount = cruiseSamplingData.getIndividualObservationCount(); + needSampling = cruiseIndividualObservationCount == 1 || samplingInterval == 1 || cruiseIndividualObservationCount % samplingInterval == 1; + } + return new IndividualObservationSamplingStatus(context, needSampling, cruiseSamplingData, zoneSamplingData, fishingOperationSamplingData); } /** @@ -652,14 +642,6 @@ public class CruiseSamplingCache implements CruiseCacheAble { return maturity; } - public void addSamplingListener(SamplingListener listener) { - listeners.add(SamplingListener.class, listener); - } - - public void removeSamplingListener(SamplingListener listener) { - listeners.remove(SamplingListener.class, listener); - } - public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById) { List<CacheExtractedKey> result = cruiseCache.getSamplingNumbers(speciesById, sexQualitativeValues); result.forEach(key -> { @@ -687,17 +669,6 @@ public class CruiseSamplingCache implements CruiseCacheAble { return cpsDefinitionsBySpecies.containsKey(species.getReferenceTaxonId()); } - private void fireSamplingNeeded(SamplingEvent event) { - - SamplingListener[] samplingListeners = listeners.getListeners(SamplingListener.class); - if (samplingListeners.length > 0) { - - for (SamplingListener listener : samplingListeners) { - listener.samplingNeeded(event); - } - } - } - private Optional<Zone> tryFindZone(TuttiLocation location) { Integer locationId = location.getIdAsInt(); @@ -763,32 +734,11 @@ public class CruiseSamplingCache implements CruiseCacheAble { CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.addOneIndividualObservation(fishingOperationSamplingKey); if (log.isInfoEnabled()) { - log.info("add individual observation " + cruiseSamplingKey + " => op " + fishingOperationSamplingData.getSamplingCount() + " / zone " + zoneSamplingData.getSamplingCount() + " / cruise " + cruiseSamplingData.getSamplingCount()); - } - - if (!isLoading()) { - - int samplingInterval = individualObservationSamplingContext.getCalcifiedPiecesSamplingDefinition().getSamplingInterval(); - int cruiseIndividualObservationCount = cruiseSamplingData.getIndividualObservationCount(); - if (cruiseIndividualObservationCount == 1 || samplingInterval == 1 || cruiseIndividualObservationCount % samplingInterval == 1) { - - IndividualObservationSamplingStatus status = new IndividualObservationSamplingStatus(individualObservationSamplingContext, cruiseSamplingData, zoneSamplingData, fishingOperationSamplingData); - SamplingEvent event = new SamplingEvent(this, status); - if (log.isInfoEnabled()) { - log.info("-> needs sampling"); - } - fireSamplingNeeded(event); - } - + log.info("add individual observation " + cruiseSamplingKey + " ⇒ op " + fishingOperationSamplingData + " / zone " + zoneSamplingData + " / cruise " + cruiseSamplingData); } } - /** - * Suppression d'un échantillon du cache. - * - * @param individualObservationSamplingContext le contexte de l'observation individuelle - */ private void removeIndividualObservation(IndividualObservationSamplingContext individualObservationSamplingContext) { Objects.requireNonNull(individualObservationSamplingContext); @@ -803,7 +753,7 @@ public class CruiseSamplingCache implements CruiseCacheAble { CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.removeOneIndividualObservation(fishingOperationSamplingKey); if (log.isInfoEnabled()) { - log.info("remove individual observation " + cruiseSamplingKey + " => op " + fishingOperationSamplingData.getSamplingCount() + " / zone " + zoneSamplingData.getSamplingCount() + " / cruise " + cruiseSamplingData.getSamplingCount()); + log.info("remove individual observation " + cruiseSamplingKey + " ⇒ op " + fishingOperationSamplingData + " / zone " + zoneSamplingData + " / cruise " + cruiseSamplingData); } } @@ -822,7 +772,7 @@ public class CruiseSamplingCache implements CruiseCacheAble { CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.addOneSampling(fishingOperationSamplingKey); if (log.isInfoEnabled()) { - log.info("add Sampling " + cruiseSamplingKey + " => op " + fishingOperationSamplingData.getSamplingCount() + " / zone " + zoneSamplingData.getSamplingCount() + " / cruise " + cruiseSamplingData.getSamplingCount()); + log.info("add sampling " + cruiseSamplingKey + " ⇒ op " + fishingOperationSamplingData + " / zone " + zoneSamplingData + " / cruise " + cruiseSamplingData); } } @@ -841,7 +791,7 @@ public class CruiseSamplingCache implements CruiseCacheAble { CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.removeOneSampling(fishingOperationSamplingKey); if (log.isInfoEnabled()) { - log.info("remove Sampling " + cruiseSamplingKey + " => op " + fishingOperationSamplingData.getSamplingCount() + " / zone " + zoneSamplingData.getSamplingCount() + " / cruise " + cruiseSamplingData.getSamplingCount()); + log.info("remove sampling " + cruiseSamplingKey + " ⇒ op " + fishingOperationSamplingData + " / zone " + zoneSamplingData + " / cruise " + cruiseSamplingData); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java index 92184c6..46dcfdb 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java @@ -50,11 +50,21 @@ public class IndividualObservationSamplingStatus { */ private final int samplingCountInZone; + /** + * Pour savoir si on demande un prélèvement. + */ + private final boolean needSampling; + public IndividualObservationSamplingStatus(IndividualObservationSamplingContext individualObservationSamplingContext, + boolean needSampling, CruiseSamplingInternalCache.SamplingData cruiseSamplingData, CruiseSamplingInternalCache.SamplingData zoneSamplingData, CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData) { Objects.requireNonNull(individualObservationSamplingContext); + Objects.requireNonNull(cruiseSamplingData); + Objects.requireNonNull(zoneSamplingData); + Objects.requireNonNull(fishingOperationSamplingData); + this.needSampling = needSampling; this.individualObservationSamplingContext = individualObservationSamplingContext; this.samplingCountInCruise = cruiseSamplingData.getSamplingCount(); this.individualObservationCountInCruise = cruiseSamplingData.getIndividualObservationCount(); @@ -68,6 +78,10 @@ public class IndividualObservationSamplingStatus { return individualObservationSamplingContext; } + public boolean isNeedSampling() { + return needSampling; + } + public CalcifiedPiecesSamplingDefinition getCalcifiedPiecesSamplingDefinition() { return individualObservationSamplingContext.getCalcifiedPiecesSamplingDefinition(); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java deleted file mode 100644 index f06583c..0000000 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.ifremer.tutti.service.sampling; - -/* - * #%L - * Tutti :: Service - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2012 - 2016 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% - */ - -import java.util.EventObject; - -/** - * @author Kevin Morin (Code Lutin) - * @since 4.5 - */ -public class SamplingEvent extends EventObject { - - private final IndividualObservationSamplingStatus status; - - public SamplingEvent(CruiseSamplingCache source, IndividualObservationSamplingStatus status) { - super(source); - this.status = status; - } - - @Override - public CruiseSamplingCache getSource() { - return (CruiseSamplingCache) super.getSource(); - } - - public IndividualObservationSamplingStatus getStatus() { - return status; - } - -} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingListener.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingListener.java deleted file mode 100644 index 8f14783..0000000 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingListener.java +++ /dev/null @@ -1,38 +0,0 @@ -package fr.ifremer.tutti.service.sampling; - -/* - * #%L - * Tutti :: Service - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2012 - 2016 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% - */ - -import java.util.EventListener; - -/** - * @author Kevin Morin (Code Lutin) - * @since 4.5 - */ -public interface SamplingListener extends EventListener { - - void samplingNeeded(SamplingEvent event); - -} - -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/revue_algorithme in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 41059a9cd2a86b5359d3715376f7899125a0aa23 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:15:11 2016 +0200 Suppression du statut de la ligne d'une observation (cela pose des problème sur la sélection dans par exemple l'éditeur des code de prélèvement qui se déclanche avant que la ligne soit sélectionnée) --- .../frequency/IndividualObservationBatchRowModel.java | 16 ---------------- 1 file changed, 16 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 9895745..8244875 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,7 +34,6 @@ 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; @@ -96,13 +95,6 @@ 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); @@ -144,14 +136,6 @@ 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 --// //------------------------------------------------------------------------// -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/revue_algorithme in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 48d0e067104b56a4afa32d552e77d17f264dcf71 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:16:51 2016 +0200 Revue du modèle de la zone de notification et de son handler --- .../frequency/SamplingNotificationZoneHandler.java | 96 +++++++++++----------- .../frequency/SamplingNotificationZoneModel.java | 12 +++ 2 files changed, 60 insertions(+), 48 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java index 0587d90..9c9b2b0 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneHandler.java @@ -8,7 +8,6 @@ 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; @@ -48,9 +47,9 @@ public class SamplingNotificationZoneHandler implements Closeable { private final JLabel samplingWarningLabel; private final JLabel samplingSummaryLabel; - private final SamplingListener samplingListener; private final ListSelectionListener listSelectionListener; private final PropertyChangeListener modelSummaryTextChanged; + private final PropertyChangeListener modelSelectedRowChanged; private final PropertyChangeListener modelStatusChanged; private final Decorator<Integer> infiniteDecorator; @@ -60,12 +59,12 @@ public class SamplingNotificationZoneHandler implements Closeable { private final Color colorHighlightInfoForeground; private final Color colorHighlightInfoBackground; - public SamplingNotificationZoneHandler(SpeciesFrequencyUI ui) { + public SamplingNotificationZoneHandler(SpeciesFrequencyUI ui, SamplingNotificationZoneModel model) { this.uiModel = ui.getModel(); this.samplingWarningLabel = ui.getSamplingWarningLabel(); this.samplingSummaryLabel = ui.getSamplingResumeLabel(); this.individualObservationTableModel = (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); - this.model = new SamplingNotificationZoneModel(); + this.model = model; this.listSelectionModel = ui.getObsTable().getSelectionModel(); SpeciesFrequencyUIHandler uiHandler = ui.getHandler(); @@ -76,16 +75,6 @@ public class SamplingNotificationZoneHandler implements Closeable { this.colorHighlightInfoForeground = uiHandler.getConfig().getColorHighlightInfoForeground(); this.colorHighlightInfoBackground = uiHandler.getConfig().getColorHighlightInfoBackground(); - // 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()); - - } - }; - // Ecoute le changement d'état de la zone de notification pour mettre à jour le statut this.modelStatusChanged = event -> { @@ -132,6 +121,34 @@ public class SamplingNotificationZoneHandler implements Closeable { }; + this.modelSelectedRowChanged = event -> { + + IndividualObservationBatchRowModel selectedRow = (IndividualObservationBatchRowModel) event.getNewValue(); + + if (selectedRow == null) { + + whenCanNotUseSampling("Aucune observation individuelle sélectionnée."); + return; + } + + try { + + // récupération du status de l'observation individuelle + IndividualObservationSamplingStatus status = individualObservationUICache.getIndividualObservationSamplingStatus(selectedRow); + + // mise à jour de la zone de notification + 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."); + } + + }; + // Ecoute la sélection sur le tableau des observations individuelles pour rafraîchir la zone de notification this.listSelectionListener = event -> { @@ -142,7 +159,7 @@ public class SamplingNotificationZoneHandler implements Closeable { } if (source.isSelectionEmpty()) { - whenCanNotUseSampling("Aucune observation individuelle sélectionnée."); + model.setSelectedRow(null); return; } @@ -152,23 +169,7 @@ public class SamplingNotificationZoneHandler implements Closeable { } IndividualObservationBatchRowModel selectedRow = individualObservationTableModel.getEntry(source.getMinSelectionIndex()); - - // on commence toujours par supprimer le status de cette ligne - selectedRow.setIndividualObservationSamplingStatus(null); - - 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."); - } + model.setSelectedRow(selectedRow); }; @@ -183,13 +184,12 @@ public class SamplingNotificationZoneHandler implements Closeable { // toujours supprimer les listeners listSelectionModel.removeListSelectionListener(listSelectionListener); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SELECTED_ROW, modelSelectedRowChanged); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); - if (individualObservationUICache.useCruiseSamplingCache()) { - individualObservationUICache.getCruiseSamplingCache().removeSamplingListener(samplingListener); - } // on les ajoutent (on peut en avoir besoin pour désactiver la zone de notification) model.addPropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.addPropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SELECTED_ROW, modelSelectedRowChanged); model.addPropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); if (!individualObservationUICache.isProtocolFilled()) { @@ -224,7 +224,6 @@ public class SamplingNotificationZoneHandler implements Closeable { model.reset(); - individualObservationUICache.getCruiseSamplingCache().addSamplingListener(samplingListener); listSelectionModel.addListSelectionListener(listSelectionListener); } @@ -233,41 +232,42 @@ public class SamplingNotificationZoneHandler implements Closeable { public void close() { listSelectionModel.removeListSelectionListener(listSelectionListener); - if (individualObservationUICache.useCruiseSamplingCache()) { - individualObservationUICache.getCruiseSamplingCache().removeSamplingListener(samplingListener); - } model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SELECTED_ROW, modelSelectedRowChanged); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); } private void whenCanNotUseSampling(String message) { + model.setSummaryText(message); model.setSamplingNotificationZoneStatus(SamplingNotificationZoneStatus.DISABLED); + } private void stopUsingStatusNotication(String message) { whenCanNotUseSampling(message); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SAMPLING_STATUS, modelStatusChanged); + model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SELECTED_ROW, modelSelectedRowChanged); model.removePropertyChangeListener(SamplingNotificationZoneModel.PROPERTY_SUMMARY_TEXT, modelSummaryTextChanged); } - private void whenSamplingNeeded(IndividualObservationSamplingStatus status) { + private void whenUpdateSummary(IndividualObservationSamplingStatus status) { model.setSummaryText(getSummaryText(status)); - model.setSamplingNotificationZoneStatus(SamplingNotificationZoneStatus.NEED_SAMPLING); - - } - private void whenUpdateSummary(IndividualObservationSamplingStatus status) { + SamplingNotificationZoneStatus zoneStatus; - model.setSummaryText(getSummaryText(status)); + if (status.isNeedSampling()) { + zoneStatus = SamplingNotificationZoneStatus.NEED_SAMPLING; + } else if (status.isOneTotalCountIsAttained()) { + zoneStatus = SamplingNotificationZoneStatus.COUNT_ATTAINED; + } else { + zoneStatus = SamplingNotificationZoneStatus.NONE; + } - SamplingNotificationZoneStatus zoneStatus = status.isOneTotalCountIsAttained() ? - SamplingNotificationZoneStatus.COUNT_ATTAINED : - SamplingNotificationZoneStatus.NONE; model.setSamplingNotificationZoneStatus(zoneStatus); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java index 6e6547d..1572e0d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SamplingNotificationZoneModel.java @@ -11,7 +11,9 @@ public class SamplingNotificationZoneModel extends AbstractSerializableBean { public static final String PROPERTY_SAMPLING_STATUS = "samplingNotificationZoneStatus"; public static final String PROPERTY_SUMMARY_TEXT = "summaryText"; + public static final String PROPERTY_SELECTED_ROW = "selectedRow"; + private IndividualObservationBatchRowModel selectedRow; private SamplingNotificationZoneStatus samplingNotificationZoneStatus; private String summaryText; @@ -41,4 +43,14 @@ public class SamplingNotificationZoneModel extends AbstractSerializableBean { setSummaryText("Aucune observation individuelle sélectionnée."); } + + public IndividualObservationBatchRowModel getSelectedRow() { + return selectedRow; + } + + public void setSelectedRow(IndividualObservationBatchRowModel selectedRow) { + this.selectedRow = selectedRow; + firePropertyChange(PROPERTY_SELECTED_ROW, null /* On force la propagation de l'évènement! */, selectedRow); + } + } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/revue_algorithme in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit e899b8ab8b822120a6c46d62938d24f881c3ef9f Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:17:14 2016 +0200 traduction perdue --- tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 4f46f12..647a22e 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 @@ -1533,8 +1533,7 @@ tutti.editSpeciesFrequencies.samplingNeeded.immature=Immature 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= +tutti.editSpeciesFrequencies.samplingNeeded.warning=<html><body><strong>Prélevez les pièces calcifiées \!</body></html> 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 -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/revue_algorithme in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit af55cbb697ba72eda6aafeef1e2a769230855b46 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:17:38 2016 +0200 Renommage méthode + suppression méthode non utilisée --- .../catches/species/frequency/IndividualObservationUICache.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) 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 23a149a..f487a6a 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 @@ -171,10 +171,6 @@ public class IndividualObservationUICache implements Closeable { .forEach(individualObservationRow -> addSamplingCodeNotAvailable(individualObservationRow.getSamplingCode())); } - public CruiseSamplingCache getCruiseSamplingCache() { - return cruiseSamplingCache; - } - public boolean isFishingOperationWithZone() { return fishingOperationZone != null; } @@ -198,7 +194,7 @@ public class IndividualObservationUICache implements Closeable { this.fishingOperation = null; } - public IndividualObservationSamplingStatus getIndividualObservationStatus(IndividualObservationBatchRowModel row) throws CalcifiedPiecesSamplingAlgorithmEntryNotFoundException, SizeNotDefinedOnIndividualObservationException, ZoneNotDefinedOnFishingOperationException { + public IndividualObservationSamplingStatus getIndividualObservationSamplingStatus(IndividualObservationBatchRowModel row) throws CalcifiedPiecesSamplingAlgorithmEntryNotFoundException, SizeNotDefinedOnIndividualObservationException, ZoneNotDefinedOnFishingOperationException { Float size = row.getSize(); return cruiseSamplingCache.getIndividualObservationSamplingStatus(fishingOperation, -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/revue_algorithme in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 7de63b3196d6cab28a601e6d1d7cfd88b589b0b6 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Apr 20 02:27:52 2016 +0200 Normalement on a le bon flow pour la rafraichissement de la zone de notification des prélèvements + nettoyage de code --- .../IndividualObservationBatchTableHandler.java | 139 +++++---------------- .../IndividualObservationBatchUIModel.java | 7 ++ .../frequency/SpeciesFrequencyUIHandler.java | 11 +- 3 files changed, 39 insertions(+), 118 deletions(-) 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 c68e7d3..37eacb1 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 @@ -103,7 +103,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { if (!optionalCruiseCache.isPresent()) { throw new IllegalStateException("Can't find cruise cache"); } - this.individualObservationUICache = new IndividualObservationUICache(optionalCruiseCache.get(), model, uiHandler.getDataContext()); + this.individualObservationUICache = new IndividualObservationUICache(optionalCruiseCache.get(), model, dataContext); this.individualObservationTable = ui.getObsTable(); this.frequencyTableModel = uiHandler.getTableModel(); this.individualObservationToFrequencyEngine = new IndividualObservationToFrequencyEngine(model2.getIndividualObservationWeightUnit()); @@ -120,6 +120,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { CaracteristicQualitativeValue gender = model2.getGender(row); CaracteristicQualitativeValue maturity = model2.getMaturityValue(row); + boolean recomputeSamplingNotificationZone = false; switch (propertyName) { case IndividualObservationBatchRowModel.PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE: { @@ -139,6 +140,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { float lengthStepToDecrement = optionalDecrementSize.get(); frequencyTableModel.decrementFrequencyRowsNumbers(lengthStepToDecrement); individualObservationUICache.decrementsObservationNb(gender, maturity, lengthStepToDecrement, row.getSamplingCode()); + recomputeSamplingNotificationZone = true; } Optional<Float> optionalIncrementSize = frequencyUpdate.getIncrementSize(); @@ -146,6 +148,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { float lengthStepToIncrement = optionalIncrementSize.get(); frequencyTableModel.incrementFrequencyRowsNumbers(lengthStepToIncrement); individualObservationUICache.incrementsObservationNb(gender, maturity, lengthStepToIncrement, row.getSamplingCode()); + recomputeSamplingNotificationZone = true; } Optional<Pair<Float, Float>> optionalSubstractWeight = frequencyUpdate.getSubstractWeight(); @@ -176,73 +179,11 @@ public class IndividualObservationBatchTableHandler implements Closeable { } break; -// case IndividualObservationBatchRowModel.PROPERTY_SIZE: { -// -// Float oldValue = (Float) evt.getOldValue(); -// Float newValue = (Float) evt.getNewValue(); -// -// if (oldValue != null) { -// individualObservationUICache.decrementsObservationNb(gender, maturity, oldValue, row.getSamplingCode()); -// } -// if (newValue != null) { -// individualObservationUICache.incrementsObservationNb(gender, maturity, newValue, row.getSamplingCode()); -// } -// -// // we only update the frequencies if the row is valid -// if (row.isValid() && model.mustCopyIndividualObservationSize()) { -// -// if (oldValue != null) { -// frequencyTableModel.decrementFrequencyRowsNumbers(oldValue); -// } -// if (newValue != null) { -// frequencyTableModel.incrementFrequencyRowsNumbers(newValue); -// } -// -// if (model.isCopyIndividualObservationAll() && row.withWeight()) { -// float weight = row.getWeight(); -// if (oldValue != null) { -// frequencyTableModel.removeWeightToFrequencyRow(oldValue, weight); -// } -// if (newValue != null) { -// frequencyTableModel.addWeightToFrequencyRow(newValue, weight); -// } -// } -// } -// } -// break; -// -// case IndividualObservationBatchRowModel.PROPERTY_WEIGHT: -// if (row.isValid() && model.isCopyIndividualObservationAll()) { -// -// Float oldValue = (Float) evt.getOldValue(); -// Float newValue = (Float) evt.getNewValue(); -// Float weightToAdd; -// -// if (oldValue == null) { -// weightToAdd = newValue; -// -// } else if (newValue == null) { -// weightToAdd = -oldValue; -// -// } else { -// weightToAdd = newValue - oldValue; -// } -// -// WeightUnit weightUnit = model.getWeightUnit(); -// -// if (weightUnit.isNotNullNorZero(weightToAdd)) { -// if (weightUnit.isGreaterThanZero(weightToAdd)) { -// frequencyTableModel.addWeightToFrequencyRow(row, weightToAdd); -// } else { -// frequencyTableModel.removeWeightToFrequencyRow(row, -weightToAdd); -// } -// } -// } -// break; - case IndividualObservationBatchRowModel.PROPERTY_DEFAULT_CARACTERISTICS: case IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS: + if (row.withSize()) { + CaracteristicMap oldValue = (CaracteristicMap) evt.getOldValue(); CaracteristicMap newValue = (CaracteristicMap) evt.getNewValue(); @@ -259,6 +200,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { if (!Objects.equals(oldMaturity, newMaturity)) { individualObservationUICache.decrementsObservationNb(gender, oldMaturity, row.getSize()); individualObservationUICache.incrementsObservationNb(gender, newMaturity, row.getSize(), row.getSamplingCode()); + recomputeSamplingNotificationZone = true; } } @@ -267,8 +209,11 @@ public class IndividualObservationBatchTableHandler implements Closeable { if (!Objects.equals(oldGender, newGender)) { individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), row.getSamplingCode()); + recomputeSamplingNotificationZone = true; } + } + break; case IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE: @@ -288,39 +233,31 @@ public class IndividualObservationBatchTableHandler implements Closeable { if (row.withSize()) { - float size = row.getSize(); + boolean removeSampling = withOldSamplingCode && !withNewSamplingCode; + boolean addSampling = withNewSamplingCode && !withOldSamplingCode; + + if (removeSampling) { + + individualObservationUICache.decrementsSamplingNb(gender, maturity, row.getSize()); + recomputeSamplingNotificationZone = true; + + } else if (addSampling) { + + individualObservationUICache.incrementsSamplingNb(gender, maturity, row.getSize()); + recomputeSamplingNotificationZone = true; - if (withOldSamplingCode) { - individualObservationUICache.decrementsSamplingNb(gender, maturity, size); - } - if (withNewSamplingCode) { - individualObservationUICache.incrementsSamplingNb(gender, maturity, size); } } + break; -// case IndividualObservationBatchRowModel.PROPERTY_VALID: -// // if the row's valid state changes, then remove or readd it to the frequencies -// if (!model.isRowComputationInProgress()) { -// -// boolean oldValue = (boolean) evt.getOldValue(); -// boolean newValue = (boolean) evt.getNewValue(); -// -// if (oldValue && model.mustCopyIndividualObservationSize()) { -// -// frequencyTableModel.decrementFrequencyRowsNumbers(row); -// } -// if (newValue) { -// if (model.mustCopyIndividualObservationSize()) { -// frequencyTableModel.incrementFrequencyRowsNumbers(row); -// } -// if (model.isCopyIndividualObservationAll() && row.withWeight()) { -// frequencyTableModel.addWeightToFrequencyRow(row, row.getWeight()); -// } -// } -// } -// break; + } + + if (recomputeSamplingNotificationZone) { + + // recalcul de la zone de notification + model2.getSamplingNotificationZoneModel().setSelectedRow(row); } // model2.recomputeRowValidState(row); @@ -479,24 +416,6 @@ 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); -// }); - model2.addPropertyChangeListener(IndividualObservationBatchUIModel.PROPERTY_ROWS, evt -> individualObservationTableModel.setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue())); // Pour bloquer le changement du mode de recopie des observations individuelles → mensurations diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java index d5f1d0c..7c7f4b6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java @@ -54,6 +54,8 @@ public class IndividualObservationBatchUIModel extends AbstractTuttiTableUIModel */ private Collection<Caracteristic> notEditableCaracteristic; + private final SamplingNotificationZoneModel samplingNotificationZoneModel; + @Override protected SpeciesBatchRowModel newEntity() { return null; // Jamais utilisé! @@ -64,6 +66,11 @@ public class IndividualObservationBatchUIModel extends AbstractTuttiTableUIModel this.sexCaracteristic = sexCaracteristic; this.individualObservationWeightUnit = individualObservationWeightUnit; this.defaultCaracteristic = defaultCaracteristic == null ? new ArrayList<>() : new ArrayList<>(defaultCaracteristic); + this.samplingNotificationZoneModel = new SamplingNotificationZoneModel(); + } + + public SamplingNotificationZoneModel getSamplingNotificationZoneModel() { + return samplingNotificationZoneModel; } public WeightUnit getIndividualObservationWeightUnit() { 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 d400df7..5e9960f 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 @@ -481,7 +481,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci this.individualObservationBatchTableHandler = new IndividualObservationBatchTableHandler(ui); this.averageWeightsHistogramHandler = new AverageWeightsHistogramHandler(ui); this.frequenciesHistogramHandler = new FrequenciesHistogramHandler(ui); - this.samplingNotificationZoneHandler = new SamplingNotificationZoneHandler(ui); + this.samplingNotificationZoneHandler = new SamplingNotificationZoneHandler(ui, model.getIndividualObservationModel().getSamplingNotificationZoneModel()); listenValidatorValid(ui.getValidator(), model); @@ -510,9 +510,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci IOUtils.closeQuietly(individualObservationBatchTableHandler); IOUtils.closeQuietly(averageWeightsHistogramHandler); IOUtils.closeQuietly(frequenciesHistogramHandler); - IOUtils.closeQuietly(individualObservationBatchTableHandler); - -// resetSamplingLabel(); + IOUtils.closeQuietly(samplingNotificationZoneHandler); frequencyEditor = null; @@ -535,10 +533,9 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci EditSpeciesBatchPanelUI parent = getParentContainer(EditSpeciesBatchPanelUI.class); parent.switchToEditBatch(); + //FIXME Voir si on doit encore faire ça après le switch ? je pense que oui... // // on supprime la colonne maturité en fermant, pour avoir les même colonnes qu'à la création de l'écran (important pour la swing session) // removeMaturityColumnIfPresent(); -// -// individualObservationUICache.close(); } @@ -1083,8 +1080,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci boolean sampleCodeMenusEnabled = individualObservationBatchTableHandler.isSampleCodeMenusEnabled(modelRowIndex); -// boolean sampleCodeMenusEnabled = modelRowIndex >= 0 && ui.getObsTable().getSelectedRowCount() == 1 -// && getObsTableModel().getRows().get(ui.getObsTable().getSelectedRow()).withSamplingCode(); ui.getEditSampleCodeMenu().setEnabled(sampleCodeMenusEnabled); ui.getDeleteSampleCodeMenu().setEnabled(sampleCodeMenusEnabled); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm