branch feature/8245 updated (e2b4392 -> 1028129)
This is an automated email from the git hooks/post-receive script. New change to branch feature/8245 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git from e2b4392 Correction de l'unité utilisée pour le graphique des poids moyens new 1028129 Introduction modele pour la partie observations individuelles + du menache The 1 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 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 Summary of changes: .../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(-) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8245 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>.
participants (1)
-
codelutin.com scm