branch develop updated (2aad139 -> 9b9430d)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git from 2aad139 Quand on quitte un écran, on nettoye les validateurs new 1d6b0ed Mauvais flow, c'est pas faute de l'avoir dit pleins de fois... new 1a78521 Ajout d'une classe pour gérer les unités new 138580c Correction de l'apgorithme de comparaision de poids new 278f703 En avant la musique... création de modèles et controleurs... new 9844616 Réécriture de la logique du mode de recopie + continue le nettoyage du code new e2b4392 Correction de l'unité utilisée pour le graphique des poids moyens new 1028129 Introduction modele pour la partie observations individuelles + du menache new 9b9430d Livrable #8245 Merge branch 'feature/8245' into develop 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 9b9430d081a7902c006189fd45e2d90ed017a5fb Merge: 2aad139 1028129 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Apr 16 11:16:24 2016 +0200 Livrable #8245 Merge branch 'feature/8245' into develop commit 10281292f9f06aace81f0b439edbc021938b063c Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Apr 16 11:15:20 2016 +0200 Introduction modele pour la partie observations individuelles + du menache commit e2b4392dca98d96754cd8ea3d290c63f889b335b Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Apr 16 07:56:39 2016 +0200 Correction de l'unité utilisée pour le graphique des poids moyens commit 9844616e718e71252ef0e82b732b664279cc9986 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 15 23:30:14 2016 +0200 Réécriture de la logique du mode de recopie + continue le nettoyage du code commit 278f70357eabf2563a71be3f617ab0c95efcf6ab Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 15 09:52:50 2016 +0200 En avant la musique... création de modèles et controleurs... commit 138580c9b2f7462a3f4f22f15802586ab8e2026b Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 15 09:46:35 2016 +0200 Correction de l'apgorithme de comparaision de poids commit 1a78521fce03c26f899a8c3bbb68eb8602864070 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 15 09:46:20 2016 +0200 Ajout d'une classe pour gérer les unités commit 1d6b0ed3ab81dbf4b22e88500ee709cdece07d80 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Apr 14 17:33:49 2016 +0200 Mauvais flow, c'est pas faute de l'avoir dit pleins de fois... Summary of changes: .../entities/referential/TaxonCache.java | 3 + .../java/fr/ifremer/tutti/type/WeightUnit.java | 15 +- .../src/main/java/fr/ifremer/tutti/util/Units.java | 13 + .../accidental/AccidentalBatchUIHandler.java | 2 +- .../SamplingCodeCellEditor.java | 2 + .../catches/species/edit/SpeciesBatchRowModel.java | 2 +- .../species/edit/SpeciesBatchUIHandler.java | 2 +- .../frequency/AverageWeightsHistogramHandler.java | 156 +++ .../frequency/AverageWeightsHistogramModel.java | 117 +++ .../frequency/FrequenciesHistogramHandler.java | 164 +++ .../frequency/FrequenciesHistogramModel.java | 107 ++ .../IndividualObservationBatchRowModel.java | 38 +- .../IndividualObservationBatchRowState.java | 61 ++ .../IndividualObservationBatchTableHandler.java | 712 +++++++++++++ .../IndividualObservationBatchTableModel.java | 124 ++- .../IndividualObservationBatchUIModel.java | 206 ++++ .../IndividualObservationToFrequencyEngine.java | 268 +++++ .../frequency/IndividualObservationUICache.java | 25 +- .../frequency/SpeciesFrequencyCellComponent.java | 12 +- .../frequency/SpeciesFrequencyLogRowModel.java | 1 - .../frequency/SpeciesFrequencyTableModel.java | 312 +++--- .../species/frequency/SpeciesFrequencyUI.jaxx | 2 +- .../frequency/SpeciesFrequencyUIHandler.java | 1111 +++++--------------- .../species/frequency/SpeciesFrequencyUIModel.java | 418 ++------ .../actions/ApplySpeciesFrequencyRafaleAction.java | 110 +- .../frequency/actions/DeleteSampleCodeAction.java | 4 +- .../DeleteSpeciesFrequencyLogRowAction.java | 2 +- .../frequency/actions/EditSampleCodeAction.java | 4 +- .../GenerateSpeciesFrequencyLengthStepsAction.java | 59 +- .../ImportMultiPostSpeciesSupportAction.java | 70 +- .../frequency/actions/RemoveObservationAction.java | 20 +- .../actions/ResetSpeciesFrequencyAction.java | 2 +- .../util/table/AbstractTuttiTableUIModel.java | 14 +- 33 files changed, 2580 insertions(+), 1578 deletions(-) create mode 100644 tutti-persistence/src/main/java/fr/ifremer/tutti/util/Units.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramHandler.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramModel.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramHandler.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramModel.java rename tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/{individualobservation => species/frequency}/IndividualObservationBatchRowModel.java (91%) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowState.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java rename tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/{individualobservation => species/frequency}/IndividualObservationBatchTableModel.java (69%) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.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 develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 1d6b0ed3ab81dbf4b22e88500ee709cdece07d80 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Apr 14 17:33:49 2016 +0200 Mauvais flow, c'est pas faute de l'avoir dit pleins de fois... --- .../frequency/actions/ApplySpeciesFrequencyRafaleAction.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java index 299af42..d560dab 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java @@ -79,8 +79,6 @@ public class ApplySpeciesFrequencyRafaleAction { float aroundLengthStep = model.getLengthStep(step); - model.setInRafaleRowCreation(true); - if (model.isCopyIndividualObservationNothing()) { SpeciesFrequencyTableModel tableModel = handler.getTableModel(); @@ -147,8 +145,14 @@ public class ApplySpeciesFrequencyRafaleAction { int rowIndex = obsTableModel.getRowIndex(obsRow); SwingUtilities.invokeLater(() -> { - selectRow(ui.getObsTable(), rowIndex); - model.setInRafaleRowCreation(false); + + model.setInRafaleRowCreation(true); + try { + selectRow(ui.getObsTable(), rowIndex); + } finally { + model.setInRafaleRowCreation(false); + } + }); } -- 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 develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 1a78521fce03c26f899a8c3bbb68eb8602864070 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 15 09:46:20 2016 +0200 Ajout d'une classe pour gérer les unités --- .../src/main/java/fr/ifremer/tutti/util/Units.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/util/Units.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/util/Units.java new file mode 100644 index 0000000..e2c8839 --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/util/Units.java @@ -0,0 +1,13 @@ +package fr.ifremer.tutti.util; + +/** + * Created on 15/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class Units { + + public static String getLabelWithUnit(String label, String unit) { + return label + " (" + unit + ")"; + } +} -- 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 develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 138580c9b2f7462a3f4f22f15802586ab8e2026b Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 15 09:46:35 2016 +0200 Correction de l'apgorithme de comparaision de poids --- .../src/main/java/fr/ifremer/tutti/type/WeightUnit.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/type/WeightUnit.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/type/WeightUnit.java index 39cd373..a2d309c 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/type/WeightUnit.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/type/WeightUnit.java @@ -100,7 +100,7 @@ public enum WeightUnit implements Comparator<Float> { Objects.requireNonNull(v0, "can not compare null weights"); Objects.requireNonNull(v1, "can not compare null weights"); - float delta = round(v0) - round(v1); + float delta = roundWithSign(v0) - roundWithSign(v1); int result; if (delta > rawPrecision) { // v0 > v1 @@ -173,6 +173,19 @@ public enum WeightUnit implements Comparator<Float> { return result; } + public Float roundWithSign(Float weight) { + Float result; + if (weight == null) { + result = null; + } else { + + BigDecimal sumB = new BigDecimal(String.valueOf(weight)) + .setScale(numberDigits, BigDecimal.ROUND_HALF_UP); + result = sumB.floatValue(); + } + return result; + } + public String decorateLabel(String label) { return String.format("%s (%s)", label, getShortLabel()); } -- 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 develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 278f70357eabf2563a71be3f617ab0c95efcf6ab Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 15 09:52:50 2016 +0200 En avant la musique... création de modèles et controleurs... --- .../accidental/AccidentalBatchUIHandler.java | 2 +- .../SamplingCodeCellEditor.java | 2 + .../catches/species/edit/SpeciesBatchRowModel.java | 2 +- .../species/edit/SpeciesBatchUIHandler.java | 2 +- .../frequency/AverageWeightsHistogramHandler.java | 156 ++ .../frequency/AverageWeightsHistogramModel.java | 120 ++ .../frequency/FrequenciesHistogramHandler.java | 166 ++ .../frequency/FrequenciesHistogramModel.java | 113 ++ .../IndividualObservationBatchRowModel.java | 2 +- .../IndividualObservationBatchTableHandler.java | 665 ++++++++ .../IndividualObservationBatchTableModel.java | 67 +- .../frequency/IndividualObservationUICache.java | 1 - .../frequency/SpeciesFrequencyCellComponent.java | 1 - .../frequency/SpeciesFrequencyLogRowModel.java | 1 - .../frequency/SpeciesFrequencyTableModel.java | 111 +- .../species/frequency/SpeciesFrequencyUI.jaxx | 2 +- .../frequency/SpeciesFrequencyUIHandler.java | 1651 +++++++++++--------- .../species/frequency/SpeciesFrequencyUIModel.java | 107 +- .../actions/ApplySpeciesFrequencyRafaleAction.java | 4 +- .../frequency/actions/DeleteSampleCodeAction.java | 4 +- .../DeleteSpeciesFrequencyLogRowAction.java | 2 +- .../frequency/actions/EditSampleCodeAction.java | 4 +- .../ImportMultiPostSpeciesSupportAction.java | 2 +- .../frequency/actions/RemoveObservationAction.java | 4 +- 24 files changed, 2303 insertions(+), 888 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUIHandler.java index b2df417..54725bc 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUIHandler.java @@ -38,7 +38,7 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.accidental.create.CreateAccidentalBatchUIModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; import fr.ifremer.tutti.ui.swing.util.TuttiUI; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/SamplingCodeCellEditor.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/SamplingCodeCellEditor.java index 7cfacdc..69e228f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/SamplingCodeCellEditor.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/SamplingCodeCellEditor.java @@ -25,6 +25,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservatio import com.google.common.base.Preconditions; import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.util.TuttiUI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/edit/SpeciesBatchRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/edit/SpeciesBatchRowModel.java index 950cc31..6d861f2 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/edit/SpeciesBatchRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/edit/SpeciesBatchRowModel.java @@ -37,7 +37,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchs; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.type.WeightUnit; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentModelAware; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/edit/SpeciesBatchUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/edit/SpeciesBatchUIHandler.java index 096058c..3a0f650 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/edit/SpeciesBatchUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/edit/SpeciesBatchUIHandler.java @@ -42,7 +42,7 @@ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.ValidationService; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.content.operation.catches.AbstractTuttiBatchTableUIHandler; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.create.CreateSpeciesBatchUIModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyCellComponent; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramHandler.java new file mode 100644 index 0000000..bf610c2 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramHandler.java @@ -0,0 +1,156 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import fr.ifremer.tutti.ui.swing.util.TuttiNumberTickUnitSource; +import fr.ifremer.tutti.util.Units; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.axis.NumberTickUnitSource; +import org.jfree.chart.axis.ValueAxis; +import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; + +import javax.swing.JFrame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.Closeable; + +import static org.nuiton.i18n.I18n.t; + +/** + * To manage the average weights histogram. + * + * Created on 14/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class AverageWeightsHistogramHandler implements Closeable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(AverageWeightsHistogramHandler.class); + + private final AverageWeightsHistogramModel model; + + private final JFreeChart chart; + private final JFrame popup; + + public AverageWeightsHistogramHandler(SpeciesFrequencyUI ui) { + + SpeciesFrequencyUIHandler uiHandler = ui.getHandler(); + SpeciesFrequencyUIModel uiModel = ui.getModel(); + + model = uiModel.getAverageWeightsHistogramModel(); + + chart = ChartFactory.createXYLineChart(null, + t("tutti.editSpeciesFrequencies.table.header.lengthStep"), + model.getIndividualObservationWeightUnit().decorateLabel(t("tutti.editSpeciesFrequencies.averageWeight.label")), + model.getDataset()); + chart.clearSubtitles(); + + ValueAxis rangeAxis = chart.getXYPlot().getRangeAxis(); + rangeAxis.setAutoRange(true); + rangeAxis.setStandardTickUnits(new NumberTickUnitSource()); + rangeAxis.setMinorTickMarksVisible(true); + + ValueAxis domainAxis = chart.getXYPlot().getDomainAxis(); + domainAxis.setAutoRange(true); + domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); + domainAxis.setMinorTickMarksVisible(true); + + XYLineAndShapeRenderer plotRenderer = (XYLineAndShapeRenderer) chart.getXYPlot().getRenderer(); + plotRenderer.setSeriesPaint(0, uiHandler.getConfig().getColorComputedWeights()); + plotRenderer.setBaseShapesVisible(true); + + ChartPanel chartPanel = new ChartPanel(chart); + chartPanel.setDomainZoomable(false); + chartPanel.setMouseZoomable(false); + chartPanel.setPopupMenu(null); + + popup = new JFrame(); + popup.getContentPane().add(chartPanel); + popup.pack(); + + // when step has changed in model, update chart + uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_STEP, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + Float step1 = (Float) evt.getNewValue(); + model.setStep(step1); + + } + }); + + // when lengthStepCaracteristicUnit changed, let's updates the label of some fields + uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_LENGTH_STEP_CARACTERISTIC_UNIT, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + String unit = (String) evt.getNewValue(); + + if (unit == null) { + + unit = t("tutti.editSpeciesFrequencies.unkownStepUnit"); + } + + String lengthStepLabelWithUnit = Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.table.header.lengthStep"), unit); + model.setLengthStepLabelWithUnit(lengthStepLabelWithUnit); + + } + }); + + model.addPropertyChangeListener(AverageWeightsHistogramModel.PROPERTY_TITLE, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String title = (String) evt.getNewValue(); + if (log.isInfoEnabled()) { + log.info("Average weights graph title changed to: " + title); + } + popup.setTitle(title); + } + }); + + model.addPropertyChangeListener(AverageWeightsHistogramModel.PROPERTY_LENGTH_STEP_LABEL_WITH_UNIT, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String lengthStepLabelWithUnit = (String) evt.getNewValue(); + if (log.isInfoEnabled()) { + log.info("Average weights graph lengthStepLabelWithUnit changed to: " + lengthStepLabelWithUnit); + } + chart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); + } + }); + + model.addPropertyChangeListener(AverageWeightsHistogramModel.PROPERTY_STEP, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + Float step = (Float) evt.getNewValue(); + if (log.isInfoEnabled()) { + log.info("Average weights graph step changed to: " + step); + } + chart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step == 1f)); + model.getDataset().setIntervalWidth(step); + + } + }); + + // Show graphic in popup when fires button action + ui.getGraphAverageWeightButton().addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + popup.setVisible(true); + } + }); + + } + + @Override + public void close() { + popup.dispose(); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramModel.java new file mode 100644 index 0000000..fdf1375 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramModel.java @@ -0,0 +1,120 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import fr.ifremer.tutti.type.WeightUnit; +import fr.ifremer.tutti.util.Weights; +import org.jdesktop.beans.AbstractSerializableBean; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; + +import java.util.List; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 15/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class AverageWeightsHistogramModel extends AbstractSerializableBean { + + public static final String PROPERTY_TITLE = "title"; + public static final String PROPERTY_LENGTH_STEP_LABEL_WITH_UNIT = "lengthStepLabelWithUnit"; + public static final String PROPERTY_STEP = "step"; + + /** + * To store average weights graph series. + * + * @since 4.5 + */ + private final XYSeriesCollection dataset; + protected final XYSeries series; + + private final WeightUnit frequencyWeightUnit; + private final WeightUnit individualObservationWeightUnit; + + private String title; + private String lengthStepLabelWithUnit; + private Float step; + + public AverageWeightsHistogramModel(WeightUnit frequencyWeightUnit, WeightUnit individualObservationWeightUnit) { + this.frequencyWeightUnit = frequencyWeightUnit; + this.individualObservationWeightUnit = individualObservationWeightUnit; + + series = new XYSeries("", true, false); + dataset = new XYSeriesCollection(series); + dataset.setIntervalPositionFactor(0); + dataset.setIntervalWidth(0); + + } + + public WeightUnit getIndividualObservationWeightUnit() { + return individualObservationWeightUnit; + } + + public XYSeriesCollection getDataset() { + return dataset; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + + title = title + frequencyWeightUnit.decorateLabel(t("tutti.editSpeciesFrequencies.field.graphAverageWeight")); + + Object oldValue = getTitle(); + this.title = title; + firePropertyChange(PROPERTY_TITLE, oldValue, title); + } + + public String getLengthStepLabelWithUnit() { + return lengthStepLabelWithUnit; + } + + public void setLengthStepLabelWithUnit(String lengthStepLabelWithUnit) { + Object oldValue = getLengthStepLabelWithUnit(); + this.lengthStepLabelWithUnit = lengthStepLabelWithUnit; + firePropertyChange(PROPERTY_LENGTH_STEP_LABEL_WITH_UNIT, oldValue, lengthStepLabelWithUnit); + } + + public Float getStep() { + return step; + } + + public void setStep(Float step) { + Object oldValue = getStep(); + this.step = step; + firePropertyChange(PROPERTY_STEP, oldValue, step); + } + + public void reloadRows(List<SpeciesFrequencyRowModel> rows) { + + series.clear(); + + if (rows != null) { + + rows.stream().filter(SpeciesFrequencyRowModel::isValid).forEach(this::addOrUpdate); + + } + + } + + public void addOrUpdate(SpeciesFrequencyRowModel row) { + + Float weight = Weights.convert(frequencyWeightUnit, individualObservationWeightUnit, row.computeAverageWeight()); + series.addOrUpdate(row.getLengthStep(), weight); + + } + + public void removeValue(Float lengthStep) { + if (series.indexOf(lengthStep) >= 0) { + if (series.getItemCount() > 1) { + series.remove(lengthStep); + } else { + series.clear(); + } + } + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramHandler.java new file mode 100644 index 0000000..e741e44 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramHandler.java @@ -0,0 +1,166 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import fr.ifremer.tutti.ui.swing.util.TuttiNumberTickUnitSource; +import fr.ifremer.tutti.util.Units; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.axis.NumberTickUnitSource; +import org.jfree.chart.axis.ValueAxis; + +import javax.swing.JFrame; +import java.awt.BorderLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.Closeable; + +import static org.nuiton.i18n.I18n.t; + +/** + * To manage the frequencies histogram. + * + * Created on 14/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class FrequenciesHistogramHandler implements Closeable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(FrequenciesHistogramHandler.class); + + private final FrequenciesHistogramModel model; + + private final JFreeChart chart; + private final JFrame popup; + + public FrequenciesHistogramHandler(SpeciesFrequencyUI ui) { + + SpeciesFrequencyUIModel uiModel = ui.getModel(); + SpeciesFrequencyUIHandler uiHandler = ui.getHandler(); + +// this.frequencyTableModel = uiHandler.getTableModel(); + + this.model = uiModel.getFrequenciesHistogramModel(); + + chart = ChartFactory.createXYBarChart(null, + t("tutti.editSpeciesFrequencies.table.header.lengthStep"), + false, + t("tutti.editSpeciesFrequencies.table.header.number"), + model.getDataset()); + chart.clearSubtitles(); + + ValueAxis rangeAxis = chart.getXYPlot().getRangeAxis(); + rangeAxis.setAutoRange(true); + rangeAxis.setStandardTickUnits(new NumberTickUnitSource(true)); + + ValueAxis domainAxis = chart.getXYPlot().getDomainAxis(); + domainAxis.setAutoRange(true); + domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); + domainAxis.setMinorTickMarksVisible(true); + + chart.getXYPlot().getRenderer().setSeriesPaint(0, uiHandler.getConfig().getColorComputedWeights()); + + ChartPanel chartPanel = new ChartPanel(chart); + chartPanel.setDomainZoomable(false); + chartPanel.setMouseZoomable(false); + chartPanel.setPopupMenu(null); + + ui.getHistogramPanel().add(chartPanel, BorderLayout.CENTER); + + popup = new JFrame(); + chartPanel.addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + if (e.getClickCount() > 1) { + + popup.getContentPane().removeAll(); + ChartPanel chartPanel = new ChartPanel(chart); + popup.getContentPane().add(chartPanel); + popup.pack(); + popup.setVisible(true); + + } + } + }); + + // when step has changed in model, update chart + uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_STEP, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + Float step1 = (Float) evt.getNewValue(); + model.setStep(step1); + + } + }); + + // when lengthStepCaracteristicUnit changed, let's updates the label of some fields + uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_LENGTH_STEP_CARACTERISTIC_UNIT, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + String unit = (String) evt.getNewValue(); + + if (unit == null) { + + unit = t("tutti.editSpeciesFrequencies.unkownStepUnit"); + } + + String lengthStepLabelWithUnit = Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.table.header.lengthStep"), unit); + model.setLengthStepLabelWithUnit(lengthStepLabelWithUnit); + + } + + }); + + model.addPropertyChangeListener(AverageWeightsHistogramModel.PROPERTY_TITLE, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String title = (String) evt.getNewValue(); + if (log.isInfoEnabled()) { + log.info("Frequencies graph title changed to: " + title); + } + popup.setTitle(title); + } + }); + + model.addPropertyChangeListener(AverageWeightsHistogramModel.PROPERTY_LENGTH_STEP_LABEL_WITH_UNIT, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String lengthStepLabelWithUnit = (String) evt.getNewValue(); + if (log.isInfoEnabled()) { + log.info("Frequencies graph lengthStepLabelWithUnit changed to: " + lengthStepLabelWithUnit); + } + chart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); + } + }); + + model.addPropertyChangeListener(AverageWeightsHistogramModel.PROPERTY_STEP, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + Float step = (Float) evt.getNewValue(); + if (log.isInfoEnabled()) { + log.info("Frequencies graph step changed to: " + step); + } + + chart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step == 1f)); + model.getDataset().setIntervalWidth(step); + + } + }); + + } + + @Override + public void close() { + popup.dispose(); + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramModel.java new file mode 100644 index 0000000..0171a41 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramModel.java @@ -0,0 +1,113 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import fr.ifremer.tutti.type.WeightUnit; +import org.jdesktop.beans.AbstractSerializableBean; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; + +import java.util.List; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 15/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class FrequenciesHistogramModel extends AbstractSerializableBean { + + public static final String PROPERTY_TITLE = "title"; + public static final String PROPERTY_LENGTH_STEP_LABEL_WITH_UNIT = "lengthStepLabelWithUnit"; + public static final String PROPERTY_STEP = "step"; + + /** + * To store frequencies graph series. + * + * @since 3.11 + */ + private final XYSeriesCollection dataset; + protected final XYSeries series; + + private final WeightUnit frequencyWeightUnit; + private final WeightUnit individualObservationWeightUnit; + + private String title; + private String lengthStepLabelWithUnit; + private Float step; + + public FrequenciesHistogramModel(WeightUnit frequencyWeightUnit, WeightUnit individualObservationWeightUnit) { + this.frequencyWeightUnit = frequencyWeightUnit; + this.individualObservationWeightUnit = individualObservationWeightUnit; + + series = new XYSeries("", true, false); + + dataset = new XYSeriesCollection(series); + dataset.setIntervalPositionFactor(0); + dataset.setIntervalWidth(0); + + } + + public XYSeriesCollection getDataset() { + return dataset; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + + title = title + t("tutti.editSpeciesFrequencies.title"); + + Object oldValue = getTitle(); + this.title = title; + firePropertyChange(PROPERTY_TITLE, oldValue, title); + } + + public String getLengthStepLabelWithUnit() { + return lengthStepLabelWithUnit; + } + + public void setLengthStepLabelWithUnit(String lengthStepLabelWithUnit) { + Object oldValue = getLengthStepLabelWithUnit(); + this.lengthStepLabelWithUnit = lengthStepLabelWithUnit; + firePropertyChange(PROPERTY_LENGTH_STEP_LABEL_WITH_UNIT, oldValue, lengthStepLabelWithUnit); + } + + public Float getStep() { + return step; + } + + public void setStep(Float step) { + Object oldValue = getStep(); + this.step = step; + firePropertyChange(PROPERTY_STEP, oldValue, step); + } + + public void reloadRows(List<SpeciesFrequencyRowModel> rows) { + + series.clear(); + + if (rows != null) { + + rows.stream().filter(SpeciesFrequencyRowModel::isValid).forEach(this::addOrUpdate); + + } + + } + + public void addOrUpdate(SpeciesFrequencyRowModel row) { + series.addOrUpdate(row.getLengthStep(), row.getNumber()); + } + + public void removeValue(Float lengthStep) { + if (series.indexOf(lengthStep) >= 0) { + if (series.getItemCount() > 1) { + series.remove(lengthStep); + } else { + series.clear(); + } + } + } + +} 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/species/frequency/IndividualObservationBatchRowModel.java similarity index 99% rename from tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchRowModel.java rename to tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowModel.java index a9ad8d0..c22191b 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/species/frequency/IndividualObservationBatchRowModel.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation; +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; /* * #%L 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 new file mode 100644 index 0000000..8fd6d3b --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java @@ -0,0 +1,665 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.Attachment; +import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.SampleCategory; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +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.DecoratorService; +import fr.ifremer.tutti.service.sampling.SamplingCodePrefix; +import fr.ifremer.tutti.type.WeightUnit; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SamplingCodeCellEditor; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SamplingCodeCellRenderer; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; +import fr.ifremer.tutti.ui.swing.util.TuttiUI; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentCellEditor; +import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentCellRenderer; +import fr.ifremer.tutti.ui.swing.util.caracteristics.CaracteristicMapCellComponent; +import fr.ifremer.tutti.ui.swing.util.comment.CommentCellEditor; +import fr.ifremer.tutti.ui.swing.util.comment.CommentCellRenderer; +import jaxx.runtime.SwingUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.decorator.HighlightPredicate; +import org.jdesktop.swingx.decorator.Highlighter; +import org.jdesktop.swingx.table.DefaultTableColumnModelExt; +import org.jdesktop.swingx.table.TableColumnExt; +import org.jdesktop.swingx.table.TableColumnModelExt; +import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; + +import javax.swing.JOptionPane; +import javax.swing.event.TableModelEvent; +import java.awt.Color; +import java.beans.PropertyChangeListener; +import java.beans.PropertyVetoException; +import java.io.Closeable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; +import static org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler.CONFIRMATION_FORMAT; + +/** + * To manage individual observations. + * + * Created on 14/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class IndividualObservationBatchTableHandler implements Closeable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(IndividualObservationBatchTableHandler.class); + + private final SpeciesFrequencyUI ui; + private final SpeciesFrequencyUIHandler uiHandler; + private final JXTable individualObservationTable; + + private final SpeciesFrequencyUIModel model; + private final SpeciesFrequencyTableModel frequencyTableModel; + private final IndividualObservationBatchTableModel individualObservationTableModel; + + private final IndividualObservationUICache individualObservationUICache; + private final Map<String, Caracteristic> maturityCaracteristics; + + private ColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId; + + /** + * Added on each individual observation row in the dedicated table. + * Notify each time a modification is done on a such row. + */ + private final PropertyChangeListener individualObservationRowChangedListener; + + public IndividualObservationBatchTableHandler(SpeciesFrequencyUI ui) { + + this.ui = ui; + this.model = ui.getModel(); + this.uiHandler = ui.getHandler(); + this.individualObservationUICache = new IndividualObservationUICache(uiHandler.getDataContext().getOptionalCruiseSamplingCache().orElse(null), model); + this.individualObservationTable = ui.getObsTable(); + this.frequencyTableModel = uiHandler.getTableModel(); + + List<Caracteristic> maturityCaracteristics = new ArrayList<>(uiHandler.getDataContext().getMaturityCaracteristics()); + + this.maturityCaracteristics = TuttiEntities.splitById(maturityCaracteristics); + + // When any change on any individual observation + this.individualObservationRowChangedListener = evt -> { + + IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); + String propertyName = evt.getPropertyName(); + + CaracteristicQualitativeValue gender = model.getGender(row); + CaracteristicQualitativeValue maturity = model.getMaturityValue(row); + + switch (propertyName) { + 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(); + + if (log.isInfoEnabled()) { + log.info("caracteristics changed"); + } + + if (model.withMaturityCaracteristic()) { + CaracteristicQualitativeValue oldMaturity = model.getMaturityValue(oldValue); + CaracteristicQualitativeValue newMaturity = model.getMaturityValue(newValue); + if (log.isInfoEnabled()) { + log.info("maturities : " + oldMaturity + " " + newMaturity); + } + if (!Objects.equals(oldMaturity, newMaturity)) { + individualObservationUICache.decrementsObservationNb(gender, oldMaturity, row.getSize()); + individualObservationUICache.incrementsObservationNb(gender, newMaturity, row.getSize(), row.getSamplingCode()); + } + } + + CaracteristicQualitativeValue oldGender = model.getGender(oldValue); + CaracteristicQualitativeValue newGender = model.getGender(newValue); + if (!Objects.equals(oldGender, newGender)) { + individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); + individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), row.getSamplingCode()); + } + } + break; + + case IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE: + if (row.withSize()) { + + float size = row.getSize(); + + String oldValue = (String) evt.getOldValue(); + String newValue = (String) evt.getNewValue(); + + if (StringUtils.isNotBlank(oldValue)) { + individualObservationUICache.decrementsSamplingNb(gender, maturity, size, oldValue); + } + if (StringUtils.isNotBlank(newValue)) { + individualObservationUICache.incrementsSamplingNb(gender, maturity, size, newValue); + } + } + 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; + } + + model.recomputeIndividualObservationRowValidState(row); + model.recomputeCanEditLengthStep(); + + model.setModify(true); + + }; + + // can show / hide some columns in model + individualObservationTable.setColumnControlVisible(true); + + // create obsTable column model + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + + { + // Rank column + + uiHandler.addIntegerColumnToModel(columnModel, + IndividualObservationBatchTableModel.RANK, + TuttiUI.INT_10_DIGITS_PATTERN, + individualObservationTable); + + } + + { // Size column + + uiHandler.addFloatColumnToModel(columnModel, + IndividualObservationBatchTableModel.SIZE, + TuttiUI.DECIMAL3_PATTERN, + individualObservationTable); + } + + WeightUnit individualObservationWeightUnit = uiHandler.getConfig().getIndividualObservationWeightUnit(); + + { // Weight column + + uiHandler.addFloatColumnToModel(columnModel, + IndividualObservationBatchTableModel.WEIGHT, + individualObservationWeightUnit, + individualObservationTable); + } + + List<Caracteristic> defaultCaracteristic = model.getDefaultCaracteristic(); + + for (Caracteristic caracteristic : defaultCaracteristic) { + uiHandler.addCaracteristicColumnToModel(individualObservationTable, + columnModel, + caracteristic); + } + + { // Other caracteristics column + + Set<Caracteristic> caracteristicsToSkip = Collections.unmodifiableSet( + Sets.newHashSet(model.getDefaultCaracteristic())); + + uiHandler.addColumnToModel(columnModel, + CaracteristicMapCellComponent.newEditor(ui, caracteristicsToSkip), + CaracteristicMapCellComponent.newRender(uiHandler.getContext()), + IndividualObservationBatchTableModel.OTHER_CARACTERISTICS); + + } + + { + // Smapling code column + + uiHandler.addColumnToModel(columnModel, + SamplingCodeCellEditor.newEditor(ui), + SamplingCodeCellRenderer.newRender(), + IndividualObservationBatchTableModel.SAMPLING_CODE); + + } + + { // Comment column + + uiHandler.addColumnToModel(columnModel, + CommentCellEditor.newEditor(ui), + CommentCellRenderer.newRender(), + IndividualObservationBatchTableModel.COMMENT); + + } + + { // File column + + uiHandler.addColumnToModel(columnModel, + AttachmentCellEditor.newEditor(ui), + AttachmentCellRenderer.newRender(uiHandler.getDecorator(Attachment.class, null)), + IndividualObservationBatchTableModel.ATTACHMENT); + } + + // create obsTable model + individualObservationTableModel = new IndividualObservationBatchTableModel(individualObservationWeightUnit, model, columnModel); + + individualObservationTable.setModel(individualObservationTableModel); + individualObservationTable.setColumnModel(columnModel); + + // by default do not authorize to change column orders + individualObservationTable.getTableHeader().setReorderingAllowed(false); + + uiHandler.addHighlighters(individualObservationTable); + + Color cellWithValueColor = uiHandler.getConfig().getColorCellWithValue(); + + Highlighter commentHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( + new HighlightPredicate.AndHighlightPredicate( + new HighlightPredicate.IdentifierHighlightPredicate(IndividualObservationBatchTableModel.COMMENT), + // for not null value + (renderer, adapter) -> { + String value = (String) adapter.getValue(); + return StringUtils.isNotBlank(value); + }), cellWithValueColor); + individualObservationTable.addHighlighter(commentHighlighter); + + uiHandler.installTableKeyListener(columnModel, individualObservationTable, false); + + // always scroll to selected row + SwingUtil.scrollToTableSelection(individualObservationTable); + + this.individualObservationTableModel.addTableModelListener(e -> { + + int firstRow = e.getFirstRow(); + int lastRow = e.getLastRow(); + + switch (e.getType()) { + case TableModelEvent.DELETE: + if (this.individualObservationTableModel.getRowCount() == 0) { + this.individualObservationTableModel.addNewRow(); + + } else { + this.individualObservationTableModel.recomputeRankOrders(firstRow); + } + break; + + case TableModelEvent.INSERT: + for (int i = firstRow; i <= lastRow; i++) { + IndividualObservationBatchRowModel newRow = this.individualObservationTableModel.getRows().get(i); + newRow.addPropertyChangeListener(individualObservationRowChangedListener); + + if (model.mustCopyIndividualObservationSize()) { + + frequencyTableModel.incrementFrequencyRowsNumbers(newRow); + + } + + model.recomputeIndividualObservationRowValidState(newRow); + } + break; + + case TableModelEvent.UPDATE: + if (this.individualObservationTableModel.getRowCount() == 0) { + this.individualObservationTableModel.addNewRow(); + } + } + + model.recomputeCanEditLengthStep(); + }); + + this.individualObservationTable.getSelectionModel().addListSelectionListener(e -> { + + if (!model.isInRafaleRowCreation()) { + uiHandler.resetSamplingLabel(); + } + + IndividualObservationBatchRowModel selectedRow = null; + + if (!this.individualObservationTable.getSelectionModel().isSelectionEmpty()) { + if (this.individualObservationTable.getSelectedRowCount() == 1) { + selectedRow = this.individualObservationTableModel.getEntry(this.individualObservationTable.getSelectedRow()); + + } + } + + individualObservationUICache.updateSelectedRow(selectedRow); + }); + + model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INDIVIDUAL_OBSERVATION_ROWS, evt -> { + individualObservationTableModel.setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue()); + }); + + // 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 (source.isInitBatchEdition()) { + + if (log.isInfoEnabled()) { + log.info("Skip ask user to confirm copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); + } + return; + } + + // le seul mode où l'utilisateur ne peut rien saisir est le mode tout + if (CopyIndividualObservationMode.ALL != oldCopyMode) { + + long rowsWithUserData; + + // si on etait en mode taille et que l'utilisateur avait saisi des tailles + if (oldCopyMode == CopyIndividualObservationMode.SIZE) { + rowsWithUserData = model.getRows().stream() + .filter(SpeciesFrequencyRowModel::withWeight) + .count(); + + } else { + rowsWithUserData = model.getRows().stream() + .filter(row -> row.getLengthStep() != null || row.withNumber() || row.withWeight()) + .count(); + } + + if (rowsWithUserData > 0) { + + String htmlMessage = String.format( + CONFIRMATION_FORMAT, + t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.message"), + t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.help")); + int i = JOptionPane.showConfirmDialog( + uiHandler.getTopestUI(), + htmlMessage, + t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.title"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); + + if (i == JOptionPane.CANCEL_OPTION) { + throw new PropertyVetoException("The user does not want to erase his data.", evt); + } + } + } + }); + + // Pour mettre à jour les mensurations suite au changement du mode de recopie des observations individuelles + model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { + + SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); + CopyIndividualObservationMode oldCopyMode = (CopyIndividualObservationMode) evt.getOldValue(); + CopyIndividualObservationMode newCopyMode = (CopyIndividualObservationMode) evt.getNewValue(); + + if (newCopyMode == null) { + + return; + } + boolean nothingCopyMode = CopyIndividualObservationMode.NOTHING == newCopyMode; + + + if (!nothingCopyMode) { + + source.setFrequenciesConfigurationMode(FrequencyConfigurationMode.RAFALE); + source.setAddIndividualObservationOnRafale(true); + + } + + + // si on est en initialisation, ca ne sert à rien de regénérer les lignes, elles sont sensées être chargées + if (source.isInitBatchEdition()) { + + if (log.isInfoEnabled()) { + log.info("Skip recompute frequencies from indivudal observations (flag initBatchEdition is on), copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); + } + return; + } + + model.setRowComputationInProgress(true); + + try { + + model.getRows().clear(); + model.getRowsInError().clear(); + model.reloadRows(); + model.recomputeIndividualObservationRowsValidateState(); + uiHandler.reloadRowsFromIndividualObservations(); + + } finally { + model.setRowComputationInProgress(false); + } + + frequencyTableModel.fireTableDataChanged(); + individualObservationTableModel.fireTableDataChanged(); + + }); + + model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_LENGTH_STEP_CARACTERISTIC, evt -> { + + Caracteristic newValue = (Caracteristic) evt.getNewValue(); + individualObservationTableModel.setLengthstepCaracteristic(newValue); + + }); + + } + + @Override + public void close() { + + uiHandler.resetSamplingLabel(); + + // 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(); + + } + + protected void removeMaturityColumnIfPresent() { + if (maturityColumnId != null) { + TableColumnExt maturityColumn = individualObservationTable.getColumnExt(maturityColumnId); + individualObservationTable.removeColumn(maturityColumn); + individualObservationTableModel.removeMaturityIdentifier(maturityColumnId); + maturityColumnId = null; + } + } + + public List<IndividualObservationBatchRowModel> loadIndividualObservations(Species species, List<IndividualObservationBatchRowModel> individualObservations) { + + individualObservationTableModel.setSpecies(species); + + SamplingCodePrefix samplingCodePrefix = new SamplingCodePrefix(uiHandler.getConfig().getSamplingCodePrefix(), uiHandler.decorate(species, DecoratorService.WITH_SURVEY_CODE_NO_NAME)); + individualObservationTableModel.setSamplingCodePrefix(samplingCodePrefix); + + return individualObservationTableModel.loadRows(individualObservations, individualObservationRowChangedListener); + + } + + public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { + model.setMaturityCaracteristic(maturityCaracteristic); + if (maturityCaracteristic != null) { + addMaturityCaracteristicColumnToModel(maturityCaracteristic); + } + } + + public void addMaturityCaracteristicColumnToModel(Caracteristic caracteristic) { + + // remove the row sorter while we add the new column + individualObservationTable.setRowSorter(null); + individualObservationTable.setAutoCreateRowSorter(false); + + TableColumnModelExt columnModel = (TableColumnModelExt) individualObservationTable.getColumnModel(); + + ColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId = uiHandler.addCaracteristicColumnToModel(individualObservationTable, + columnModel, + caracteristic); + + Objects.requireNonNull(maturityColumnId); + this.maturityColumnId = maturityColumnId; + + individualObservationTableModel.addMaturityIdentifier(maturityColumnId); + + // on cherche le bon index où insérer la colonne maturité (avant les autres caractéristiques, mais elle peut etre cachee) + int modelIndex = columnModel.getColumnExt(IndividualObservationBatchTableModel.OTHER_CARACTERISTICS).getModelIndex(); + int indexToMove = individualObservationTable.convertColumnIndexToView(modelIndex); + + // si la colonne autres caracteristiques est cachée, alors on cherche la première colonne suivante non cachée + int columnCount = columnModel.getColumnCount(true); + while (indexToMove == -1 && modelIndex < columnCount) { + indexToMove = individualObservationTable.convertColumnIndexToView(modelIndex); + modelIndex++; + } + // si une colonne après celle des autres caractéristiques est visible, on déplace la maturité avant cette colonne + // sinon, on laisse la maturité à la fin + if (modelIndex != -1) { + individualObservationTable.moveColumn(columnModel.getColumnCount() - 1, indexToMove); + } + // reset the row sorter + individualObservationTable.setAutoCreateRowSorter(true); + + } + + public void setIndividualObservationRows(List<IndividualObservationBatchRowModel> obsRows) { + + model.setIndividualObservationRows(obsRows); + individualObservationTableModel.setRows(obsRows); + model.recomputeIndividualObservationRowsValidateState(); + + } + + public void initCaracteristicValues(SpeciesBatchRowModel speciesBatch) { + + CaracteristicMap sampleCategoryValues = new CaracteristicMap(); + Iterator<SampleCategory<?>> iterator = speciesBatch.iterator(); + iterator.forEachRemaining(sampleCategory -> { + Caracteristic caracteristic = sampleCategory.getCategoryDef().getCaracteristic(); + sampleCategoryValues.put(caracteristic, sampleCategory.getCategoryValue()); + }); + + individualObservationTableModel.setDefaultCaracteristicValues(sampleCategoryValues); + model.setNotEditableCaracteristic(sampleCategoryValues.keySet()); + + } + + public boolean isSampleCodeMenusEnabled(int modelRowIndex) { + return modelRowIndex >= 0 && individualObservationTable.getSelectedRowCount() == 1 + && individualObservationTableModel.getRows().get(individualObservationTable.getSelectedRow()).withSamplingCode(); + } + + public void initObservationsCache(SpeciesBatchRowModel incomingSpeciesBatch, FishingOperation fishingOperation) { + + individualObservationUICache.init(ui, incomingSpeciesBatch, fishingOperation, model.getIndividualObservationRows()); + + } + + public IndividualObservationUICache getIndividualObservationUICache() { + return individualObservationUICache; + } + + public void initMaturityCaracteristic(SpeciesProtocol speciesProtocol) { + + Caracteristic maturityCaracteristic; + + if (speciesProtocol == null) { + maturityCaracteristic = null; + } else { + maturityCaracteristic = maturityCaracteristics.get(speciesProtocol.getMaturityPmfmId()); + } + + // Add maturity column if necessary + + model.setMaturityCaracteristic(maturityCaracteristic); + if (maturityCaracteristic != null) { + addMaturityCaracteristicColumnToModel(maturityCaracteristic); + } + + } + +} + diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java similarity index 78% rename from tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java rename to tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java index 8a6a924..690f9e5 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation; +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; /* * #%L @@ -23,13 +23,14 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservatio */ import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; 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.SamplingCodePrefix; import fr.ifremer.tutti.type.WeightUnit; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; import fr.ifremer.tutti.ui.swing.util.table.CaracteristicColumnIdentifier; +import org.apache.commons.collections4.CollectionUtils; import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; @@ -37,6 +38,9 @@ import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -100,16 +104,16 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab protected Caracteristic lengthstepCaracteristic; - protected final SpeciesFrequencyUIModel parentModel; + protected final SpeciesFrequencyUIModel uiModel; public IndividualObservationBatchTableModel(WeightUnit weightUnit, - SpeciesFrequencyUIModel parentModel, + SpeciesFrequencyUIModel uiModel, TableColumnModelExt columnModel) { super(columnModel, true, false); - this.parentModel = parentModel; + this.uiModel = uiModel; this.weightUnit = weightUnit; // Lorsque la caracteristique de maturité change, on met à jour defaultCaracteristicsMap - this.parentModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_MATURITY_CARACTERISTIC, new PropertyChangeListener() { + this.uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_MATURITY_CARACTERISTIC, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Caracteristic oldValue = (Caracteristic) evt.getOldValue(); @@ -123,7 +127,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } }); - this.defaultCaracteristicsMap = CaracteristicMap.fromCollection(parentModel.getDefaultCaracteristic()); + this.defaultCaracteristicsMap = CaracteristicMap.fromCollection(uiModel.getDefaultCaracteristic()); setNoneEditableCols(RANK); } @@ -177,12 +181,12 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab if (getRowCount() > 0) { IndividualObservationBatchRowModel lastRow = getRows().get(getRowCount() - 1); - CaracteristicQualitativeValue gender = parentModel.getGender(lastRow); - parentModel.setGenderValueToDefaultCaracterictis(result, gender); + CaracteristicQualitativeValue gender = uiModel.getGender(lastRow); + uiModel.setGenderValueToDefaultCaracterictis(result, gender); - if (parentModel.withMaturityCaracteristic()) { - CaracteristicQualitativeValue maturityState = parentModel.getMaturityValue(lastRow); - parentModel.setMaturityValueToDefaultCaracterictis(result, maturityState); + if (uiModel.withMaturityCaracteristic()) { + CaracteristicQualitativeValue maturityState = uiModel.getMaturityValue(lastRow); + uiModel.setMaturityValueToDefaultCaracterictis(result, maturityState); } } @@ -257,4 +261,43 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } + public List<IndividualObservationBatchRowModel> loadRows(List<IndividualObservationBatchRowModel> individualObservations, PropertyChangeListener individualObservationRowChangedListener) { + + List<IndividualObservationBatchRowModel> obsRows = new ArrayList<>(); + + setRows(new ArrayList<>()); + + if (CollectionUtils.isNotEmpty(individualObservations)) { + + CopyIndividualObservationMode copyIndividualObservationMode = null; + + int rankOrder = 1; + for (IndividualObservationBatchRowModel rowModel : individualObservations) { + + CopyIndividualObservationMode incomingCopyIndividualObservationMode = rowModel.getCopyIndividualObservationMode(); + Objects.requireNonNull(incomingCopyIndividualObservationMode, "Mode de recopie non trouvé sur l'observation individuelle: " + rowModel.getId()); + if (copyIndividualObservationMode == null) { + copyIndividualObservationMode = incomingCopyIndividualObservationMode; + } else { + if (copyIndividualObservationMode != incomingCopyIndividualObservationMode) { + throw new IllegalStateException("Plusieurs modes de recopie trouvés sur les observations individuelles du lot, ce qui est impossible"); + } + } + IndividualObservationBatchRowModel newRow = createNewRow(); + newRow.copy(rowModel); + newRow.setRankOrder(rankOrder++); + newRow.addPropertyChangeListener(individualObservationRowChangedListener); + newRow.setValid(true); + + uiModel.moveMaturityValueFromCaracteristicsToDefaultCaracteristics(newRow); + + obsRows.add(newRow); + } + + } + + return obsRows; + + } + } 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 8dc68e5..1c7f68e 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 @@ -34,7 +34,6 @@ import fr.ifremer.tutti.service.sampling.CruiseSamplingCache; import fr.ifremer.tutti.service.sampling.SamplingCodePrefix; import fr.ifremer.tutti.service.sampling.SamplingEvent; import fr.ifremer.tutti.service.sampling.SamplingListener; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; import fr.ifremer.tutti.util.Numbers; import org.apache.commons.logging.Log; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java index 8c9d1c5..f56112f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java @@ -24,7 +24,6 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.EditSpeciesBatchPanelUI; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchUI; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java index 109e6e7..c29de3b 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyLogRowModel.java @@ -24,7 +24,6 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; * #L% */ -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import org.apache.commons.lang3.time.DateFormatUtils; import org.jdesktop.beans.AbstractSerializableBean; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java index 38c945c..3cd8750 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java @@ -26,17 +26,17 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; import fr.ifremer.tutti.type.WeightUnit; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import fr.ifremer.tutti.util.Weights; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.table.TableColumnModelExt; -import org.jfree.data.xy.XYSeries; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -96,9 +96,9 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp protected transient PropertyChangeListener onNumberChangedListener; - protected final XYSeries frequenciesSeries; - - protected final XYSeries averageWeightsSeries; +// protected final XYSeries frequenciesSeries; +// +// protected final XYSeries averageWeightsSeries; public SpeciesFrequencyTableModel(WeightUnit weightUnit, WeightUnit individualObservationWeightUnit, @@ -109,8 +109,8 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp this.individualObservationWeightUnit = individualObservationWeightUnit; this.uiModel = uiModel; this.modelCache = uiModel.cache; - this.frequenciesSeries = uiModel.frequenciesDataset.getSeries(0); - this.averageWeightsSeries = uiModel.averageWeightsDataset.getSeries(0); +// this.frequenciesSeries = uiModel.getFrequenciesHistogramModel().getDataset().getSeries(0); +// this.averageWeightsSeries = uiModel.getAverageWeightsHistogramModel().getDataset().getSeries(0); setNoneEditableCols(RTP_COMPUTED_WEIGHT); } @@ -277,8 +277,9 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp if (oldValue != null) { modelCache.removeLengthStep(oldValue); - removeLengthStepFromSeries(frequenciesSeries, oldValue); - removeLengthStepFromSeries(averageWeightsSeries, oldValue); + lengthStepWasRemoved(oldValue); +// removeLengthStepFromSeries(frequenciesSeries, oldValue); +// removeLengthStepFromSeries(averageWeightsSeries, oldValue); } @@ -287,13 +288,14 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp modelCache.addLengthStep(row); - if (row.withNumber()) { - - frequenciesSeries.addOrUpdate(newValue, row.getNumber()); - Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); - averageWeightsSeries.addOrUpdate(newValue, weight); - - } + lengthStepOrNumberWasUpdated(row); +// if (row.withNumber()) { +// +// frequenciesSeries.addOrUpdate(newValue, row.getNumber()); +// Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); +// averageWeightsSeries.addOrUpdate(newValue, weight); +// +// } } @@ -330,14 +332,16 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp if (!row.withNumber()) { // remove the value for the lengthStep - removeLengthStepFromSeries(frequenciesSeries, lengthStep); - removeLengthStepFromSeries(averageWeightsSeries, lengthStep); + lengthStepWasRemoved(lengthStep); +// removeLengthStepFromSeries(frequenciesSeries, lengthStep); +// removeLengthStepFromSeries(averageWeightsSeries, lengthStep); } else { - frequenciesSeries.addOrUpdate(lengthStep, row.getNumber()); - Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); - averageWeightsSeries.addOrUpdate(lengthStep, weight); + lengthStepOrNumberWasUpdated(row); +// frequenciesSeries.addOrUpdate(lengthStep, row.getNumber()); +// Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); +// averageWeightsSeries.addOrUpdate(lengthStep, weight); } @@ -374,12 +378,14 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp if (!row.withWeight()) { // remove the value for the lengthStep - removeLengthStepFromSeries(averageWeightsSeries, lengthStep); + uiModel.getAverageWeightsHistogramModel().removeValue(lengthStep); +// removeLengthStepFromSeries(averageWeightsSeries, lengthStep); } else { - Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); - averageWeightsSeries.addOrUpdate(lengthStep, weight); + uiModel.getAverageWeightsHistogramModel().addOrUpdate(row); +// Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); +// averageWeightsSeries.addOrUpdate(lengthStep, weight); } @@ -397,15 +403,15 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp return onWeightChangedListener; } - private void removeLengthStepFromSeries(XYSeries series, Float lengthStep) { - if (series.indexOf(lengthStep) >= 0) { - if (series.getItemCount() > 1) { - series.remove(lengthStep); - } else { - series.clear(); - } - } - } +// private void removeLengthStepFromSeries(XYSeries series, Float lengthStep) { +// if (series.indexOf(lengthStep) >= 0) { +// if (series.getItemCount() > 1) { +// series.remove(lengthStep); +// } else { +// series.clear(); +// } +// } +// } private void dettachListeners(SpeciesFrequencyRowModel result) { @@ -578,4 +584,43 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } + public List<SpeciesFrequencyRowModel> loadRows(List<SpeciesFrequencyRowModel> incomingRows) { + + List<SpeciesFrequencyRowModel> result = new ArrayList<>(); + + if (CollectionUtils.isNotEmpty(incomingRows)) { + + for (SpeciesFrequencyRowModel rowModel : incomingRows) { + + SpeciesFrequencyRowModel newRow = createNewRow(false, false); + newRow.copy(rowModel); + result.add(newRow); + + } + + } + + return result; + + } + + private void lengthStepWasRemoved(Float lengthStep) { + + uiModel.getAverageWeightsHistogramModel().removeValue(lengthStep); + uiModel.getFrequenciesHistogramModel().removeValue(lengthStep); + + } + + + private void lengthStepOrNumberWasUpdated(SpeciesFrequencyRowModel row) { + + if (row.withNumber()) { + + uiModel.getAverageWeightsHistogramModel().addOrUpdate(row); + uiModel.getFrequenciesHistogramModel().addOrUpdate(row); + + } + + } + } \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx index aeeb4ad..dd24f4d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx @@ -118,7 +118,7 @@ protected int getLengthStepPanelPreferedWidth() { <JToolBar id="frequenciesToolBar"> <!-- use actionperformed otherwise the event is triggered twice when the confirm dialog is shown --> <JCheckBox id='copyRtpWeightsCheckBox' onActionPerformed='model.setCopyRtpWeights(copyRtpWeightsCheckBox.isSelected())'/> - <JButton id='graphAverageWeightButton' onActionPerformed="handler.showAverageWeightsHistogram()"/> + <JButton id='graphAverageWeightButton'/> </JToolBar> <JToolBar id="copyToSizeToolBar"> 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 ebd4104..d163a03 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 @@ -22,20 +22,14 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; * #L% */ -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderEvent; import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderListener; import fr.ifremer.tutti.ichtyometer.feed.record.FeedReaderMeasureRecord; -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; -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.Rtp; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Sexs; @@ -43,13 +37,8 @@ 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.sampling.SamplingCodePrefix; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.TuttiUIContext; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SamplingCodeCellEditor; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SamplingCodeCellRenderer; 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; @@ -57,24 +46,19 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.Spe import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions.ApplySpeciesFrequencyRafaleAction; import fr.ifremer.tutti.ui.swing.util.SoundEngine; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; -import fr.ifremer.tutti.ui.swing.util.TuttiNumberTickUnitSource; import fr.ifremer.tutti.ui.swing.util.TuttiUI; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; -import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentCellEditor; -import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentCellRenderer; -import fr.ifremer.tutti.ui.swing.util.caracteristics.CaracteristicMapCellComponent; import fr.ifremer.tutti.ui.swing.util.caracteristics.CaracteristicMapColumnRowModel; import fr.ifremer.tutti.ui.swing.util.caracteristics.CaracteristicMapColumnUIHandler; import fr.ifremer.tutti.ui.swing.util.caracteristics.CaracteristicMapEditorUI; -import fr.ifremer.tutti.ui.swing.util.comment.CommentCellEditor; -import fr.ifremer.tutti.ui.swing.util.comment.CommentCellRenderer; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; import fr.ifremer.tutti.ui.swing.util.table.CaracteristicColumnIdentifier; +import fr.ifremer.tutti.util.Units; import fr.ifremer.tutti.util.Weights; import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; @@ -84,49 +68,33 @@ import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.jdesktop.swingx.table.TableColumnExt; import org.jdesktop.swingx.table.TableColumnModelExt; -import org.jfree.chart.ChartFactory; -import org.jfree.chart.ChartPanel; -import org.jfree.chart.JFreeChart; -import org.jfree.chart.axis.NumberTickUnitSource; -import org.jfree.chart.axis.ValueAxis; -import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.ApplicationBusinessException; import org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; import javax.swing.JComponent; -import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingUtilities; -import javax.swing.event.TableModelEvent; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; -import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; -import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -149,15 +117,15 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci private Map<String, Caracteristic> lengthStepCaracteristics; - private Map<String, Caracteristic> maturityCaracteristics; +// private Map<String, Caracteristic> maturityCaracteristics; - private JFreeChart frequenciesChart; +// private JFreeChart frequenciesChart; - private JFreeChart averageWeightsChart; +// private JFreeChart averageWeightsChart; - protected final JFrame frequenciesHistogramPopup = new JFrame(); +// protected final JFrame frequenciesHistogramPopup = new JFrame(); - protected final JFrame averageWeightsHistogramPopup = new JFrame(); +// protected final JFrame averageWeightsHistogramPopup = new JFrame(); /** * Weight unit. @@ -171,16 +139,28 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci */ protected final FeedReaderListener feedReaderListener; - protected IndividualObservationUICache individualObservationUICache; +// protected IndividualObservationUICache individualObservationUICache; protected ApplySpeciesFrequencyRafaleAction applySpeciesFrequencyRafaleAction; - protected PropertyChangeListener obsChangedListener; +// /** +// * Added on each individual observation row in the dedicated table. +// * Notify each time a modification is done on a such row. +// */ +// protected PropertyChangeListener individualObservationRowChangedListener; - protected CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId; +// protected CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId; protected SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; + protected IndividualObservationBatchTableHandler individualObservationBatchTableHandler; + protected AverageWeightsHistogramHandler averageWeightsHistogramHandler; + protected FrequenciesHistogramHandler frequenciesHistogramHandler; + + protected Decorator<Caracteristic> caracteristicDecorator; + protected Decorator<Caracteristic> caracteristicTipDecorator; + protected Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator; + public SpeciesFrequencyUIHandler() { super(SpeciesFrequencyRowModel.PROPERTY_LENGTH_STEP, @@ -205,161 +185,161 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } }; - - this.obsChangedListener = new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - - IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); - String propertyName = evt.getPropertyName(); - - SpeciesFrequencyUIModel model = getModel(); - - CaracteristicQualitativeValue gender = model.getGender(row); - CaracteristicQualitativeValue maturity = model.getMaturityValue(row); - - switch (propertyName) { - 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) { - getTableModel().decrementFrequencyRowsNumbers(oldValue); - } - if (newValue != null) { - getTableModel().incrementFrequencyRowsNumbers(newValue); - } - - if (model.isCopyIndividualObservationAll() && row.withWeight()) { - float weight = row.getWeight(); - if (oldValue != null) { - getTableModel().removeWeightToFrequencyRow(oldValue, weight); - } - if (newValue != null) { - getTableModel().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; - } - - if (weightUnit.isNotNullNorZero(weightToAdd)) { - if (weightUnit.isGreaterThanZero(weightToAdd)) { - getTableModel().addWeightToFrequencyRow(row, weightToAdd); - } else { - getTableModel().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(); - - if (log.isInfoEnabled()) { - log.info("caracteristics changed"); - } - - if (model.withMaturityCaracteristic()) { - CaracteristicQualitativeValue oldMaturity = model.getMaturityValue(oldValue); - CaracteristicQualitativeValue newMaturity = model.getMaturityValue(newValue); - if (log.isInfoEnabled()) { - log.info("maturities : " + oldMaturity + " " + newMaturity); - } - if (!Objects.equals(oldMaturity, newMaturity)) { - individualObservationUICache.decrementsObservationNb(gender, oldMaturity, row.getSize()); - individualObservationUICache.incrementsObservationNb(gender, newMaturity, row.getSize(), row.getSamplingCode()); - } - } - - CaracteristicQualitativeValue oldGender = model.getGender(oldValue); - CaracteristicQualitativeValue newGender = model.getGender(newValue); - if (!Objects.equals(oldGender, newGender)) { - individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); - individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), row.getSamplingCode()); - } - } - break; - - case IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE: - if (row.withSize()) { - - float size = row.getSize(); - - String oldValue = (String) evt.getOldValue(); - String newValue = (String) evt.getNewValue(); - - if (StringUtils.isNotBlank(oldValue)) { - individualObservationUICache.decrementsSamplingNb(gender, maturity, size, oldValue); - } - if (StringUtils.isNotBlank(newValue)) { - individualObservationUICache.incrementsSamplingNb(gender, maturity, size, newValue); - } - } - 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()) { - - getTableModel().decrementFrequencyRowsNumbers(row); - } - if (newValue) { - if (model.mustCopyIndividualObservationSize()) { - getTableModel().incrementFrequencyRowsNumbers(row); - } - if (model.isCopyIndividualObservationAll() && row.withWeight()) { - getTableModel().addWeightToFrequencyRow(row, row.getWeight()); - } - } - } - break; - } - - model.recomputeIndividualObservationRowValidState(row); - model.recomputeCanEditLengthStep(); - - model.setModify(true); - - } - - }; +// // When any change on any individual observation +// this.individualObservationRowChangedListener = new PropertyChangeListener() { +// +// @Override +// public void propertyChange(PropertyChangeEvent evt) { +// +// IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); +// String propertyName = evt.getPropertyName(); +// +// SpeciesFrequencyUIModel model = getModel(); +// +// CaracteristicQualitativeValue gender = model.getGender(row); +// CaracteristicQualitativeValue maturity = model.getMaturityValue(row); +// +// switch (propertyName) { +// 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) { +// getTableModel().decrementFrequencyRowsNumbers(oldValue); +// } +// if (newValue != null) { +// getTableModel().incrementFrequencyRowsNumbers(newValue); +// } +// +// if (model.isCopyIndividualObservationAll() && row.withWeight()) { +// float weight = row.getWeight(); +// if (oldValue != null) { +// getTableModel().removeWeightToFrequencyRow(oldValue, weight); +// } +// if (newValue != null) { +// getTableModel().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; +// } +// +// if (weightUnit.isNotNullNorZero(weightToAdd)) { +// if (weightUnit.isGreaterThanZero(weightToAdd)) { +// getTableModel().addWeightToFrequencyRow(row, weightToAdd); +// } else { +// getTableModel().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(); +// +// if (log.isInfoEnabled()) { +// log.info("caracteristics changed"); +// } +// +// if (model.withMaturityCaracteristic()) { +// CaracteristicQualitativeValue oldMaturity = model.getMaturityValue(oldValue); +// CaracteristicQualitativeValue newMaturity = model.getMaturityValue(newValue); +// if (log.isInfoEnabled()) { +// log.info("maturities : " + oldMaturity + " " + newMaturity); +// } +// if (!Objects.equals(oldMaturity, newMaturity)) { +// individualObservationUICache.decrementsObservationNb(gender, oldMaturity, row.getSize()); +// individualObservationUICache.incrementsObservationNb(gender, newMaturity, row.getSize(), row.getSamplingCode()); +// } +// } +// +// CaracteristicQualitativeValue oldGender = model.getGender(oldValue); +// CaracteristicQualitativeValue newGender = model.getGender(newValue); +// if (!Objects.equals(oldGender, newGender)) { +// individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); +// individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), row.getSamplingCode()); +// } +// } +// break; +// +// case IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE: +// if (row.withSize()) { +// +// float size = row.getSize(); +// +// String oldValue = (String) evt.getOldValue(); +// String newValue = (String) evt.getNewValue(); +// +// if (StringUtils.isNotBlank(oldValue)) { +// individualObservationUICache.decrementsSamplingNb(gender, maturity, size, oldValue); +// } +// if (StringUtils.isNotBlank(newValue)) { +// individualObservationUICache.incrementsSamplingNb(gender, maturity, size, newValue); +// } +// } +// 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()) { +// +// getTableModel().decrementFrequencyRowsNumbers(row); +// } +// if (newValue) { +// if (model.mustCopyIndividualObservationSize()) { +// getTableModel().incrementFrequencyRowsNumbers(row); +// } +// if (model.isCopyIndividualObservationAll() && row.withWeight()) { +// getTableModel().addWeightToFrequencyRow(row, row.getWeight()); +// } +// } +// } +// break; +// } +// +// model.recomputeIndividualObservationRowValidState(row); +// model.recomputeCanEditLengthStep(); +// +// model.setModify(true); +// +// } +// +// }; } @@ -471,13 +451,16 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci this.speciesOrBenthosBatchUISupport = ui.getContextValue(SpeciesOrBenthosBatchUISupport.class, ui.getSpeciesOrBenthosContext()); this.weightUnit = speciesOrBenthosBatchUISupport.getWeightUnit(); + this.caracteristicDecorator = getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); + this.caracteristicTipDecorator = getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); + this.caracteristicQualitativeDecorator = getDecorator(CaracteristicQualitativeValue.class, null); + Caracteristic sexCaracteristic = getPersistenceService().getSexCaracteristic(); SampleCategoryModel sampleCategoryModel = getDataContext().getSampleCategoryModel(); // get the default caracteristics - List<Caracteristic> defaultCaracteristic = - new ArrayList<>(getDataContext().getDefaultIndividualObservationCaracteristics()); + List<Caracteristic> defaultCaracteristic = new ArrayList<>(getDataContext().getDefaultIndividualObservationCaracteristics()); // on ajoute toujours la colonne sex if (!defaultCaracteristic.contains(sexCaracteristic)) { @@ -505,8 +488,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SwingUtilities.invokeLater(this::updateLogVisibility); }); - this.individualObservationUICache = new IndividualObservationUICache( - getDataContext().getOptionalCruiseSamplingCache().orElse(null), model); +// this.individualObservationUICache = new IndividualObservationUICache(getDataContext().getOptionalCruiseSamplingCache().orElse(null), model); } @Override @@ -516,21 +498,19 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci initUI(this.ui); - List<Caracteristic> lengthStepCaracteristics = - Lists.newArrayList(getDataContext().getLengthStepCaracteristics()); + List<Caracteristic> lengthStepCaracteristics = new ArrayList<>(getDataContext().getLengthStepCaracteristics()); this.lengthStepCaracteristics = TuttiEntities.splitById(lengthStepCaracteristics); - List<Caracteristic> maturityCaracteristics = - Lists.newArrayList(getDataContext().getMaturityCaracteristics()); - - this.maturityCaracteristics = TuttiEntities.splitById(maturityCaracteristics); +// List<Caracteristic> maturityCaracteristics = new ArrayList<>(getDataContext().getMaturityCaracteristics()); +// +// this.maturityCaracteristics = TuttiEntities.splitById(maturityCaracteristics); SpeciesFrequencyUIModel model = getModel(); taxonCache = TaxonCaches.createSpeciesCacheWithoutVernacularCode(getPersistenceService(), getDataContext().getProtocol()); - final Caracteristic modelCaracteristic = model.getLengthStepCaracteristic(); + Caracteristic modelCaracteristic = model.getLengthStepCaracteristic(); initBeanFilterableComboBox(this.ui.getLengthStepCaracteristicComboBox(), lengthStepCaracteristics, modelCaracteristic); @@ -565,10 +545,10 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // get step from the pmfm float step1 = getStep(newValue); model.setStep(step1); - model.setDataSetIntervalWidth(step1); +// model.setDataSetIntervalWidth(step1); - frequenciesChart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step1 == 1f)); - averageWeightsChart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step1 == 1f)); +// frequenciesChart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step1 == 1f)); +// averageWeightsChart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step1 == 1f)); if (CollectionUtils.isNotEmpty(getModel().getRows())) { for (SpeciesFrequencyRowModel rowModel : getModel().getRows()) { @@ -578,7 +558,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } SpeciesFrequencyUIHandler.this.ui.getValidator().doValidate(); - getObsTableModel().setLengthstepCaracteristic(newValue); +// getObsTableModel().setLengthstepCaracteristic(newValue); }); // when lengthStepCaracteristicUnit changed, let's updates the label of some fields @@ -591,26 +571,26 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci unit = t("tutti.editSpeciesFrequencies.unkownStepUnit"); } - getUI().getMinStepLabel().setText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.minStep"), unit)); - getUI().getMinStepLabel().setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.minStep.tip"), unit)); + getUI().getMinStepLabel().setText(Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.minStep"), unit)); + getUI().getMinStepLabel().setToolTipText(Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.minStep.tip"), unit)); - getUI().getMaxStepLabel().setText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.maxStep"), unit)); - getUI().getMaxStepLabel().setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.maxStep.tip"), unit)); + getUI().getMaxStepLabel().setText(Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.maxStep"), unit)); + getUI().getMaxStepLabel().setToolTipText(Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.maxStep.tip"), unit)); - getUI().getRafaleStepLabel().setText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.rafaleStep"), unit)); - getUI().getRafaleStepLabel().setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.rafaleStep.tip"), unit)); + getUI().getRafaleStepLabel().setText(Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.rafaleStep"), unit)); + getUI().getRafaleStepLabel().setToolTipText(Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.rafaleStep.tip"), unit)); TableColumnExt column = (TableColumnExt) getUI().getTable().getColumn(SpeciesFrequencyTableModel.LENGTH_STEP); - String lengthStepLabelWithUnit = getLabelWithUnit(t("tutti.editSpeciesFrequencies.table.header.lengthStep"), unit); + String lengthStepLabelWithUnit = Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.table.header.lengthStep"), unit); column.setHeaderValue(lengthStepLabelWithUnit); column.setToolTipText(lengthStepLabelWithUnit); column = (TableColumnExt) getUI().getObsTable().getColumn(IndividualObservationBatchTableModel.SIZE); - column.setHeaderValue(getLabelWithUnit(t("tutti.editIndividualObservationBatch.table.header.size"), unit)); - column.setToolTipText(getLabelWithUnit(t("tutti.editIndividualObservationBatch.table.header.size"), unit)); + column.setHeaderValue(Units.getLabelWithUnit(t("tutti.editIndividualObservationBatch.table.header.size"), unit)); + column.setToolTipText(Units.getLabelWithUnit(t("tutti.editIndividualObservationBatch.table.header.size"), unit)); - frequenciesChart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); - averageWeightsChart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); +// frequenciesChart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); +// averageWeightsChart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); }); // when configuration mode change, let's focus the best component (see http://forge.codelutin.com/issues/4035) @@ -662,111 +642,111 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci getTableModel().fireTableDataChanged(); }); - model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INDIVIDUAL_OBSERVATION_ROWS, evt -> { - getObsTableModel().setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue()); - }); - - // 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 (source.isInitBatchEdition()) { - - if (log.isInfoEnabled()) { - log.info("Skip ask user to confirm copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); - } - return; - } - - // le seul mode où l'utilisateur ne peut rien saisir est le mode tout - if (CopyIndividualObservationMode.ALL != oldCopyMode) { - - long rowsWithUserData; - - // si on etait en mode taille et que l'utilisateur avait saisi des tailles - if (oldCopyMode == CopyIndividualObservationMode.SIZE) { - rowsWithUserData = model.getRows().stream() - .filter(SpeciesFrequencyRowModel::withWeight) - .count(); - - } else { - rowsWithUserData = model.getRows().stream() - .filter(row -> row.getLengthStep() != null || row.withNumber() || row.withWeight()) - .count(); - } - - if (rowsWithUserData > 0) { - - String htmlMessage = String.format( - CONFIRMATION_FORMAT, - t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.message"), - t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.help")); - int i = JOptionPane.showConfirmDialog( - getTopestUI(), - htmlMessage, - t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.title"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (i == JOptionPane.CANCEL_OPTION) { - throw new PropertyVetoException("The user does not want to erase his data.", evt); - } - } - } - }); - - // Pour mettre à jour les mensuratuibs suite au changement du mode de recopie des observations individuelles - model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { - - SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); - CopyIndividualObservationMode oldCopyMode = (CopyIndividualObservationMode) evt.getOldValue(); - CopyIndividualObservationMode newCopyMode = (CopyIndividualObservationMode) evt.getNewValue(); - - if (newCopyMode == null) { - - return; - } - boolean nothingCopyMode = CopyIndividualObservationMode.NOTHING == newCopyMode; - - - if (!nothingCopyMode) { - - source.setFrequenciesConfigurationMode(FrequencyConfigurationMode.RAFALE); - source.setAddIndividualObservationOnRafale(true); - - } - - - // si on est en initialisation, ca ne sert à rien de regénérer les lignes, elles sont sensées être chargées - if (source.isInitBatchEdition()) { - - if (log.isInfoEnabled()) { - log.info("Skip recompute frequencies from indivudal observations (flag initBatchEdition is on), copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); - } - return; - } - - model.setRowComputationInProgress(true); - - try { - - model.getRows().clear(); - model.getRowsInError().clear(); - model.reloadRows(); - model.recomputeIndividualObservationRowsValidateState(); - reloadRowsFromIndividualObservations(); - - } finally { - model.setRowComputationInProgress(false); - } - - getTableModel().fireTableDataChanged(); - getObsTableModel().fireTableDataChanged(); - - }); +// model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INDIVIDUAL_OBSERVATION_ROWS, evt -> { +// getObsTableModel().setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue()); +// }); +// +// // 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 (source.isInitBatchEdition()) { +// +// if (log.isInfoEnabled()) { +// log.info("Skip ask user to confirm copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); +// } +// return; +// } +// +// // le seul mode où l'utilisateur ne peut rien saisir est le mode tout +// if (CopyIndividualObservationMode.ALL != oldCopyMode) { +// +// long rowsWithUserData; +// +// // si on etait en mode taille et que l'utilisateur avait saisi des tailles +// if (oldCopyMode == CopyIndividualObservationMode.SIZE) { +// rowsWithUserData = model.getRows().stream() +// .filter(SpeciesFrequencyRowModel::withWeight) +// .count(); +// +// } else { +// rowsWithUserData = model.getRows().stream() +// .filter(row -> row.getLengthStep() != null || row.withNumber() || row.withWeight()) +// .count(); +// } +// +// if (rowsWithUserData > 0) { +// +// String htmlMessage = String.format( +// CONFIRMATION_FORMAT, +// t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.message"), +// t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.help")); +// int i = JOptionPane.showConfirmDialog( +// getTopestUI(), +// htmlMessage, +// t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.title"), +// JOptionPane.OK_CANCEL_OPTION, +// JOptionPane.QUESTION_MESSAGE); +// +// if (i == JOptionPane.CANCEL_OPTION) { +// throw new PropertyVetoException("The user does not want to erase his data.", evt); +// } +// } +// } +// }); +// +// // Pour mettre à jour les mensuratuibs suite au changement du mode de recopie des observations individuelles +// model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { +// +// SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); +// CopyIndividualObservationMode oldCopyMode = (CopyIndividualObservationMode) evt.getOldValue(); +// CopyIndividualObservationMode newCopyMode = (CopyIndividualObservationMode) evt.getNewValue(); +// +// if (newCopyMode == null) { +// +// return; +// } +// boolean nothingCopyMode = CopyIndividualObservationMode.NOTHING == newCopyMode; +// +// +// if (!nothingCopyMode) { +// +// source.setFrequenciesConfigurationMode(FrequencyConfigurationMode.RAFALE); +// source.setAddIndividualObservationOnRafale(true); +// +// } +// +// +// // si on est en initialisation, ca ne sert à rien de regénérer les lignes, elles sont sensées être chargées +// if (source.isInitBatchEdition()) { +// +// if (log.isInfoEnabled()) { +// log.info("Skip recompute frequencies from indivudal observations (flag initBatchEdition is on), copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); +// } +// return; +// } +// +// model.setRowComputationInProgress(true); +// +// try { +// +// model.getRows().clear(); +// model.getRowsInError().clear(); +// model.reloadRows(); +// model.recomputeIndividualObservationRowsValidateState(); +// reloadRowsFromIndividualObservations(); +// +// } finally { +// model.setRowComputationInProgress(false); +// } +// +// getTableModel().fireTableDataChanged(); +// getObsTableModel().fireTableDataChanged(); +// +// }); // set the pattern to the weight in simple counting mode according to the weight unit @@ -774,30 +754,32 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // init histogram - initFrequenciesHistogram(); +// initFrequenciesHistogram(); // init data table initDataTable(); - initAverageWeightsHistogram(); +// initAverageWeightsHistogram(); // init log table initLogTable(); - initObsTable(); + this.individualObservationBatchTableHandler = new IndividualObservationBatchTableHandler(ui); + this.averageWeightsHistogramHandler = new AverageWeightsHistogramHandler(ui); + this.frequenciesHistogramHandler = new FrequenciesHistogramHandler(ui); listenValidatorValid(ui.getValidator(), model); } - protected IndividualObservationBatchTableModel getObsTableModel() { - return (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); - } +// protected IndividualObservationBatchTableModel getObsTableModel() { +// return (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); +// } - public void showAverageWeightsHistogram() { - averageWeightsHistogramPopup.setVisible(true); - } +// public void showAverageWeightsHistogram() { +// averageWeightsHistogramPopup.setVisible(true); +// } @Override protected JComponent getComponentToFocus() { @@ -819,9 +801,14 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.setCanDisplayNotifications(false); - frequenciesHistogramPopup.dispose(); - averageWeightsHistogramPopup.dispose(); - resetSamplingLabel(); +// frequenciesHistogramPopup.dispose(); +// averageWeightsHistogramPopup.dispose(); + + IOUtils.closeQuietly(individualObservationBatchTableHandler); + IOUtils.closeQuietly(averageWeightsHistogramHandler); + IOUtils.closeQuietly(frequenciesHistogramHandler); + +// resetSamplingLabel(); frequencyEditor = null; @@ -834,12 +821,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.setSimpleCount(null); model.setModify(false); - EditSpeciesBatchPanelUI parent = getParentContainer(EditSpeciesBatchPanelUI.class); - parent.switchToEditBatch(); - - // 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(); - TuttiUIContext context = getContext(); if (context.isIchtyometerConnected()) { @@ -847,7 +828,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci context.getIchtyometerReader().removeFeedModeReaderListener(feedReaderListener); } - individualObservationUICache.close(); + EditSpeciesBatchPanelUI parent = getParentContainer(EditSpeciesBatchPanelUI.class); + parent.switchToEditBatch(); + +// // 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(); } @@ -857,17 +844,22 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci Objects.requireNonNull(speciesBatch, "Impossible d'éditer un lot non renseigné"); // on enlève la colonne spécifique à l'espèce précédente - removeMaturityColumnIfPresent(); + individualObservationBatchTableHandler.removeMaturityColumnIfPresent(); - if (title != null) { + SpeciesFrequencyUIModel model = getModel(); - frequenciesHistogramPopup.setTitle(title + t("tutti.editSpeciesFrequencies.title")); - averageWeightsHistogramPopup.setTitle(title + weightUnit.decorateLabel(t("tutti.editSpeciesFrequencies.field.graphAverageWeight"))); + Objects.requireNonNull(title, "title can't be null here ?!"); +// if (title != null) { - } + model.getAverageWeightsHistogramModel().setTitle(title); + model.getFrequenciesHistogramModel().setTitle(title); +// frequenciesHistogramPopup.setTitle(title + t("tutti.editSpeciesFrequencies.title")); +// averageWeightsHistogramPopup.setTitle(title + weightUnit.decorateLabel(t("tutti.editSpeciesFrequencies.field.graphAverageWeight"))); + +// } frequencyEditor = editor; - SpeciesFrequencyUIModel model = getModel(); + model.setNextEditableRowIndex(frequencyEditor.getNextEditableRowIndex()); @@ -887,50 +879,79 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.setCopyRtpWeights(false); model.setAddIndividualObservationOnRafale(false); - Optional<String> speciesMaturityPmfmId = Optional.empty(); + // get species from protocol + SpeciesProtocol speciesProtocol = getDataContext().isProtocolFilled() ? speciesOrBenthosBatchUISupport.getSpeciesProtocol(speciesBatch.getSpecies()) : null; - // set rtps - TuttiProtocol protocol = getDataContext().getProtocol(); - if (protocol != null) { + // set rtp + Rtp rtp = null; - Integer referenceTaxonId = speciesBatch.getSpecies().getReferenceTaxonId(); - Optional<SpeciesProtocol> optSpeciesProtocol = - protocol.getSpecies().stream() - .filter(sp -> sp.getSpeciesReferenceTaxonId().equals(referenceTaxonId)) - .findFirst(); + if (speciesProtocol != null) { - if (optSpeciesProtocol.isPresent()) { - SpeciesProtocol speciesProtocol = optSpeciesProtocol.get(); - Rtp rtp; - CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(getModel().getSexCaracteristic().getIdAsInt()); + CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(getModel().getSexCaracteristic().getIdAsInt()); - if (sampleCategoryValue != null) { - - if (Sexs.isMale(sampleCategoryValue)) { - rtp = speciesProtocol.getRtpMale(); - } else if (Sexs.isFemale(sampleCategoryValue)) { - rtp = speciesProtocol.getRtpFemale(); - } else { - rtp = speciesProtocol.getRtpUndefined(); - } + if (sampleCategoryValue != null) { + if (Sexs.isMale(sampleCategoryValue)) { + rtp = speciesProtocol.getRtpMale(); + } else if (Sexs.isFemale(sampleCategoryValue)) { + rtp = speciesProtocol.getRtpFemale(); } else { rtp = speciesProtocol.getRtpUndefined(); } - getModel().setRtp(rtp); - speciesMaturityPmfmId = Optional.ofNullable(speciesProtocol.getMaturityPmfmId()); + } else { + rtp = speciesProtocol.getRtpUndefined(); } } - // Add maturity column if necessary + getModel().setRtp(rtp); + + // init maturity caracteristic + individualObservationBatchTableHandler.initMaturityCaracteristic(speciesProtocol); + +// Optional<String> optionalMaturityPmfmId; +// Optional<SpeciesProtocol> optSpeciesProtocol = +// protocol.getSpecies().stream() +// .filter(sp -> sp.getSpeciesReferenceTaxonId().equals(referenceTaxonId)) +// .findFirst(); +// +// if (optSpeciesProtocol.isPresent()) { +// SpeciesProtocol speciesProtocol = optSpeciesProtocol.get(); +// Rtp rtp; +// CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(getModel().getSexCaracteristic().getIdAsInt()); +// +// if (sampleCategoryValue != null) { +// +// if (Sexs.isMale(sampleCategoryValue)) { +// rtp = speciesProtocol.getRtpMale(); +// } else if (Sexs.isFemale(sampleCategoryValue)) { +// rtp = speciesProtocol.getRtpFemale(); +// } else { +// rtp = speciesProtocol.getRtpUndefined(); +// } +// +// } else { +// rtp = speciesProtocol.getRtpUndefined(); +// } +// getModel().setRtp(rtp); +// +// speciesMaturityPmfmId = Optional.ofNullable(speciesProtocol.getMaturityPmfmId()); +// } + +// } +// +// // Add maturity column if necessary +// +// Optional<Caracteristic> optionalMaturityCaracteristic = speciesMaturityPmfmId.map(maturityCaracteristics::get); +// +// setMaturityCaracteristic(optionalMaturityCaracteristic.orElse(null)); - Optional<Caracteristic> optionalMaturityCaracteristic = speciesMaturityPmfmId.map(maturityCaracteristics::get); + loadFrequenciesAndObservations(frequency, individualObservations); - setMaturityCaracteristic(optionalMaturityCaracteristic.orElse(null)); + individualObservationBatchTableHandler.initObservationsCache(frequencyEditor.getEditRow(), getDataContext().getFishingOperation()); - loadFrequenciesAndObservations(frequency, individualObservations); +// individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getIndividualObservationRows()); if (getContext().isIchtyometerConnected()) { @@ -939,8 +960,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } - individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getIndividualObservationRows()); - model.setModify(false); } finally { @@ -971,7 +990,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } public IndividualObservationUICache getIndividualObservationUICache() { - return individualObservationUICache; + return individualObservationBatchTableHandler.getIndividualObservationUICache(); } //------------------------------------------------------------------------// @@ -1086,81 +1105,81 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } - protected void initFrequenciesHistogram() { - frequenciesChart = ChartFactory.createXYBarChart(null, - t("tutti.editSpeciesFrequencies.table.header.lengthStep"), - false, - t("tutti.editSpeciesFrequencies.table.header.number"), - getModel().frequenciesDataset); - frequenciesChart.clearSubtitles(); - - ValueAxis rangeAxis = frequenciesChart.getXYPlot().getRangeAxis(); - rangeAxis.setAutoRange(true); - rangeAxis.setStandardTickUnits(new NumberTickUnitSource(true)); - - ValueAxis domainAxis = frequenciesChart.getXYPlot().getDomainAxis(); - domainAxis.setAutoRange(true); - domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); - domainAxis.setMinorTickMarksVisible(true); - - frequenciesChart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); - - final ChartPanel chartPanel = new ChartPanel(frequenciesChart); - chartPanel.setDomainZoomable(false); - chartPanel.setMouseZoomable(false); - chartPanel.setPopupMenu(null); - - JPanel histogramPanel = ui.getHistogramPanel(); - histogramPanel.add(chartPanel, BorderLayout.CENTER); - - chartPanel.addMouseListener(new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - super.mouseClicked(e); - if (e.getClickCount() > 1) { - - frequenciesHistogramPopup.getContentPane().removeAll(); - ChartPanel chartPanel = new ChartPanel(frequenciesChart); - frequenciesHistogramPopup.getContentPane().add(chartPanel); - frequenciesHistogramPopup.pack(); - frequenciesHistogramPopup.setVisible(true); - - } - } - }); - } - - protected void initAverageWeightsHistogram() { - averageWeightsChart = ChartFactory.createXYLineChart(null, - t("tutti.editSpeciesFrequencies.table.header.lengthStep"), - getConfig().getIndividualObservationWeightUnit() - .decorateLabel(t("tutti.editSpeciesFrequencies.averageWeight.label")), - getModel().averageWeightsDataset); - averageWeightsChart.clearSubtitles(); - - ValueAxis rangeAxis = averageWeightsChart.getXYPlot().getRangeAxis(); - rangeAxis.setAutoRange(true); - rangeAxis.setStandardTickUnits(new NumberTickUnitSource()); - rangeAxis.setMinorTickMarksVisible(true); - - ValueAxis domainAxis = averageWeightsChart.getXYPlot().getDomainAxis(); - domainAxis.setAutoRange(true); - domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); - domainAxis.setMinorTickMarksVisible(true); - - XYLineAndShapeRenderer plotRenderer = (XYLineAndShapeRenderer) averageWeightsChart.getXYPlot().getRenderer(); - plotRenderer.setSeriesPaint(0, getConfig().getColorComputedWeights()); - plotRenderer.setBaseShapesVisible(true); - - final ChartPanel chartPanel = new ChartPanel(averageWeightsChart); - chartPanel.setDomainZoomable(false); - chartPanel.setMouseZoomable(false); - chartPanel.setPopupMenu(null); - - averageWeightsHistogramPopup.getContentPane().add(chartPanel); - averageWeightsHistogramPopup.pack(); - } +// protected void initFrequenciesHistogram() { +// frequenciesChart = ChartFactory.createXYBarChart(null, +// t("tutti.editSpeciesFrequencies.table.header.lengthStep"), +// false, +// t("tutti.editSpeciesFrequencies.table.header.number"), +// getModel().frequenciesDataset); +// frequenciesChart.clearSubtitles(); +// +// ValueAxis rangeAxis = frequenciesChart.getXYPlot().getRangeAxis(); +// rangeAxis.setAutoRange(true); +// rangeAxis.setStandardTickUnits(new NumberTickUnitSource(true)); +// +// ValueAxis domainAxis = frequenciesChart.getXYPlot().getDomainAxis(); +// domainAxis.setAutoRange(true); +// domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); +// domainAxis.setMinorTickMarksVisible(true); +// +// frequenciesChart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); +// +// final ChartPanel chartPanel = new ChartPanel(frequenciesChart); +// chartPanel.setDomainZoomable(false); +// chartPanel.setMouseZoomable(false); +// chartPanel.setPopupMenu(null); +// +// JPanel histogramPanel = ui.getHistogramPanel(); +// histogramPanel.add(chartPanel, BorderLayout.CENTER); +// +// chartPanel.addMouseListener(new MouseAdapter() { +// +// @Override +// public void mouseClicked(MouseEvent e) { +// super.mouseClicked(e); +// if (e.getClickCount() > 1) { +// +// frequenciesHistogramPopup.getContentPane().removeAll(); +// ChartPanel chartPanel = new ChartPanel(frequenciesChart); +// frequenciesHistogramPopup.getContentPane().add(chartPanel); +// frequenciesHistogramPopup.pack(); +// frequenciesHistogramPopup.setVisible(true); +// +// } +// } +// }); +// } + +// protected void initAverageWeightsHistogram() { +// averageWeightsChart = ChartFactory.createXYLineChart(null, +// t("tutti.editSpeciesFrequencies.table.header.lengthStep"), +// getConfig().getIndividualObservationWeightUnit() +// .decorateLabel(t("tutti.editSpeciesFrequencies.averageWeight.label")), +// getModel().averageWeightsDataset); +// averageWeightsChart.clearSubtitles(); +// +// ValueAxis rangeAxis = averageWeightsChart.getXYPlot().getRangeAxis(); +// rangeAxis.setAutoRange(true); +// rangeAxis.setStandardTickUnits(new NumberTickUnitSource()); +// rangeAxis.setMinorTickMarksVisible(true); +// +// ValueAxis domainAxis = averageWeightsChart.getXYPlot().getDomainAxis(); +// domainAxis.setAutoRange(true); +// domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); +// domainAxis.setMinorTickMarksVisible(true); +// +// XYLineAndShapeRenderer plotRenderer = (XYLineAndShapeRenderer) averageWeightsChart.getXYPlot().getRenderer(); +// plotRenderer.setSeriesPaint(0, getConfig().getColorComputedWeights()); +// plotRenderer.setBaseShapesVisible(true); +// +// final ChartPanel chartPanel = new ChartPanel(averageWeightsChart); +// chartPanel.setDomainZoomable(false); +// chartPanel.setMouseZoomable(false); +// chartPanel.setPopupMenu(null); +// +// averageWeightsHistogramPopup.getContentPane().add(chartPanel); +// averageWeightsHistogramPopup.pack(); +// } protected void initLogTable() { JXTable logTable = ui.getLogsTable(); @@ -1190,184 +1209,185 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci logTable.addHighlighter(evenHighlighter); } - protected void initObsTable() { - - JXTable obsTable = ui.getObsTable(); - - // can show / hide some columns in model - obsTable.setColumnControlVisible(true); - - // create obsTable column model - DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); - Decorator<Caracteristic> caracteristicDecorator = - getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); - Decorator<Caracteristic> caracteristicTipDecorator = - getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); - - Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = - getDecorator(CaracteristicQualitativeValue.class, null); - - { - // Rank column - - addIntegerColumnToModel(columnModel, - IndividualObservationBatchTableModel.RANK, - TuttiUI.INT_10_DIGITS_PATTERN, - obsTable); - - } - - { // Size column - - addFloatColumnToModel(columnModel, - IndividualObservationBatchTableModel.SIZE, - TuttiUI.DECIMAL3_PATTERN, - obsTable); - } - - WeightUnit individualObservationWeightUnit = getConfig().getIndividualObservationWeightUnit(); - - { // Weight column - - addFloatColumnToModel(columnModel, - IndividualObservationBatchTableModel.WEIGHT, - individualObservationWeightUnit, - obsTable); - } - - List<Caracteristic> defaultCaracteristic = getModel().getDefaultCaracteristic(); - - for (Caracteristic caracteristic : defaultCaracteristic) { - addCaracteristicColumnToModel(obsTable, - columnModel, - caracteristicDecorator, - caracteristicTipDecorator, - caracteristicQualitativeDecorator, - caracteristic); - } - - { // Other caracteristics column - - Set<Caracteristic> caracteristicsToSkip = Collections.unmodifiableSet( - Sets.newHashSet(getModel().getDefaultCaracteristic())); - - addColumnToModel(columnModel, - CaracteristicMapCellComponent.newEditor(ui, caracteristicsToSkip), - CaracteristicMapCellComponent.newRender(getContext()), - IndividualObservationBatchTableModel.OTHER_CARACTERISTICS); - - } - - { - // Smapling code column - - addColumnToModel(columnModel, - SamplingCodeCellEditor.newEditor(ui), - SamplingCodeCellRenderer.newRender(), - IndividualObservationBatchTableModel.SAMPLING_CODE); - - } - - { // Comment column - - addColumnToModel(columnModel, - CommentCellEditor.newEditor(ui), - CommentCellRenderer.newRender(), - IndividualObservationBatchTableModel.COMMENT); - - } - - { // File column - - addColumnToModel(columnModel, - AttachmentCellEditor.newEditor(ui), - AttachmentCellRenderer.newRender(getDecorator(Attachment.class, null)), - IndividualObservationBatchTableModel.ATTACHMENT); - } - - // create obsTable model - IndividualObservationBatchTableModel tableModel = - new IndividualObservationBatchTableModel(individualObservationWeightUnit, - getModel(), -// defaultCaracteristic, -// getModel().getSexCaracteristic(), - columnModel); - - obsTable.setModel(tableModel); - obsTable.setColumnModel(columnModel); - - initTable(obsTable); - Color cellWithValueColor = getConfig().getColorCellWithValue(); - - Highlighter commentHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( - new HighlightPredicate.AndHighlightPredicate( - new HighlightPredicate.IdentifierHighlightPredicate(IndividualObservationBatchTableModel.COMMENT), - // for not null value - (renderer, adapter) -> { - String value = (String) adapter.getValue(); - return StringUtils.isNotBlank(value); - }), cellWithValueColor); - obsTable.addHighlighter(commentHighlighter); - - installTableKeyListener(columnModel, obsTable, false); - - tableModel.addTableModelListener(e -> { - - int firstRow = e.getFirstRow(); - int lastRow = e.getLastRow(); - - switch (e.getType()) { - case TableModelEvent.DELETE: - if (tableModel.getRowCount() == 0) { - tableModel.addNewRow(); - - } else { - tableModel.recomputeRankOrders(firstRow); - } - break; - - case TableModelEvent.INSERT: - for (int i = firstRow; i <= lastRow; i++) { - IndividualObservationBatchRowModel newRow = tableModel.getRows().get(i); - newRow.addPropertyChangeListener(obsChangedListener); - - if (getModel().mustCopyIndividualObservationSize()) { - - getTableModel().incrementFrequencyRowsNumbers(newRow); - - } - - getModel().recomputeIndividualObservationRowValidState(newRow); - } - break; - - case TableModelEvent.UPDATE: - if (tableModel.getRowCount() == 0) { - tableModel.addNewRow(); - } - } - - getModel().recomputeCanEditLengthStep(); - }); - - obsTable.getSelectionModel().addListSelectionListener(e -> { - - if (!getModel().isInRafaleRowCreation()) { - resetSamplingLabel(); - } - - IndividualObservationBatchRowModel selectedRow = null; - - if (!obsTable.getSelectionModel().isSelectionEmpty()) { - if (obsTable.getSelectedRowCount() == 1) { - selectedRow = getObsTableModel().getEntry(obsTable.getSelectedRow()); - - } - } - - individualObservationUICache.updateSelectedRow(selectedRow); - }); - } +// protected void initObsTable() { +// +// JXTable obsTable = ui.getObsTable(); +// +// // can show / hide some columns in model +// obsTable.setColumnControlVisible(true); +// +// // create obsTable column model +// DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); +// Decorator<Caracteristic> caracteristicDecorator = +// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); +// Decorator<Caracteristic> caracteristicTipDecorator = +// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); +// +// Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = +// getDecorator(CaracteristicQualitativeValue.class, null); +// +// { +// // Rank column +// +// addIntegerColumnToModel(columnModel, +// IndividualObservationBatchTableModel.RANK, +// TuttiUI.INT_10_DIGITS_PATTERN, +// obsTable); +// +// } +// +// { // Size column +// +// addFloatColumnToModel(columnModel, +// IndividualObservationBatchTableModel.SIZE, +// TuttiUI.DECIMAL3_PATTERN, +// obsTable); +// } +// +// WeightUnit individualObservationWeightUnit = getConfig().getIndividualObservationWeightUnit(); +// +// { // Weight column +// +// addFloatColumnToModel(columnModel, +// IndividualObservationBatchTableModel.WEIGHT, +// individualObservationWeightUnit, +// obsTable); +// } +// +// List<Caracteristic> defaultCaracteristic = getModel().getDefaultCaracteristic(); +// +// for (Caracteristic caracteristic : defaultCaracteristic) { +// addCaracteristicColumnToModel(obsTable, +// columnModel, +// caracteristicDecorator, +// caracteristicTipDecorator, +// caracteristicQualitativeDecorator, +// caracteristic); +// } +// +// { // Other caracteristics column +// +// Set<Caracteristic> caracteristicsToSkip = Collections.unmodifiableSet( +// Sets.newHashSet(getModel().getDefaultCaracteristic())); +// +// addColumnToModel(columnModel, +// CaracteristicMapCellComponent.newEditor(ui, caracteristicsToSkip), +// CaracteristicMapCellComponent.newRender(getContext()), +// IndividualObservationBatchTableModel.OTHER_CARACTERISTICS); +// +// } +// +// { +// // Smapling code column +// +// addColumnToModel(columnModel, +// SamplingCodeCellEditor.newEditor(ui), +// SamplingCodeCellRenderer.newRender(), +// IndividualObservationBatchTableModel.SAMPLING_CODE); +// +// } +// +// { // Comment column +// +// addColumnToModel(columnModel, +// CommentCellEditor.newEditor(ui), +// CommentCellRenderer.newRender(), +// IndividualObservationBatchTableModel.COMMENT); +// +// } +// +// { // File column +// +// addColumnToModel(columnModel, +// AttachmentCellEditor.newEditor(ui), +// AttachmentCellRenderer.newRender(getDecorator(Attachment.class, null)), +// IndividualObservationBatchTableModel.ATTACHMENT); +// } +// +// // create obsTable model +// IndividualObservationBatchTableModel tableModel = +// new IndividualObservationBatchTableModel(individualObservationWeightUnit, +// getModel(), +//// defaultCaracteristic, +//// getModel().getSexCaracteristic(), +// columnModel); +// +// obsTable.setModel(tableModel); +// obsTable.setColumnModel(columnModel); +// +// initTable(obsTable); +// Color cellWithValueColor = getConfig().getColorCellWithValue(); +// +// Highlighter commentHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( +// new HighlightPredicate.AndHighlightPredicate( +// new HighlightPredicate.IdentifierHighlightPredicate(IndividualObservationBatchTableModel.COMMENT), +// // for not null value +// (renderer, adapter) -> { +// String value = (String) adapter.getValue(); +// return StringUtils.isNotBlank(value); +// }), cellWithValueColor); +// obsTable.addHighlighter(commentHighlighter); +// +// installTableKeyListener(columnModel, obsTable, false); +// +// tableModel.addTableModelListener(e -> { +// +// int firstRow = e.getFirstRow(); +// int lastRow = e.getLastRow(); +// +// switch (e.getType()) { +// case TableModelEvent.DELETE: +// if (tableModel.getRowCount() == 0) { +// tableModel.addNewRow(); +// +// } else { +// tableModel.recomputeRankOrders(firstRow); +// } +// break; +// +// case TableModelEvent.INSERT: +// for (int i = firstRow; i <= lastRow; i++) { +// IndividualObservationBatchRowModel newRow = tableModel.getRows().get(i); +// newRow.addPropertyChangeListener(obsChangedListener); +// +// if (getModel().mustCopyIndividualObservationSize()) { +// +// getTableModel().incrementFrequencyRowsNumbers(newRow); +// +// } +// +// getModel().recomputeIndividualObservationRowValidState(newRow); +// } +// break; +// +// case TableModelEvent.UPDATE: +// if (tableModel.getRowCount() == 0) { +// tableModel.addNewRow(); +// } +// } +// +// getModel().recomputeCanEditLengthStep(); +// }); +// +// obsTable.getSelectionModel().addListSelectionListener(e -> { +// +// if (!getModel().isInRafaleRowCreation()) { +// resetSamplingLabel(); +// } +// +// IndividualObservationBatchRowModel selectedRow = null; +// +// if (!obsTable.getSelectionModel().isSelectionEmpty()) { +// if (obsTable.getSelectedRowCount() == 1) { +// selectedRow = getObsTableModel().getEntry(obsTable.getSelectedRow()); +// +// } +// } +// +// individualObservationUICache.updateSelectedRow(selectedRow); +// }); +// } +// public void resetSamplingLabel() { if (log.isDebugEnabled()) { @@ -1376,66 +1396,63 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci ui.getSamplingWarningLabel().setVisible(false); } - public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { - getModel().setMaturityCaracteristic(maturityCaracteristic); -// getObsTableModel().setMaturityCaracteristic(maturityCaracteristic); - if (maturityCaracteristic != null) { - addMaturityCaracteristicColumnToModel(maturityCaracteristic); - } - } - - protected void addMaturityCaracteristicColumnToModel(Caracteristic caracteristic) { - - Decorator<Caracteristic> caracteristicDecorator = - getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); - Decorator<Caracteristic> caracteristicTipDecorator = - getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); - - Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = - getDecorator(CaracteristicQualitativeValue.class, null); - - // remove the row sorter while we add the new column - JXTable obsTable = ui.getObsTable(); - obsTable.setRowSorter(null); - obsTable.setAutoCreateRowSorter(false); - - TableColumnModelExt columnModel = (TableColumnModelExt) obsTable.getColumnModel(); - - maturityColumnId = addCaracteristicColumnToModel(obsTable, - columnModel, - caracteristicDecorator, - caracteristicTipDecorator, - caracteristicQualitativeDecorator, - caracteristic); - - Objects.requireNonNull(maturityColumnId); - - getObsTableModel().addMaturityIdentifier(maturityColumnId); - - // on cherche le bon index où insérer la colonne maturité (avant les autres caractéristiques, mais elle peut etre cachee) - int modelIndex = columnModel.getColumnExt(IndividualObservationBatchTableModel.OTHER_CARACTERISTICS).getModelIndex(); - int indexToMove = obsTable.convertColumnIndexToView(modelIndex); - - // si la colonne autres caracteristiques est cachée, alors on cherche la première colonne suivante non cachée - int columnCount = columnModel.getColumnCount(true); - while (indexToMove == -1 && modelIndex < columnCount) { - indexToMove = obsTable.convertColumnIndexToView(modelIndex); - modelIndex++; - } - // si une colonne après celle des autres caractéristiques est visible, on déplace la maturité avant cette colonne - // sinon, on laisse la maturité à la fin - if (modelIndex != -1) { - obsTable.moveColumn(columnModel.getColumnCount() - 1, indexToMove); - } - // reset the row sorter - obsTable.setAutoCreateRowSorter(true); - } +// public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { +// getModel().setMaturityCaracteristic(maturityCaracteristic); +//// getObsTableModel().setMaturityCaracteristic(maturityCaracteristic); +// if (maturityCaracteristic != null) { +// individualObservationBatchTableHandler.addMaturityCaracteristicColumnToModel(maturityCaracteristic); +// } +// } + +// protected void addMaturityCaracteristicColumnToModel(Caracteristic caracteristic) { +// +// Decorator<Caracteristic> caracteristicDecorator = +// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); +// Decorator<Caracteristic> caracteristicTipDecorator = +// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); +// +// Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = +// getDecorator(CaracteristicQualitativeValue.class, null); +// +// // remove the row sorter while we add the new column +// JXTable obsTable = ui.getObsTable(); +// obsTable.setRowSorter(null); +// obsTable.setAutoCreateRowSorter(false); +// +// TableColumnModelExt columnModel = (TableColumnModelExt) obsTable.getColumnModel(); +// +// maturityColumnId = addCaracteristicColumnToModel(obsTable, +// columnModel, +// caracteristicDecorator, +// caracteristicTipDecorator, +// caracteristicQualitativeDecorator, +// caracteristic); +// +// Objects.requireNonNull(maturityColumnId); +// +// getObsTableModel().addMaturityIdentifier(maturityColumnId); +// +// // on cherche le bon index où insérer la colonne maturité (avant les autres caractéristiques, mais elle peut etre cachee) +// int modelIndex = columnModel.getColumnExt(IndividualObservationBatchTableModel.OTHER_CARACTERISTICS).getModelIndex(); +// int indexToMove = obsTable.convertColumnIndexToView(modelIndex); +// +// // si la colonne autres caracteristiques est cachée, alors on cherche la première colonne suivante non cachée +// int columnCount = columnModel.getColumnCount(true); +// while (indexToMove == -1 && modelIndex < columnCount) { +// indexToMove = obsTable.convertColumnIndexToView(modelIndex); +// modelIndex++; +// } +// // si une colonne après celle des autres caractéristiques est visible, on déplace la maturité avant cette colonne +// // sinon, on laisse la maturité à la fin +// if (modelIndex != -1) { +// obsTable.moveColumn(columnModel.getColumnCount() - 1, indexToMove); +// } +// // reset the row sorter +// obsTable.setAutoCreateRowSorter(true); +// } protected CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> addCaracteristicColumnToModel(JXTable table, TableColumnModelExt columnModel, - Decorator<Caracteristic> caracteristicDecorator, - Decorator<Caracteristic> caracteristicTipDecorator, - Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator, Caracteristic caracteristic) { String header = caracteristicDecorator.toString(caracteristic); @@ -1533,8 +1550,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SoundEngine soundEngine = getContext().getSoundEngine(); soundEngine.beepOnIchtyometerErrorReception(); - throw new ApplicationBusinessException( - t("tutti.editSpeciesFrequencies.error.itchyometer.bad.record", record.getRecord())); + throw new ApplicationBusinessException(t("tutti.editSpeciesFrequencies.error.itchyometer.bad.record", record.getRecord())); } } @@ -1609,9 +1625,9 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci ui.getLogsScrollPane().setVisible(logVisible); } - protected String getLabelWithUnit(String label, String unit) { - return label + " (" + unit + ")"; - } +// protected String getLabelWithUnit(String label, String unit) { +// return label + " (" + unit + ")"; +// } protected void reloadRowsFromIndividualObservations() { SpeciesFrequencyUIModel model = getModel(); @@ -1664,6 +1680,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } model.reloadRows(); + } @Override @@ -1679,8 +1696,10 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci protected void beforeOpenPopup(int modelRowIndex, int modelColumnIndex) { super.beforeOpenPopup(modelRowIndex, modelColumnIndex); - boolean sampleCodeMenusEnabled = modelRowIndex >= 0 && ui.getObsTable().getSelectedRowCount() == 1 - && getObsTableModel().getRows().get(ui.getObsTable().getSelectedRow()).withSamplingCode(); + 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); } @@ -1703,18 +1722,17 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.setTotalWeight(null); model.setSimpleCount(null); - Caracteristic lengthStepCaracteristic = null; - CopyIndividualObservationMode copyIndividualObservationMode = null; +// Caracteristic lengthStepCaracteristic = null; - List<SpeciesFrequencyRowModel> rows = new ArrayList<>(); - List<IndividualObservationBatchRowModel> obsRows = new ArrayList<>(); +// List<SpeciesFrequencyRowModel> rows = new ArrayList<>(); +// List<IndividualObservationBatchRowModel> obsRows = new ArrayList<>(); Species species = speciesBatch.getSpecies(); - IndividualObservationBatchTableModel obsTableModel = getObsTableModel(); - obsTableModel.setSpecies(species); +// IndividualObservationBatchTableModel obsTableModel = getObsTableModel(); +// obsTableModel.setSpecies(species); - SamplingCodePrefix samplingCodePrefix = new SamplingCodePrefix(getConfig().getSamplingCodePrefix(), decorate(species, DecoratorService.WITH_SURVEY_CODE_NO_NAME)); - obsTableModel.setSamplingCodePrefix(samplingCodePrefix); +// SamplingCodePrefix samplingCodePrefix = new SamplingCodePrefix(getConfig().getSamplingCodePrefix(), decorate(species, DecoratorService.WITH_SURVEY_CODE_NO_NAME)); +// obsTableModel.setSamplingCodePrefix(samplingCodePrefix); model.setTotalWeight(speciesBatch.getWeight()); @@ -1722,82 +1740,123 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // try to load existing frequency // - if (CollectionUtils.isNotEmpty(frequency)) { - - SpeciesFrequencyTableModel tableModel = getTableModel(); - - for (SpeciesFrequencyRowModel rowModel : frequency) { - - SpeciesFrequencyRowModel newRow = tableModel.createNewRow(false, false); - newRow.copy(rowModel); - rows.add(newRow); - - } + List<SpeciesFrequencyRowModel> rows = getTableModel().loadRows(frequency); - // use first frequency row length step caracteristics + Caracteristic lengthStepCaracteristic = null; - SpeciesFrequencyRowModel rowModel = frequency.get(0); - lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); + if (!rows.isEmpty()) { + SpeciesFrequencyRowModel firstFrequencyRow = frequency.get(0); + lengthStepCaracteristic = firstFrequencyRow.getLengthStepCaracteristic(); if (log.isInfoEnabled()) { - log.info("Use existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); + log.info("Use existing lengthStep caracteristic / step from first existing frequency: " + decorate(lengthStepCaracteristic)); } + } +// if (CollectionUtils.isNotEmpty(frequency)) { +// +// SpeciesFrequencyTableModel tableModel = getTableModel(); +// +// for (SpeciesFrequencyRowModel rowModel : frequency) { +// +// SpeciesFrequencyRowModel newRow = tableModel.createNewRow(false, false); +// newRow.copy(rowModel); +// rows.add(newRow); +// +// } +// +// // use first frequency row length step caracteristics +// +// SpeciesFrequencyRowModel rowModel = frequency.get(0); +// lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); +// +// if (log.isInfoEnabled()) { +// log.info("Use existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); +// } +// } + // // try to load existing individual observations // - if (CollectionUtils.isNotEmpty(individualObservations)) { - - IndividualObservationBatchTableModel tableModel = getObsTableModel(); - tableModel.setRows(new ArrayList<>()); - - int rankOrder = 1; - for (IndividualObservationBatchRowModel rowModel : individualObservations) { - - CopyIndividualObservationMode incomingCopyIndividualObservationMode = rowModel.getCopyIndividualObservationMode(); - Objects.requireNonNull(incomingCopyIndividualObservationMode, "Mode de recopie non trouvé sur l'observation individuelle: " + rowModel.getId()); - if (copyIndividualObservationMode == null) { - copyIndividualObservationMode = incomingCopyIndividualObservationMode; - } else { - if (copyIndividualObservationMode != incomingCopyIndividualObservationMode) { - throw new IllegalStateException("Plusieurs modes de recopie trouvés sur les observations individuelles du lot, ce qui est impossible"); - } - } - IndividualObservationBatchRowModel newRow = tableModel.createNewRow(); - newRow.copy(rowModel); - newRow.setRankOrder(rankOrder++); - newRow.addPropertyChangeListener(obsChangedListener); - newRow.setValid(true); + List<IndividualObservationBatchRowModel> individualObservationRows = individualObservationBatchTableHandler.loadIndividualObservations(species, individualObservations); - model.moveMaturityValueFromCaracteristicsToDefaultCaracteristics(newRow); + CopyIndividualObservationMode copyIndividualObservationMode; + if (individualObservationRows.isEmpty()) { - obsRows.add(newRow); + copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; - } + } else { - // use first individual observation row length step caracteristics + IndividualObservationBatchRowModel firstIndividualObservationRow = individualObservationRows.get(0); + copyIndividualObservationMode = firstIndividualObservationRow.getCopyIndividualObservationMode(); if (lengthStepCaracteristic == null) { - IndividualObservationBatchRowModel rowModel = individualObservations.get(0); - lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); + + lengthStepCaracteristic = firstIndividualObservationRow.getLengthStepCaracteristic(); if (log.isInfoEnabled()) { - log.info("Use existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); + log.info("Use existing lengthStep caracteristic / step from first individual observation : " + decorate(lengthStepCaracteristic)); } - } - - } else { - // par défaut pas de mode de recopie - copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; + } } if (log.isInfoEnabled()) { log.info("CopyIndividualObservationMode: " + copyIndividualObservationMode); } +// if (CollectionUtils.isNotEmpty(individualObservations)) { +// +// IndividualObservationBatchTableModel tableModel = getObsTableModel(); +// tableModel.setRows(new ArrayList<>()); +// +// int rankOrder = 1; +// for (IndividualObservationBatchRowModel rowModel : individualObservations) { +// +// CopyIndividualObservationMode incomingCopyIndividualObservationMode = rowModel.getCopyIndividualObservationMode(); +// Objects.requireNonNull(incomingCopyIndividualObservationMode, "Mode de recopie non trouvé sur l'observation individuelle: " + rowModel.getId()); +// if (copyIndividualObservationMode == null) { +// copyIndividualObservationMode = incomingCopyIndividualObservationMode; +// } else { +// if (copyIndividualObservationMode != incomingCopyIndividualObservationMode) { +// throw new IllegalStateException("Plusieurs modes de recopie trouvés sur les observations individuelles du lot, ce qui est impossible"); +// } +// } +// IndividualObservationBatchRowModel newRow = tableModel.createNewRow(); +// newRow.copy(rowModel); +// newRow.setRankOrder(rankOrder++); +// newRow.addPropertyChangeListener(obsChangedListener); +// newRow.setValid(true); +// +// model.moveMaturityValueFromCaracteristicsToDefaultCaracteristics(newRow); +// +// obsRows.add(newRow); +// +// } +// +// // use first individual observation row length step caracteristics +// +// if (lengthStepCaracteristic == null) { +// IndividualObservationBatchRowModel rowModel = individualObservations.get(0); +// lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); +// +// if (log.isInfoEnabled()) { +// log.info("Use existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); +// } +// } +// +// } else { +// +// // par défaut pas de mode de recopie +// copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; +// +// } +// +// if (log.isInfoEnabled()) { +// log.info("CopyIndividualObservationMode: " + copyIndividualObservationMode); +// } SpeciesBatchRowModel previousSiblingRow = frequencyEditor.getPreviousSiblingRow(); @@ -1844,7 +1903,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } if (log.isDebugEnabled()) { - log.debug("Will edit batch row: " + speciesBatch + " with " + rows.size() + " frequency"); + log.debug("Will edit batch row: " + speciesBatch + " with " + rows.size() + " frequencies and " + individualObservationRows.size() + " indivudual observations."); } Integer number = speciesBatch.getNumber(); @@ -1870,19 +1929,21 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.setLengthStepCaracteristic(lengthStepCaracteristic); model.setRows(rows); - CaracteristicMap sampleCategoryValues = new CaracteristicMap(); - Iterator<SampleCategory<?>> iterator = speciesBatch.iterator(); - iterator.forEachRemaining(sampleCategory -> { - Caracteristic caracteristic = sampleCategory.getCategoryDef().getCaracteristic(); - sampleCategoryValues.put(caracteristic, sampleCategory.getCategoryValue()); - }); + individualObservationBatchTableHandler.initCaracteristicValues(speciesBatch); - obsTableModel.setDefaultCaracteristicValues(sampleCategoryValues); - model.setNotEditableCaracteristic(sampleCategoryValues.keySet()); +// CaracteristicMap sampleCategoryValues = new CaracteristicMap(); +// Iterator<SampleCategory<?>> iterator = speciesBatch.iterator(); +// iterator.forEachRemaining(sampleCategory -> { +// Caracteristic caracteristic = sampleCategory.getCategoryDef().getCaracteristic(); +// sampleCategoryValues.put(caracteristic, sampleCategory.getCategoryValue()); +// }); +// +// obsTableModel.setDefaultCaracteristicValues(sampleCategoryValues); +// model.setNotEditableCaracteristic(sampleCategoryValues.keySet()); - model.setIndividualObservationRows(obsRows); - obsTableModel.setRows(obsRows); - model.recomputeIndividualObservationRowsValidateState(); + individualObservationBatchTableHandler.setIndividualObservationRows(individualObservationRows); +// obsTableModel.setRows(obsRows); +// model.recomputeIndividualObservationRowsValidateState(); // let's change the copy mode (mark it in init mode to avoid user change confirmation and some recompuations) model.setCopyIndividualObservationMode(null); @@ -1896,13 +1957,47 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } } - protected void removeMaturityColumnIfPresent() { - if (maturityColumnId != null) { - TableColumnExt maturityColumn = ui.getObsTable().getColumnExt(maturityColumnId); - ui.getObsTable().removeColumn(maturityColumn); - getObsTableModel().removeMaturityIdentifier(maturityColumnId); - maturityColumnId = null; - } +// protected void removeMaturityColumnIfPresent() { +// if (maturityColumnId != null) { +// TableColumnExt maturityColumn = ui.getObsTable().getColumnExt(maturityColumnId); +// ui.getObsTable().removeColumn(maturityColumn); +// getObsTableModel().removeMaturityIdentifier(maturityColumnId); +// maturityColumnId = null; +// } +// } + + + // Attention on surcharge les méthodes suivantes pour pouvoir les utiliser dans l'autre handler, ne rien changer (pour le moment)... + + @Override + protected <R> TableColumnExt addIntegerColumnToModel(TableColumnModel model, + ColumnIdentifier<R> identifier, + String numberPattern, + JTable table) { + return super.addIntegerColumnToModel(model, identifier, numberPattern, table); + } + + @Override + protected <R> TableColumnExt addFloatColumnToModel(TableColumnModel model, + ColumnIdentifier<R> identifier, + String numberPattern, + JTable table) { + return super.addFloatColumnToModel(model, identifier, numberPattern, table); + } + + @Override + protected <R> TableColumnExt addFloatColumnToModel(TableColumnModel model, ColumnIdentifier<R> identifier, WeightUnit weightUnit, JTable table) { + return super.addFloatColumnToModel(model, identifier, weightUnit, table); + } + + @Override + protected void installTableKeyListener(TableColumnModel columnModel, JTable table, boolean enterToChangeRow) { + super.installTableKeyListener(columnModel, table, enterToChangeRow); + } + + @Override + protected String decorate(Serializable object, String context) { + return super.decorate(object, context); } } 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 0dc3fa4..2a20c53 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 @@ -29,7 +29,6 @@ import fr.ifremer.tutti.persistence.entities.protocol.Rtp; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.type.WeightUnit; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; 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.util.computable.ComputableData; @@ -39,8 +38,6 @@ import fr.ifremer.tutti.util.Weights; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.jfree.data.xy.XYSeries; -import org.jfree.data.xy.XYSeriesCollection; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -272,19 +269,19 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa */ protected CopyIndividualObservationMode copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; - /** - * To store frequencies graph series. - * - * @since 3.11 - */ - protected final XYSeriesCollection frequenciesDataset; +// /** +// * To store frequencies graph series. +// * +// * @since 3.11 +// */ +// protected final XYSeriesCollection frequenciesDataset; - /** - * To store average weights graph series. - * - * @since 4.5 - */ - protected final XYSeriesCollection averageWeightsDataset; +// /** +// * To store average weights graph series. +// * +// * @since 4.5 +// */ +// protected final XYSeriesCollection averageWeightsDataset; /** * Default caracteristics coming from protocol. @@ -338,6 +335,9 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa */ protected Caracteristic maturityCaracteristic; + protected final AverageWeightsHistogramModel averageWeightsHistogramModel; + protected final FrequenciesHistogramModel frequenciesHistogramModel; + protected final PropertyChangeListener rowInErrorChangedListener = new PropertyChangeListener() { @Override @@ -360,25 +360,34 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa this.totalComputedOrNotWeight.addPropagateListener(PROPERTY_TOTAL_WEIGHT, this); setEmptyRows(new HashSet<>()); - XYSeries series = new XYSeries("", true, false); - - frequenciesDataset = new XYSeriesCollection(series); - frequenciesDataset.setIntervalPositionFactor(0); - frequenciesDataset.setIntervalWidth(0); + this.averageWeightsHistogramModel = new AverageWeightsHistogramModel(weightUnit, individualObservationWeightUnit); + this.frequenciesHistogramModel = new FrequenciesHistogramModel(weightUnit, individualObservationWeightUnit); - series = new XYSeries("", true, false); +// XYSeries series = new XYSeries("", true, false); +// +// frequenciesDataset = new XYSeriesCollection(series); +// frequenciesDataset.setIntervalPositionFactor(0); +// frequenciesDataset.setIntervalWidth(0); - averageWeightsDataset = new XYSeriesCollection(series); - averageWeightsDataset.setIntervalPositionFactor(0); - averageWeightsDataset.setIntervalWidth(0); +// series = new XYSeries("", true, false); +// +// averageWeightsDataset = new XYSeriesCollection(series); +// averageWeightsDataset.setIntervalPositionFactor(0); +// averageWeightsDataset.setIntervalWidth(0); - this.defaultCaracteristic = defaultCaracteristic == null - ? new ArrayList<>() - : new ArrayList<>(defaultCaracteristic); + this.defaultCaracteristic = defaultCaracteristic == null ? new ArrayList<>() : new ArrayList<>(defaultCaracteristic); setIndividualObservationRowsInError(new HashSet<>()); } + public AverageWeightsHistogramModel getAverageWeightsHistogramModel() { + return averageWeightsHistogramModel; + } + + public FrequenciesHistogramModel getFrequenciesHistogramModel() { + return frequenciesHistogramModel; + } + public WeightUnit getWeightUnit() { return weightUnit; } @@ -397,30 +406,34 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa setEmptyRows(new HashSet<>()); - XYSeries frequenciesSeries = frequenciesDataset.getSeries(0); - frequenciesSeries.clear(); - XYSeries averageWeightsSeries = averageWeightsDataset.getSeries(0); - averageWeightsSeries.clear(); +// XYSeries frequenciesSeries = frequenciesDataset.getSeries(0); +// frequenciesSeries.clear(); +// XYSeries averageWeightsSeries = averageWeightsDataset.getSeries(0); +// averageWeightsSeries.clear(); cache.loadCache(rows); recomputeRowsValidateState(); - if (rows != null) { - - rows.stream().filter(SpeciesFrequencyRowModel::isValid).forEach(row -> { + //FIXME Je préfèrerais ne pas pusher, ... + frequenciesHistogramModel.reloadRows(rows); + averageWeightsHistogramModel.reloadRows(rows); - Float lengthStep = row.getLengthStep(); - Integer number = row.getNumber(); +// if (rows != null) { +// +// rows.stream().filter(SpeciesFrequencyRowModel::isValid).forEach(row -> { +// +// Float lengthStep = row.getLengthStep(); +// Integer number = row.getNumber(); - frequenciesSeries.addOrUpdate(lengthStep, number); +// frequenciesSeries.addOrUpdate(lengthStep, number); - Float averageWeight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); - if (averageWeight != null) { - averageWeightsSeries.addOrUpdate(lengthStep, averageWeight); - } - }); - } +// Float averageWeight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); +// if (averageWeight != null) { +// averageWeightsSeries.addOrUpdate(lengthStep, averageWeight); +// } +// }); +// } recomputeTotalNumberAndWeight(); @@ -1024,10 +1037,10 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa && row.getWeight() != null; } - public void setDataSetIntervalWidth(float step) { - frequenciesDataset.setIntervalWidth(step); - averageWeightsDataset.setIntervalWidth(step); - } +// public void setDataSetIntervalWidth(float step) { +// frequenciesDataset.setIntervalWidth(step); +// averageWeightsDataset.setIntervalWidth(step); +// } public List<Caracteristic> getDefaultCaracteristic() { return defaultCaracteristic; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java index d560dab..02ab245 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java @@ -24,8 +24,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ -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.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyLogRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyLogsTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/DeleteSampleCodeAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/DeleteSampleCodeAction.java index c6f6fc8..252f883 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/DeleteSampleCodeAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/DeleteSampleCodeAction.java @@ -24,8 +24,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ -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.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; import org.jdesktop.swingx.JXTable; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/DeleteSpeciesFrequencyLogRowAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/DeleteSpeciesFrequencyLogRowAction.java index 1aee35c..d257ccd 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/DeleteSpeciesFrequencyLogRowAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/DeleteSpeciesFrequencyLogRowAction.java @@ -24,7 +24,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyLogCellComponent; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyLogRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyLogsTableModel; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java index 91ff95a..8e6fba3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/EditSampleCodeAction.java @@ -26,8 +26,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.TuttiUIContext; -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.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SampleCodeEditionPopupUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.SampleCodeEditionPopupUIModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationUICache; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java index f608cff..e20afe6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java @@ -27,7 +27,7 @@ import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.service.catches.multipost.MultiPostImportResult; -import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; 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; 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 6517d51..0ab0c09 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 @@ -24,8 +24,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ -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.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.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; -- 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 develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 9844616e718e71252ef0e82b732b664279cc9986 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Apr 15 23:30:14 2016 +0200 Réécriture de la logique du mode de recopie + continue le nettoyage du code --- .../entities/referential/TaxonCache.java | 3 + .../frequency/FrequenciesHistogramHandler.java | 2 - .../frequency/FrequenciesHistogramModel.java | 8 +- .../IndividualObservationBatchRowModel.java | 36 ++- .../IndividualObservationBatchRowState.java | 61 +++++ .../IndividualObservationBatchTableHandler.java | 285 ++++++++++++--------- .../IndividualObservationBatchTableModel.java | 7 +- .../IndividualObservationToFrequencyEngine.java | 260 +++++++++++++++++++ .../frequency/SpeciesFrequencyTableModel.java | 32 +-- .../frequency/SpeciesFrequencyUIHandler.java | 280 ++++++-------------- .../species/frequency/SpeciesFrequencyUIModel.java | 20 +- .../ImportMultiPostSpeciesSupportAction.java | 1 + .../frequency/actions/RemoveObservationAction.java | 6 +- 13 files changed, 614 insertions(+), 387 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/TaxonCache.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/TaxonCache.java index e109c51..c4c34aa 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/TaxonCache.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/referential/TaxonCache.java @@ -120,4 +120,7 @@ public class TaxonCache { } + public boolean containsLengthStepPmfmId(Species species) { + return getLengthStepPmfmId(species)!=null; + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramHandler.java index e741e44..5b5eff6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramHandler.java @@ -42,8 +42,6 @@ public class FrequenciesHistogramHandler implements Closeable { SpeciesFrequencyUIModel uiModel = ui.getModel(); SpeciesFrequencyUIHandler uiHandler = ui.getHandler(); -// this.frequencyTableModel = uiHandler.getTableModel(); - this.model = uiModel.getFrequenciesHistogramModel(); chart = ChartFactory.createXYBarChart(null, diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramModel.java index 0171a41..db0172e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequenciesHistogramModel.java @@ -1,6 +1,5 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; -import fr.ifremer.tutti.type.WeightUnit; import org.jdesktop.beans.AbstractSerializableBean; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; @@ -28,16 +27,11 @@ public class FrequenciesHistogramModel extends AbstractSerializableBean { private final XYSeriesCollection dataset; protected final XYSeries series; - private final WeightUnit frequencyWeightUnit; - private final WeightUnit individualObservationWeightUnit; - private String title; private String lengthStepLabelWithUnit; private Float step; - public FrequenciesHistogramModel(WeightUnit frequencyWeightUnit, WeightUnit individualObservationWeightUnit) { - this.frequencyWeightUnit = frequencyWeightUnit; - this.individualObservationWeightUnit = individualObservationWeightUnit; + public FrequenciesHistogramModel() { series = new XYSeries("", true, false); 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 c22191b..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 @@ -60,17 +60,14 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel public static final String PROPERTY_DEFAULT_CARACTERISTICS = "defaultCaracteristics"; -// public static final String PROPERTY_SAMPLING_CODE_PREFIX = "samplingCodePrefix"; -// -// public static final String PROPERTY_SAMPLING_CODE_ID = "samplingCodeId"; + public static final String PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE = "individualObservationBatchRowState"; /** * Delegate edit object. * * @since 1.3 */ - protected final IndividualObservationBatch editObject = - IndividualObservationBatchs.newIndividualObservationBatch(); + protected final IndividualObservationBatch editObject = IndividualObservationBatchs.newIndividualObservationBatch(); /** * Attachments (should never be null). @@ -93,13 +90,6 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel */ protected final WeightUnit weightUnit; -// /** -// * Caracteristique de maturité -// * -// * @since 4.5 -// */ -// protected Caracteristic maturityCaracteristic; - /** * @since 4.5 */ @@ -264,9 +254,14 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel @Override public void setWeight(Float weight) { - Object oldValue = getWeight(); + Float oldValue = getWeight(); + IndividualObservationBatchRowState oldState = new IndividualObservationBatchRowState(getSize(), oldValue, computeValid()); editObject.setWeight(weight); firePropertyChange(PROPERTY_WEIGHT, oldValue, weight); + + IndividualObservationBatchRowState newState = new IndividualObservationBatchRowState(getSize(), weight, computeValid()); + firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE, oldState, newState); + } public boolean withWeight() { @@ -292,9 +287,15 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel @Override public void setSize(Float size) { - Object oldValue = getSize(); + Float oldValue = getSize(); + IndividualObservationBatchRowState oldState = new IndividualObservationBatchRowState(oldValue, getWeight(), computeValid()); + editObject.setSize(size); firePropertyChange(PROPERTY_SIZE, oldValue, size); + + IndividualObservationBatchRowState newState = new IndividualObservationBatchRowState(size, getWeight(), computeValid()); + firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE, oldState, newState); + } public boolean withSize() { @@ -483,4 +484,11 @@ public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel return result; } + public boolean computeValid() { + CopyIndividualObservationMode copyIndividualObservationMode = getCopyIndividualObservationMode(); + return copyIndividualObservationMode == CopyIndividualObservationMode.NOTHING + || (copyIndividualObservationMode == CopyIndividualObservationMode.SIZE && withSize()) + || (copyIndividualObservationMode == CopyIndividualObservationMode.ALL && withSize() && withWeight()); + } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowState.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowState.java new file mode 100644 index 0000000..8f4085b --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchRowState.java @@ -0,0 +1,61 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import com.google.common.base.MoreObjects; + +import java.util.Objects; + +/** + * Contient l'état d'une observation individuelle utilisée par les modes de recopie pour savoir ce qu'il faut + * déporter dans les mensurations. + * + * Created on 15/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class IndividualObservationBatchRowState { + + private final Float size; + private final Float weight; + private final boolean valid; + + public IndividualObservationBatchRowState(Float size, Float weight, boolean valid) { + this.size = size; + this.weight = weight; + this.valid = valid; + } + + public boolean isValid() { + return valid; + } + + public Float getSize() { + return size; + } + + public Float getWeight() { + return weight; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + IndividualObservationBatchRowState that = (IndividualObservationBatchRowState) o; + return Objects.equals(size, that.size) && + Objects.equals(weight, that.weight); + } + + @Override + public int hashCode() { + return Objects.hash(size, weight); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("size", size) + .add("weight", weight) + .add("valid", valid) + .toString(); + } +} 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 8fd6d3b..528f01c 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 @@ -26,6 +26,7 @@ import fr.ifremer.tutti.ui.swing.util.comment.CommentCellEditor; import fr.ifremer.tutti.ui.swing.util.comment.CommentCellRenderer; import jaxx.runtime.SwingUtil; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; @@ -48,6 +49,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -84,6 +86,8 @@ public class IndividualObservationBatchTableHandler implements Closeable { */ private final PropertyChangeListener individualObservationRowChangedListener; + private final IndividualObservationToFrequencyEngine individualObservationToFrequencyEngine; + public IndividualObservationBatchTableHandler(SpeciesFrequencyUI ui) { this.ui = ui; @@ -92,6 +96,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { this.individualObservationUICache = new IndividualObservationUICache(uiHandler.getDataContext().getOptionalCruiseSamplingCache().orElse(null), model); this.individualObservationTable = ui.getObsTable(); this.frequencyTableModel = uiHandler.getTableModel(); + this.individualObservationToFrequencyEngine = new IndividualObservationToFrequencyEngine(model.getIndividualObservationWeightUnit()); List<Caracteristic> maturityCaracteristics = new ArrayList<>(uiHandler.getDataContext().getMaturityCaracteristics()); @@ -107,69 +112,112 @@ public class IndividualObservationBatchTableHandler implements Closeable { CaracteristicQualitativeValue maturity = model.getMaturityValue(row); switch (propertyName) { - case IndividualObservationBatchRowModel.PROPERTY_SIZE: { + case IndividualObservationBatchRowModel.PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE: { - Float oldValue = (Float) evt.getOldValue(); - Float newValue = (Float) evt.getNewValue(); + IndividualObservationBatchRowState oldValue = (IndividualObservationBatchRowState) evt.getOldValue(); + IndividualObservationBatchRowState newValue = (IndividualObservationBatchRowState) evt.getNewValue(); - if (oldValue != null) { - individualObservationUICache.decrementsObservationNb(gender, maturity, oldValue, row.getSamplingCode()); - } - if (newValue != null) { - individualObservationUICache.incrementsObservationNb(gender, maturity, newValue, row.getSamplingCode()); - } + Optional<IndividualObservationToFrequencyEngine.FrequencyUpdate> optionalFrequencyUpdate = + individualObservationToFrequencyEngine.computeFrequencyUpdate(model.getCopyIndividualObservationMode(), oldValue, newValue); - // we only update the frequencies if the row is valid - if (row.isValid() && model.mustCopyIndividualObservationSize()) { + if (optionalFrequencyUpdate.isPresent()) { - if (oldValue != null) { - frequencyTableModel.decrementFrequencyRowsNumbers(oldValue); - } - if (newValue != null) { - frequencyTableModel.incrementFrequencyRowsNumbers(newValue); - } + IndividualObservationToFrequencyEngine.FrequencyUpdate frequencyUpdate = optionalFrequencyUpdate.get(); - if (model.isCopyIndividualObservationAll() && row.withWeight()) { - float weight = row.getWeight(); - if (oldValue != null) { - frequencyTableModel.removeWeightToFrequencyRow(oldValue, weight); - } - if (newValue != null) { - frequencyTableModel.addWeightToFrequencyRow(newValue, weight); - } + Optional<Float> optionalDecrementSize = frequencyUpdate.getDecrementSize(); + if (optionalDecrementSize.isPresent()) { + float lengthStepToDecrement = optionalDecrementSize.get(); + frequencyTableModel.decrementFrequencyRowsNumbers(lengthStepToDecrement); + individualObservationUICache.decrementsObservationNb(gender, maturity, lengthStepToDecrement, row.getSamplingCode()); } - } - } - 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; + Optional<Float> optionalIncrementSize = frequencyUpdate.getIncrementSize(); + if (optionalIncrementSize.isPresent()) { + float lengthStepToIncrement = optionalIncrementSize.get(); + frequencyTableModel.incrementFrequencyRowsNumbers(lengthStepToIncrement); + individualObservationUICache.incrementsObservationNb(gender, maturity, lengthStepToIncrement, row.getSamplingCode()); } - WeightUnit weightUnit = model.getWeightUnit(); + Optional<Pair<Float, Float>> optionalSubstractWeight = frequencyUpdate.getSubstractWeight(); + if (optionalSubstractWeight.isPresent()) { + Pair<Float, Float> substractWeight = optionalSubstractWeight.get(); + frequencyTableModel.removeWeightToFrequencyRow(substractWeight.getKey(), substractWeight.getValue()); + } - if (weightUnit.isNotNullNorZero(weightToAdd)) { - if (weightUnit.isGreaterThanZero(weightToAdd)) { - frequencyTableModel.addWeightToFrequencyRow(row, weightToAdd); - } else { - frequencyTableModel.removeWeightToFrequencyRow(row, -weightToAdd); - } + Optional<Pair<Float, Float>> optionalAddWeight = frequencyUpdate.getAddWeight(); + if (optionalAddWeight.isPresent()) { + Pair<Float, Float> addWeight = optionalAddWeight.get(); + frequencyTableModel.addWeightToFrequencyRow(addWeight.getKey(), addWeight.getValue()); } + } - break; + + } + 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: @@ -219,26 +267,27 @@ public class IndividualObservationBatchTableHandler implements Closeable { } 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; +// 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; } model.recomputeIndividualObservationRowValidState(row); @@ -561,59 +610,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { } - public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { - model.setMaturityCaracteristic(maturityCaracteristic); - if (maturityCaracteristic != null) { - addMaturityCaracteristicColumnToModel(maturityCaracteristic); - } - } - - public void addMaturityCaracteristicColumnToModel(Caracteristic caracteristic) { - - // remove the row sorter while we add the new column - individualObservationTable.setRowSorter(null); - individualObservationTable.setAutoCreateRowSorter(false); - - TableColumnModelExt columnModel = (TableColumnModelExt) individualObservationTable.getColumnModel(); - - ColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId = uiHandler.addCaracteristicColumnToModel(individualObservationTable, - columnModel, - caracteristic); - - Objects.requireNonNull(maturityColumnId); - this.maturityColumnId = maturityColumnId; - - individualObservationTableModel.addMaturityIdentifier(maturityColumnId); - - // on cherche le bon index où insérer la colonne maturité (avant les autres caractéristiques, mais elle peut etre cachee) - int modelIndex = columnModel.getColumnExt(IndividualObservationBatchTableModel.OTHER_CARACTERISTICS).getModelIndex(); - int indexToMove = individualObservationTable.convertColumnIndexToView(modelIndex); - - // si la colonne autres caracteristiques est cachée, alors on cherche la première colonne suivante non cachée - int columnCount = columnModel.getColumnCount(true); - while (indexToMove == -1 && modelIndex < columnCount) { - indexToMove = individualObservationTable.convertColumnIndexToView(modelIndex); - modelIndex++; - } - // si une colonne après celle des autres caractéristiques est visible, on déplace la maturité avant cette colonne - // sinon, on laisse la maturité à la fin - if (modelIndex != -1) { - individualObservationTable.moveColumn(columnModel.getColumnCount() - 1, indexToMove); - } - // reset the row sorter - individualObservationTable.setAutoCreateRowSorter(true); - - } - - public void setIndividualObservationRows(List<IndividualObservationBatchRowModel> obsRows) { - - model.setIndividualObservationRows(obsRows); - individualObservationTableModel.setRows(obsRows); - model.recomputeIndividualObservationRowsValidateState(); - - } - - public void initCaracteristicValues(SpeciesBatchRowModel speciesBatch) { + public void editBatch(SpeciesBatchRowModel speciesBatch, List<IndividualObservationBatchRowModel> individualObservationRows) { CaracteristicMap sampleCategoryValues = new CaracteristicMap(); Iterator<SampleCategory<?>> iterator = speciesBatch.iterator(); @@ -625,6 +622,10 @@ public class IndividualObservationBatchTableHandler implements Closeable { individualObservationTableModel.setDefaultCaracteristicValues(sampleCategoryValues); model.setNotEditableCaracteristic(sampleCategoryValues.keySet()); + model.setIndividualObservationRows(individualObservationRows); + individualObservationTableModel.setRows(individualObservationRows); + model.recomputeIndividualObservationRowsValidateState(); + } public boolean isSampleCodeMenusEnabled(int modelRowIndex) { @@ -656,7 +657,41 @@ public class IndividualObservationBatchTableHandler implements Closeable { model.setMaturityCaracteristic(maturityCaracteristic); if (maturityCaracteristic != null) { - addMaturityCaracteristicColumnToModel(maturityCaracteristic); + + + // remove the row sorter while we add the new column + individualObservationTable.setRowSorter(null); + individualObservationTable.setAutoCreateRowSorter(false); + + TableColumnModelExt columnModel = (TableColumnModelExt) individualObservationTable.getColumnModel(); + + ColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId = uiHandler.addCaracteristicColumnToModel(individualObservationTable, + columnModel, + maturityCaracteristic); + + Objects.requireNonNull(maturityColumnId); + this.maturityColumnId = maturityColumnId; + + individualObservationTableModel.addMaturityIdentifier(maturityColumnId); + + // on cherche le bon index où insérer la colonne maturité (avant les autres caractéristiques, mais elle peut etre cachee) + int modelIndex = columnModel.getColumnExt(IndividualObservationBatchTableModel.OTHER_CARACTERISTICS).getModelIndex(); + int indexToMove = individualObservationTable.convertColumnIndexToView(modelIndex); + + // si la colonne autres caracteristiques est cachée, alors on cherche la première colonne suivante non cachée + int columnCount = columnModel.getColumnCount(true); + while (indexToMove == -1 && modelIndex < columnCount) { + indexToMove = individualObservationTable.convertColumnIndexToView(modelIndex); + modelIndex++; + } + // si une colonne après celle des autres caractéristiques est visible, on déplace la maturité avant cette colonne + // sinon, on laisse la maturité à la fin + if (modelIndex != -1) { + individualObservationTable.moveColumn(columnModel.getColumnCount() - 1, indexToMove); + } + // reset the row sorter + individualObservationTable.setAutoCreateRowSorter(true); + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java index 690f9e5..0dca87c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java @@ -168,8 +168,8 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab @Override public IndividualObservationBatchRowModel createNewRow() { - IndividualObservationBatchRowModel result = - new IndividualObservationBatchRowModel(weightUnit, defaultCaracteristicsMap); + IndividualObservationBatchRowModel result = new IndividualObservationBatchRowModel(weightUnit, defaultCaracteristicsMap); + result.setCopyIndividualObservationMode(uiModel.getCopyIndividualObservationMode()); // by default empty row is not valid result.setValid(false); @@ -265,8 +265,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab List<IndividualObservationBatchRowModel> obsRows = new ArrayList<>(); - setRows(new ArrayList<>()); - + //FIXME Faire un check sur la méthode de mensuration qui doit être la même if (CollectionUtils.isNotEmpty(individualObservations)) { CopyIndividualObservationMode copyIndividualObservationMode = null; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java new file mode 100644 index 0000000..9254f46 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java @@ -0,0 +1,260 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; +import fr.ifremer.tutti.type.WeightUnit; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.Objects; +import java.util.Optional; + +/** + * Pour générer ce qui doit être recopié depuis une observation individuelle vers les mensurations lors d'une + * modification d'une observation individuelle. + * + * Created on 15/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class IndividualObservationToFrequencyEngine { + + /** Logger. */ + private static final Log log = LogFactory.getLog(IndividualObservationToFrequencyEngine.class); + + private final WeightUnit individualObservationWeightUnit; + + public IndividualObservationToFrequencyEngine(WeightUnit individualObservationWeightUnit) { + this.individualObservationWeightUnit = individualObservationWeightUnit; + } + + /** + * Ce qui doit être fait sur la table des mensurations suite à une modification d'une observation individuelle. + */ + public static class FrequencyUpdate { + + /** + * la taille dont il faut décrémenter la classe de taille. + */ + private final Float decrementSize; + /** + * la taille dont il faut incrémenter la classe de taille. + */ + private final Float incrementSize; + + /** + * Le poids à soustraire du poids total de la classe de taille en clef. + */ + private final Pair<Float, Float> substractWeight; + /** + * Le poids à ajouter au poids total de la classe de taille en clef. + */ + private final Pair<Float, Float> addWeight; + + private FrequencyUpdate(Float decrementSize, Float incrementSize, Pair<Float, Float> substractWeight, Pair<Float, Float> addWeight) { + this.decrementSize = decrementSize; + this.incrementSize = incrementSize; + this.substractWeight = substractWeight; + this.addWeight = addWeight; + } + + public Optional<Float> getDecrementSize() { + return Optional.ofNullable(decrementSize); + } + + public Optional<Float> getIncrementSize() { + return Optional.ofNullable(incrementSize); + } + + public Optional<Pair<Float, Float>> getSubstractWeight() { + return Optional.ofNullable(substractWeight); + } + + public Optional<Pair<Float, Float>> getAddWeight() { + return Optional.ofNullable(addWeight); + } + + @Override + public String toString() { + MoreObjects.ToStringHelper toStringHelper = MoreObjects.toStringHelper(this); + if (decrementSize != null) { + toStringHelper.add("decrementSize", decrementSize); + } + if (incrementSize != null) { + toStringHelper.add("incrementSize", incrementSize); + } + if (substractWeight != null) { + toStringHelper.add("substractWeight", substractWeight); + } + if (addWeight != null) { + toStringHelper.add("addWeight", addWeight); + } + return toStringHelper.toString(); + } + + } + + public Optional<FrequencyUpdate> computeFrequencyUpdate(CopyIndividualObservationMode copyIndividualObservationMode, + IndividualObservationBatchRowState oldState, + IndividualObservationBatchRowState newState) { + + FrequencyUpdate result; + switch (copyIndividualObservationMode) { + + case ALL: + result = computeFrequencyUpdateForSizeAndWeight(oldState, newState); + if (log.isInfoEnabled()) { + log.info("[Copy Mode All] result: " + result); + } + break; + + case SIZE: + result = computeFrequencyUpdateForSizeOnly(oldState, newState); + if (log.isInfoEnabled()) { + log.info("[Copy Mode Size] result: " + (result == null ? "No size changed." : result)); + } + break; + + case NOTHING: + if (log.isDebugEnabled()) { + log.debug("[Copy Mode None] Do nothing."); + } + result = null; + break; + + default: + throw new IllegalStateException("Can't come here"); + + } + + return Optional.ofNullable(result); + + } + + public FrequencyUpdate computeFrequencyUpdateForSizeOnly(IndividualObservationBatchRowState oldState, IndividualObservationBatchRowState newState) { + + Objects.requireNonNull(oldState); + Objects.requireNonNull(newState); + + Float oldSize = oldState.getSize(); + Float newSize = newState.getSize(); + boolean sizeChanged = !Objects.equals(oldSize, newSize); + + FrequencyUpdate frequencyUpdate; + + if (sizeChanged) { + + Float decrementSize = null; + Float incrementSize = null; + + if (oldState.isValid()) { + decrementSize = oldSize; + } + + if (newState.isValid()) { + incrementSize = newSize; + } + + frequencyUpdate = new FrequencyUpdate(decrementSize, incrementSize, null, null); + + } else { + + frequencyUpdate = null; + + } + + return frequencyUpdate; + + } + + public FrequencyUpdate computeFrequencyUpdateForSizeAndWeight(IndividualObservationBatchRowState oldState, IndividualObservationBatchRowState newState) { + + Objects.requireNonNull(oldState); + Objects.requireNonNull(newState); + + Float newSize = newState.getSize(); + Float oldSize = oldState.getSize(); + boolean sizeChanged = !Objects.equals(oldSize, newSize); + + Float newWeight = newState.getWeight(); + Float oldWeight = oldState.getWeight(); + boolean weightChanged = !Objects.equals(oldWeight, newWeight); + + Preconditions.checkState(sizeChanged || weightChanged); + + boolean oldStateValid = oldState.isValid(); + boolean newStateValid = newState.isValid(); + + Float decrementSize = null; + Float incrementSize = null; + + Pair<Float, Float> substractWeight = null; + Pair<Float, Float> addWeight = null; + + if (sizeChanged) { + + if (oldStateValid) { + + decrementSize = oldSize; + substractWeight = Pair.of(oldSize, oldWeight); + + } + + if (newStateValid) { + + incrementSize = newSize; + addWeight = Pair.of(newSize, newWeight); + + } + + } + + if (weightChanged) { + + // la classe de taille n'a pas changée, on calcule le delta de poids à ajouter ou supprimer sur la classe de taille + + Float weightToAdd; + + if (oldStateValid && newStateValid) { + + weightToAdd = newWeight - oldWeight; + + } else if (oldStateValid) { + + decrementSize = oldSize; + weightToAdd = -oldWeight; + + } else if (newStateValid) { + + incrementSize = newSize; + weightToAdd = newWeight; + + } else { + + // forcement au moins un des deux états est valide car le poids a changé... + throw new IllegalStateException("Can't come here!"); + + } + + if (individualObservationWeightUnit.isGreaterThanZero(weightToAdd)) { + + // Ajout + addWeight = Pair.of(newSize, weightToAdd); + + } else { + + // Suppression + substractWeight = Pair.of(newSize, -weightToAdd); + + } + + } + + return new FrequencyUpdate(decrementSize, incrementSize, substractWeight, addWeight); + + } + + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java index 3cd8750..6576a67 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java @@ -96,10 +96,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp protected transient PropertyChangeListener onNumberChangedListener; -// protected final XYSeries frequenciesSeries; -// -// protected final XYSeries averageWeightsSeries; - public SpeciesFrequencyTableModel(WeightUnit weightUnit, WeightUnit individualObservationWeightUnit, TableColumnModelExt columnModel, @@ -109,8 +105,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp this.individualObservationWeightUnit = individualObservationWeightUnit; this.uiModel = uiModel; this.modelCache = uiModel.cache; -// this.frequenciesSeries = uiModel.getFrequenciesHistogramModel().getDataset().getSeries(0); -// this.averageWeightsSeries = uiModel.getAverageWeightsHistogramModel().getDataset().getSeries(0); setNoneEditableCols(RTP_COMPUTED_WEIGHT); } @@ -224,7 +218,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp if (newRows != null) { for (SpeciesFrequencyRowModel row : newRows) { - dettachListeners(row); // prevent leaks! attachListeners(row); } @@ -423,6 +416,8 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp private void attachListeners(SpeciesFrequencyRowModel result) { + dettachListeners(result); // prevent leaks! + result.addPropertyChangeListener(SpeciesFrequencyRowModel.PROPERTY_LENGTH_STEP, getOnLengthStepChangedListener()); result.addPropertyChangeListener(SpeciesFrequencyRowModel.PROPERTY_WEIGHT, getOnWeightChangedListener()); result.addPropertyChangeListener(SpeciesFrequencyRowModel.PROPERTY_NUMBER, getOnNumberChangedListener()); @@ -531,19 +526,13 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } - public void addWeightToFrequencyRow(IndividualObservationBatchRowModel row, float weight) { - if (row.withSize()) { - addWeightToFrequencyRow(row.getSize(), weight); - } - } - public void addWeightToFrequencyRow(float lengthStep, float weight) { if (log.isInfoEnabled()) { log.info("add weight to frequency (lengthStep: " + lengthStep + "): " + weight); } - Preconditions.checkState(weightUnit.isGreaterThanZero(weight)); + Preconditions.checkState(!weightUnit.isSmallerThanZero(weight)); SpeciesFrequencyRowModel row = getOrCreateRowForLengthStep(lengthStep); @@ -555,19 +544,13 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } - public void removeWeightToFrequencyRow(IndividualObservationBatchRowModel row, float weight) { - if (row.withSize()) { - removeWeightToFrequencyRow(row.getSize(), weight); - } - } - public void removeWeightToFrequencyRow(float lengthStep, float weight) { if (log.isInfoEnabled()) { log.info("remove weight to frequency (lengthStep: " + lengthStep + "): " + weight); } - Preconditions.checkState(weightUnit.isGreaterThanZero(weight)); + Preconditions.checkState(!weightUnit.isSmallerThanZero(weight)); Optional<SpeciesFrequencyRowModel> optionalRow = getOptionalRowForLengthStep(lengthStep); @@ -575,11 +558,13 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp SpeciesFrequencyRowModel row = optionalRow.get(); + //FIXME on n'en sait rien que c'est ce type de poids. // conversion de poids weight = Weights.convert(uiModel.getIndividualObservationWeightUnit(), weightUnit, weight); row.removeFromWeight(weight); updateRow(row); + } } @@ -588,6 +573,7 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp List<SpeciesFrequencyRowModel> result = new ArrayList<>(); + //FIXME Faire un check sur la méthode de mensuration qui doit être la même if (CollectionUtils.isNotEmpty(incomingRows)) { for (SpeciesFrequencyRowModel rowModel : incomingRows) { @@ -600,6 +586,10 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } + // always sort row by their length + // see http://forge.codelutin.com/issues/2482 + Collections.sort(result); + return result; } 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 d163a03..b4929b2 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 @@ -849,24 +849,17 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SpeciesFrequencyUIModel model = getModel(); Objects.requireNonNull(title, "title can't be null here ?!"); -// if (title != null) { model.getAverageWeightsHistogramModel().setTitle(title); model.getFrequenciesHistogramModel().setTitle(title); -// frequenciesHistogramPopup.setTitle(title + t("tutti.editSpeciesFrequencies.title")); -// averageWeightsHistogramPopup.setTitle(title + weightUnit.decorateLabel(t("tutti.editSpeciesFrequencies.field.graphAverageWeight"))); - -// } frequencyEditor = editor; - model.setNextEditableRowIndex(frequencyEditor.getNextEditableRowIndex()); List<SpeciesFrequencyRowModel> frequency = speciesBatch.getFrequency(); List<IndividualObservationBatchRowModel> individualObservations = speciesBatch.getIndividualObservation(); - model.setInitBatchEdition(true); model.setCanDisplayNotifications(false); @@ -905,7 +898,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } - getModel().setRtp(rtp); + model.setRtp(rtp); // init maturity caracteristic individualObservationBatchTableHandler.initMaturityCaracteristic(speciesProtocol); @@ -1704,8 +1697,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci ui.getDeleteSampleCodeMenu().setEnabled(sampleCodeMenusEnabled); } - public void loadFrequenciesAndObservations(List<SpeciesFrequencyRowModel> frequency, List<IndividualObservationBatchRowModel> individualObservations) { + SpeciesFrequencyUIModel model = getModel(); SpeciesBatchRowModel speciesBatch = model.getBatch(); @@ -1714,74 +1707,25 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci try { - FrequencyConfigurationMode mode = FrequencyConfigurationMode.FREQUENCIES; - FrequencyConfigurationMode frequenciesMode = FrequencyConfigurationMode.AUTO_GEN; + Integer number = speciesBatch.getNumber(); + model.setSimpleCount(number); model.setTotalNumber(null); model.setTotalComputedWeight(null); model.setTotalWeight(null); - model.setSimpleCount(null); - -// Caracteristic lengthStepCaracteristic = null; - -// List<SpeciesFrequencyRowModel> rows = new ArrayList<>(); -// List<IndividualObservationBatchRowModel> obsRows = new ArrayList<>(); Species species = speciesBatch.getSpecies(); -// IndividualObservationBatchTableModel obsTableModel = getObsTableModel(); -// obsTableModel.setSpecies(species); - -// SamplingCodePrefix samplingCodePrefix = new SamplingCodePrefix(getConfig().getSamplingCodePrefix(), decorate(species, DecoratorService.WITH_SURVEY_CODE_NO_NAME)); -// obsTableModel.setSamplingCodePrefix(samplingCodePrefix); model.setTotalWeight(speciesBatch.getWeight()); - // - // try to load existing frequency - // - - List<SpeciesFrequencyRowModel> rows = getTableModel().loadRows(frequency); - - Caracteristic lengthStepCaracteristic = null; - - if (!rows.isEmpty()) { + List<SpeciesFrequencyRowModel> frequencyRows = getTableModel().loadRows(frequency); - SpeciesFrequencyRowModel firstFrequencyRow = frequency.get(0); - lengthStepCaracteristic = firstFrequencyRow.getLengthStepCaracteristic(); - if (log.isInfoEnabled()) { - log.info("Use existing lengthStep caracteristic / step from first existing frequency: " + decorate(lengthStepCaracteristic)); - } + List<IndividualObservationBatchRowModel> individualObservationRows = individualObservationBatchTableHandler.loadIndividualObservations(species, individualObservations); + if (log.isDebugEnabled()) { + log.debug("Will edit batch row: " + speciesBatch + " with " + frequencyRows.size() + " frequencies and " + individualObservationRows.size() + " indivudual observations."); } -// if (CollectionUtils.isNotEmpty(frequency)) { -// -// SpeciesFrequencyTableModel tableModel = getTableModel(); -// -// for (SpeciesFrequencyRowModel rowModel : frequency) { -// -// SpeciesFrequencyRowModel newRow = tableModel.createNewRow(false, false); -// newRow.copy(rowModel); -// rows.add(newRow); -// -// } -// -// // use first frequency row length step caracteristics -// -// SpeciesFrequencyRowModel rowModel = frequency.get(0); -// lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); -// -// if (log.isInfoEnabled()) { -// log.info("Use existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); -// } -// } - - // - // try to load existing individual observations - // - - List<IndividualObservationBatchRowModel> individualObservationRows = individualObservationBatchTableHandler.loadIndividualObservations(species, individualObservations); - CopyIndividualObservationMode copyIndividualObservationMode; if (individualObservationRows.isEmpty()) { @@ -1792,158 +1736,44 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci IndividualObservationBatchRowModel firstIndividualObservationRow = individualObservationRows.get(0); copyIndividualObservationMode = firstIndividualObservationRow.getCopyIndividualObservationMode(); - if (lengthStepCaracteristic == null) { - - lengthStepCaracteristic = firstIndividualObservationRow.getLengthStepCaracteristic(); - - if (log.isInfoEnabled()) { - log.info("Use existing lengthStep caracteristic / step from first individual observation : " + decorate(lengthStepCaracteristic)); - } - - } - } if (log.isInfoEnabled()) { log.info("CopyIndividualObservationMode: " + copyIndividualObservationMode); } -// if (CollectionUtils.isNotEmpty(individualObservations)) { -// -// IndividualObservationBatchTableModel tableModel = getObsTableModel(); -// tableModel.setRows(new ArrayList<>()); -// -// int rankOrder = 1; -// for (IndividualObservationBatchRowModel rowModel : individualObservations) { -// -// CopyIndividualObservationMode incomingCopyIndividualObservationMode = rowModel.getCopyIndividualObservationMode(); -// Objects.requireNonNull(incomingCopyIndividualObservationMode, "Mode de recopie non trouvé sur l'observation individuelle: " + rowModel.getId()); -// if (copyIndividualObservationMode == null) { -// copyIndividualObservationMode = incomingCopyIndividualObservationMode; -// } else { -// if (copyIndividualObservationMode != incomingCopyIndividualObservationMode) { -// throw new IllegalStateException("Plusieurs modes de recopie trouvés sur les observations individuelles du lot, ce qui est impossible"); -// } -// } -// IndividualObservationBatchRowModel newRow = tableModel.createNewRow(); -// newRow.copy(rowModel); -// newRow.setRankOrder(rankOrder++); -// newRow.addPropertyChangeListener(obsChangedListener); -// newRow.setValid(true); -// -// model.moveMaturityValueFromCaracteristicsToDefaultCaracteristics(newRow); -// -// obsRows.add(newRow); -// -// } -// -// // use first individual observation row length step caracteristics -// -// if (lengthStepCaracteristic == null) { -// IndividualObservationBatchRowModel rowModel = individualObservations.get(0); -// lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); -// -// if (log.isInfoEnabled()) { -// log.info("Use existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); -// } -// } -// -// } else { -// -// // par défaut pas de mode de recopie -// copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; -// -// } -// -// if (log.isInfoEnabled()) { -// log.info("CopyIndividualObservationMode: " + copyIndividualObservationMode); -// } - - SpeciesBatchRowModel previousSiblingRow = frequencyEditor.getPreviousSiblingRow(); - - if (lengthStepCaracteristic == null && previousSiblingRow != null) { - - // try to get it from his previous brother row - List<SpeciesFrequencyRowModel> previousFrequency = previousSiblingRow.getFrequency(); - - if (CollectionUtils.isNotEmpty(previousFrequency)) { - - // use the first frequency length step caracteristic / step - SpeciesFrequencyRowModel rowModel = previousFrequency.get(0); - lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); - if (log.isInfoEnabled()) { - log.info("Use previous sibling existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); - } - } - } - if (lengthStepCaracteristic == null) { + Caracteristic lengthStepCaracteristic = computeLengthStepCaracteristic(species, frequencyRows, individualObservationRows); + model.setLengthStepCaracteristic(lengthStepCaracteristic); - String lengthStepPmfmId = taxonCache.getLengthStepPmfmId(species); + FrequencyConfigurationMode mode; - if (lengthStepPmfmId != null) { + if (number != null || (lengthStepCaracteristic == null && taxonCache.containsLengthStepPmfmId(species))) { - lengthStepCaracteristic = lengthStepCaracteristics.get(lengthStepPmfmId); + mode = FrequencyConfigurationMode.SIMPLE_COUNTING; - if (log.isInfoEnabled()) { - log.info("Use existing from protocol lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); - } + } else { - } - } + mode = FrequencyConfigurationMode.FREQUENCIES; - if (lengthStepCaracteristic == null) { - String speciesLengthStepPmfmId = taxonCache.getLengthStepPmfmId(species); - if (speciesLengthStepPmfmId == null) { - mode = FrequencyConfigurationMode.SIMPLE_COUNTING; - } } if (log.isInfoEnabled()) { log.info("FrequencyConfigurationMode: " + mode); } - if (log.isDebugEnabled()) { - log.debug("Will edit batch row: " + speciesBatch + " with " + rows.size() + " frequencies and " + individualObservationRows.size() + " indivudual observations."); - } - - Integer number = speciesBatch.getNumber(); - if (number != null && rows.isEmpty()) { - mode = FrequencyConfigurationMode.SIMPLE_COUNTING; - model.setSimpleCount(number); - } - // make sure configuration mode will be rebound model.setConfigurationMode(null); model.setConfigurationMode(mode); model.setFrequenciesConfigurationMode(null); - model.setFrequenciesConfigurationMode(frequenciesMode); + model.setFrequenciesConfigurationMode(FrequencyConfigurationMode.AUTO_GEN); // connect model to validator ui.getValidator().setBean(model); - // always sort row by their length - // see http://forge.codelutin.com/issues/2482 - Collections.sort(rows); - - model.setLengthStepCaracteristic(lengthStepCaracteristic); - model.setRows(rows); - - individualObservationBatchTableHandler.initCaracteristicValues(speciesBatch); + model.setRows(frequencyRows); -// CaracteristicMap sampleCategoryValues = new CaracteristicMap(); -// Iterator<SampleCategory<?>> iterator = speciesBatch.iterator(); -// iterator.forEachRemaining(sampleCategory -> { -// Caracteristic caracteristic = sampleCategory.getCategoryDef().getCaracteristic(); -// sampleCategoryValues.put(caracteristic, sampleCategory.getCategoryValue()); -// }); -// -// obsTableModel.setDefaultCaracteristicValues(sampleCategoryValues); -// model.setNotEditableCaracteristic(sampleCategoryValues.keySet()); - - individualObservationBatchTableHandler.setIndividualObservationRows(individualObservationRows); -// obsTableModel.setRows(obsRows); -// model.recomputeIndividualObservationRowsValidateState(); + individualObservationBatchTableHandler.editBatch(speciesBatch, individualObservationRows); // let's change the copy mode (mark it in init mode to avoid user change confirmation and some recompuations) model.setCopyIndividualObservationMode(null); @@ -1957,16 +1787,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } } -// protected void removeMaturityColumnIfPresent() { -// if (maturityColumnId != null) { -// TableColumnExt maturityColumn = ui.getObsTable().getColumnExt(maturityColumnId); -// ui.getObsTable().removeColumn(maturityColumn); -// getObsTableModel().removeMaturityIdentifier(maturityColumnId); -// maturityColumnId = null; -// } -// } - - // Attention on surcharge les méthodes suivantes pour pouvoir les utiliser dans l'autre handler, ne rien changer (pour le moment)... @Override @@ -2000,4 +1820,68 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci return super.decorate(object, context); } + + private Caracteristic computeLengthStepCaracteristic(Species species, List<SpeciesFrequencyRowModel> frequencyRows, List<IndividualObservationBatchRowModel> individualObservationRows) { + + Caracteristic lengthStepCaracteristic = null; + + if (!frequencyRows.isEmpty()) { + + SpeciesFrequencyRowModel firstFrequencyRow = frequencyRows.get(0); + lengthStepCaracteristic = firstFrequencyRow.getLengthStepCaracteristic(); + if (log.isInfoEnabled()) { + log.info("Use existing lengthStep caracteristic / step from first existing frequency: " + decorate(lengthStepCaracteristic)); + } + + } + + if (lengthStepCaracteristic == null) { + + if (!individualObservationRows.isEmpty()) { + IndividualObservationBatchRowModel firstIndividualObservationRow = individualObservationRows.get(0); + + lengthStepCaracteristic = firstIndividualObservationRow.getLengthStepCaracteristic(); + + if (log.isInfoEnabled()) { + log.info("Use existing lengthStep caracteristic / step from first individual observation : " + decorate(lengthStepCaracteristic)); + } + } + + } + + SpeciesBatchRowModel previousSiblingRow = frequencyEditor.getPreviousSiblingRow(); + + if (lengthStepCaracteristic == null && previousSiblingRow != null) { + + // try to get it from his previous brother row + List<SpeciesFrequencyRowModel> previousFrequency = previousSiblingRow.getFrequency(); + + if (CollectionUtils.isNotEmpty(previousFrequency)) { + + // use the first frequency length step caracteristic / step + SpeciesFrequencyRowModel rowModel = previousFrequency.get(0); + lengthStepCaracteristic = rowModel.getLengthStepCaracteristic(); + if (log.isInfoEnabled()) { + log.info("Use previous sibling existing lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); + } + } + } + + if (lengthStepCaracteristic == null) { + + String lengthStepPmfmId = taxonCache.getLengthStepPmfmId(species); + + if (lengthStepPmfmId != null) { + + lengthStepCaracteristic = lengthStepCaracteristics.get(lengthStepPmfmId); + + if (log.isInfoEnabled()) { + log.info("Use existing from protocol lengthStep caracteristic / step " + decorate(lengthStepCaracteristic)); + } + + } + } + + return lengthStepCaracteristic; + } } 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 2a20c53..09f3fce 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 @@ -361,7 +361,7 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa setEmptyRows(new HashSet<>()); this.averageWeightsHistogramModel = new AverageWeightsHistogramModel(weightUnit, individualObservationWeightUnit); - this.frequenciesHistogramModel = new FrequenciesHistogramModel(weightUnit, individualObservationWeightUnit); + this.frequenciesHistogramModel = new FrequenciesHistogramModel(); // XYSeries series = new XYSeries("", true, false); // @@ -1028,18 +1028,10 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } - public boolean isIndividualObservationRowValid(IndividualObservationBatchRowModel row) { - return copyIndividualObservationMode == CopyIndividualObservationMode.NOTHING - || copyIndividualObservationMode == CopyIndividualObservationMode.SIZE - && row.getSize() != null - || copyIndividualObservationMode == CopyIndividualObservationMode.ALL - && row.getSize() != null - && row.getWeight() != null; - } - -// public void setDataSetIntervalWidth(float step) { -// frequenciesDataset.setIntervalWidth(step); -// averageWeightsDataset.setIntervalWidth(step); +// public boolean isIndividualObservationRowValid(IndividualObservationBatchRowModel row) { +// return copyIndividualObservationMode == CopyIndividualObservationMode.NOTHING +// || (copyIndividualObservationMode == CopyIndividualObservationMode.SIZE && row.withSize()) +// || (copyIndividualObservationMode == CopyIndividualObservationMode.ALL && row.withSize() && row.withWeight()); // } public List<Caracteristic> getDefaultCaracteristic() { @@ -1153,7 +1145,7 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa protected final void recomputeIndividualObservationRowValidState(IndividualObservationBatchRowModel row) { // recompute row valid state - boolean valid = isIndividualObservationRowValid(row); + boolean valid = row.computeValid(); // apply it to row row.setValid(valid); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java index e20afe6..4a644df 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java @@ -189,6 +189,7 @@ public abstract class ImportMultiPostSpeciesSupportAction extends LongActionSupp getDataContext().getDefaultIndividualObservationCaracteristics(), individualObservations); + //FIXME Faire un «reset» avant pour l'algorithme de prélèvement getHandler().loadFrequenciesAndObservations(frequencyRows, individualObservationRows); getModel().setModify(true); 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 0ab0c09..9a23f0f 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 @@ -27,6 +27,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationUICache; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyTableModel; 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; @@ -81,6 +82,7 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc SpeciesFrequencyUIHandler handler = ui.getHandler(); IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); + SpeciesFrequencyTableModel frequencyTableModel = handler.getTableModel(); // Attention, on ne traite ici que les observations individuelles qui ont une taille rowsToDelete.stream().filter(IndividualObservationBatchRowModel::withSize).forEach(row -> { @@ -92,10 +94,10 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc boolean removeSize = removeWeight || model.isCopyIndividualObservationSize(); if (removeWeight) { - handler.getTableModel().removeWeightToFrequencyRow(row, row.getWeight()); + frequencyTableModel.removeWeightToFrequencyRow(row.getSize(), row.getWeight()); } if (removeSize) { - handler.getTableModel().decrementFrequencyRowsNumbers(row); + frequencyTableModel.decrementFrequencyRowsNumbers(row); } individualObservationUICache.decrements(row); -- 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 develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit e2b4392dca98d96754cd8ea3d290c63f889b335b Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Apr 16 07:56:39 2016 +0200 Correction de l'unité utilisée pour le graphique des poids moyens --- .../frequency/AverageWeightsHistogramHandler.java | 2 +- .../frequency/AverageWeightsHistogramModel.java | 21 ++++---- .../species/frequency/SpeciesFrequencyUIModel.java | 59 +--------------------- 3 files changed, 11 insertions(+), 71 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramHandler.java index bf610c2..47fd529 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramHandler.java @@ -46,7 +46,7 @@ public class AverageWeightsHistogramHandler implements Closeable { chart = ChartFactory.createXYLineChart(null, t("tutti.editSpeciesFrequencies.table.header.lengthStep"), - model.getIndividualObservationWeightUnit().decorateLabel(t("tutti.editSpeciesFrequencies.averageWeight.label")), + model.getFrequencyWeightUnit().decorateLabel(t("tutti.editSpeciesFrequencies.averageWeight.label")), model.getDataset()); chart.clearSubtitles(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramModel.java index fdf1375..d71b1d0 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/AverageWeightsHistogramModel.java @@ -1,7 +1,6 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import fr.ifremer.tutti.type.WeightUnit; -import fr.ifremer.tutti.util.Weights; import org.jdesktop.beans.AbstractSerializableBean; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; @@ -30,25 +29,24 @@ public class AverageWeightsHistogramModel extends AbstractSerializableBean { protected final XYSeries series; private final WeightUnit frequencyWeightUnit; - private final WeightUnit individualObservationWeightUnit; private String title; private String lengthStepLabelWithUnit; private Float step; - public AverageWeightsHistogramModel(WeightUnit frequencyWeightUnit, WeightUnit individualObservationWeightUnit) { + public AverageWeightsHistogramModel(WeightUnit frequencyWeightUnit) { + this.frequencyWeightUnit = frequencyWeightUnit; - this.individualObservationWeightUnit = individualObservationWeightUnit; - series = new XYSeries("", true, false); - dataset = new XYSeriesCollection(series); - dataset.setIntervalPositionFactor(0); - dataset.setIntervalWidth(0); + this.series = new XYSeries("", true, false); + this.dataset = new XYSeriesCollection(series); + this.dataset.setIntervalPositionFactor(0); + this.dataset.setIntervalWidth(0); } - public WeightUnit getIndividualObservationWeightUnit() { - return individualObservationWeightUnit; + public WeightUnit getFrequencyWeightUnit() { + return frequencyWeightUnit; } public XYSeriesCollection getDataset() { @@ -102,8 +100,7 @@ public class AverageWeightsHistogramModel extends AbstractSerializableBean { public void addOrUpdate(SpeciesFrequencyRowModel row) { - Float weight = Weights.convert(frequencyWeightUnit, individualObservationWeightUnit, row.computeAverageWeight()); - series.addOrUpdate(row.getLengthStep(), weight); + series.addOrUpdate(row.getLengthStep(), row.computeAverageWeight()); } 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 09f3fce..a8d9a58 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 @@ -269,20 +269,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa */ protected CopyIndividualObservationMode copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; -// /** -// * To store frequencies graph series. -// * -// * @since 3.11 -// */ -// protected final XYSeriesCollection frequenciesDataset; - -// /** -// * To store average weights graph series. -// * -// * @since 4.5 -// */ -// protected final XYSeriesCollection averageWeightsDataset; - /** * Default caracteristics coming from protocol. * @@ -360,21 +346,9 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa this.totalComputedOrNotWeight.addPropagateListener(PROPERTY_TOTAL_WEIGHT, this); setEmptyRows(new HashSet<>()); - this.averageWeightsHistogramModel = new AverageWeightsHistogramModel(weightUnit, individualObservationWeightUnit); + this.averageWeightsHistogramModel = new AverageWeightsHistogramModel(weightUnit); this.frequenciesHistogramModel = new FrequenciesHistogramModel(); -// XYSeries series = new XYSeries("", true, false); -// -// frequenciesDataset = new XYSeriesCollection(series); -// frequenciesDataset.setIntervalPositionFactor(0); -// frequenciesDataset.setIntervalWidth(0); - -// series = new XYSeries("", true, false); -// -// averageWeightsDataset = new XYSeriesCollection(series); -// averageWeightsDataset.setIntervalPositionFactor(0); -// averageWeightsDataset.setIntervalWidth(0); - this.defaultCaracteristic = defaultCaracteristic == null ? new ArrayList<>() : new ArrayList<>(defaultCaracteristic); setIndividualObservationRowsInError(new HashSet<>()); @@ -406,11 +380,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa setEmptyRows(new HashSet<>()); -// XYSeries frequenciesSeries = frequenciesDataset.getSeries(0); -// frequenciesSeries.clear(); -// XYSeries averageWeightsSeries = averageWeightsDataset.getSeries(0); -// averageWeightsSeries.clear(); - cache.loadCache(rows); recomputeRowsValidateState(); @@ -419,22 +388,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa frequenciesHistogramModel.reloadRows(rows); averageWeightsHistogramModel.reloadRows(rows); -// if (rows != null) { -// -// rows.stream().filter(SpeciesFrequencyRowModel::isValid).forEach(row -> { -// -// Float lengthStep = row.getLengthStep(); -// Integer number = row.getNumber(); - -// frequenciesSeries.addOrUpdate(lengthStep, number); - -// Float averageWeight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); -// if (averageWeight != null) { -// averageWeightsSeries.addOrUpdate(lengthStep, averageWeight); -// } -// }); -// } - recomputeTotalNumberAndWeight(); } @@ -525,10 +478,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa return lengthStepCaracteristic == null ? null : lengthStepCaracteristic.getUnit(); } -// public Float getLengthStepCaracteristicPrecision() { -// return lengthStepCaracteristic == null ? null : lengthStepCaracteristic.getPrecision(); -// } - public Float getMinStep() { return minStep; } @@ -1028,12 +977,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } -// public boolean isIndividualObservationRowValid(IndividualObservationBatchRowModel row) { -// return copyIndividualObservationMode == CopyIndividualObservationMode.NOTHING -// || (copyIndividualObservationMode == CopyIndividualObservationMode.SIZE && row.withSize()) -// || (copyIndividualObservationMode == CopyIndividualObservationMode.ALL && row.withSize() && row.withWeight()); -// } - public List<Caracteristic> getDefaultCaracteristic() { return defaultCaracteristic; } -- 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 develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 10281292f9f06aace81f0b439edbc021938b063c Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Apr 16 11:15:20 2016 +0200 Introduction modele pour la partie observations individuelles + du menache --- .../IndividualObservationBatchTableHandler.java | 84 +-- .../IndividualObservationBatchTableModel.java | 106 +++- .../IndividualObservationBatchUIModel.java | 206 +++++++ .../IndividualObservationToFrequencyEngine.java | 24 +- .../frequency/IndividualObservationUICache.java | 24 +- .../frequency/SpeciesFrequencyCellComponent.java | 11 +- .../frequency/SpeciesFrequencyTableModel.java | 251 ++++---- .../frequency/SpeciesFrequencyUIHandler.java | 648 +-------------------- .../species/frequency/SpeciesFrequencyUIModel.java | 348 ++--------- .../actions/ApplySpeciesFrequencyRafaleAction.java | 94 +-- .../GenerateSpeciesFrequencyLengthStepsAction.java | 59 +- .../ImportMultiPostSpeciesSupportAction.java | 69 +-- .../frequency/actions/RemoveObservationAction.java | 14 +- .../actions/ResetSpeciesFrequencyAction.java | 2 +- .../util/table/AbstractTuttiTableUIModel.java | 14 +- 15 files changed, 672 insertions(+), 1282 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 528f01c..1c1c7f4 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 @@ -73,6 +73,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { private final SpeciesFrequencyUIModel model; private final SpeciesFrequencyTableModel frequencyTableModel; + private final IndividualObservationBatchUIModel model2; private final IndividualObservationBatchTableModel individualObservationTableModel; private final IndividualObservationUICache individualObservationUICache; @@ -92,11 +93,12 @@ public class IndividualObservationBatchTableHandler implements Closeable { this.ui = ui; this.model = ui.getModel(); + this.model2 = ui.getModel().getIndividualObservationModel(); this.uiHandler = ui.getHandler(); this.individualObservationUICache = new IndividualObservationUICache(uiHandler.getDataContext().getOptionalCruiseSamplingCache().orElse(null), model); this.individualObservationTable = ui.getObsTable(); this.frequencyTableModel = uiHandler.getTableModel(); - this.individualObservationToFrequencyEngine = new IndividualObservationToFrequencyEngine(model.getIndividualObservationWeightUnit()); + this.individualObservationToFrequencyEngine = new IndividualObservationToFrequencyEngine(model2.getIndividualObservationWeightUnit()); List<Caracteristic> maturityCaracteristics = new ArrayList<>(uiHandler.getDataContext().getMaturityCaracteristics()); @@ -108,8 +110,8 @@ public class IndividualObservationBatchTableHandler implements Closeable { IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); String propertyName = evt.getPropertyName(); - CaracteristicQualitativeValue gender = model.getGender(row); - CaracteristicQualitativeValue maturity = model.getMaturityValue(row); + CaracteristicQualitativeValue gender = model2.getGender(row); + CaracteristicQualitativeValue maturity = model2.getMaturityValue(row); switch (propertyName) { case IndividualObservationBatchRowModel.PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE: { @@ -141,17 +143,28 @@ public class IndividualObservationBatchTableHandler implements Closeable { Optional<Pair<Float, Float>> optionalSubstractWeight = frequencyUpdate.getSubstractWeight(); if (optionalSubstractWeight.isPresent()) { Pair<Float, Float> substractWeight = optionalSubstractWeight.get(); - frequencyTableModel.removeWeightToFrequencyRow(substractWeight.getKey(), substractWeight.getValue()); + float weight = substractWeight.getValue(); + float weightToRemove = frequencyTableModel.convertWeightFromIndividualObservation(weight); + frequencyTableModel.removeWeightToFrequencyRow(substractWeight.getKey(), weightToRemove); } Optional<Pair<Float, Float>> optionalAddWeight = frequencyUpdate.getAddWeight(); if (optionalAddWeight.isPresent()) { Pair<Float, Float> addWeight = optionalAddWeight.get(); - frequencyTableModel.addWeightToFrequencyRow(addWeight.getKey(), addWeight.getValue()); + float weight = addWeight.getValue(); + float weightToAdd = frequencyTableModel.convertWeightFromIndividualObservation(weight); + frequencyTableModel.addWeightToFrequencyRow(addWeight.getKey(), weightToAdd); } } + if (individualObservationToFrequencyEngine.isValidStateChanged(oldValue, newValue)) { + + // l'état de validité de la ligne a changé, on recalcule les lignes en erreurs + model2.recomputeRowValidState(row); + + } + } break; @@ -229,9 +242,9 @@ public class IndividualObservationBatchTableHandler implements Closeable { log.info("caracteristics changed"); } - if (model.withMaturityCaracteristic()) { - CaracteristicQualitativeValue oldMaturity = model.getMaturityValue(oldValue); - CaracteristicQualitativeValue newMaturity = model.getMaturityValue(newValue); + if (model2.withMaturityCaracteristic()) { + CaracteristicQualitativeValue oldMaturity = model2.getMaturityValue(oldValue); + CaracteristicQualitativeValue newMaturity = model2.getMaturityValue(newValue); if (log.isInfoEnabled()) { log.info("maturities : " + oldMaturity + " " + newMaturity); } @@ -241,8 +254,8 @@ public class IndividualObservationBatchTableHandler implements Closeable { } } - CaracteristicQualitativeValue oldGender = model.getGender(oldValue); - CaracteristicQualitativeValue newGender = model.getGender(newValue); + CaracteristicQualitativeValue oldGender = model2.getGender(oldValue); + CaracteristicQualitativeValue newGender = model2.getGender(newValue); if (!Objects.equals(oldGender, newGender)) { individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), row.getSamplingCode()); @@ -290,7 +303,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { // break; } - model.recomputeIndividualObservationRowValidState(row); +// model2.recomputeRowValidState(row); model.recomputeCanEditLengthStep(); model.setModify(true); @@ -331,7 +344,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { individualObservationTable); } - List<Caracteristic> defaultCaracteristic = model.getDefaultCaracteristic(); + List<Caracteristic> defaultCaracteristic = model2.getDefaultCaracteristic(); for (Caracteristic caracteristic : defaultCaracteristic) { uiHandler.addCaracteristicColumnToModel(individualObservationTable, @@ -342,7 +355,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { { // Other caracteristics column Set<Caracteristic> caracteristicsToSkip = Collections.unmodifiableSet( - Sets.newHashSet(model.getDefaultCaracteristic())); + Sets.newHashSet(model2.getDefaultCaracteristic())); uiHandler.addColumnToModel(columnModel, CaracteristicMapCellComponent.newEditor(ui, caracteristicsToSkip), @@ -406,46 +419,47 @@ public class IndividualObservationBatchTableHandler implements Closeable { // always scroll to selected row SwingUtil.scrollToTableSelection(individualObservationTable); - this.individualObservationTableModel.addTableModelListener(e -> { + individualObservationTableModel.addTableModelListener(e -> { int firstRow = e.getFirstRow(); int lastRow = e.getLastRow(); switch (e.getType()) { case TableModelEvent.DELETE: - if (this.individualObservationTableModel.getRowCount() == 0) { - this.individualObservationTableModel.addNewRow(); + if (individualObservationTableModel.getRowCount() == 0) { + individualObservationTableModel.addNewRow(); } else { - this.individualObservationTableModel.recomputeRankOrders(firstRow); + individualObservationTableModel.recomputeRankOrders(firstRow); } break; case TableModelEvent.INSERT: for (int i = firstRow; i <= lastRow; i++) { - IndividualObservationBatchRowModel newRow = this.individualObservationTableModel.getRows().get(i); + IndividualObservationBatchRowModel newRow = individualObservationTableModel.getEntry(i); newRow.addPropertyChangeListener(individualObservationRowChangedListener); - if (model.mustCopyIndividualObservationSize()) { + if (model.mustCopyIndividualObservationSize() && newRow.withSize()) { - frequencyTableModel.incrementFrequencyRowsNumbers(newRow); + frequencyTableModel.incrementFrequencyRowsNumbers(newRow.getSize()); } - model.recomputeIndividualObservationRowValidState(newRow); + model2.recomputeRowValidState(newRow); } break; case TableModelEvent.UPDATE: - if (this.individualObservationTableModel.getRowCount() == 0) { - this.individualObservationTableModel.addNewRow(); + if (individualObservationTableModel.getRowCount() == 0) { + individualObservationTableModel.addNewRow(); } } model.recomputeCanEditLengthStep(); + }); - this.individualObservationTable.getSelectionModel().addListSelectionListener(e -> { + individualObservationTable.getSelectionModel().addListSelectionListener(e -> { if (!model.isInRafaleRowCreation()) { uiHandler.resetSamplingLabel(); @@ -453,9 +467,9 @@ public class IndividualObservationBatchTableHandler implements Closeable { IndividualObservationBatchRowModel selectedRow = null; - if (!this.individualObservationTable.getSelectionModel().isSelectionEmpty()) { - if (this.individualObservationTable.getSelectedRowCount() == 1) { - selectedRow = this.individualObservationTableModel.getEntry(this.individualObservationTable.getSelectedRow()); + if (!individualObservationTable.getSelectionModel().isSelectionEmpty()) { + if (individualObservationTable.getSelectedRowCount() == 1) { + selectedRow = individualObservationTableModel.getEntry(individualObservationTable.getSelectedRow()); } } @@ -463,9 +477,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { individualObservationUICache.updateSelectedRow(selectedRow); }); - model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INDIVIDUAL_OBSERVATION_ROWS, evt -> { - individualObservationTableModel.setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue()); - }); + model2.addPropertyChangeListener(IndividualObservationBatchUIModel.PROPERTY_ROWS, evt -> individualObservationTableModel.setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue())); // Pour bloquer le changement du mode de recopie des observations individuelles → mensurations model.addVetoableChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { @@ -557,7 +569,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { model.getRows().clear(); model.getRowsInError().clear(); model.reloadRows(); - model.recomputeIndividualObservationRowsValidateState(); + model2.recomputeRowsValidateState(); uiHandler.reloadRowsFromIndividualObservations(); } finally { @@ -620,11 +632,11 @@ public class IndividualObservationBatchTableHandler implements Closeable { }); individualObservationTableModel.setDefaultCaracteristicValues(sampleCategoryValues); - model.setNotEditableCaracteristic(sampleCategoryValues.keySet()); + model2.setNotEditableCaracteristic(sampleCategoryValues.keySet()); - model.setIndividualObservationRows(individualObservationRows); + model2.setRows(individualObservationRows); individualObservationTableModel.setRows(individualObservationRows); - model.recomputeIndividualObservationRowsValidateState(); + model2.recomputeRowsValidateState(); } @@ -635,7 +647,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { public void initObservationsCache(SpeciesBatchRowModel incomingSpeciesBatch, FishingOperation fishingOperation) { - individualObservationUICache.init(ui, incomingSpeciesBatch, fishingOperation, model.getIndividualObservationRows()); + individualObservationUICache.init(ui, incomingSpeciesBatch, fishingOperation, model2.getRows()); } @@ -655,7 +667,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { // Add maturity column if necessary - model.setMaturityCaracteristic(maturityCaracteristic); + model2.setMaturityCaracteristic(maturityCaracteristic); if (maturityCaracteristic != null) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java index 0dca87c..7f74b71 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java @@ -32,6 +32,7 @@ import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.util.table.CaracteristicColumnIdentifier; import org.apache.commons.collections4.CollectionUtils; import org.jdesktop.swingx.table.TableColumnModelExt; +import org.nuiton.jaxx.application.bean.JavaBeanObjectUtil; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; @@ -39,6 +40,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Set; @@ -105,15 +107,17 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab protected Caracteristic lengthstepCaracteristic; protected final SpeciesFrequencyUIModel uiModel; + protected final IndividualObservationBatchUIModel model; public IndividualObservationBatchTableModel(WeightUnit weightUnit, SpeciesFrequencyUIModel uiModel, TableColumnModelExt columnModel) { super(columnModel, true, false); this.uiModel = uiModel; + this.model = uiModel.getIndividualObservationModel(); this.weightUnit = weightUnit; // Lorsque la caracteristique de maturité change, on met à jour defaultCaracteristicsMap - this.uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_MATURITY_CARACTERISTIC, new PropertyChangeListener() { + this.model.addPropertyChangeListener(IndividualObservationBatchUIModel.PROPERTY_MATURITY_CARACTERISTIC, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Caracteristic oldValue = (Caracteristic) evt.getOldValue(); @@ -127,7 +131,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } }); - this.defaultCaracteristicsMap = CaracteristicMap.fromCollection(uiModel.getDefaultCaracteristic()); + this.defaultCaracteristicsMap = CaracteristicMap.fromCollection(model.getDefaultCaracteristic()); setNoneEditableCols(RANK); } @@ -181,12 +185,12 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab if (getRowCount() > 0) { IndividualObservationBatchRowModel lastRow = getRows().get(getRowCount() - 1); - CaracteristicQualitativeValue gender = uiModel.getGender(lastRow); - uiModel.setGenderValueToDefaultCaracterictis(result, gender); + CaracteristicQualitativeValue gender = model.getGender(lastRow); + model.setGenderValueToDefaultCaracterictis(result, gender); - if (uiModel.withMaturityCaracteristic()) { - CaracteristicQualitativeValue maturityState = uiModel.getMaturityValue(lastRow); - uiModel.setMaturityValueToDefaultCaracterictis(result, maturityState); + if (model.withMaturityCaracteristic()) { + CaracteristicQualitativeValue maturityState = model.getMaturityValue(lastRow); + model.setMaturityValueToDefaultCaracterictis(result, maturityState); } } @@ -230,29 +234,6 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab return editable; } - public IndividualObservationBatchRowModel getEmptyRow() { - - IndividualObservationBatchRowModel result = null; - - for (int i = rows.size() - 1; i >= 0; i--) { - IndividualObservationBatchRowModel row = rows.get(i); - // if the row has no data set, then it could be the empty row we are looking for - Set<Caracteristic> notNullCaracteristics = defaultCaracteristicsMap.keySet().stream() - .filter(key -> defaultCaracteristicsMap.get(key) != null) - .collect(Collectors.toSet()); - if (row.isEmpty(notNullCaracteristics)) { - - result = row; - - } else { // if the row has data set, then the empty row we are looking for was the previous row - break; - } - - } - - return result; - } - public void recomputeRankOrders(int firstRow) { for (int i = firstRow; i < getRowCount(); i++) { @@ -288,7 +269,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab newRow.addPropertyChangeListener(individualObservationRowChangedListener); newRow.setValid(true); - uiModel.moveMaturityValueFromCaracteristicsToDefaultCaracteristics(newRow); + model.moveMaturityValueFromCaracteristicsToDefaultCaracteristics(newRow); obsRows.add(newRow); } @@ -299,4 +280,67 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } + public IndividualObservationBatchRowModel addRafaleRow(Float step) { + + IndividualObservationBatchRowModel row = getEmptyRow(); + if (row == null) { + row = createNewRow(); + addNewRow(row); + } + row.setSize(step); + updateRow(row); + + return row; + + } + + private IndividualObservationBatchRowModel getEmptyRow() { + + IndividualObservationBatchRowModel result = null; + + for (int i = rows.size() - 1; i >= 0; i--) { + IndividualObservationBatchRowModel row = rows.get(i); + // if the row has no data set, then it could be the empty row we are looking for + Set<Caracteristic> notNullCaracteristics = defaultCaracteristicsMap.keySet().stream() + .filter(key -> defaultCaracteristicsMap.get(key) != null) + .collect(Collectors.toSet()); + if (row.isEmpty(notNullCaracteristics)) { + + result = row; + + } else { // if the row has data set, then the empty row we are looking for was the previous row + break; + } + + } + + return result; + + } + + public void removeRows(Collection<IndividualObservationBatchRowModel> rowsToDelete) { + + int minSelection = Integer.MAX_VALUE; + int maxSelection = -1; + + for (IndividualObservationBatchRowModel row : rowsToDelete) { + + JavaBeanObjectUtil.removeAllPropertyChangeListeners(row); + int rowIndex = rows.indexOf(row); + if (minSelection > rowIndex) { + minSelection = rowIndex; + } + if (maxSelection < rowIndex) { + maxSelection = rowIndex; + } + + model.removeRowInError(row); + } + + rows.removeAll(rowsToDelete); + model.removeRowsInError(rowsToDelete); + + fireTableRowsDeleted(minSelection, maxSelection); + + } } 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 new file mode 100644 index 0000000..d5f1d0c --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java @@ -0,0 +1,206 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.type.WeightUnit; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.application.bean.JavaBeanObject; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created on 16/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class IndividualObservationBatchUIModel extends AbstractTuttiTableUIModel<SpeciesBatchRowModel, IndividualObservationBatchRowModel, IndividualObservationBatchUIModel> implements JavaBeanObject { + + private static final long serialVersionUID = 1L; + + /** Logger. */ + private static final Log log = LogFactory.getLog(IndividualObservationBatchUIModel.class); + + public static final String PROPERTY_MATURITY_CARACTERISTIC = "maturityCaracteristic"; + + public static final String PROPERTY_NOT_EDITABLE_CARACTERISTIC = "notEditableCaracteristic"; + + private final WeightUnit individualObservationWeightUnit; + + private final Caracteristic sexCaracteristic; + + /** + * Default caracteristics coming from protocol. + * + * @since 4.5 + */ + private final List<Caracteristic> defaultCaracteristic; + + /** + * Caracteristique de maturité du protocole + */ + private Caracteristic maturityCaracteristic; + + /** + * Caracteristiques non éditables, car caractéristiques de catégorisation du lot (sexe, maturité, etc) + * + * @since 4.5 + */ + private Collection<Caracteristic> notEditableCaracteristic; + + @Override + protected SpeciesBatchRowModel newEntity() { + return null; // Jamais utilisé! + } + + public IndividualObservationBatchUIModel(Caracteristic sexCaracteristic, WeightUnit individualObservationWeightUnit, List<Caracteristic> defaultCaracteristic) { + super(SpeciesBatchRowModel.class, null, null); + this.sexCaracteristic = sexCaracteristic; + this.individualObservationWeightUnit = individualObservationWeightUnit; + this.defaultCaracteristic = defaultCaracteristic == null ? new ArrayList<>() : new ArrayList<>(defaultCaracteristic); + } + + public WeightUnit getIndividualObservationWeightUnit() { + return individualObservationWeightUnit; + } + + public List<Caracteristic> getDefaultCaracteristic() { + return defaultCaracteristic; + } + + public boolean withMaturityCaracteristic() { + return maturityCaracteristic != null; + } + + public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { + Object oldValue = this.maturityCaracteristic; + this.maturityCaracteristic = maturityCaracteristic; + firePropertyChange(PROPERTY_MATURITY_CARACTERISTIC, oldValue, maturityCaracteristic); + } + + public CaracteristicQualitativeValue getMaturityValue(IndividualObservationBatchRowModel row) { + + CaracteristicQualitativeValue caracteristicValue = null; + if (withMaturityCaracteristic()) { + caracteristicValue = row.getCaracteristicQualitativeValue(maturityCaracteristic); + } + return caracteristicValue; + + } + + public CaracteristicQualitativeValue getMaturityValue(CaracteristicMap caracteristicMap) { + + CaracteristicQualitativeValue caracteristicValue = null; + if (withMaturityCaracteristic()) { + caracteristicValue = caracteristicMap.getQualitativeValue(maturityCaracteristic); + } + return caracteristicValue; + + } + + public void moveMaturityValueFromCaracteristicsToDefaultCaracteristics(IndividualObservationBatchRowModel newRow) { + + if (withMaturityCaracteristic()) { + + Serializable caracteristicValue = newRow.getCaracteristics().remove(maturityCaracteristic); + newRow.getDefaultCaracteristics().putIfAbsent(maturityCaracteristic, caracteristicValue); + + } + } + + public void setMaturityValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue maturityState) { + result.getDefaultCaracteristics().put(maturityCaracteristic, maturityState); + } + + public Caracteristic getSexCaracteristic() { + return sexCaracteristic; + } + + public CaracteristicQualitativeValue getGender(IndividualObservationBatchRowModel row) { + return row.getCaracteristicQualitativeValue(sexCaracteristic); + } + + public CaracteristicQualitativeValue getGender(CaracteristicMap caracteristicMap) { + return caracteristicMap.getQualitativeValue(sexCaracteristic); + } + + public void setGenderValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue gender) { + result.getDefaultCaracteristics().put(sexCaracteristic, gender); + } + + public Collection<Caracteristic> getNotEditableCaracteristic() { + return notEditableCaracteristic; + } + + public void setNotEditableCaracteristic(Collection<Caracteristic> notEditableCaracteristic) { + Object oldValue = getNotEditableCaracteristic(); + this.notEditableCaracteristic = notEditableCaracteristic; + firePropertyChange(PROPERTY_NOT_EDITABLE_CARACTERISTIC, oldValue, notEditableCaracteristic); + } + + /** + * TODO Voir si c'est vraiment nécessaire de vérifier que les lignes ne sont pas vides ? + * + * @return {@code true} s'il existe au moins une ligne en erreur avec des caractéristiques remplies + */ + public boolean isNonEmptyRowInError() { + return rowsInError.stream().anyMatch(row -> !row.isEmpty(notEditableCaracteristic)); + } + + public void recomputeRowsValidateState() { + + if (log.isInfoEnabled()) { + log.info("Revalidate all individual observation rows"); + } + + rows.forEach(this::recomputeRowValidState); + + } + + public boolean recomputeCanEditLengthStep() { + boolean result = true; + if (rows != null) { + for (IndividualObservationBatchRowModel row : rows) { + + if (row.isEmpty(notEditableCaracteristic)) { + // la ligne est vide + continue; + } + + // une ligne non vide et complete a ete trouvee + // on ne peut plus editer + result = false; + break; + } + } + return result; + } + + @Override + public void firePropertyChanged(String propertyName, Object oldValue, Object newValue) { + super.firePropertyChange(propertyName, oldValue, newValue); + } + + public void recomputeRowValidState(IndividualObservationBatchRowModel row) { + + // recompute row valid state + boolean valid = row.computeValid(); + + // apply it to row + row.setValid(valid); + + if (valid) { + removeRowInError(row); + } else { + addRowInError(row); + } + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java index 9254f46..f1993d3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java @@ -96,6 +96,11 @@ public class IndividualObservationToFrequencyEngine { } + public boolean isValidStateChanged(IndividualObservationBatchRowState oldState, + IndividualObservationBatchRowState newState) { + return oldState.isValid() != newState.isValid(); + } + public Optional<FrequencyUpdate> computeFrequencyUpdate(CopyIndividualObservationMode copyIndividualObservationMode, IndividualObservationBatchRowState oldState, IndividualObservationBatchRowState newState) { @@ -233,20 +238,23 @@ public class IndividualObservationToFrequencyEngine { } else { - // forcement au moins un des deux états est valide car le poids a changé... - throw new IllegalStateException("Can't come here!"); + weightToAdd = 0f; } - if (individualObservationWeightUnit.isGreaterThanZero(weightToAdd)) { + if (individualObservationWeightUnit.isNotNullNorZero(weightToAdd)) { - // Ajout - addWeight = Pair.of(newSize, weightToAdd); + if (individualObservationWeightUnit.isGreaterThanZero(weightToAdd)) { - } else { + // Ajout + addWeight = Pair.of(newSize, weightToAdd); - // Suppression - substractWeight = Pair.of(newSize, -weightToAdd); + } else { + + // Suppression + substractWeight = Pair.of(newSize, -weightToAdd); + + } } 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 1c7f68e..ab01a3b 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 @@ -67,6 +67,7 @@ public class IndividualObservationUICache implements Closeable { private final SamplingListener samplingListener; private final CruiseSamplingCache samplingCache; private final SpeciesFrequencyUIModel uiModel; + private final IndividualObservationBatchUIModel individualObservationModel; private SpeciesBatchRowModel speciesEditRow; private FishingOperation fishingOperation; @@ -96,6 +97,7 @@ public class IndividualObservationUICache implements Closeable { this.samplingCache = samplingCache; this.uiModel = uiModel; + this.individualObservationModel = uiModel.getIndividualObservationModel(); // 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() { @@ -211,8 +213,8 @@ public class IndividualObservationUICache implements Closeable { */ public void increments(IndividualObservationBatchRowModel row) { - incrementsObservationNb(uiModel.getGender(row), - uiModel.getMaturityValue(row), + incrementsObservationNb(individualObservationModel.getGender(row), + individualObservationModel.getMaturityValue(row), row.getSize(), row.getSamplingCode()); @@ -245,7 +247,7 @@ public class IndividualObservationUICache implements Closeable { maturity, uiModel.getLengthStepInMm(lengthStep)); - if (samplingCode!=null) { + if (samplingCode != null) { incrementsSamplingNb(gender, maturityQualitativeValue, lengthStep, samplingCode); } } @@ -291,8 +293,8 @@ public class IndividualObservationUICache implements Closeable { */ public void decrements(IndividualObservationBatchRowModel row) { - decrementsObservationNb(uiModel.getGender(row), - uiModel.getMaturityValue(row), + decrementsObservationNb(individualObservationModel.getGender(row), + individualObservationModel.getMaturityValue(row), row.getSize(), row.getSamplingCode()); @@ -386,10 +388,10 @@ public class IndividualObservationUICache implements Closeable { return; } - uiModel.getIndividualObservationRows() - .stream() - .filter(IndividualObservationBatchRowModel::withSize) - .forEach(this::decrements); + individualObservationModel.getRows() + .stream() + .filter(IndividualObservationBatchRowModel::withSize) + .forEach(this::decrements); } @@ -457,11 +459,11 @@ public class IndividualObservationUICache implements Closeable { if (withSamplingCache() && selectedRow != null && selectedRow.withSize()) { - CaracteristicQualitativeValue maturityQualitativeValue = uiModel.getMaturityValue(selectedRow); + CaracteristicQualitativeValue maturityQualitativeValue = individualObservationModel.getMaturityValue(selectedRow); Boolean maturity = samplingCache.getMaturity(selectedRow.getSpecies().getReferenceTaxonId(), maturityQualitativeValue); int lengthstep = uiModel.getLengthStepInMm(selectedRow.getSize()); - event = samplingCache.getEventForSummary(fishingOperation, species, maturity, uiModel.getGender(selectedRow), lengthstep).orElse(null); + event = samplingCache.getEventForSummary(fishingOperation, species, maturity, individualObservationModel.getGender(selectedRow), lengthstep).orElse(null); } displaySummary(event); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java index f56112f..d3e012c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java @@ -22,7 +22,6 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; * #L% */ -import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.EditSpeciesBatchPanelUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchTableModel; @@ -246,12 +245,10 @@ public class SpeciesFrequencyCellComponent extends DefaultTableCellRenderer { // List<IndividualObservationBatchRowModel> individualObservation = new ArrayList<>(); - CopyIndividualObservationMode copyIndividualObservationMode = frequencyModel.getCopyIndividualObservationMode(); - - for (IndividualObservationBatchRowModel row : frequencyModel.getIndividualObservationRows()) { - row.setCopyIndividualObservationMode(copyIndividualObservationMode); - individualObservation.add(row); - } +// CopyIndividualObservationMode copyIndividualObservationMode = frequencyModel.getCopyIndividualObservationMode(); +// +// row.setCopyIndividualObservationMode(copyIndividualObservationMode); + individualObservation.addAll(frequencyModel.getIndividualObservationModel().getRows()); if (log.isDebugEnabled()) { log.debug("Push back " + individualObservation.size() + " observations to batch " + frequencyModel.getBatch()); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java index 6576a67..3b251b7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java @@ -23,9 +23,10 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; */ import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.type.WeightUnit; +import fr.ifremer.tutti.util.Numbers; import fr.ifremer.tutti.util.Weights; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; @@ -34,13 +35,14 @@ import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; -import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import static org.nuiton.i18n.I18n.n; @@ -104,7 +106,7 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp this.weightUnit = weightUnit; this.individualObservationWeightUnit = individualObservationWeightUnit; this.uiModel = uiModel; - this.modelCache = uiModel.cache; + this.modelCache = uiModel.getCache(); setNoneEditableCols(RTP_COMPUTED_WEIGHT); } @@ -257,51 +259,38 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp private PropertyChangeListener getOnLengthStepChangedListener() { if (onLengthStepChangedListener == null) { - onLengthStepChangedListener = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { + onLengthStepChangedListener = evt -> { - SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); + SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); - // recompute the weight with the rtp - uiModel.computeRowWeightWithRtp(row); + // recompute the weight with the rtp + uiModel.computeRowWeightWithRtp(row); - Float oldValue = (Float) evt.getOldValue(); - if (oldValue != null) { + Float oldValue = (Float) evt.getOldValue(); + if (oldValue != null) { - modelCache.removeLengthStep(oldValue); - lengthStepWasRemoved(oldValue); -// removeLengthStepFromSeries(frequenciesSeries, oldValue); -// removeLengthStepFromSeries(averageWeightsSeries, oldValue); + modelCache.removeLengthStep(oldValue); + lengthStepWasRemoved(oldValue); - } - - Float newValue = (Float) evt.getNewValue(); - if (newValue != null) { + } - modelCache.addLengthStep(row); + Float newValue = (Float) evt.getNewValue(); + if (newValue != null) { - lengthStepOrNumberWasUpdated(row); -// if (row.withNumber()) { -// -// frequenciesSeries.addOrUpdate(newValue, row.getNumber()); -// Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); -// averageWeightsSeries.addOrUpdate(newValue, weight); -// -// } + modelCache.addLengthStep(row); + lengthStepOrNumberWasUpdated(row); - } + } - uiModel.recomputeCanEditLengthStep(); - uiModel.recomputeRowsValidateState(); - uiModel.updateEmptyRow(row); + uiModel.recomputeCanEditLengthStep(); + uiModel.recomputeRowsValidateState(); + uiModel.updateEmptyRow(row); - // Can recompute total number and weight only after valid flag change - uiModel.recomputeTotalNumberAndWeight(); + // Can recompute total number and weight only after valid flag change + uiModel.recomputeTotalNumberAndWeight(); - fireTableDataChanged(); + fireTableDataChanged(); - } }; } return onLengthStepChangedListener; @@ -309,47 +298,39 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp private PropertyChangeListener getOnNumberChangedListener() { if (onNumberChangedListener == null) { - onNumberChangedListener = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - - SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); + onNumberChangedListener = evt -> { - // recompute the weight with the rtp - uiModel.computeRowWeightWithRtp(row); + SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); - Float lengthStep = row.getLengthStep(); + // recompute the weight with the rtp + uiModel.computeRowWeightWithRtp(row); - if (lengthStep != null) { + Float lengthStep = row.getLengthStep(); - if (!row.withNumber()) { + if (lengthStep != null) { - // remove the value for the lengthStep - lengthStepWasRemoved(lengthStep); -// removeLengthStepFromSeries(frequenciesSeries, lengthStep); -// removeLengthStepFromSeries(averageWeightsSeries, lengthStep); + if (!row.withNumber()) { - } else { + // remove the value for the lengthStep + lengthStepWasRemoved(lengthStep); - lengthStepOrNumberWasUpdated(row); -// frequenciesSeries.addOrUpdate(lengthStep, row.getNumber()); -// Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); -// averageWeightsSeries.addOrUpdate(lengthStep, weight); + } else { - } + lengthStepOrNumberWasUpdated(row); } - uiModel.recomputeCanEditLengthStep(); - uiModel.recomputeRowValidState(row); - uiModel.updateEmptyRow(row); + } + + uiModel.recomputeCanEditLengthStep(); + uiModel.recomputeRowValidState(row); + uiModel.updateEmptyRow(row); - // Can recompute total number and weight only after valid flag change - uiModel.recomputeTotalNumberAndWeight(); + // Can recompute total number and weight only after valid flag change + uiModel.recomputeTotalNumberAndWeight(); - fireTableDataChanged(); + fireTableDataChanged(); - } }; } return onNumberChangedListener; @@ -357,55 +338,39 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp private PropertyChangeListener getOnWeightChangedListener() { if (onWeightChangedListener == null) { - onWeightChangedListener = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { + onWeightChangedListener = evt -> { - SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); - modelCache.updateRowWithWeight(row); + SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); + modelCache.updateRowWithWeight(row); - Float lengthStep = row.getLengthStep(); + Float lengthStep = row.getLengthStep(); - if (lengthStep != null) { + if (lengthStep != null) { - if (!row.withWeight()) { + if (!row.withWeight()) { - // remove the value for the lengthStep - uiModel.getAverageWeightsHistogramModel().removeValue(lengthStep); -// removeLengthStepFromSeries(averageWeightsSeries, lengthStep); + // remove the value for the lengthStep + uiModel.getAverageWeightsHistogramModel().removeValue(lengthStep); - } else { + } else { - uiModel.getAverageWeightsHistogramModel().addOrUpdate(row); -// Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); -// averageWeightsSeries.addOrUpdate(lengthStep, weight); - - } + uiModel.getAverageWeightsHistogramModel().addOrUpdate(row); } - uiModel.recomputeRowsValidateState(); - uiModel.updateEmptyRow(row); + } + + uiModel.recomputeRowsValidateState(); + uiModel.updateEmptyRow(row); - // Can recompute total number and weight only after valid flag change - uiModel.recomputeTotalNumberAndWeight(); + // Can recompute total number and weight only after valid flag change + uiModel.recomputeTotalNumberAndWeight(); - } }; } return onWeightChangedListener; } -// private void removeLengthStepFromSeries(XYSeries series, Float lengthStep) { -// if (series.indexOf(lengthStep) >= 0) { -// if (series.getItemCount() > 1) { -// series.remove(lengthStep); -// } else { -// series.clear(); -// } -// } -// } - private void dettachListeners(SpeciesFrequencyRowModel result) { result.removePropertyChangeListener(SpeciesFrequencyRowModel.PROPERTY_LENGTH_STEP, getOnLengthStepChangedListener()); @@ -428,7 +393,7 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp int rowIndex = getRowIndex(row); removeRow(rowIndex); - uiModel.getRowCache().remove(row.getLengthStep()); + modelCache.getRowCache().remove(row.getLengthStep()); } @@ -437,7 +402,7 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp // obtenir la classe de taille (en fonction de la précision de la méthode de mensuration) float realLengthStep = uiModel.getLengthStep(lengthstep); - Map<Float, SpeciesFrequencyRowModel> rowCache = uiModel.getRowCache(); + Map<Float, SpeciesFrequencyRowModel> rowCache = modelCache.getRowCache(); SpeciesFrequencyRowModel row = rowCache.get(realLengthStep); @@ -447,7 +412,7 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp rowCache.put(realLengthStep, row); // get new index - List<Float> steps = Lists.newArrayList(rowCache.keySet()); + List<Float> steps = new ArrayList<>(rowCache.keySet()); steps.add(realLengthStep); Collections.sort(steps); @@ -464,19 +429,13 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp // obtenir la classe de taille (en fonction de la précision de la méthode de mensuration) float realLengthStep = uiModel.getLengthStep(lengthstep); - Map<Float, SpeciesFrequencyRowModel> rowCache = uiModel.getRowCache(); + Map<Float, SpeciesFrequencyRowModel> rowCache = modelCache.getRowCache(); SpeciesFrequencyRowModel row = rowCache.get(realLengthStep); return Optional.ofNullable(row); } - public void incrementFrequencyRowsNumbers(IndividualObservationBatchRowModel row) { - if (row.withSize()) { - incrementFrequencyRowsNumbers(row.getSize()); - } - } - public void incrementFrequencyRowsNumbers(float lengthStepToIncrement) { if (log.isInfoEnabled()) { @@ -490,12 +449,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } - public void decrementFrequencyRowsNumbers(IndividualObservationBatchRowModel row) { - if (row.withSize()) { - decrementFrequencyRowsNumbers(row.getSize()); - } - } - public void decrementFrequencyRowsNumbers(float lengthStepToDecrement) { if (log.isInfoEnabled()) { @@ -526,6 +479,10 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } + public Float convertWeightFromIndividualObservation(float weight) { + return Weights.convert(uiModel.getIndividualObservationWeightUnit(), weightUnit, weight); + } + public void addWeightToFrequencyRow(float lengthStep, float weight) { if (log.isInfoEnabled()) { @@ -536,8 +493,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp SpeciesFrequencyRowModel row = getOrCreateRowForLengthStep(lengthStep); - // conversion de poids - weight = Weights.convert(uiModel.getIndividualObservationWeightUnit(), weightUnit, weight); row.addToWeight(weight); updateRow(row); @@ -558,9 +513,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp SpeciesFrequencyRowModel row = optionalRow.get(); - //FIXME on n'en sait rien que c'est ce type de poids. - // conversion de poids - weight = Weights.convert(uiModel.getIndividualObservationWeightUnit(), weightUnit, weight); row.removeFromWeight(weight); updateRow(row); @@ -594,6 +546,72 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } + public SpeciesFrequencyRowModel addRafaleRow(float lengthStep) { + + Map<Float, SpeciesFrequencyRowModel> rowsByStep = uiModel.getCache().getRowCache(); + + SpeciesFrequencyRowModel row = rowsByStep.get(lengthStep); + + int rowIndex; + + if (row != null) { + + // increments current row + Integer number = row.getNumber(); + row.setNumber((number == null ? 0 : number) + 1); + updateRow(row); + + } else { + + // create a new row + + row = createNewRow(); + row.setLengthStep(lengthStep); + row.setNumber(1); + row.setValid(uiModel.isRowValid(row)); + + // get new index + List<Float> steps = new ArrayList<>(rowsByStep.keySet()); + steps.add(lengthStep); + + Collections.sort(steps); + + rowIndex = steps.indexOf(lengthStep); + + addNewRow(rowIndex, row); + } + + return row; + + } + + public void generateRows() { + + Float minStep = uiModel.getLengthStep(uiModel.getMinStep()); + Float maxStep = uiModel.getLengthStep(uiModel.getMaxStep()); + Caracteristic lengthStepCaracteristic = uiModel.getLengthStepCaracteristic(); + + Map<Float, SpeciesFrequencyRowModel> rowsByStep = modelCache.getRowCache(); + Set<Float> existingKeys = new HashSet<>(rowsByStep.keySet()); + List<SpeciesFrequencyRowModel> rows = new ArrayList<>(rowsByStep.values()); + + for (float i = minStep, step = uiModel.getStep(); i <= maxStep; i = Numbers.getRoundedLengthStep(i + step, true)) { + + if (!existingKeys.contains(i)) { + + // add it + SpeciesFrequencyRowModel newRow = createNewRow(); + newRow.setLengthStep(i); + newRow.setLengthStepCaracteristic(lengthStepCaracteristic); + rows.add(newRow); + } + } + Collections.sort(rows); + uiModel.setRows(rows); + + } + + private void lengthStepWasRemoved(Float lengthStep) { uiModel.getAverageWeightsHistogramModel().removeValue(lengthStep); @@ -601,7 +619,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } - private void lengthStepOrNumberWasUpdated(SpeciesFrequencyRowModel row) { if (row.withNumber()) { 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 b4929b2..acdcae7 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 @@ -117,16 +117,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci private Map<String, Caracteristic> lengthStepCaracteristics; -// private Map<String, Caracteristic> maturityCaracteristics; - -// private JFreeChart frequenciesChart; - -// private JFreeChart averageWeightsChart; - -// protected final JFrame frequenciesHistogramPopup = new JFrame(); - -// protected final JFrame averageWeightsHistogramPopup = new JFrame(); - /** * Weight unit. * @@ -139,18 +129,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci */ protected final FeedReaderListener feedReaderListener; -// protected IndividualObservationUICache individualObservationUICache; - protected ApplySpeciesFrequencyRafaleAction applySpeciesFrequencyRafaleAction; -// /** -// * Added on each individual observation row in the dedicated table. -// * Notify each time a modification is done on a such row. -// */ -// protected PropertyChangeListener individualObservationRowChangedListener; - -// protected CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId; - protected SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; protected IndividualObservationBatchTableHandler individualObservationBatchTableHandler; @@ -185,162 +165,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } }; -// // When any change on any individual observation -// this.individualObservationRowChangedListener = new PropertyChangeListener() { -// -// @Override -// public void propertyChange(PropertyChangeEvent evt) { -// -// IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); -// String propertyName = evt.getPropertyName(); -// -// SpeciesFrequencyUIModel model = getModel(); -// -// CaracteristicQualitativeValue gender = model.getGender(row); -// CaracteristicQualitativeValue maturity = model.getMaturityValue(row); -// -// switch (propertyName) { -// 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) { -// getTableModel().decrementFrequencyRowsNumbers(oldValue); -// } -// if (newValue != null) { -// getTableModel().incrementFrequencyRowsNumbers(newValue); -// } -// -// if (model.isCopyIndividualObservationAll() && row.withWeight()) { -// float weight = row.getWeight(); -// if (oldValue != null) { -// getTableModel().removeWeightToFrequencyRow(oldValue, weight); -// } -// if (newValue != null) { -// getTableModel().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; -// } -// -// if (weightUnit.isNotNullNorZero(weightToAdd)) { -// if (weightUnit.isGreaterThanZero(weightToAdd)) { -// getTableModel().addWeightToFrequencyRow(row, weightToAdd); -// } else { -// getTableModel().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(); -// -// if (log.isInfoEnabled()) { -// log.info("caracteristics changed"); -// } -// -// if (model.withMaturityCaracteristic()) { -// CaracteristicQualitativeValue oldMaturity = model.getMaturityValue(oldValue); -// CaracteristicQualitativeValue newMaturity = model.getMaturityValue(newValue); -// if (log.isInfoEnabled()) { -// log.info("maturities : " + oldMaturity + " " + newMaturity); -// } -// if (!Objects.equals(oldMaturity, newMaturity)) { -// individualObservationUICache.decrementsObservationNb(gender, oldMaturity, row.getSize()); -// individualObservationUICache.incrementsObservationNb(gender, newMaturity, row.getSize(), row.getSamplingCode()); -// } -// } -// -// CaracteristicQualitativeValue oldGender = model.getGender(oldValue); -// CaracteristicQualitativeValue newGender = model.getGender(newValue); -// if (!Objects.equals(oldGender, newGender)) { -// individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); -// individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), row.getSamplingCode()); -// } -// } -// break; -// -// case IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE: -// if (row.withSize()) { -// -// float size = row.getSize(); -// -// String oldValue = (String) evt.getOldValue(); -// String newValue = (String) evt.getNewValue(); -// -// if (StringUtils.isNotBlank(oldValue)) { -// individualObservationUICache.decrementsSamplingNb(gender, maturity, size, oldValue); -// } -// if (StringUtils.isNotBlank(newValue)) { -// individualObservationUICache.incrementsSamplingNb(gender, maturity, size, newValue); -// } -// } -// 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()) { -// -// getTableModel().decrementFrequencyRowsNumbers(row); -// } -// if (newValue) { -// if (model.mustCopyIndividualObservationSize()) { -// getTableModel().incrementFrequencyRowsNumbers(row); -// } -// if (model.isCopyIndividualObservationAll() && row.withWeight()) { -// getTableModel().addWeightToFrequencyRow(row, row.getWeight()); -// } -// } -// } -// break; -// } -// -// model.recomputeIndividualObservationRowValidState(row); -// model.recomputeCanEditLengthStep(); -// -// model.setModify(true); -// -// } -// -// }; - } //------------------------------------------------------------------------// @@ -488,7 +312,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SwingUtilities.invokeLater(this::updateLogVisibility); }); -// this.individualObservationUICache = new IndividualObservationUICache(getDataContext().getOptionalCruiseSamplingCache().orElse(null), model); } @Override @@ -502,10 +325,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci this.lengthStepCaracteristics = TuttiEntities.splitById(lengthStepCaracteristics); -// List<Caracteristic> maturityCaracteristics = new ArrayList<>(getDataContext().getMaturityCaracteristics()); -// -// this.maturityCaracteristics = TuttiEntities.splitById(maturityCaracteristics); - SpeciesFrequencyUIModel model = getModel(); taxonCache = TaxonCaches.createSpeciesCacheWithoutVernacularCode(getPersistenceService(), getDataContext().getProtocol()); @@ -545,10 +364,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // get step from the pmfm float step1 = getStep(newValue); model.setStep(step1); -// model.setDataSetIntervalWidth(step1); - -// frequenciesChart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step1 == 1f)); -// averageWeightsChart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step1 == 1f)); if (CollectionUtils.isNotEmpty(getModel().getRows())) { for (SpeciesFrequencyRowModel rowModel : getModel().getRows()) { @@ -589,8 +404,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci column.setHeaderValue(Units.getLabelWithUnit(t("tutti.editIndividualObservationBatch.table.header.size"), unit)); column.setToolTipText(Units.getLabelWithUnit(t("tutti.editIndividualObservationBatch.table.header.size"), unit)); -// frequenciesChart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); -// averageWeightsChart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); }); // when configuration mode change, let's focus the best component (see http://forge.codelutin.com/issues/4035) @@ -642,127 +455,21 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci getTableModel().fireTableDataChanged(); }); -// model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INDIVIDUAL_OBSERVATION_ROWS, evt -> { -// getObsTableModel().setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue()); -// }); -// -// // 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 (source.isInitBatchEdition()) { -// -// if (log.isInfoEnabled()) { -// log.info("Skip ask user to confirm copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); -// } -// return; -// } -// -// // le seul mode où l'utilisateur ne peut rien saisir est le mode tout -// if (CopyIndividualObservationMode.ALL != oldCopyMode) { -// -// long rowsWithUserData; -// -// // si on etait en mode taille et que l'utilisateur avait saisi des tailles -// if (oldCopyMode == CopyIndividualObservationMode.SIZE) { -// rowsWithUserData = model.getRows().stream() -// .filter(SpeciesFrequencyRowModel::withWeight) -// .count(); -// -// } else { -// rowsWithUserData = model.getRows().stream() -// .filter(row -> row.getLengthStep() != null || row.withNumber() || row.withWeight()) -// .count(); -// } -// -// if (rowsWithUserData > 0) { -// -// String htmlMessage = String.format( -// CONFIRMATION_FORMAT, -// t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.message"), -// t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.help")); -// int i = JOptionPane.showConfirmDialog( -// getTopestUI(), -// htmlMessage, -// t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.title"), -// JOptionPane.OK_CANCEL_OPTION, -// JOptionPane.QUESTION_MESSAGE); -// -// if (i == JOptionPane.CANCEL_OPTION) { -// throw new PropertyVetoException("The user does not want to erase his data.", evt); -// } -// } -// } -// }); -// -// // Pour mettre à jour les mensuratuibs suite au changement du mode de recopie des observations individuelles -// model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { -// -// SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); -// CopyIndividualObservationMode oldCopyMode = (CopyIndividualObservationMode) evt.getOldValue(); -// CopyIndividualObservationMode newCopyMode = (CopyIndividualObservationMode) evt.getNewValue(); -// -// if (newCopyMode == null) { -// -// return; -// } -// boolean nothingCopyMode = CopyIndividualObservationMode.NOTHING == newCopyMode; -// -// -// if (!nothingCopyMode) { -// -// source.setFrequenciesConfigurationMode(FrequencyConfigurationMode.RAFALE); -// source.setAddIndividualObservationOnRafale(true); -// -// } -// -// -// // si on est en initialisation, ca ne sert à rien de regénérer les lignes, elles sont sensées être chargées -// if (source.isInitBatchEdition()) { -// -// if (log.isInfoEnabled()) { -// log.info("Skip recompute frequencies from indivudal observations (flag initBatchEdition is on), copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); -// } -// return; -// } -// -// model.setRowComputationInProgress(true); -// -// try { -// -// model.getRows().clear(); -// model.getRowsInError().clear(); -// model.reloadRows(); -// model.recomputeIndividualObservationRowsValidateState(); -// reloadRowsFromIndividualObservations(); -// -// } finally { -// model.setRowComputationInProgress(false); -// } -// -// getTableModel().fireTableDataChanged(); -// getObsTableModel().fireTableDataChanged(); -// -// }); + // si le tableau des observations est en erreur, on recalcule si il existe une ligne non vide en erreur + model.getIndividualObservationModel().addPropertyChangeListener(IndividualObservationBatchUIModel.PROPERTY_ROWS_IN_ERROR, evt -> { + IndividualObservationBatchUIModel source = (IndividualObservationBatchUIModel) evt.getSource(); + if (source.getRows() != null) { + boolean nonEmptyRow = source.isNonEmptyRowInError(); + model.setNonEmptyIndividualObservationRowsInError(nonEmptyRow); + } + }); // set the pattern to the weight in simple counting mode according to the weight unit ui.getSimpleCountingWeightField().setNumberPattern(weightUnit.getNumberEditorPattern()); - // init histogram - -// initFrequenciesHistogram(); - - // init data table - initDataTable(); -// initAverageWeightsHistogram(); - - // init log table initLogTable(); this.individualObservationBatchTableHandler = new IndividualObservationBatchTableHandler(ui); @@ -773,14 +480,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } -// protected IndividualObservationBatchTableModel getObsTableModel() { -// return (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); -// } - -// public void showAverageWeightsHistogram() { -// averageWeightsHistogramPopup.setVisible(true); -// } - @Override protected JComponent getComponentToFocus() { FrequencyConfigurationMode configurationMode = getModel().getConfigurationMode(); @@ -801,9 +500,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.setCanDisplayNotifications(false); -// frequenciesHistogramPopup.dispose(); -// averageWeightsHistogramPopup.dispose(); - IOUtils.closeQuietly(individualObservationBatchTableHandler); IOUtils.closeQuietly(averageWeightsHistogramHandler); IOUtils.closeQuietly(frequenciesHistogramHandler); @@ -880,7 +576,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (speciesProtocol != null) { - CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(getModel().getSexCaracteristic().getIdAsInt()); + Caracteristic sexCaracteristic = model.getIndividualObservationModel().getSexCaracteristic(); + CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(sexCaracteristic.getIdAsInt()); if (sampleCategoryValue != null) { @@ -944,7 +641,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci individualObservationBatchTableHandler.initObservationsCache(frequencyEditor.getEditRow(), getDataContext().getFishingOperation()); -// individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getIndividualObservationRows()); +// individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getRows()); if (getContext().isIchtyometerConnected()) { @@ -1098,82 +795,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } -// protected void initFrequenciesHistogram() { -// frequenciesChart = ChartFactory.createXYBarChart(null, -// t("tutti.editSpeciesFrequencies.table.header.lengthStep"), -// false, -// t("tutti.editSpeciesFrequencies.table.header.number"), -// getModel().frequenciesDataset); -// frequenciesChart.clearSubtitles(); -// -// ValueAxis rangeAxis = frequenciesChart.getXYPlot().getRangeAxis(); -// rangeAxis.setAutoRange(true); -// rangeAxis.setStandardTickUnits(new NumberTickUnitSource(true)); -// -// ValueAxis domainAxis = frequenciesChart.getXYPlot().getDomainAxis(); -// domainAxis.setAutoRange(true); -// domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); -// domainAxis.setMinorTickMarksVisible(true); -// -// frequenciesChart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); -// -// final ChartPanel chartPanel = new ChartPanel(frequenciesChart); -// chartPanel.setDomainZoomable(false); -// chartPanel.setMouseZoomable(false); -// chartPanel.setPopupMenu(null); -// -// JPanel histogramPanel = ui.getHistogramPanel(); -// histogramPanel.add(chartPanel, BorderLayout.CENTER); -// -// chartPanel.addMouseListener(new MouseAdapter() { -// -// @Override -// public void mouseClicked(MouseEvent e) { -// super.mouseClicked(e); -// if (e.getClickCount() > 1) { -// -// frequenciesHistogramPopup.getContentPane().removeAll(); -// ChartPanel chartPanel = new ChartPanel(frequenciesChart); -// frequenciesHistogramPopup.getContentPane().add(chartPanel); -// frequenciesHistogramPopup.pack(); -// frequenciesHistogramPopup.setVisible(true); -// -// } -// } -// }); -// } - -// protected void initAverageWeightsHistogram() { -// averageWeightsChart = ChartFactory.createXYLineChart(null, -// t("tutti.editSpeciesFrequencies.table.header.lengthStep"), -// getConfig().getIndividualObservationWeightUnit() -// .decorateLabel(t("tutti.editSpeciesFrequencies.averageWeight.label")), -// getModel().averageWeightsDataset); -// averageWeightsChart.clearSubtitles(); -// -// ValueAxis rangeAxis = averageWeightsChart.getXYPlot().getRangeAxis(); -// rangeAxis.setAutoRange(true); -// rangeAxis.setStandardTickUnits(new NumberTickUnitSource()); -// rangeAxis.setMinorTickMarksVisible(true); -// -// ValueAxis domainAxis = averageWeightsChart.getXYPlot().getDomainAxis(); -// domainAxis.setAutoRange(true); -// domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); -// domainAxis.setMinorTickMarksVisible(true); -// -// XYLineAndShapeRenderer plotRenderer = (XYLineAndShapeRenderer) averageWeightsChart.getXYPlot().getRenderer(); -// plotRenderer.setSeriesPaint(0, getConfig().getColorComputedWeights()); -// plotRenderer.setBaseShapesVisible(true); -// -// final ChartPanel chartPanel = new ChartPanel(averageWeightsChart); -// chartPanel.setDomainZoomable(false); -// chartPanel.setMouseZoomable(false); -// chartPanel.setPopupMenu(null); -// -// averageWeightsHistogramPopup.getContentPane().add(chartPanel); -// averageWeightsHistogramPopup.pack(); -// } - protected void initLogTable() { JXTable logTable = ui.getLogsTable(); @@ -1202,186 +823,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci logTable.addHighlighter(evenHighlighter); } -// protected void initObsTable() { -// -// JXTable obsTable = ui.getObsTable(); -// -// // can show / hide some columns in model -// obsTable.setColumnControlVisible(true); -// -// // create obsTable column model -// DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); -// Decorator<Caracteristic> caracteristicDecorator = -// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); -// Decorator<Caracteristic> caracteristicTipDecorator = -// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); -// -// Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = -// getDecorator(CaracteristicQualitativeValue.class, null); -// -// { -// // Rank column -// -// addIntegerColumnToModel(columnModel, -// IndividualObservationBatchTableModel.RANK, -// TuttiUI.INT_10_DIGITS_PATTERN, -// obsTable); -// -// } -// -// { // Size column -// -// addFloatColumnToModel(columnModel, -// IndividualObservationBatchTableModel.SIZE, -// TuttiUI.DECIMAL3_PATTERN, -// obsTable); -// } -// -// WeightUnit individualObservationWeightUnit = getConfig().getIndividualObservationWeightUnit(); -// -// { // Weight column -// -// addFloatColumnToModel(columnModel, -// IndividualObservationBatchTableModel.WEIGHT, -// individualObservationWeightUnit, -// obsTable); -// } -// -// List<Caracteristic> defaultCaracteristic = getModel().getDefaultCaracteristic(); -// -// for (Caracteristic caracteristic : defaultCaracteristic) { -// addCaracteristicColumnToModel(obsTable, -// columnModel, -// caracteristicDecorator, -// caracteristicTipDecorator, -// caracteristicQualitativeDecorator, -// caracteristic); -// } -// -// { // Other caracteristics column -// -// Set<Caracteristic> caracteristicsToSkip = Collections.unmodifiableSet( -// Sets.newHashSet(getModel().getDefaultCaracteristic())); -// -// addColumnToModel(columnModel, -// CaracteristicMapCellComponent.newEditor(ui, caracteristicsToSkip), -// CaracteristicMapCellComponent.newRender(getContext()), -// IndividualObservationBatchTableModel.OTHER_CARACTERISTICS); -// -// } -// -// { -// // Smapling code column -// -// addColumnToModel(columnModel, -// SamplingCodeCellEditor.newEditor(ui), -// SamplingCodeCellRenderer.newRender(), -// IndividualObservationBatchTableModel.SAMPLING_CODE); -// -// } -// -// { // Comment column -// -// addColumnToModel(columnModel, -// CommentCellEditor.newEditor(ui), -// CommentCellRenderer.newRender(), -// IndividualObservationBatchTableModel.COMMENT); -// -// } -// -// { // File column -// -// addColumnToModel(columnModel, -// AttachmentCellEditor.newEditor(ui), -// AttachmentCellRenderer.newRender(getDecorator(Attachment.class, null)), -// IndividualObservationBatchTableModel.ATTACHMENT); -// } -// -// // create obsTable model -// IndividualObservationBatchTableModel tableModel = -// new IndividualObservationBatchTableModel(individualObservationWeightUnit, -// getModel(), -//// defaultCaracteristic, -//// getModel().getSexCaracteristic(), -// columnModel); -// -// obsTable.setModel(tableModel); -// obsTable.setColumnModel(columnModel); -// -// initTable(obsTable); -// Color cellWithValueColor = getConfig().getColorCellWithValue(); -// -// Highlighter commentHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( -// new HighlightPredicate.AndHighlightPredicate( -// new HighlightPredicate.IdentifierHighlightPredicate(IndividualObservationBatchTableModel.COMMENT), -// // for not null value -// (renderer, adapter) -> { -// String value = (String) adapter.getValue(); -// return StringUtils.isNotBlank(value); -// }), cellWithValueColor); -// obsTable.addHighlighter(commentHighlighter); -// -// installTableKeyListener(columnModel, obsTable, false); -// -// tableModel.addTableModelListener(e -> { -// -// int firstRow = e.getFirstRow(); -// int lastRow = e.getLastRow(); -// -// switch (e.getType()) { -// case TableModelEvent.DELETE: -// if (tableModel.getRowCount() == 0) { -// tableModel.addNewRow(); -// -// } else { -// tableModel.recomputeRankOrders(firstRow); -// } -// break; -// -// case TableModelEvent.INSERT: -// for (int i = firstRow; i <= lastRow; i++) { -// IndividualObservationBatchRowModel newRow = tableModel.getRows().get(i); -// newRow.addPropertyChangeListener(obsChangedListener); -// -// if (getModel().mustCopyIndividualObservationSize()) { -// -// getTableModel().incrementFrequencyRowsNumbers(newRow); -// -// } -// -// getModel().recomputeIndividualObservationRowValidState(newRow); -// } -// break; -// -// case TableModelEvent.UPDATE: -// if (tableModel.getRowCount() == 0) { -// tableModel.addNewRow(); -// } -// } -// -// getModel().recomputeCanEditLengthStep(); -// }); -// -// obsTable.getSelectionModel().addListSelectionListener(e -> { -// -// if (!getModel().isInRafaleRowCreation()) { -// resetSamplingLabel(); -// } -// -// IndividualObservationBatchRowModel selectedRow = null; -// -// if (!obsTable.getSelectionModel().isSelectionEmpty()) { -// if (obsTable.getSelectedRowCount() == 1) { -// selectedRow = getObsTableModel().getEntry(obsTable.getSelectedRow()); -// -// } -// } -// -// individualObservationUICache.updateSelectedRow(selectedRow); -// }); -// } -// - public void resetSamplingLabel() { if (log.isDebugEnabled()) { log.debug("reset smapling panel"); @@ -1389,61 +830,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci ui.getSamplingWarningLabel().setVisible(false); } -// public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { -// getModel().setMaturityCaracteristic(maturityCaracteristic); -//// getObsTableModel().setMaturityCaracteristic(maturityCaracteristic); -// if (maturityCaracteristic != null) { -// individualObservationBatchTableHandler.addMaturityCaracteristicColumnToModel(maturityCaracteristic); -// } -// } - -// protected void addMaturityCaracteristicColumnToModel(Caracteristic caracteristic) { -// -// Decorator<Caracteristic> caracteristicDecorator = -// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); -// Decorator<Caracteristic> caracteristicTipDecorator = -// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); -// -// Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = -// getDecorator(CaracteristicQualitativeValue.class, null); -// -// // remove the row sorter while we add the new column -// JXTable obsTable = ui.getObsTable(); -// obsTable.setRowSorter(null); -// obsTable.setAutoCreateRowSorter(false); -// -// TableColumnModelExt columnModel = (TableColumnModelExt) obsTable.getColumnModel(); -// -// maturityColumnId = addCaracteristicColumnToModel(obsTable, -// columnModel, -// caracteristicDecorator, -// caracteristicTipDecorator, -// caracteristicQualitativeDecorator, -// caracteristic); -// -// Objects.requireNonNull(maturityColumnId); -// -// getObsTableModel().addMaturityIdentifier(maturityColumnId); -// -// // on cherche le bon index où insérer la colonne maturité (avant les autres caractéristiques, mais elle peut etre cachee) -// int modelIndex = columnModel.getColumnExt(IndividualObservationBatchTableModel.OTHER_CARACTERISTICS).getModelIndex(); -// int indexToMove = obsTable.convertColumnIndexToView(modelIndex); -// -// // si la colonne autres caracteristiques est cachée, alors on cherche la première colonne suivante non cachée -// int columnCount = columnModel.getColumnCount(true); -// while (indexToMove == -1 && modelIndex < columnCount) { -// indexToMove = obsTable.convertColumnIndexToView(modelIndex); -// modelIndex++; -// } -// // si une colonne après celle des autres caractéristiques est visible, on déplace la maturité avant cette colonne -// // sinon, on laisse la maturité à la fin -// if (modelIndex != -1) { -// obsTable.moveColumn(columnModel.getColumnCount() - 1, indexToMove); -// } -// // reset the row sorter -// obsTable.setAutoCreateRowSorter(true); -// } - protected CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> addCaracteristicColumnToModel(JXTable table, TableColumnModelExt columnModel, Caracteristic caracteristic) { @@ -1618,10 +1004,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci ui.getLogsScrollPane().setVisible(logVisible); } -// protected String getLabelWithUnit(String label, String unit) { -// return label + " (" + unit + ")"; -// } - protected void reloadRowsFromIndividualObservations() { SpeciesFrequencyUIModel model = getModel(); CopyIndividualObservationMode copyMode = model.getCopyIndividualObservationMode(); @@ -1630,8 +1012,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci Caracteristic lengthStepCaracteristic = model.getLengthStepCaracteristic(); - List<IndividualObservationBatchRowModel> validObsRow = new ArrayList<>(model.getIndividualObservationRows()); - validObsRow.removeAll(model.getIndividualObservationRowsInError()); + List<IndividualObservationBatchRowModel> validObsRow = new ArrayList<>(model.getIndividualObservationModel().getRows()); + validObsRow.removeAll(model.getIndividualObservationModel().getRowsInError()); WeightUnit individualObservationWeightUnit = getConfig().getIndividualObservationWeightUnit(); @@ -1643,13 +1025,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (log.isInfoEnabled()) { log.info("size : " + size); } - SpeciesFrequencyRowModel row = model.getRowCache().get(size); + SpeciesFrequencyRowModel row = model.getCache().getRowCache().get(size); if (row == null) { row = getTableModel().createNewRow(false, true); row.setLengthStep(size); row.setLengthStepCaracteristic(lengthStepCaracteristic); model.getRows().add(row); - model.getRowCache().put(size, row); + model.getCache().getRowCache().put(size, row); } row.incNumber(); Float weight = obsRow.getWeight(); 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 a8d9a58..9e4ef6f 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 @@ -22,12 +22,10 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; * #L% */ -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.protocol.Rtp; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; @@ -39,15 +37,9 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; /** @@ -115,19 +107,10 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa public static final String PROPERTY_COPY_INDIVIDUAL_OBSERVATION_SIZE = "copyIndividualObservationSize"; - public static final String PROPERTY_INDIVIDUAL_OBSERVATION_ROWS = "individualObservationRows"; - - 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"; public static final String PROPERTY_CAN_DISPLAY_NOTIFICATIONS = "canDisplayNotifications"; - - public static final String PROPERTY_NOT_EDITABLE_CARACTERISTIC = "notEditableCaracteristic"; - - public static final String PROPERTY_MATURITY_CARACTERISTIC = "maturityCaracteristic"; + public static final String PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR = "nonEmptyIndividualObservationRowsInError"; private final SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; @@ -136,123 +119,123 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa * * @since 0.2 */ - protected FrequencyConfigurationMode configurationMode; + private FrequencyConfigurationMode configurationMode; /** * Fill mode. * * @since 4.5 */ - protected FrequencyConfigurationMode frequenciesConfigurationMode = FrequencyConfigurationMode.AUTO_GEN; + private FrequencyConfigurationMode frequenciesConfigurationMode; /** * Batch that contains frequencies. * * @since 0.2 */ - protected SpeciesBatchRowModel batch; + private SpeciesBatchRowModel batch; /** * Default step to addIndividualObservation length step. * * @since 0.2 */ - protected Float step; + private Float step; /** * Min step to auto generate length steps. * * @since 0.2 */ - protected Float minStep; + private Float minStep; /** * Max step to auto generate length steps. * * @since 0.2 */ - protected Float maxStep; + private Float maxStep; /** * Length step caracteristic. * * @since 0.3 */ - protected Caracteristic lengthStepCaracteristic; + private Caracteristic lengthStepCaracteristic; /** * Sum of the number of each valid row * * @since 2.3 */ - protected Integer totalNumber; + private Integer totalNumber; /** * Sum of the weight of each valid row, or sample weight * * @since 3.8 */ - protected ComputableData<Float> totalComputedOrNotWeight = new ComputableData<>(); + private ComputableData<Float> totalComputedOrNotWeight; /** * Rtp of the species batch * * @since 4.5 */ - protected Rtp rtp; + private Rtp rtp; /** * copy the weigths computed with the RTPs of the protocol * * @since 4.5 */ - protected boolean copyRtpWeights; + private boolean copyRtpWeights; /** * Add individual observation rows when a lengthstep is added with the rafale mode * * @since 4.5 */ - protected boolean addIndividualObservationOnRafale; + private boolean addIndividualObservationOnRafale; /** * Number in case of simple counting mode * * @since 1.0 */ - protected Integer simpleCount; + private Integer simpleCount; /** * The index of the next editable row (null if none). * * @since 2.5 */ - protected Integer nextEditableRowIndex; + private Integer nextEditableRowIndex; - protected Set<SpeciesFrequencyRowModel> emptyRows; + private Set<SpeciesFrequencyRowModel> emptyRows; /** * Sample categories model. * * @since 2.4 */ - protected final SampleCategoryModel sampleCategoryModel; + private final SampleCategoryModel sampleCategoryModel; /** * Weight unit. * * @since 2.5 */ - protected final WeightUnit weightUnit; + private final WeightUnit weightUnit; - protected final WeightUnit individualObservationWeightUnit; + private final WeightUnit individualObservationWeightUnit; /** * To store all caches used by the screen * * @since 3.11 */ - protected final SpeciesFrequencyUIModelCache cache = new SpeciesFrequencyUIModelCache(); + private final SpeciesFrequencyUIModelCache cache; /** * Can edit length step? (only if no row is filled). @@ -260,77 +243,35 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa * * @since 3.11 */ - protected boolean canEditLengthStep = true; + private boolean canEditLengthStep; /** * What to copy from the individual observations to the data table * * @since 4.5 */ - protected CopyIndividualObservationMode copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; - - /** - * Default caracteristics coming from protocol. - * - * @since 4.5 - */ - protected final List<Caracteristic> defaultCaracteristic; + private CopyIndividualObservationMode copyIndividualObservationMode; - /** - * Individual observations - * - * @since 4.5 - */ - protected List<IndividualObservationBatchRowModel> individualObservationRows; - - /** - * Individual observations in error - * - * @since 4.5 - */ - protected Set<IndividualObservationBatchRowModel> individualObservationRowsInError; - - protected boolean rowComputationInProgress; + private boolean rowComputationInProgress; /** * Is the model is loading? */ - protected boolean initBatchEdition; + private boolean initBatchEdition; /** * Can smapling notifications or summary be displayed? */ - protected boolean canDisplayNotifications; + private boolean canDisplayNotifications; /** * A row is being created in rafale. Do not remove the sampling warning in this state. */ - protected boolean inRafaleRowCreation; - - /** - * Caracteristiques non éditables, car caractéristiques de catégorisation du lot (sexe, maturité, etc) - * - * @since 4.5 - */ - protected Collection<Caracteristic> notEditableCaracteristic; + private boolean inRafaleRowCreation; - protected final Caracteristic sexCaracteristic; - - /** - * Caracteristique de maturité du protocole - */ - protected Caracteristic maturityCaracteristic; - - protected final AverageWeightsHistogramModel averageWeightsHistogramModel; - protected final FrequenciesHistogramModel frequenciesHistogramModel; - - protected final PropertyChangeListener rowInErrorChangedListener = new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - reloadNonEmptyIndividualObservationRowsInError(); - } - }; + private final AverageWeightsHistogramModel averageWeightsHistogramModel; + private final FrequenciesHistogramModel frequenciesHistogramModel; + private final IndividualObservationBatchUIModel individualObservationModel; public SpeciesFrequencyUIModel(SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport, WeightUnit individualObservationWeightUnit, @@ -342,16 +283,27 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa this.weightUnit = speciesOrBenthosBatchUISupport.getWeightUnit(); this.individualObservationWeightUnit = individualObservationWeightUnit; this.sampleCategoryModel = sampleCategoryModel; - this.sexCaracteristic = sexCaracteristic; + this.totalComputedOrNotWeight = new ComputableData<>(); this.totalComputedOrNotWeight.addPropagateListener(PROPERTY_TOTAL_WEIGHT, this); + this.copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; + this.canEditLengthStep = true; + this.cache = new SpeciesFrequencyUIModelCache(); + this.frequenciesConfigurationMode = FrequencyConfigurationMode.AUTO_GEN; setEmptyRows(new HashSet<>()); + this.individualObservationModel = new IndividualObservationBatchUIModel(sexCaracteristic, individualObservationWeightUnit, defaultCaracteristic); + +// JavaBeanObjectPropagateChangeListener.listenAndPropagate(individualObservationModel, +// this, +// IndividualObservationBatchUIModel.PROPERTY_NON_EMPTY_ROWS_IN_ERROR, +// "nonEmptyIndividualObservationRowsInError"); + this.averageWeightsHistogramModel = new AverageWeightsHistogramModel(weightUnit); this.frequenciesHistogramModel = new FrequenciesHistogramModel(); + } - this.defaultCaracteristic = defaultCaracteristic == null ? new ArrayList<>() : new ArrayList<>(defaultCaracteristic); - - setIndividualObservationRowsInError(new HashSet<>()); + public SpeciesFrequencyUIModelCache getCache() { + return cache; } public AverageWeightsHistogramModel getAverageWeightsHistogramModel() { @@ -403,7 +355,7 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa Float lengthStep = row.getLengthStep(); valid = lengthStep != null && lengthStep > 0 - && numberOfRows(lengthStep) < 2; + && cache.numberOfRows(lengthStep) < 2; } if (valid) { @@ -833,19 +785,8 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } } - if (individualObservationRows != null) { - for (IndividualObservationBatchRowModel row : individualObservationRows) { - - if (row.isEmpty(notEditableCaracteristic)) { - // la ligne est vide - continue; - } - - // une ligne non vide et complete a ete trouvee - // on ne peut plus editer - result = false; - break; - } + if (result) { + result = individualObservationModel.recomputeCanEditLengthStep(); } setCanEditLengthStep(result); @@ -877,86 +818,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa return rtp != null; } - public int numberOfRows(float lengthStep) { - return cache.numberOfRows(lengthStep); - } - - public Map<Float, SpeciesFrequencyRowModel> getRowCache() { - return cache.getRowCache(); - } - - public List<IndividualObservationBatchRowModel> getIndividualObservationRows() { - return individualObservationRows; - } - - public void setIndividualObservationRows(List<IndividualObservationBatchRowModel> individualObservationRows) { - Object oldValue = getIndividualObservationRows(); - this.individualObservationRows = individualObservationRows; - firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_ROWS, oldValue, individualObservationRows); - - individualObservationRowsInError.clear(); - for (IndividualObservationBatchRowModel row : individualObservationRows) { - if (!row.isValid()) { - individualObservationRowsInError.add(row); - } - } - setIndividualObservationRowsInError(individualObservationRowsInError); - } - - public Set<IndividualObservationBatchRowModel> getIndividualObservationRowsInError() { - return individualObservationRowsInError; - } - - public void setIndividualObservationRowsInError(Set<IndividualObservationBatchRowModel> individualObservationRowsInError) { - if (this.individualObservationRowsInError != null) { - this.individualObservationRowsInError.forEach(row -> row.removePropertyChangeListener(rowInErrorChangedListener)); - } - this.individualObservationRowsInError = individualObservationRowsInError; - if (this.individualObservationRowsInError != null) { - this.individualObservationRowsInError.forEach(row -> row.addPropertyChangeListener(rowInErrorChangedListener)); - } - reloadNonEmptyIndividualObservationRowsInError(); - } - - public void addIndividualObservationRowInError(IndividualObservationBatchRowModel row) { - boolean nonEmptyIndividualObservationInError = isNonEmptyIndividualObservationRowsInError(); - Object oldValue = new HashSet<>(individualObservationRowsInError); - individualObservationRowsInError.add(row); - row.addPropertyChangeListener(rowInErrorChangedListener); - firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, oldValue, individualObservationRowsInError); - setNonEmptyIndividualObservationRowsInError(nonEmptyIndividualObservationInError); - } - - public void removeIndividualObservationRowInError(IndividualObservationBatchRowModel row) { - boolean nonEmptyIndividualObservationInError = isNonEmptyIndividualObservationRowsInError(); - Object oldValue = new HashSet<>(individualObservationRowsInError); - individualObservationRowsInError.remove(row); - row.removePropertyChangeListener(rowInErrorChangedListener); - firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, oldValue, individualObservationRowsInError); - setNonEmptyIndividualObservationRowsInError(nonEmptyIndividualObservationInError); - } - - public boolean isNonEmptyIndividualObservationRowsInError() { - return individualObservationRowsInError != null - && individualObservationRowsInError.stream().anyMatch(row -> !row.isEmpty(notEditableCaracteristic)); - } - - public void setNonEmptyIndividualObservationRowsInError(boolean oldNonEmptyIndividualObservationInError) { - firePropertyChange(PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, - oldNonEmptyIndividualObservationInError, - isNonEmptyIndividualObservationRowsInError()); - } - - public void reloadNonEmptyIndividualObservationRowsInError() { - firePropertyChange(PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, - null, - isNonEmptyIndividualObservationRowsInError()); - } - - public boolean isNonEmptyIndividualObservationRow() { - return individualObservationRows.stream().anyMatch(row -> !row.isEmpty(notEditableCaracteristic)); - } - public void recomputeRowsValidateState() { if (log.isInfoEnabled()) { @@ -967,20 +828,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } - public void recomputeIndividualObservationRowsValidateState() { - - if (log.isInfoEnabled()) { - log.info("Revalidate all individual observation rows"); - } - - individualObservationRows.forEach(this::recomputeIndividualObservationRowValidState); - - } - - public List<Caracteristic> getDefaultCaracteristic() { - return defaultCaracteristic; - } - public boolean isRowComputationInProgress() { return rowComputationInProgress; } @@ -1007,68 +854,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa this.inRafaleRowCreation = inRafaleRowCreation; } - public Collection<Caracteristic> getNotEditableCaracteristic() { - return notEditableCaracteristic; - } - - public void setNotEditableCaracteristic(Collection<Caracteristic> notEditableCaracteristic) { - Object oldValue = getNotEditableCaracteristic(); - this.notEditableCaracteristic = notEditableCaracteristic; - firePropertyChange(PROPERTY_NOT_EDITABLE_CARACTERISTIC, oldValue, notEditableCaracteristic); - } - - public Caracteristic getSexCaracteristic() { - return sexCaracteristic; - } - - public CaracteristicQualitativeValue getGender(IndividualObservationBatchRowModel row) { - return row.getCaracteristicQualitativeValue(sexCaracteristic); - } - - public CaracteristicQualitativeValue getGender(CaracteristicMap caracteristicMap) { - return caracteristicMap.getQualitativeValue(sexCaracteristic); - } - - public boolean withMaturityCaracteristic() { - return maturityCaracteristic != null; - } - - public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { - Object oldValue = this.maturityCaracteristic; - this.maturityCaracteristic = maturityCaracteristic; - firePropertyChange(PROPERTY_MATURITY_CARACTERISTIC, oldValue, maturityCaracteristic); - } - - public CaracteristicQualitativeValue getMaturityValue(IndividualObservationBatchRowModel row) { - - CaracteristicQualitativeValue caracteristicValue = null; - if (withMaturityCaracteristic()) { - caracteristicValue = row.getCaracteristicQualitativeValue(maturityCaracteristic); - } - return caracteristicValue; - - } - - public CaracteristicQualitativeValue getMaturityValue(CaracteristicMap caracteristicMap) { - - CaracteristicQualitativeValue caracteristicValue = null; - if (withMaturityCaracteristic()) { - caracteristicValue = caracteristicMap.getQualitativeValue(maturityCaracteristic); - } - return caracteristicValue; - - } - - public void moveMaturityValueFromCaracteristicsToDefaultCaracteristics(IndividualObservationBatchRowModel newRow) { - - if (withMaturityCaracteristic()) { - - Serializable caracteristicValue = newRow.getCaracteristics().remove(maturityCaracteristic); - newRow.getDefaultCaracteristics().putIfAbsent(maturityCaracteristic, caracteristicValue); - - } - } - protected final void recomputeRowValidState(SpeciesFrequencyRowModel row) { // recompute row valid state @@ -1085,35 +870,30 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } - protected final void recomputeIndividualObservationRowValidState(IndividualObservationBatchRowModel row) { - - // recompute row valid state - boolean valid = row.computeValid(); - - // apply it to row - row.setValid(valid); - - if (valid) { - removeIndividualObservationRowInError(row); - } else { - addIndividualObservationRowInError(row); - } - - } - public SpeciesOrBenthosBatchUISupport getSpeciesOrBenthosBatchUISupport() { return speciesOrBenthosBatchUISupport; } - public void setMaturityValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue maturityState) { - result.getDefaultCaracteristics().put(maturityCaracteristic, maturityState); + public WeightUnit getIndividualObservationWeightUnit() { + return individualObservationWeightUnit; } - public void setGenderValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue gender) { - result.getDefaultCaracteristics().put(sexCaracteristic, gender); + public IndividualObservationBatchUIModel getIndividualObservationModel() { + return individualObservationModel; } - public WeightUnit getIndividualObservationWeightUnit() { - return individualObservationWeightUnit; + private boolean nonEmptyIndividualObservationRowsInError; + + // Ne pas supprimer utiliser par la validation + public boolean isNonEmptyIndividualObservationRowsInError() { + return nonEmptyIndividualObservationRowsInError; + } + + // Ne pas supprimer utiliser par la validation + public void setNonEmptyIndividualObservationRowsInError(boolean nonEmptyIndividualObservationRowsInError) { + boolean oldValue = this.nonEmptyIndividualObservationRowsInError; + this.nonEmptyIndividualObservationRowsInError = nonEmptyIndividualObservationRowsInError; + firePropertyChanged(PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, oldValue, nonEmptyIndividualObservationRowsInError); } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java index 02ab245..32ab9ae 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java @@ -39,11 +39,7 @@ import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; import javax.swing.SwingUtilities; -import java.util.ArrayList; -import java.util.Collections; import java.util.Date; -import java.util.List; -import java.util.Map; import static org.nuiton.i18n.I18n.t; @@ -83,38 +79,41 @@ public class ApplySpeciesFrequencyRafaleAction { SpeciesFrequencyTableModel tableModel = handler.getTableModel(); - Map<Float, SpeciesFrequencyRowModel> rowsByStep = model.getRowCache(); - - SpeciesFrequencyRowModel row = rowsByStep.get(aroundLengthStep); - - int rowIndex; - - if (row != null) { - - // increments current row - Integer number = row.getNumber(); - row.setNumber((number == null ? 0 : number) + 1); - rowIndex = tableModel.updateRow(row); - - } else { - - // create a new row - - row = tableModel.createNewRow(); - row.setLengthStep(aroundLengthStep); - row.setNumber(1); - row.setValid(handler.isRowValid(row)); - - // get new index - List<Float> steps = new ArrayList<>(rowsByStep.keySet()); - steps.add(aroundLengthStep); - - Collections.sort(steps); - - rowIndex = steps.indexOf(aroundLengthStep); - - tableModel.addNewRow(rowIndex, row); - } + SpeciesFrequencyRowModel row = tableModel.addRafaleRow(aroundLengthStep); + int rowIndex = tableModel.getRowIndex(row); + +// Map<Float, SpeciesFrequencyRowModel> rowsByStep = model.getRowCache(); +// +// SpeciesFrequencyRowModel row = rowsByStep.get(aroundLengthStep); +// +// int rowIndex; +// +// if (row != null) { +// +// // increments current row +// Integer number = row.getNumber(); +// row.setNumber((number == null ? 0 : number) + 1); +// rowIndex = tableModel.updateRow(row); +// +// } else { +// +// // create a new row +// +// row = tableModel.createNewRow(); +// row.setLengthStep(aroundLengthStep); +// row.setNumber(1); +// row.setValid(handler.isRowValid(row)); +// +// // get new index +// List<Float> steps = new ArrayList<>(rowsByStep.keySet()); +// steps.add(aroundLengthStep); +// +// Collections.sort(steps); +// +// rowIndex = steps.indexOf(aroundLengthStep); +// +// tableModel.addNewRow(rowIndex, row); +// } int totalNumber = model.computeTotalNumber(); model.setTotalNumber(totalNumber); @@ -131,16 +130,19 @@ public class ApplySpeciesFrequencyRafaleAction { logsTableModel.addNewRow(0, newLogRow); if (model.isAddIndividualObservationOnRafale()) { - IndividualObservationBatchTableModel obsTableModel = - (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); - - IndividualObservationBatchRowModel obsRow = obsTableModel.getEmptyRow(); - if (obsRow == null) { - obsRow = obsTableModel.createNewRow(); - obsTableModel.addNewRow(obsRow); - } - obsRow.setSize(step); - obsTableModel.updateRow(obsRow); + + IndividualObservationBatchTableModel obsTableModel = (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); + + IndividualObservationBatchRowModel obsRow = obsTableModel.addRafaleRow(step); + +// IndividualObservationBatchRowModel obsRow = obsTableModel.getEmptyRow(); +// if (obsRow == null) { +// obsRow = obsTableModel.createNewRow(); +// obsTableModel.addNewRow(obsRow); +// } +// obsRow.setSize(step); +// obsTableModel.updateRow(obsRow); + newLogRow.setObsRow(obsRow); int rowIndex = obsTableModel.getRowIndex(obsRow); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/GenerateSpeciesFrequencyLengthStepsAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/GenerateSpeciesFrequencyLengthStepsAction.java index 074be40..411476e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/GenerateSpeciesFrequencyLengthStepsAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/GenerateSpeciesFrequencyLengthStepsAction.java @@ -24,23 +24,13 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; -import fr.ifremer.tutti.util.Numbers; import jaxx.runtime.SwingUtil; import jaxx.runtime.swing.JTables; import javax.swing.AbstractAction; import java.awt.event.ActionEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -69,31 +59,32 @@ public class GenerateSpeciesFrequencyLengthStepsAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { - SpeciesFrequencyUIModel model = ui.getModel(); +// SpeciesFrequencyUIModel model = ui.getModel(); SpeciesFrequencyTableModel tableModel = ui.getHandler().getTableModel(); - - Map<Float, SpeciesFrequencyRowModel> rowsByStep = model.getRowCache(); - - Float minStep = model.getLengthStep(model.getMinStep()); - Float maxStep = model.getLengthStep(model.getMaxStep()); - Caracteristic lengthStepCaracteristic = model.getLengthStepCaracteristic(); - - Set<Float> existingKeys = new HashSet<>(rowsByStep.keySet()); - List<SpeciesFrequencyRowModel> rows = new ArrayList<>(rowsByStep.values()); - - for (float i = minStep, step = model.getStep(); i <= maxStep; i = Numbers.getRoundedLengthStep(i + step, true)) { - - if (!existingKeys.contains(i)) { - - // add it - SpeciesFrequencyRowModel newRow = tableModel.createNewRow(); - newRow.setLengthStep(i); - newRow.setLengthStepCaracteristic(lengthStepCaracteristic); - rows.add(newRow); - } - } - Collections.sort(rows); - model.setRows(rows); + tableModel.generateRows(); + +// Map<Float, SpeciesFrequencyRowModel> rowsByStep = model.getRowCache(); +// +// Float minStep = model.getLengthStep(model.getMinStep()); +// Float maxStep = model.getLengthStep(model.getMaxStep()); +// Caracteristic lengthStepCaracteristic = model.getLengthStepCaracteristic(); +// +// Set<Float> existingKeys = new HashSet<>(rowsByStep.keySet()); +// List<SpeciesFrequencyRowModel> rows = new ArrayList<>(rowsByStep.values()); +// +// for (float i = minStep, step = model.getStep(); i <= maxStep; i = Numbers.getRoundedLengthStep(i + step, true)) { +// +// if (!existingKeys.contains(i)) { +// +// // add it +// SpeciesFrequencyRowModel newRow = tableModel.createNewRow(); +// newRow.setLengthStep(i); +// newRow.setLengthStepCaracteristic(lengthStepCaracteristic); +// rows.add(newRow); +// } +// } +// Collections.sort(rows); +// model.setRows(rows); // select first cell in table (see http://forge.codelutin.com/issues/2496) JTables.doSelectCell(ui.getTable(), 0, 1); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java index 4a644df..edb1495 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java @@ -27,9 +27,9 @@ import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.service.catches.multipost.MultiPostImportResult; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; 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.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyCellComponent; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; @@ -38,14 +38,10 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.Spe import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler; -import javax.swing.JOptionPane; import java.io.File; import java.util.List; -import static org.nuiton.i18n.I18n.t; - /** * @author Tony Chemit - chemit@codelutin.com * @since 4.5 @@ -89,62 +85,13 @@ public abstract class ImportMultiPostSpeciesSupportAction extends LongActionSupp if (doAction) { - String message = "<ul>"; - boolean ask = false; - if (isImportFrequencies() && getModel().isNonEmptyRows()) { - ask = true; - message = "<li>" + t("tutti.askBeforeMultiPostImport.frequencies.message") + "</li>"; - } - - if (isImportIndivudalObservations() && getModel().getIndividualObservationRows().size() > 0 - && getModel().isNonEmptyIndividualObservationRow()) { - ask = true; - message += "<li>" + t("tutti.askBeforeMultiPostImport.observations.message") + "</li>"; - } - message += "</ul>"; - - if (ask) { - - String htmlMessage = String.format(AbstractApplicationUIHandler.CONFIRMATION_FORMAT, - t("tutti.askBeforeMultiPostImport.message", message), - t("tutti.askBeforeMultiPostImport.help")); - - int saveResponse = JOptionPane.showOptionDialog( - getHandler().getTopestUI(), - htmlMessage, - t("tutti.askBeforeMultiPostImport.title"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, - new String[]{t("tutti.option.cleanAndImport"), t("tutti.option.cancelImport")}, - t("tutti.option.cleanAndImport")); - - switch (saveResponse) { - case 0: + // choose file to import + file = chooseFile(getFileChooserTitle(), + getFileChooserButton(), + "^.*\\." + getFileExtension(), + getFileExtensionDescription()); - // do action - doAction = true; - break; - case 1: - - // cancel import - doAction = false; - - } - - } - - if (doAction) { - - // choose file to import - file = chooseFile(getFileChooserTitle(), - getFileChooserButton(), - "^.*\\." + getFileExtension(), - getFileExtensionDescription()); - - doAction = file != null; - - } + doAction = file != null; } @@ -189,6 +136,8 @@ public abstract class ImportMultiPostSpeciesSupportAction extends LongActionSupp getDataContext().getDefaultIndividualObservationCaracteristics(), individualObservations); + //FIXME Il faut reporter le poids de sous-échantillons + //FIXME Faire un «reset» avant pour l'algorithme de prélèvement getHandler().loadFrequenciesAndObservations(frequencyRows, individualObservationRows); getModel().setModify(true); 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 9a23f0f..a2337bf 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 @@ -75,7 +75,6 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc t("tutti.editSpeciesFrequencies.action.removeObservations.confirm.title"), JOptionPane.YES_NO_OPTION); - if (answer == JOptionPane.YES_OPTION) { SpeciesFrequencyUIModel model = ui.getModel(); @@ -94,23 +93,18 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc boolean removeSize = removeWeight || model.isCopyIndividualObservationSize(); if (removeWeight) { - frequencyTableModel.removeWeightToFrequencyRow(row.getSize(), row.getWeight()); + float weightToRemove = frequencyTableModel.convertWeightFromIndividualObservation(row.getWeight()); + frequencyTableModel.removeWeightToFrequencyRow(row.getSize(), weightToRemove); } if (removeSize) { - frequencyTableModel.decrementFrequencyRowsNumbers(row); + frequencyTableModel.decrementFrequencyRowsNumbers(row.getSize()); } individualObservationUICache.decrements(row); - model.removeIndividualObservationRowInError(row); }); - int minSelection = obsTable.getSelectionModel().getMinSelectionIndex(); - int maxSelection = obsTable.getSelectionModel().getMaxSelectionIndex(); - - //FIXME On devrait faire un seul appel vers le table model - obsTableModel.getRows().removeAll(rowsToDelete); - obsTableModel.fireTableRowsDeleted(minSelection, maxSelection); + obsTableModel.removeRows(rowsToDelete); model.setModify(true); } 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 c230ea2..7957c95 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 @@ -100,7 +100,7 @@ public class ResetSpeciesFrequencyAction extends LongActionSupport<SpeciesFreque IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); individualObservationUICache.decrementsAll(); - model.setIndividualObservationRows(new ArrayList<>()); + model.getIndividualObservationModel().setRows(new ArrayList<>()); model.setCanDisplayNotifications(true); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java index 06f22ef..a3e5153 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java @@ -22,8 +22,6 @@ package fr.ifremer.tutti.ui.swing.util.table; * #L% */ -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; @@ -32,6 +30,9 @@ import org.nuiton.util.beans.Binder; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -71,7 +72,7 @@ public abstract class AbstractTuttiTableUIModel<E, R extends AbstractTuttiBeanUI setValid(CollectionUtils.isEmpty(rowsInErorr)); } }); - setRowsInError(Sets.<R>newHashSet()); + setRowsInError(new HashSet<>()); } public List<R> getRows() { @@ -80,7 +81,7 @@ public abstract class AbstractTuttiTableUIModel<E, R extends AbstractTuttiBeanUI public void setRows(List<R> rows) { if (rows == null) { - rows = Lists.newArrayList(); + rows = new ArrayList<>(); } this.rows = rows; @@ -118,4 +119,9 @@ public abstract class AbstractTuttiTableUIModel<E, R extends AbstractTuttiBeanUI rowsInError.remove(row); firePropertyChange(PROPERTY_ROWS_IN_ERROR, null, rowsInError); } + + public void removeRowsInError(Collection<R> rows) { + rowsInError.removeAll(rows); + firePropertyChange(PROPERTY_ROWS_IN_ERROR, null, rowsInError); + } } -- 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 develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 9b9430d081a7902c006189fd45e2d90ed017a5fb Merge: 2aad139 1028129 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Apr 16 11:16:24 2016 +0200 Livrable #8245 Merge branch 'feature/8245' into develop .../entities/referential/TaxonCache.java | 3 + .../java/fr/ifremer/tutti/type/WeightUnit.java | 15 +- .../src/main/java/fr/ifremer/tutti/util/Units.java | 13 + .../accidental/AccidentalBatchUIHandler.java | 2 +- .../SamplingCodeCellEditor.java | 2 + .../catches/species/edit/SpeciesBatchRowModel.java | 2 +- .../species/edit/SpeciesBatchUIHandler.java | 2 +- .../frequency/AverageWeightsHistogramHandler.java | 156 +++ .../frequency/AverageWeightsHistogramModel.java | 117 +++ .../frequency/FrequenciesHistogramHandler.java | 164 +++ .../frequency/FrequenciesHistogramModel.java | 107 ++ .../IndividualObservationBatchRowModel.java | 38 +- .../IndividualObservationBatchRowState.java | 61 ++ .../IndividualObservationBatchTableHandler.java | 712 +++++++++++++ .../IndividualObservationBatchTableModel.java | 124 ++- .../IndividualObservationBatchUIModel.java | 206 ++++ .../IndividualObservationToFrequencyEngine.java | 268 +++++ .../frequency/IndividualObservationUICache.java | 25 +- .../frequency/SpeciesFrequencyCellComponent.java | 12 +- .../frequency/SpeciesFrequencyLogRowModel.java | 1 - .../frequency/SpeciesFrequencyTableModel.java | 312 +++--- .../species/frequency/SpeciesFrequencyUI.jaxx | 2 +- .../frequency/SpeciesFrequencyUIHandler.java | 1111 +++++--------------- .../species/frequency/SpeciesFrequencyUIModel.java | 418 ++------ .../actions/ApplySpeciesFrequencyRafaleAction.java | 110 +- .../frequency/actions/DeleteSampleCodeAction.java | 4 +- .../DeleteSpeciesFrequencyLogRowAction.java | 2 +- .../frequency/actions/EditSampleCodeAction.java | 4 +- .../GenerateSpeciesFrequencyLengthStepsAction.java | 59 +- .../ImportMultiPostSpeciesSupportAction.java | 70 +- .../frequency/actions/RemoveObservationAction.java | 20 +- .../actions/ResetSpeciesFrequencyAction.java | 2 +- .../util/table/AbstractTuttiTableUIModel.java | 14 +- 33 files changed, 2580 insertions(+), 1578 deletions(-) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm