This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 10281292f9f06aace81f0b439edbc021938b063c Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Apr 16 11:15:20 2016 +0200 Introduction modele pour la partie observations individuelles + du menache --- .../IndividualObservationBatchTableHandler.java | 84 +-- .../IndividualObservationBatchTableModel.java | 106 +++- .../IndividualObservationBatchUIModel.java | 206 +++++++ .../IndividualObservationToFrequencyEngine.java | 24 +- .../frequency/IndividualObservationUICache.java | 24 +- .../frequency/SpeciesFrequencyCellComponent.java | 11 +- .../frequency/SpeciesFrequencyTableModel.java | 251 ++++---- .../frequency/SpeciesFrequencyUIHandler.java | 648 +-------------------- .../species/frequency/SpeciesFrequencyUIModel.java | 348 ++--------- .../actions/ApplySpeciesFrequencyRafaleAction.java | 94 +-- .../GenerateSpeciesFrequencyLengthStepsAction.java | 59 +- .../ImportMultiPostSpeciesSupportAction.java | 69 +-- .../frequency/actions/RemoveObservationAction.java | 14 +- .../actions/ResetSpeciesFrequencyAction.java | 2 +- .../util/table/AbstractTuttiTableUIModel.java | 14 +- 15 files changed, 672 insertions(+), 1282 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java index 528f01c..1c1c7f4 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableHandler.java @@ -73,6 +73,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { private final SpeciesFrequencyUIModel model; private final SpeciesFrequencyTableModel frequencyTableModel; + private final IndividualObservationBatchUIModel model2; private final IndividualObservationBatchTableModel individualObservationTableModel; private final IndividualObservationUICache individualObservationUICache; @@ -92,11 +93,12 @@ public class IndividualObservationBatchTableHandler implements Closeable { this.ui = ui; this.model = ui.getModel(); + this.model2 = ui.getModel().getIndividualObservationModel(); this.uiHandler = ui.getHandler(); this.individualObservationUICache = new IndividualObservationUICache(uiHandler.getDataContext().getOptionalCruiseSamplingCache().orElse(null), model); this.individualObservationTable = ui.getObsTable(); this.frequencyTableModel = uiHandler.getTableModel(); - this.individualObservationToFrequencyEngine = new IndividualObservationToFrequencyEngine(model.getIndividualObservationWeightUnit()); + this.individualObservationToFrequencyEngine = new IndividualObservationToFrequencyEngine(model2.getIndividualObservationWeightUnit()); List<Caracteristic> maturityCaracteristics = new ArrayList<>(uiHandler.getDataContext().getMaturityCaracteristics()); @@ -108,8 +110,8 @@ public class IndividualObservationBatchTableHandler implements Closeable { IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); String propertyName = evt.getPropertyName(); - CaracteristicQualitativeValue gender = model.getGender(row); - CaracteristicQualitativeValue maturity = model.getMaturityValue(row); + CaracteristicQualitativeValue gender = model2.getGender(row); + CaracteristicQualitativeValue maturity = model2.getMaturityValue(row); switch (propertyName) { case IndividualObservationBatchRowModel.PROPERTY_INDIVIDUAL_OBSERVATION_BATCH_ROW_STATE: { @@ -141,17 +143,28 @@ public class IndividualObservationBatchTableHandler implements Closeable { Optional<Pair<Float, Float>> optionalSubstractWeight = frequencyUpdate.getSubstractWeight(); if (optionalSubstractWeight.isPresent()) { Pair<Float, Float> substractWeight = optionalSubstractWeight.get(); - frequencyTableModel.removeWeightToFrequencyRow(substractWeight.getKey(), substractWeight.getValue()); + float weight = substractWeight.getValue(); + float weightToRemove = frequencyTableModel.convertWeightFromIndividualObservation(weight); + frequencyTableModel.removeWeightToFrequencyRow(substractWeight.getKey(), weightToRemove); } Optional<Pair<Float, Float>> optionalAddWeight = frequencyUpdate.getAddWeight(); if (optionalAddWeight.isPresent()) { Pair<Float, Float> addWeight = optionalAddWeight.get(); - frequencyTableModel.addWeightToFrequencyRow(addWeight.getKey(), addWeight.getValue()); + float weight = addWeight.getValue(); + float weightToAdd = frequencyTableModel.convertWeightFromIndividualObservation(weight); + frequencyTableModel.addWeightToFrequencyRow(addWeight.getKey(), weightToAdd); } } + if (individualObservationToFrequencyEngine.isValidStateChanged(oldValue, newValue)) { + + // l'état de validité de la ligne a changé, on recalcule les lignes en erreurs + model2.recomputeRowValidState(row); + + } + } break; @@ -229,9 +242,9 @@ public class IndividualObservationBatchTableHandler implements Closeable { log.info("caracteristics changed"); } - if (model.withMaturityCaracteristic()) { - CaracteristicQualitativeValue oldMaturity = model.getMaturityValue(oldValue); - CaracteristicQualitativeValue newMaturity = model.getMaturityValue(newValue); + if (model2.withMaturityCaracteristic()) { + CaracteristicQualitativeValue oldMaturity = model2.getMaturityValue(oldValue); + CaracteristicQualitativeValue newMaturity = model2.getMaturityValue(newValue); if (log.isInfoEnabled()) { log.info("maturities : " + oldMaturity + " " + newMaturity); } @@ -241,8 +254,8 @@ public class IndividualObservationBatchTableHandler implements Closeable { } } - CaracteristicQualitativeValue oldGender = model.getGender(oldValue); - CaracteristicQualitativeValue newGender = model.getGender(newValue); + CaracteristicQualitativeValue oldGender = model2.getGender(oldValue); + CaracteristicQualitativeValue newGender = model2.getGender(newValue); if (!Objects.equals(oldGender, newGender)) { individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), row.getSamplingCode()); @@ -290,7 +303,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { // break; } - model.recomputeIndividualObservationRowValidState(row); +// model2.recomputeRowValidState(row); model.recomputeCanEditLengthStep(); model.setModify(true); @@ -331,7 +344,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { individualObservationTable); } - List<Caracteristic> defaultCaracteristic = model.getDefaultCaracteristic(); + List<Caracteristic> defaultCaracteristic = model2.getDefaultCaracteristic(); for (Caracteristic caracteristic : defaultCaracteristic) { uiHandler.addCaracteristicColumnToModel(individualObservationTable, @@ -342,7 +355,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { { // Other caracteristics column Set<Caracteristic> caracteristicsToSkip = Collections.unmodifiableSet( - Sets.newHashSet(model.getDefaultCaracteristic())); + Sets.newHashSet(model2.getDefaultCaracteristic())); uiHandler.addColumnToModel(columnModel, CaracteristicMapCellComponent.newEditor(ui, caracteristicsToSkip), @@ -406,46 +419,47 @@ public class IndividualObservationBatchTableHandler implements Closeable { // always scroll to selected row SwingUtil.scrollToTableSelection(individualObservationTable); - this.individualObservationTableModel.addTableModelListener(e -> { + individualObservationTableModel.addTableModelListener(e -> { int firstRow = e.getFirstRow(); int lastRow = e.getLastRow(); switch (e.getType()) { case TableModelEvent.DELETE: - if (this.individualObservationTableModel.getRowCount() == 0) { - this.individualObservationTableModel.addNewRow(); + if (individualObservationTableModel.getRowCount() == 0) { + individualObservationTableModel.addNewRow(); } else { - this.individualObservationTableModel.recomputeRankOrders(firstRow); + individualObservationTableModel.recomputeRankOrders(firstRow); } break; case TableModelEvent.INSERT: for (int i = firstRow; i <= lastRow; i++) { - IndividualObservationBatchRowModel newRow = this.individualObservationTableModel.getRows().get(i); + IndividualObservationBatchRowModel newRow = individualObservationTableModel.getEntry(i); newRow.addPropertyChangeListener(individualObservationRowChangedListener); - if (model.mustCopyIndividualObservationSize()) { + if (model.mustCopyIndividualObservationSize() && newRow.withSize()) { - frequencyTableModel.incrementFrequencyRowsNumbers(newRow); + frequencyTableModel.incrementFrequencyRowsNumbers(newRow.getSize()); } - model.recomputeIndividualObservationRowValidState(newRow); + model2.recomputeRowValidState(newRow); } break; case TableModelEvent.UPDATE: - if (this.individualObservationTableModel.getRowCount() == 0) { - this.individualObservationTableModel.addNewRow(); + if (individualObservationTableModel.getRowCount() == 0) { + individualObservationTableModel.addNewRow(); } } model.recomputeCanEditLengthStep(); + }); - this.individualObservationTable.getSelectionModel().addListSelectionListener(e -> { + individualObservationTable.getSelectionModel().addListSelectionListener(e -> { if (!model.isInRafaleRowCreation()) { uiHandler.resetSamplingLabel(); @@ -453,9 +467,9 @@ public class IndividualObservationBatchTableHandler implements Closeable { IndividualObservationBatchRowModel selectedRow = null; - if (!this.individualObservationTable.getSelectionModel().isSelectionEmpty()) { - if (this.individualObservationTable.getSelectedRowCount() == 1) { - selectedRow = this.individualObservationTableModel.getEntry(this.individualObservationTable.getSelectedRow()); + if (!individualObservationTable.getSelectionModel().isSelectionEmpty()) { + if (individualObservationTable.getSelectedRowCount() == 1) { + selectedRow = individualObservationTableModel.getEntry(individualObservationTable.getSelectedRow()); } } @@ -463,9 +477,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { individualObservationUICache.updateSelectedRow(selectedRow); }); - model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INDIVIDUAL_OBSERVATION_ROWS, evt -> { - individualObservationTableModel.setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue()); - }); + model2.addPropertyChangeListener(IndividualObservationBatchUIModel.PROPERTY_ROWS, evt -> individualObservationTableModel.setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue())); // Pour bloquer le changement du mode de recopie des observations individuelles → mensurations model.addVetoableChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { @@ -557,7 +569,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { model.getRows().clear(); model.getRowsInError().clear(); model.reloadRows(); - model.recomputeIndividualObservationRowsValidateState(); + model2.recomputeRowsValidateState(); uiHandler.reloadRowsFromIndividualObservations(); } finally { @@ -620,11 +632,11 @@ public class IndividualObservationBatchTableHandler implements Closeable { }); individualObservationTableModel.setDefaultCaracteristicValues(sampleCategoryValues); - model.setNotEditableCaracteristic(sampleCategoryValues.keySet()); + model2.setNotEditableCaracteristic(sampleCategoryValues.keySet()); - model.setIndividualObservationRows(individualObservationRows); + model2.setRows(individualObservationRows); individualObservationTableModel.setRows(individualObservationRows); - model.recomputeIndividualObservationRowsValidateState(); + model2.recomputeRowsValidateState(); } @@ -635,7 +647,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { public void initObservationsCache(SpeciesBatchRowModel incomingSpeciesBatch, FishingOperation fishingOperation) { - individualObservationUICache.init(ui, incomingSpeciesBatch, fishingOperation, model.getIndividualObservationRows()); + individualObservationUICache.init(ui, incomingSpeciesBatch, fishingOperation, model2.getRows()); } @@ -655,7 +667,7 @@ public class IndividualObservationBatchTableHandler implements Closeable { // Add maturity column if necessary - model.setMaturityCaracteristic(maturityCaracteristic); + model2.setMaturityCaracteristic(maturityCaracteristic); if (maturityCaracteristic != null) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java index 0dca87c..7f74b71 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchTableModel.java @@ -32,6 +32,7 @@ import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.util.table.CaracteristicColumnIdentifier; import org.apache.commons.collections4.CollectionUtils; import org.jdesktop.swingx.table.TableColumnModelExt; +import org.nuiton.jaxx.application.bean.JavaBeanObjectUtil; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; @@ -39,6 +40,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Set; @@ -105,15 +107,17 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab protected Caracteristic lengthstepCaracteristic; protected final SpeciesFrequencyUIModel uiModel; + protected final IndividualObservationBatchUIModel model; public IndividualObservationBatchTableModel(WeightUnit weightUnit, SpeciesFrequencyUIModel uiModel, TableColumnModelExt columnModel) { super(columnModel, true, false); this.uiModel = uiModel; + this.model = uiModel.getIndividualObservationModel(); this.weightUnit = weightUnit; // Lorsque la caracteristique de maturité change, on met à jour defaultCaracteristicsMap - this.uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_MATURITY_CARACTERISTIC, new PropertyChangeListener() { + this.model.addPropertyChangeListener(IndividualObservationBatchUIModel.PROPERTY_MATURITY_CARACTERISTIC, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Caracteristic oldValue = (Caracteristic) evt.getOldValue(); @@ -127,7 +131,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } }); - this.defaultCaracteristicsMap = CaracteristicMap.fromCollection(uiModel.getDefaultCaracteristic()); + this.defaultCaracteristicsMap = CaracteristicMap.fromCollection(model.getDefaultCaracteristic()); setNoneEditableCols(RANK); } @@ -181,12 +185,12 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab if (getRowCount() > 0) { IndividualObservationBatchRowModel lastRow = getRows().get(getRowCount() - 1); - CaracteristicQualitativeValue gender = uiModel.getGender(lastRow); - uiModel.setGenderValueToDefaultCaracterictis(result, gender); + CaracteristicQualitativeValue gender = model.getGender(lastRow); + model.setGenderValueToDefaultCaracterictis(result, gender); - if (uiModel.withMaturityCaracteristic()) { - CaracteristicQualitativeValue maturityState = uiModel.getMaturityValue(lastRow); - uiModel.setMaturityValueToDefaultCaracterictis(result, maturityState); + if (model.withMaturityCaracteristic()) { + CaracteristicQualitativeValue maturityState = model.getMaturityValue(lastRow); + model.setMaturityValueToDefaultCaracterictis(result, maturityState); } } @@ -230,29 +234,6 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab return editable; } - public IndividualObservationBatchRowModel getEmptyRow() { - - IndividualObservationBatchRowModel result = null; - - for (int i = rows.size() - 1; i >= 0; i--) { - IndividualObservationBatchRowModel row = rows.get(i); - // if the row has no data set, then it could be the empty row we are looking for - Set<Caracteristic> notNullCaracteristics = defaultCaracteristicsMap.keySet().stream() - .filter(key -> defaultCaracteristicsMap.get(key) != null) - .collect(Collectors.toSet()); - if (row.isEmpty(notNullCaracteristics)) { - - result = row; - - } else { // if the row has data set, then the empty row we are looking for was the previous row - break; - } - - } - - return result; - } - public void recomputeRankOrders(int firstRow) { for (int i = firstRow; i < getRowCount(); i++) { @@ -288,7 +269,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab newRow.addPropertyChangeListener(individualObservationRowChangedListener); newRow.setValid(true); - uiModel.moveMaturityValueFromCaracteristicsToDefaultCaracteristics(newRow); + model.moveMaturityValueFromCaracteristicsToDefaultCaracteristics(newRow); obsRows.add(newRow); } @@ -299,4 +280,67 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } + public IndividualObservationBatchRowModel addRafaleRow(Float step) { + + IndividualObservationBatchRowModel row = getEmptyRow(); + if (row == null) { + row = createNewRow(); + addNewRow(row); + } + row.setSize(step); + updateRow(row); + + return row; + + } + + private IndividualObservationBatchRowModel getEmptyRow() { + + IndividualObservationBatchRowModel result = null; + + for (int i = rows.size() - 1; i >= 0; i--) { + IndividualObservationBatchRowModel row = rows.get(i); + // if the row has no data set, then it could be the empty row we are looking for + Set<Caracteristic> notNullCaracteristics = defaultCaracteristicsMap.keySet().stream() + .filter(key -> defaultCaracteristicsMap.get(key) != null) + .collect(Collectors.toSet()); + if (row.isEmpty(notNullCaracteristics)) { + + result = row; + + } else { // if the row has data set, then the empty row we are looking for was the previous row + break; + } + + } + + return result; + + } + + public void removeRows(Collection<IndividualObservationBatchRowModel> rowsToDelete) { + + int minSelection = Integer.MAX_VALUE; + int maxSelection = -1; + + for (IndividualObservationBatchRowModel row : rowsToDelete) { + + JavaBeanObjectUtil.removeAllPropertyChangeListeners(row); + int rowIndex = rows.indexOf(row); + if (minSelection > rowIndex) { + minSelection = rowIndex; + } + if (maxSelection < rowIndex) { + maxSelection = rowIndex; + } + + model.removeRowInError(row); + } + + rows.removeAll(rowsToDelete); + model.removeRowsInError(rowsToDelete); + + fireTableRowsDeleted(minSelection, maxSelection); + + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java new file mode 100644 index 0000000..d5f1d0c --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationBatchUIModel.java @@ -0,0 +1,206 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.type.WeightUnit; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; +import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.application.bean.JavaBeanObject; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created on 16/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class IndividualObservationBatchUIModel extends AbstractTuttiTableUIModel<SpeciesBatchRowModel, IndividualObservationBatchRowModel, IndividualObservationBatchUIModel> implements JavaBeanObject { + + private static final long serialVersionUID = 1L; + + /** Logger. */ + private static final Log log = LogFactory.getLog(IndividualObservationBatchUIModel.class); + + public static final String PROPERTY_MATURITY_CARACTERISTIC = "maturityCaracteristic"; + + public static final String PROPERTY_NOT_EDITABLE_CARACTERISTIC = "notEditableCaracteristic"; + + private final WeightUnit individualObservationWeightUnit; + + private final Caracteristic sexCaracteristic; + + /** + * Default caracteristics coming from protocol. + * + * @since 4.5 + */ + private final List<Caracteristic> defaultCaracteristic; + + /** + * Caracteristique de maturité du protocole + */ + private Caracteristic maturityCaracteristic; + + /** + * Caracteristiques non éditables, car caractéristiques de catégorisation du lot (sexe, maturité, etc) + * + * @since 4.5 + */ + private Collection<Caracteristic> notEditableCaracteristic; + + @Override + protected SpeciesBatchRowModel newEntity() { + return null; // Jamais utilisé! + } + + public IndividualObservationBatchUIModel(Caracteristic sexCaracteristic, WeightUnit individualObservationWeightUnit, List<Caracteristic> defaultCaracteristic) { + super(SpeciesBatchRowModel.class, null, null); + this.sexCaracteristic = sexCaracteristic; + this.individualObservationWeightUnit = individualObservationWeightUnit; + this.defaultCaracteristic = defaultCaracteristic == null ? new ArrayList<>() : new ArrayList<>(defaultCaracteristic); + } + + public WeightUnit getIndividualObservationWeightUnit() { + return individualObservationWeightUnit; + } + + public List<Caracteristic> getDefaultCaracteristic() { + return defaultCaracteristic; + } + + public boolean withMaturityCaracteristic() { + return maturityCaracteristic != null; + } + + public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { + Object oldValue = this.maturityCaracteristic; + this.maturityCaracteristic = maturityCaracteristic; + firePropertyChange(PROPERTY_MATURITY_CARACTERISTIC, oldValue, maturityCaracteristic); + } + + public CaracteristicQualitativeValue getMaturityValue(IndividualObservationBatchRowModel row) { + + CaracteristicQualitativeValue caracteristicValue = null; + if (withMaturityCaracteristic()) { + caracteristicValue = row.getCaracteristicQualitativeValue(maturityCaracteristic); + } + return caracteristicValue; + + } + + public CaracteristicQualitativeValue getMaturityValue(CaracteristicMap caracteristicMap) { + + CaracteristicQualitativeValue caracteristicValue = null; + if (withMaturityCaracteristic()) { + caracteristicValue = caracteristicMap.getQualitativeValue(maturityCaracteristic); + } + return caracteristicValue; + + } + + public void moveMaturityValueFromCaracteristicsToDefaultCaracteristics(IndividualObservationBatchRowModel newRow) { + + if (withMaturityCaracteristic()) { + + Serializable caracteristicValue = newRow.getCaracteristics().remove(maturityCaracteristic); + newRow.getDefaultCaracteristics().putIfAbsent(maturityCaracteristic, caracteristicValue); + + } + } + + public void setMaturityValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue maturityState) { + result.getDefaultCaracteristics().put(maturityCaracteristic, maturityState); + } + + public Caracteristic getSexCaracteristic() { + return sexCaracteristic; + } + + public CaracteristicQualitativeValue getGender(IndividualObservationBatchRowModel row) { + return row.getCaracteristicQualitativeValue(sexCaracteristic); + } + + public CaracteristicQualitativeValue getGender(CaracteristicMap caracteristicMap) { + return caracteristicMap.getQualitativeValue(sexCaracteristic); + } + + public void setGenderValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue gender) { + result.getDefaultCaracteristics().put(sexCaracteristic, gender); + } + + public Collection<Caracteristic> getNotEditableCaracteristic() { + return notEditableCaracteristic; + } + + public void setNotEditableCaracteristic(Collection<Caracteristic> notEditableCaracteristic) { + Object oldValue = getNotEditableCaracteristic(); + this.notEditableCaracteristic = notEditableCaracteristic; + firePropertyChange(PROPERTY_NOT_EDITABLE_CARACTERISTIC, oldValue, notEditableCaracteristic); + } + + /** + * TODO Voir si c'est vraiment nécessaire de vérifier que les lignes ne sont pas vides ? + * + * @return {@code true} s'il existe au moins une ligne en erreur avec des caractéristiques remplies + */ + public boolean isNonEmptyRowInError() { + return rowsInError.stream().anyMatch(row -> !row.isEmpty(notEditableCaracteristic)); + } + + public void recomputeRowsValidateState() { + + if (log.isInfoEnabled()) { + log.info("Revalidate all individual observation rows"); + } + + rows.forEach(this::recomputeRowValidState); + + } + + public boolean recomputeCanEditLengthStep() { + boolean result = true; + if (rows != null) { + for (IndividualObservationBatchRowModel row : rows) { + + if (row.isEmpty(notEditableCaracteristic)) { + // la ligne est vide + continue; + } + + // une ligne non vide et complete a ete trouvee + // on ne peut plus editer + result = false; + break; + } + } + return result; + } + + @Override + public void firePropertyChanged(String propertyName, Object oldValue, Object newValue) { + super.firePropertyChange(propertyName, oldValue, newValue); + } + + public void recomputeRowValidState(IndividualObservationBatchRowModel row) { + + // recompute row valid state + boolean valid = row.computeValid(); + + // apply it to row + row.setValid(valid); + + if (valid) { + removeRowInError(row); + } else { + addRowInError(row); + } + + } + +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java index 9254f46..f1993d3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationToFrequencyEngine.java @@ -96,6 +96,11 @@ public class IndividualObservationToFrequencyEngine { } + public boolean isValidStateChanged(IndividualObservationBatchRowState oldState, + IndividualObservationBatchRowState newState) { + return oldState.isValid() != newState.isValid(); + } + public Optional<FrequencyUpdate> computeFrequencyUpdate(CopyIndividualObservationMode copyIndividualObservationMode, IndividualObservationBatchRowState oldState, IndividualObservationBatchRowState newState) { @@ -233,20 +238,23 @@ public class IndividualObservationToFrequencyEngine { } else { - // forcement au moins un des deux états est valide car le poids a changé... - throw new IllegalStateException("Can't come here!"); + weightToAdd = 0f; } - if (individualObservationWeightUnit.isGreaterThanZero(weightToAdd)) { + if (individualObservationWeightUnit.isNotNullNorZero(weightToAdd)) { - // Ajout - addWeight = Pair.of(newSize, weightToAdd); + if (individualObservationWeightUnit.isGreaterThanZero(weightToAdd)) { - } else { + // Ajout + addWeight = Pair.of(newSize, weightToAdd); - // Suppression - substractWeight = Pair.of(newSize, -weightToAdd); + } else { + + // Suppression + substractWeight = Pair.of(newSize, -weightToAdd); + + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java index 1c7f68e..ab01a3b 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java @@ -67,6 +67,7 @@ public class IndividualObservationUICache implements Closeable { private final SamplingListener samplingListener; private final CruiseSamplingCache samplingCache; private final SpeciesFrequencyUIModel uiModel; + private final IndividualObservationBatchUIModel individualObservationModel; private SpeciesBatchRowModel speciesEditRow; private FishingOperation fishingOperation; @@ -96,6 +97,7 @@ public class IndividualObservationUICache implements Closeable { this.samplingCache = samplingCache; this.uiModel = uiModel; + this.individualObservationModel = uiModel.getIndividualObservationModel(); // Ecoute sur le modèle de l'ui pour savoir quand on peut activer le cache (i.e uand le modèle n'est pas en construction) this.uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INIT_BATCH_EDITION, new PropertyChangeListener() { @@ -211,8 +213,8 @@ public class IndividualObservationUICache implements Closeable { */ public void increments(IndividualObservationBatchRowModel row) { - incrementsObservationNb(uiModel.getGender(row), - uiModel.getMaturityValue(row), + incrementsObservationNb(individualObservationModel.getGender(row), + individualObservationModel.getMaturityValue(row), row.getSize(), row.getSamplingCode()); @@ -245,7 +247,7 @@ public class IndividualObservationUICache implements Closeable { maturity, uiModel.getLengthStepInMm(lengthStep)); - if (samplingCode!=null) { + if (samplingCode != null) { incrementsSamplingNb(gender, maturityQualitativeValue, lengthStep, samplingCode); } } @@ -291,8 +293,8 @@ public class IndividualObservationUICache implements Closeable { */ public void decrements(IndividualObservationBatchRowModel row) { - decrementsObservationNb(uiModel.getGender(row), - uiModel.getMaturityValue(row), + decrementsObservationNb(individualObservationModel.getGender(row), + individualObservationModel.getMaturityValue(row), row.getSize(), row.getSamplingCode()); @@ -386,10 +388,10 @@ public class IndividualObservationUICache implements Closeable { return; } - uiModel.getIndividualObservationRows() - .stream() - .filter(IndividualObservationBatchRowModel::withSize) - .forEach(this::decrements); + individualObservationModel.getRows() + .stream() + .filter(IndividualObservationBatchRowModel::withSize) + .forEach(this::decrements); } @@ -457,11 +459,11 @@ public class IndividualObservationUICache implements Closeable { if (withSamplingCache() && selectedRow != null && selectedRow.withSize()) { - CaracteristicQualitativeValue maturityQualitativeValue = uiModel.getMaturityValue(selectedRow); + CaracteristicQualitativeValue maturityQualitativeValue = individualObservationModel.getMaturityValue(selectedRow); Boolean maturity = samplingCache.getMaturity(selectedRow.getSpecies().getReferenceTaxonId(), maturityQualitativeValue); int lengthstep = uiModel.getLengthStepInMm(selectedRow.getSize()); - event = samplingCache.getEventForSummary(fishingOperation, species, maturity, uiModel.getGender(selectedRow), lengthstep).orElse(null); + event = samplingCache.getEventForSummary(fishingOperation, species, maturity, individualObservationModel.getGender(selectedRow), lengthstep).orElse(null); } displaySummary(event); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java index f56112f..d3e012c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyCellComponent.java @@ -22,7 +22,6 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; * #L% */ -import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.EditSpeciesBatchPanelUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchTableModel; @@ -246,12 +245,10 @@ public class SpeciesFrequencyCellComponent extends DefaultTableCellRenderer { // List<IndividualObservationBatchRowModel> individualObservation = new ArrayList<>(); - CopyIndividualObservationMode copyIndividualObservationMode = frequencyModel.getCopyIndividualObservationMode(); - - for (IndividualObservationBatchRowModel row : frequencyModel.getIndividualObservationRows()) { - row.setCopyIndividualObservationMode(copyIndividualObservationMode); - individualObservation.add(row); - } +// CopyIndividualObservationMode copyIndividualObservationMode = frequencyModel.getCopyIndividualObservationMode(); +// +// row.setCopyIndividualObservationMode(copyIndividualObservationMode); + individualObservation.addAll(frequencyModel.getIndividualObservationModel().getRows()); if (log.isDebugEnabled()) { log.debug("Push back " + individualObservation.size() + " observations to batch " + frequencyModel.getBatch()); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java index 6576a67..3b251b7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyTableModel.java @@ -23,9 +23,10 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; */ import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.type.WeightUnit; +import fr.ifremer.tutti.util.Numbers; import fr.ifremer.tutti.util.Weights; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; @@ -34,13 +35,14 @@ import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; -import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import static org.nuiton.i18n.I18n.n; @@ -104,7 +106,7 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp this.weightUnit = weightUnit; this.individualObservationWeightUnit = individualObservationWeightUnit; this.uiModel = uiModel; - this.modelCache = uiModel.cache; + this.modelCache = uiModel.getCache(); setNoneEditableCols(RTP_COMPUTED_WEIGHT); } @@ -257,51 +259,38 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp private PropertyChangeListener getOnLengthStepChangedListener() { if (onLengthStepChangedListener == null) { - onLengthStepChangedListener = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { + onLengthStepChangedListener = evt -> { - SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); + SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); - // recompute the weight with the rtp - uiModel.computeRowWeightWithRtp(row); + // recompute the weight with the rtp + uiModel.computeRowWeightWithRtp(row); - Float oldValue = (Float) evt.getOldValue(); - if (oldValue != null) { + Float oldValue = (Float) evt.getOldValue(); + if (oldValue != null) { - modelCache.removeLengthStep(oldValue); - lengthStepWasRemoved(oldValue); -// removeLengthStepFromSeries(frequenciesSeries, oldValue); -// removeLengthStepFromSeries(averageWeightsSeries, oldValue); + modelCache.removeLengthStep(oldValue); + lengthStepWasRemoved(oldValue); - } - - Float newValue = (Float) evt.getNewValue(); - if (newValue != null) { + } - modelCache.addLengthStep(row); + Float newValue = (Float) evt.getNewValue(); + if (newValue != null) { - lengthStepOrNumberWasUpdated(row); -// if (row.withNumber()) { -// -// frequenciesSeries.addOrUpdate(newValue, row.getNumber()); -// Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); -// averageWeightsSeries.addOrUpdate(newValue, weight); -// -// } + modelCache.addLengthStep(row); + lengthStepOrNumberWasUpdated(row); - } + } - uiModel.recomputeCanEditLengthStep(); - uiModel.recomputeRowsValidateState(); - uiModel.updateEmptyRow(row); + uiModel.recomputeCanEditLengthStep(); + uiModel.recomputeRowsValidateState(); + uiModel.updateEmptyRow(row); - // Can recompute total number and weight only after valid flag change - uiModel.recomputeTotalNumberAndWeight(); + // Can recompute total number and weight only after valid flag change + uiModel.recomputeTotalNumberAndWeight(); - fireTableDataChanged(); + fireTableDataChanged(); - } }; } return onLengthStepChangedListener; @@ -309,47 +298,39 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp private PropertyChangeListener getOnNumberChangedListener() { if (onNumberChangedListener == null) { - onNumberChangedListener = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - - SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); + onNumberChangedListener = evt -> { - // recompute the weight with the rtp - uiModel.computeRowWeightWithRtp(row); + SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); - Float lengthStep = row.getLengthStep(); + // recompute the weight with the rtp + uiModel.computeRowWeightWithRtp(row); - if (lengthStep != null) { + Float lengthStep = row.getLengthStep(); - if (!row.withNumber()) { + if (lengthStep != null) { - // remove the value for the lengthStep - lengthStepWasRemoved(lengthStep); -// removeLengthStepFromSeries(frequenciesSeries, lengthStep); -// removeLengthStepFromSeries(averageWeightsSeries, lengthStep); + if (!row.withNumber()) { - } else { + // remove the value for the lengthStep + lengthStepWasRemoved(lengthStep); - lengthStepOrNumberWasUpdated(row); -// frequenciesSeries.addOrUpdate(lengthStep, row.getNumber()); -// Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); -// averageWeightsSeries.addOrUpdate(lengthStep, weight); + } else { - } + lengthStepOrNumberWasUpdated(row); } - uiModel.recomputeCanEditLengthStep(); - uiModel.recomputeRowValidState(row); - uiModel.updateEmptyRow(row); + } + + uiModel.recomputeCanEditLengthStep(); + uiModel.recomputeRowValidState(row); + uiModel.updateEmptyRow(row); - // Can recompute total number and weight only after valid flag change - uiModel.recomputeTotalNumberAndWeight(); + // Can recompute total number and weight only after valid flag change + uiModel.recomputeTotalNumberAndWeight(); - fireTableDataChanged(); + fireTableDataChanged(); - } }; } return onNumberChangedListener; @@ -357,55 +338,39 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp private PropertyChangeListener getOnWeightChangedListener() { if (onWeightChangedListener == null) { - onWeightChangedListener = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { + onWeightChangedListener = evt -> { - SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); - modelCache.updateRowWithWeight(row); + SpeciesFrequencyRowModel row = (SpeciesFrequencyRowModel) evt.getSource(); + modelCache.updateRowWithWeight(row); - Float lengthStep = row.getLengthStep(); + Float lengthStep = row.getLengthStep(); - if (lengthStep != null) { + if (lengthStep != null) { - if (!row.withWeight()) { + if (!row.withWeight()) { - // remove the value for the lengthStep - uiModel.getAverageWeightsHistogramModel().removeValue(lengthStep); -// removeLengthStepFromSeries(averageWeightsSeries, lengthStep); + // remove the value for the lengthStep + uiModel.getAverageWeightsHistogramModel().removeValue(lengthStep); - } else { + } else { - uiModel.getAverageWeightsHistogramModel().addOrUpdate(row); -// Float weight = Weights.convert(weightUnit, individualObservationWeightUnit, row.computeAverageWeight()); -// averageWeightsSeries.addOrUpdate(lengthStep, weight); - - } + uiModel.getAverageWeightsHistogramModel().addOrUpdate(row); } - uiModel.recomputeRowsValidateState(); - uiModel.updateEmptyRow(row); + } + + uiModel.recomputeRowsValidateState(); + uiModel.updateEmptyRow(row); - // Can recompute total number and weight only after valid flag change - uiModel.recomputeTotalNumberAndWeight(); + // Can recompute total number and weight only after valid flag change + uiModel.recomputeTotalNumberAndWeight(); - } }; } return onWeightChangedListener; } -// private void removeLengthStepFromSeries(XYSeries series, Float lengthStep) { -// if (series.indexOf(lengthStep) >= 0) { -// if (series.getItemCount() > 1) { -// series.remove(lengthStep); -// } else { -// series.clear(); -// } -// } -// } - private void dettachListeners(SpeciesFrequencyRowModel result) { result.removePropertyChangeListener(SpeciesFrequencyRowModel.PROPERTY_LENGTH_STEP, getOnLengthStepChangedListener()); @@ -428,7 +393,7 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp int rowIndex = getRowIndex(row); removeRow(rowIndex); - uiModel.getRowCache().remove(row.getLengthStep()); + modelCache.getRowCache().remove(row.getLengthStep()); } @@ -437,7 +402,7 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp // obtenir la classe de taille (en fonction de la précision de la méthode de mensuration) float realLengthStep = uiModel.getLengthStep(lengthstep); - Map<Float, SpeciesFrequencyRowModel> rowCache = uiModel.getRowCache(); + Map<Float, SpeciesFrequencyRowModel> rowCache = modelCache.getRowCache(); SpeciesFrequencyRowModel row = rowCache.get(realLengthStep); @@ -447,7 +412,7 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp rowCache.put(realLengthStep, row); // get new index - List<Float> steps = Lists.newArrayList(rowCache.keySet()); + List<Float> steps = new ArrayList<>(rowCache.keySet()); steps.add(realLengthStep); Collections.sort(steps); @@ -464,19 +429,13 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp // obtenir la classe de taille (en fonction de la précision de la méthode de mensuration) float realLengthStep = uiModel.getLengthStep(lengthstep); - Map<Float, SpeciesFrequencyRowModel> rowCache = uiModel.getRowCache(); + Map<Float, SpeciesFrequencyRowModel> rowCache = modelCache.getRowCache(); SpeciesFrequencyRowModel row = rowCache.get(realLengthStep); return Optional.ofNullable(row); } - public void incrementFrequencyRowsNumbers(IndividualObservationBatchRowModel row) { - if (row.withSize()) { - incrementFrequencyRowsNumbers(row.getSize()); - } - } - public void incrementFrequencyRowsNumbers(float lengthStepToIncrement) { if (log.isInfoEnabled()) { @@ -490,12 +449,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } - public void decrementFrequencyRowsNumbers(IndividualObservationBatchRowModel row) { - if (row.withSize()) { - decrementFrequencyRowsNumbers(row.getSize()); - } - } - public void decrementFrequencyRowsNumbers(float lengthStepToDecrement) { if (log.isInfoEnabled()) { @@ -526,6 +479,10 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } + public Float convertWeightFromIndividualObservation(float weight) { + return Weights.convert(uiModel.getIndividualObservationWeightUnit(), weightUnit, weight); + } + public void addWeightToFrequencyRow(float lengthStep, float weight) { if (log.isInfoEnabled()) { @@ -536,8 +493,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp SpeciesFrequencyRowModel row = getOrCreateRowForLengthStep(lengthStep); - // conversion de poids - weight = Weights.convert(uiModel.getIndividualObservationWeightUnit(), weightUnit, weight); row.addToWeight(weight); updateRow(row); @@ -558,9 +513,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp SpeciesFrequencyRowModel row = optionalRow.get(); - //FIXME on n'en sait rien que c'est ce type de poids. - // conversion de poids - weight = Weights.convert(uiModel.getIndividualObservationWeightUnit(), weightUnit, weight); row.removeFromWeight(weight); updateRow(row); @@ -594,6 +546,72 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } + public SpeciesFrequencyRowModel addRafaleRow(float lengthStep) { + + Map<Float, SpeciesFrequencyRowModel> rowsByStep = uiModel.getCache().getRowCache(); + + SpeciesFrequencyRowModel row = rowsByStep.get(lengthStep); + + int rowIndex; + + if (row != null) { + + // increments current row + Integer number = row.getNumber(); + row.setNumber((number == null ? 0 : number) + 1); + updateRow(row); + + } else { + + // create a new row + + row = createNewRow(); + row.setLengthStep(lengthStep); + row.setNumber(1); + row.setValid(uiModel.isRowValid(row)); + + // get new index + List<Float> steps = new ArrayList<>(rowsByStep.keySet()); + steps.add(lengthStep); + + Collections.sort(steps); + + rowIndex = steps.indexOf(lengthStep); + + addNewRow(rowIndex, row); + } + + return row; + + } + + public void generateRows() { + + Float minStep = uiModel.getLengthStep(uiModel.getMinStep()); + Float maxStep = uiModel.getLengthStep(uiModel.getMaxStep()); + Caracteristic lengthStepCaracteristic = uiModel.getLengthStepCaracteristic(); + + Map<Float, SpeciesFrequencyRowModel> rowsByStep = modelCache.getRowCache(); + Set<Float> existingKeys = new HashSet<>(rowsByStep.keySet()); + List<SpeciesFrequencyRowModel> rows = new ArrayList<>(rowsByStep.values()); + + for (float i = minStep, step = uiModel.getStep(); i <= maxStep; i = Numbers.getRoundedLengthStep(i + step, true)) { + + if (!existingKeys.contains(i)) { + + // add it + SpeciesFrequencyRowModel newRow = createNewRow(); + newRow.setLengthStep(i); + newRow.setLengthStepCaracteristic(lengthStepCaracteristic); + rows.add(newRow); + } + } + Collections.sort(rows); + uiModel.setRows(rows); + + } + + private void lengthStepWasRemoved(Float lengthStep) { uiModel.getAverageWeightsHistogramModel().removeValue(lengthStep); @@ -601,7 +619,6 @@ public class SpeciesFrequencyTableModel extends AbstractApplicationTableModel<Sp } - private void lengthStepOrNumberWasUpdated(SpeciesFrequencyRowModel row) { if (row.withNumber()) { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index b4929b2..acdcae7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -117,16 +117,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci private Map<String, Caracteristic> lengthStepCaracteristics; -// private Map<String, Caracteristic> maturityCaracteristics; - -// private JFreeChart frequenciesChart; - -// private JFreeChart averageWeightsChart; - -// protected final JFrame frequenciesHistogramPopup = new JFrame(); - -// protected final JFrame averageWeightsHistogramPopup = new JFrame(); - /** * Weight unit. * @@ -139,18 +129,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci */ protected final FeedReaderListener feedReaderListener; -// protected IndividualObservationUICache individualObservationUICache; - protected ApplySpeciesFrequencyRafaleAction applySpeciesFrequencyRafaleAction; -// /** -// * Added on each individual observation row in the dedicated table. -// * Notify each time a modification is done on a such row. -// */ -// protected PropertyChangeListener individualObservationRowChangedListener; - -// protected CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId; - protected SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; protected IndividualObservationBatchTableHandler individualObservationBatchTableHandler; @@ -185,162 +165,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } }; -// // When any change on any individual observation -// this.individualObservationRowChangedListener = new PropertyChangeListener() { -// -// @Override -// public void propertyChange(PropertyChangeEvent evt) { -// -// IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); -// String propertyName = evt.getPropertyName(); -// -// SpeciesFrequencyUIModel model = getModel(); -// -// CaracteristicQualitativeValue gender = model.getGender(row); -// CaracteristicQualitativeValue maturity = model.getMaturityValue(row); -// -// switch (propertyName) { -// case IndividualObservationBatchRowModel.PROPERTY_SIZE: { -// -// Float oldValue = (Float) evt.getOldValue(); -// Float newValue = (Float) evt.getNewValue(); -// -// if (oldValue != null) { -// individualObservationUICache.decrementsObservationNb(gender, maturity, oldValue, row.getSamplingCode()); -// } -// if (newValue != null) { -// individualObservationUICache.incrementsObservationNb(gender, maturity, newValue, row.getSamplingCode()); -// } -// -// // we only update the frequencies if the row is valid -// if (row.isValid() && model.mustCopyIndividualObservationSize()) { -// -// if (oldValue != null) { -// getTableModel().decrementFrequencyRowsNumbers(oldValue); -// } -// if (newValue != null) { -// getTableModel().incrementFrequencyRowsNumbers(newValue); -// } -// -// if (model.isCopyIndividualObservationAll() && row.withWeight()) { -// float weight = row.getWeight(); -// if (oldValue != null) { -// getTableModel().removeWeightToFrequencyRow(oldValue, weight); -// } -// if (newValue != null) { -// getTableModel().addWeightToFrequencyRow(newValue, weight); -// } -// } -// } -// } -// break; -// -// case IndividualObservationBatchRowModel.PROPERTY_WEIGHT: -// if (row.isValid() && model.isCopyIndividualObservationAll()) { -// -// Float oldValue = (Float) evt.getOldValue(); -// Float newValue = (Float) evt.getNewValue(); -// Float weightToAdd; -// -// if (oldValue == null) { -// weightToAdd = newValue; -// -// } else if (newValue == null) { -// weightToAdd = -oldValue; -// -// } else { -// weightToAdd = newValue - oldValue; -// } -// -// if (weightUnit.isNotNullNorZero(weightToAdd)) { -// if (weightUnit.isGreaterThanZero(weightToAdd)) { -// getTableModel().addWeightToFrequencyRow(row, weightToAdd); -// } else { -// getTableModel().removeWeightToFrequencyRow(row, -weightToAdd); -// } -// } -// } -// break; -// -// case IndividualObservationBatchRowModel.PROPERTY_DEFAULT_CARACTERISTICS: -// case IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS: -// if (row.withSize()) { -// CaracteristicMap oldValue = (CaracteristicMap) evt.getOldValue(); -// CaracteristicMap newValue = (CaracteristicMap) evt.getNewValue(); -// -// if (log.isInfoEnabled()) { -// log.info("caracteristics changed"); -// } -// -// if (model.withMaturityCaracteristic()) { -// CaracteristicQualitativeValue oldMaturity = model.getMaturityValue(oldValue); -// CaracteristicQualitativeValue newMaturity = model.getMaturityValue(newValue); -// if (log.isInfoEnabled()) { -// log.info("maturities : " + oldMaturity + " " + newMaturity); -// } -// if (!Objects.equals(oldMaturity, newMaturity)) { -// individualObservationUICache.decrementsObservationNb(gender, oldMaturity, row.getSize()); -// individualObservationUICache.incrementsObservationNb(gender, newMaturity, row.getSize(), row.getSamplingCode()); -// } -// } -// -// CaracteristicQualitativeValue oldGender = model.getGender(oldValue); -// CaracteristicQualitativeValue newGender = model.getGender(newValue); -// if (!Objects.equals(oldGender, newGender)) { -// individualObservationUICache.decrementsObservationNb(oldGender, maturity, row.getSize()); -// individualObservationUICache.incrementsObservationNb(newGender, maturity, row.getSize(), row.getSamplingCode()); -// } -// } -// break; -// -// case IndividualObservationBatchRowModel.PROPERTY_SAMPLING_CODE: -// if (row.withSize()) { -// -// float size = row.getSize(); -// -// String oldValue = (String) evt.getOldValue(); -// String newValue = (String) evt.getNewValue(); -// -// if (StringUtils.isNotBlank(oldValue)) { -// individualObservationUICache.decrementsSamplingNb(gender, maturity, size, oldValue); -// } -// if (StringUtils.isNotBlank(newValue)) { -// individualObservationUICache.incrementsSamplingNb(gender, maturity, size, newValue); -// } -// } -// break; -// -// case IndividualObservationBatchRowModel.PROPERTY_VALID: -// // if the row's valid state changes, then remove or readd it to the frequencies -// if (!model.isRowComputationInProgress()) { -// boolean oldValue = (boolean) evt.getOldValue(); -// boolean newValue = (boolean) evt.getNewValue(); -// -// if (oldValue && model.mustCopyIndividualObservationSize()) { -// -// getTableModel().decrementFrequencyRowsNumbers(row); -// } -// if (newValue) { -// if (model.mustCopyIndividualObservationSize()) { -// getTableModel().incrementFrequencyRowsNumbers(row); -// } -// if (model.isCopyIndividualObservationAll() && row.withWeight()) { -// getTableModel().addWeightToFrequencyRow(row, row.getWeight()); -// } -// } -// } -// break; -// } -// -// model.recomputeIndividualObservationRowValidState(row); -// model.recomputeCanEditLengthStep(); -// -// model.setModify(true); -// -// } -// -// }; - } //------------------------------------------------------------------------// @@ -488,7 +312,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SwingUtilities.invokeLater(this::updateLogVisibility); }); -// this.individualObservationUICache = new IndividualObservationUICache(getDataContext().getOptionalCruiseSamplingCache().orElse(null), model); } @Override @@ -502,10 +325,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci this.lengthStepCaracteristics = TuttiEntities.splitById(lengthStepCaracteristics); -// List<Caracteristic> maturityCaracteristics = new ArrayList<>(getDataContext().getMaturityCaracteristics()); -// -// this.maturityCaracteristics = TuttiEntities.splitById(maturityCaracteristics); - SpeciesFrequencyUIModel model = getModel(); taxonCache = TaxonCaches.createSpeciesCacheWithoutVernacularCode(getPersistenceService(), getDataContext().getProtocol()); @@ -545,10 +364,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // get step from the pmfm float step1 = getStep(newValue); model.setStep(step1); -// model.setDataSetIntervalWidth(step1); - -// frequenciesChart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step1 == 1f)); -// averageWeightsChart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step1 == 1f)); if (CollectionUtils.isNotEmpty(getModel().getRows())) { for (SpeciesFrequencyRowModel rowModel : getModel().getRows()) { @@ -589,8 +404,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci column.setHeaderValue(Units.getLabelWithUnit(t("tutti.editIndividualObservationBatch.table.header.size"), unit)); column.setToolTipText(Units.getLabelWithUnit(t("tutti.editIndividualObservationBatch.table.header.size"), unit)); -// frequenciesChart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); -// averageWeightsChart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit); }); // when configuration mode change, let's focus the best component (see http://forge.codelutin.com/issues/4035) @@ -642,127 +455,21 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci getTableModel().fireTableDataChanged(); }); -// model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_INDIVIDUAL_OBSERVATION_ROWS, evt -> { -// getObsTableModel().setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue()); -// }); -// -// // Pour bloquer le changement du mode de recopie des observations individuelles → mensurations -// model.addVetoableChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { -// -// SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); -// CopyIndividualObservationMode oldCopyMode = (CopyIndividualObservationMode) evt.getOldValue(); -// CopyIndividualObservationMode newCopyMode = (CopyIndividualObservationMode) evt.getNewValue(); -// -// if (source.isInitBatchEdition()) { -// -// if (log.isInfoEnabled()) { -// log.info("Skip ask user to confirm copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); -// } -// return; -// } -// -// // le seul mode où l'utilisateur ne peut rien saisir est le mode tout -// if (CopyIndividualObservationMode.ALL != oldCopyMode) { -// -// long rowsWithUserData; -// -// // si on etait en mode taille et que l'utilisateur avait saisi des tailles -// if (oldCopyMode == CopyIndividualObservationMode.SIZE) { -// rowsWithUserData = model.getRows().stream() -// .filter(SpeciesFrequencyRowModel::withWeight) -// .count(); -// -// } else { -// rowsWithUserData = model.getRows().stream() -// .filter(row -> row.getLengthStep() != null || row.withNumber() || row.withWeight()) -// .count(); -// } -// -// if (rowsWithUserData > 0) { -// -// String htmlMessage = String.format( -// CONFIRMATION_FORMAT, -// t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.message"), -// t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.help")); -// int i = JOptionPane.showConfirmDialog( -// getTopestUI(), -// htmlMessage, -// t("tutti.editSpeciesFrequencies.changeCopyMode.confirm.title"), -// JOptionPane.OK_CANCEL_OPTION, -// JOptionPane.QUESTION_MESSAGE); -// -// if (i == JOptionPane.CANCEL_OPTION) { -// throw new PropertyVetoException("The user does not want to erase his data.", evt); -// } -// } -// } -// }); -// -// // Pour mettre à jour les mensuratuibs suite au changement du mode de recopie des observations individuelles -// model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { -// -// SpeciesFrequencyUIModel source = (SpeciesFrequencyUIModel) evt.getSource(); -// CopyIndividualObservationMode oldCopyMode = (CopyIndividualObservationMode) evt.getOldValue(); -// CopyIndividualObservationMode newCopyMode = (CopyIndividualObservationMode) evt.getNewValue(); -// -// if (newCopyMode == null) { -// -// return; -// } -// boolean nothingCopyMode = CopyIndividualObservationMode.NOTHING == newCopyMode; -// -// -// if (!nothingCopyMode) { -// -// source.setFrequenciesConfigurationMode(FrequencyConfigurationMode.RAFALE); -// source.setAddIndividualObservationOnRafale(true); -// -// } -// -// -// // si on est en initialisation, ca ne sert à rien de regénérer les lignes, elles sont sensées être chargées -// if (source.isInitBatchEdition()) { -// -// if (log.isInfoEnabled()) { -// log.info("Skip recompute frequencies from indivudal observations (flag initBatchEdition is on), copyIndividualObservationMode changed from " + oldCopyMode + " to " + newCopyMode); -// } -// return; -// } -// -// model.setRowComputationInProgress(true); -// -// try { -// -// model.getRows().clear(); -// model.getRowsInError().clear(); -// model.reloadRows(); -// model.recomputeIndividualObservationRowsValidateState(); -// reloadRowsFromIndividualObservations(); -// -// } finally { -// model.setRowComputationInProgress(false); -// } -// -// getTableModel().fireTableDataChanged(); -// getObsTableModel().fireTableDataChanged(); -// -// }); + // si le tableau des observations est en erreur, on recalcule si il existe une ligne non vide en erreur + model.getIndividualObservationModel().addPropertyChangeListener(IndividualObservationBatchUIModel.PROPERTY_ROWS_IN_ERROR, evt -> { + IndividualObservationBatchUIModel source = (IndividualObservationBatchUIModel) evt.getSource(); + if (source.getRows() != null) { + boolean nonEmptyRow = source.isNonEmptyRowInError(); + model.setNonEmptyIndividualObservationRowsInError(nonEmptyRow); + } + }); // set the pattern to the weight in simple counting mode according to the weight unit ui.getSimpleCountingWeightField().setNumberPattern(weightUnit.getNumberEditorPattern()); - // init histogram - -// initFrequenciesHistogram(); - - // init data table - initDataTable(); -// initAverageWeightsHistogram(); - - // init log table initLogTable(); this.individualObservationBatchTableHandler = new IndividualObservationBatchTableHandler(ui); @@ -773,14 +480,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } -// protected IndividualObservationBatchTableModel getObsTableModel() { -// return (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); -// } - -// public void showAverageWeightsHistogram() { -// averageWeightsHistogramPopup.setVisible(true); -// } - @Override protected JComponent getComponentToFocus() { FrequencyConfigurationMode configurationMode = getModel().getConfigurationMode(); @@ -801,9 +500,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.setCanDisplayNotifications(false); -// frequenciesHistogramPopup.dispose(); -// averageWeightsHistogramPopup.dispose(); - IOUtils.closeQuietly(individualObservationBatchTableHandler); IOUtils.closeQuietly(averageWeightsHistogramHandler); IOUtils.closeQuietly(frequenciesHistogramHandler); @@ -880,7 +576,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (speciesProtocol != null) { - CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(getModel().getSexCaracteristic().getIdAsInt()); + Caracteristic sexCaracteristic = model.getIndividualObservationModel().getSexCaracteristic(); + CaracteristicQualitativeValue sampleCategoryValue = (CaracteristicQualitativeValue) speciesBatch.getSampleCategoryValue(sexCaracteristic.getIdAsInt()); if (sampleCategoryValue != null) { @@ -944,7 +641,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci individualObservationBatchTableHandler.initObservationsCache(frequencyEditor.getEditRow(), getDataContext().getFishingOperation()); -// individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getIndividualObservationRows()); +// individualObservationUICache.init(ui, frequencyEditor.getEditRow(), getDataContext().getFishingOperation(), model.getRows()); if (getContext().isIchtyometerConnected()) { @@ -1098,82 +795,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } -// protected void initFrequenciesHistogram() { -// frequenciesChart = ChartFactory.createXYBarChart(null, -// t("tutti.editSpeciesFrequencies.table.header.lengthStep"), -// false, -// t("tutti.editSpeciesFrequencies.table.header.number"), -// getModel().frequenciesDataset); -// frequenciesChart.clearSubtitles(); -// -// ValueAxis rangeAxis = frequenciesChart.getXYPlot().getRangeAxis(); -// rangeAxis.setAutoRange(true); -// rangeAxis.setStandardTickUnits(new NumberTickUnitSource(true)); -// -// ValueAxis domainAxis = frequenciesChart.getXYPlot().getDomainAxis(); -// domainAxis.setAutoRange(true); -// domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); -// domainAxis.setMinorTickMarksVisible(true); -// -// frequenciesChart.getXYPlot().getRenderer().setSeriesPaint(0, getConfig().getColorComputedWeights()); -// -// final ChartPanel chartPanel = new ChartPanel(frequenciesChart); -// chartPanel.setDomainZoomable(false); -// chartPanel.setMouseZoomable(false); -// chartPanel.setPopupMenu(null); -// -// JPanel histogramPanel = ui.getHistogramPanel(); -// histogramPanel.add(chartPanel, BorderLayout.CENTER); -// -// chartPanel.addMouseListener(new MouseAdapter() { -// -// @Override -// public void mouseClicked(MouseEvent e) { -// super.mouseClicked(e); -// if (e.getClickCount() > 1) { -// -// frequenciesHistogramPopup.getContentPane().removeAll(); -// ChartPanel chartPanel = new ChartPanel(frequenciesChart); -// frequenciesHistogramPopup.getContentPane().add(chartPanel); -// frequenciesHistogramPopup.pack(); -// frequenciesHistogramPopup.setVisible(true); -// -// } -// } -// }); -// } - -// protected void initAverageWeightsHistogram() { -// averageWeightsChart = ChartFactory.createXYLineChart(null, -// t("tutti.editSpeciesFrequencies.table.header.lengthStep"), -// getConfig().getIndividualObservationWeightUnit() -// .decorateLabel(t("tutti.editSpeciesFrequencies.averageWeight.label")), -// getModel().averageWeightsDataset); -// averageWeightsChart.clearSubtitles(); -// -// ValueAxis rangeAxis = averageWeightsChart.getXYPlot().getRangeAxis(); -// rangeAxis.setAutoRange(true); -// rangeAxis.setStandardTickUnits(new NumberTickUnitSource()); -// rangeAxis.setMinorTickMarksVisible(true); -// -// ValueAxis domainAxis = averageWeightsChart.getXYPlot().getDomainAxis(); -// domainAxis.setAutoRange(true); -// domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true)); -// domainAxis.setMinorTickMarksVisible(true); -// -// XYLineAndShapeRenderer plotRenderer = (XYLineAndShapeRenderer) averageWeightsChart.getXYPlot().getRenderer(); -// plotRenderer.setSeriesPaint(0, getConfig().getColorComputedWeights()); -// plotRenderer.setBaseShapesVisible(true); -// -// final ChartPanel chartPanel = new ChartPanel(averageWeightsChart); -// chartPanel.setDomainZoomable(false); -// chartPanel.setMouseZoomable(false); -// chartPanel.setPopupMenu(null); -// -// averageWeightsHistogramPopup.getContentPane().add(chartPanel); -// averageWeightsHistogramPopup.pack(); -// } - protected void initLogTable() { JXTable logTable = ui.getLogsTable(); @@ -1202,186 +823,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci logTable.addHighlighter(evenHighlighter); } -// protected void initObsTable() { -// -// JXTable obsTable = ui.getObsTable(); -// -// // can show / hide some columns in model -// obsTable.setColumnControlVisible(true); -// -// // create obsTable column model -// DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); -// Decorator<Caracteristic> caracteristicDecorator = -// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); -// Decorator<Caracteristic> caracteristicTipDecorator = -// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); -// -// Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = -// getDecorator(CaracteristicQualitativeValue.class, null); -// -// { -// // Rank column -// -// addIntegerColumnToModel(columnModel, -// IndividualObservationBatchTableModel.RANK, -// TuttiUI.INT_10_DIGITS_PATTERN, -// obsTable); -// -// } -// -// { // Size column -// -// addFloatColumnToModel(columnModel, -// IndividualObservationBatchTableModel.SIZE, -// TuttiUI.DECIMAL3_PATTERN, -// obsTable); -// } -// -// WeightUnit individualObservationWeightUnit = getConfig().getIndividualObservationWeightUnit(); -// -// { // Weight column -// -// addFloatColumnToModel(columnModel, -// IndividualObservationBatchTableModel.WEIGHT, -// individualObservationWeightUnit, -// obsTable); -// } -// -// List<Caracteristic> defaultCaracteristic = getModel().getDefaultCaracteristic(); -// -// for (Caracteristic caracteristic : defaultCaracteristic) { -// addCaracteristicColumnToModel(obsTable, -// columnModel, -// caracteristicDecorator, -// caracteristicTipDecorator, -// caracteristicQualitativeDecorator, -// caracteristic); -// } -// -// { // Other caracteristics column -// -// Set<Caracteristic> caracteristicsToSkip = Collections.unmodifiableSet( -// Sets.newHashSet(getModel().getDefaultCaracteristic())); -// -// addColumnToModel(columnModel, -// CaracteristicMapCellComponent.newEditor(ui, caracteristicsToSkip), -// CaracteristicMapCellComponent.newRender(getContext()), -// IndividualObservationBatchTableModel.OTHER_CARACTERISTICS); -// -// } -// -// { -// // Smapling code column -// -// addColumnToModel(columnModel, -// SamplingCodeCellEditor.newEditor(ui), -// SamplingCodeCellRenderer.newRender(), -// IndividualObservationBatchTableModel.SAMPLING_CODE); -// -// } -// -// { // Comment column -// -// addColumnToModel(columnModel, -// CommentCellEditor.newEditor(ui), -// CommentCellRenderer.newRender(), -// IndividualObservationBatchTableModel.COMMENT); -// -// } -// -// { // File column -// -// addColumnToModel(columnModel, -// AttachmentCellEditor.newEditor(ui), -// AttachmentCellRenderer.newRender(getDecorator(Attachment.class, null)), -// IndividualObservationBatchTableModel.ATTACHMENT); -// } -// -// // create obsTable model -// IndividualObservationBatchTableModel tableModel = -// new IndividualObservationBatchTableModel(individualObservationWeightUnit, -// getModel(), -//// defaultCaracteristic, -//// getModel().getSexCaracteristic(), -// columnModel); -// -// obsTable.setModel(tableModel); -// obsTable.setColumnModel(columnModel); -// -// initTable(obsTable); -// Color cellWithValueColor = getConfig().getColorCellWithValue(); -// -// Highlighter commentHighlighter = TuttiUIUtil.newBackgroundColorHighlighter( -// new HighlightPredicate.AndHighlightPredicate( -// new HighlightPredicate.IdentifierHighlightPredicate(IndividualObservationBatchTableModel.COMMENT), -// // for not null value -// (renderer, adapter) -> { -// String value = (String) adapter.getValue(); -// return StringUtils.isNotBlank(value); -// }), cellWithValueColor); -// obsTable.addHighlighter(commentHighlighter); -// -// installTableKeyListener(columnModel, obsTable, false); -// -// tableModel.addTableModelListener(e -> { -// -// int firstRow = e.getFirstRow(); -// int lastRow = e.getLastRow(); -// -// switch (e.getType()) { -// case TableModelEvent.DELETE: -// if (tableModel.getRowCount() == 0) { -// tableModel.addNewRow(); -// -// } else { -// tableModel.recomputeRankOrders(firstRow); -// } -// break; -// -// case TableModelEvent.INSERT: -// for (int i = firstRow; i <= lastRow; i++) { -// IndividualObservationBatchRowModel newRow = tableModel.getRows().get(i); -// newRow.addPropertyChangeListener(obsChangedListener); -// -// if (getModel().mustCopyIndividualObservationSize()) { -// -// getTableModel().incrementFrequencyRowsNumbers(newRow); -// -// } -// -// getModel().recomputeIndividualObservationRowValidState(newRow); -// } -// break; -// -// case TableModelEvent.UPDATE: -// if (tableModel.getRowCount() == 0) { -// tableModel.addNewRow(); -// } -// } -// -// getModel().recomputeCanEditLengthStep(); -// }); -// -// obsTable.getSelectionModel().addListSelectionListener(e -> { -// -// if (!getModel().isInRafaleRowCreation()) { -// resetSamplingLabel(); -// } -// -// IndividualObservationBatchRowModel selectedRow = null; -// -// if (!obsTable.getSelectionModel().isSelectionEmpty()) { -// if (obsTable.getSelectedRowCount() == 1) { -// selectedRow = getObsTableModel().getEntry(obsTable.getSelectedRow()); -// -// } -// } -// -// individualObservationUICache.updateSelectedRow(selectedRow); -// }); -// } -// - public void resetSamplingLabel() { if (log.isDebugEnabled()) { log.debug("reset smapling panel"); @@ -1389,61 +830,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci ui.getSamplingWarningLabel().setVisible(false); } -// public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { -// getModel().setMaturityCaracteristic(maturityCaracteristic); -//// getObsTableModel().setMaturityCaracteristic(maturityCaracteristic); -// if (maturityCaracteristic != null) { -// individualObservationBatchTableHandler.addMaturityCaracteristicColumnToModel(maturityCaracteristic); -// } -// } - -// protected void addMaturityCaracteristicColumnToModel(Caracteristic caracteristic) { -// -// Decorator<Caracteristic> caracteristicDecorator = -// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); -// Decorator<Caracteristic> caracteristicTipDecorator = -// getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); -// -// Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = -// getDecorator(CaracteristicQualitativeValue.class, null); -// -// // remove the row sorter while we add the new column -// JXTable obsTable = ui.getObsTable(); -// obsTable.setRowSorter(null); -// obsTable.setAutoCreateRowSorter(false); -// -// TableColumnModelExt columnModel = (TableColumnModelExt) obsTable.getColumnModel(); -// -// maturityColumnId = addCaracteristicColumnToModel(obsTable, -// columnModel, -// caracteristicDecorator, -// caracteristicTipDecorator, -// caracteristicQualitativeDecorator, -// caracteristic); -// -// Objects.requireNonNull(maturityColumnId); -// -// getObsTableModel().addMaturityIdentifier(maturityColumnId); -// -// // on cherche le bon index où insérer la colonne maturité (avant les autres caractéristiques, mais elle peut etre cachee) -// int modelIndex = columnModel.getColumnExt(IndividualObservationBatchTableModel.OTHER_CARACTERISTICS).getModelIndex(); -// int indexToMove = obsTable.convertColumnIndexToView(modelIndex); -// -// // si la colonne autres caracteristiques est cachée, alors on cherche la première colonne suivante non cachée -// int columnCount = columnModel.getColumnCount(true); -// while (indexToMove == -1 && modelIndex < columnCount) { -// indexToMove = obsTable.convertColumnIndexToView(modelIndex); -// modelIndex++; -// } -// // si une colonne après celle des autres caractéristiques est visible, on déplace la maturité avant cette colonne -// // sinon, on laisse la maturité à la fin -// if (modelIndex != -1) { -// obsTable.moveColumn(columnModel.getColumnCount() - 1, indexToMove); -// } -// // reset the row sorter -// obsTable.setAutoCreateRowSorter(true); -// } - protected CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> addCaracteristicColumnToModel(JXTable table, TableColumnModelExt columnModel, Caracteristic caracteristic) { @@ -1618,10 +1004,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci ui.getLogsScrollPane().setVisible(logVisible); } -// protected String getLabelWithUnit(String label, String unit) { -// return label + " (" + unit + ")"; -// } - protected void reloadRowsFromIndividualObservations() { SpeciesFrequencyUIModel model = getModel(); CopyIndividualObservationMode copyMode = model.getCopyIndividualObservationMode(); @@ -1630,8 +1012,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci Caracteristic lengthStepCaracteristic = model.getLengthStepCaracteristic(); - List<IndividualObservationBatchRowModel> validObsRow = new ArrayList<>(model.getIndividualObservationRows()); - validObsRow.removeAll(model.getIndividualObservationRowsInError()); + List<IndividualObservationBatchRowModel> validObsRow = new ArrayList<>(model.getIndividualObservationModel().getRows()); + validObsRow.removeAll(model.getIndividualObservationModel().getRowsInError()); WeightUnit individualObservationWeightUnit = getConfig().getIndividualObservationWeightUnit(); @@ -1643,13 +1025,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (log.isInfoEnabled()) { log.info("size : " + size); } - SpeciesFrequencyRowModel row = model.getRowCache().get(size); + SpeciesFrequencyRowModel row = model.getCache().getRowCache().get(size); if (row == null) { row = getTableModel().createNewRow(false, true); row.setLengthStep(size); row.setLengthStepCaracteristic(lengthStepCaracteristic); model.getRows().add(row); - model.getRowCache().put(size, row); + model.getCache().getRowCache().put(size, row); } row.incNumber(); Float weight = obsRow.getWeight(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java index a8d9a58..9e4ef6f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java @@ -22,12 +22,10 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; * #L% */ -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.protocol.Rtp; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; @@ -39,15 +37,9 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; /** @@ -115,19 +107,10 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa public static final String PROPERTY_COPY_INDIVIDUAL_OBSERVATION_SIZE = "copyIndividualObservationSize"; - public static final String PROPERTY_INDIVIDUAL_OBSERVATION_ROWS = "individualObservationRows"; - - public static final String PROPERTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR = "individualObservationRowsInError"; - - public static final String PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR = "nonEmptyIndividualObservationRowsInError"; - public static final String PROPERTY_INIT_BATCH_EDITION = "initBatchEdition"; public static final String PROPERTY_CAN_DISPLAY_NOTIFICATIONS = "canDisplayNotifications"; - - public static final String PROPERTY_NOT_EDITABLE_CARACTERISTIC = "notEditableCaracteristic"; - - public static final String PROPERTY_MATURITY_CARACTERISTIC = "maturityCaracteristic"; + public static final String PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR = "nonEmptyIndividualObservationRowsInError"; private final SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; @@ -136,123 +119,123 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa * * @since 0.2 */ - protected FrequencyConfigurationMode configurationMode; + private FrequencyConfigurationMode configurationMode; /** * Fill mode. * * @since 4.5 */ - protected FrequencyConfigurationMode frequenciesConfigurationMode = FrequencyConfigurationMode.AUTO_GEN; + private FrequencyConfigurationMode frequenciesConfigurationMode; /** * Batch that contains frequencies. * * @since 0.2 */ - protected SpeciesBatchRowModel batch; + private SpeciesBatchRowModel batch; /** * Default step to addIndividualObservation length step. * * @since 0.2 */ - protected Float step; + private Float step; /** * Min step to auto generate length steps. * * @since 0.2 */ - protected Float minStep; + private Float minStep; /** * Max step to auto generate length steps. * * @since 0.2 */ - protected Float maxStep; + private Float maxStep; /** * Length step caracteristic. * * @since 0.3 */ - protected Caracteristic lengthStepCaracteristic; + private Caracteristic lengthStepCaracteristic; /** * Sum of the number of each valid row * * @since 2.3 */ - protected Integer totalNumber; + private Integer totalNumber; /** * Sum of the weight of each valid row, or sample weight * * @since 3.8 */ - protected ComputableData<Float> totalComputedOrNotWeight = new ComputableData<>(); + private ComputableData<Float> totalComputedOrNotWeight; /** * Rtp of the species batch * * @since 4.5 */ - protected Rtp rtp; + private Rtp rtp; /** * copy the weigths computed with the RTPs of the protocol * * @since 4.5 */ - protected boolean copyRtpWeights; + private boolean copyRtpWeights; /** * Add individual observation rows when a lengthstep is added with the rafale mode * * @since 4.5 */ - protected boolean addIndividualObservationOnRafale; + private boolean addIndividualObservationOnRafale; /** * Number in case of simple counting mode * * @since 1.0 */ - protected Integer simpleCount; + private Integer simpleCount; /** * The index of the next editable row (null if none). * * @since 2.5 */ - protected Integer nextEditableRowIndex; + private Integer nextEditableRowIndex; - protected Set<SpeciesFrequencyRowModel> emptyRows; + private Set<SpeciesFrequencyRowModel> emptyRows; /** * Sample categories model. * * @since 2.4 */ - protected final SampleCategoryModel sampleCategoryModel; + private final SampleCategoryModel sampleCategoryModel; /** * Weight unit. * * @since 2.5 */ - protected final WeightUnit weightUnit; + private final WeightUnit weightUnit; - protected final WeightUnit individualObservationWeightUnit; + private final WeightUnit individualObservationWeightUnit; /** * To store all caches used by the screen * * @since 3.11 */ - protected final SpeciesFrequencyUIModelCache cache = new SpeciesFrequencyUIModelCache(); + private final SpeciesFrequencyUIModelCache cache; /** * Can edit length step? (only if no row is filled). @@ -260,77 +243,35 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa * * @since 3.11 */ - protected boolean canEditLengthStep = true; + private boolean canEditLengthStep; /** * What to copy from the individual observations to the data table * * @since 4.5 */ - protected CopyIndividualObservationMode copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; - - /** - * Default caracteristics coming from protocol. - * - * @since 4.5 - */ - protected final List<Caracteristic> defaultCaracteristic; + private CopyIndividualObservationMode copyIndividualObservationMode; - /** - * Individual observations - * - * @since 4.5 - */ - protected List<IndividualObservationBatchRowModel> individualObservationRows; - - /** - * Individual observations in error - * - * @since 4.5 - */ - protected Set<IndividualObservationBatchRowModel> individualObservationRowsInError; - - protected boolean rowComputationInProgress; + private boolean rowComputationInProgress; /** * Is the model is loading? */ - protected boolean initBatchEdition; + private boolean initBatchEdition; /** * Can smapling notifications or summary be displayed? */ - protected boolean canDisplayNotifications; + private boolean canDisplayNotifications; /** * A row is being created in rafale. Do not remove the sampling warning in this state. */ - protected boolean inRafaleRowCreation; - - /** - * Caracteristiques non éditables, car caractéristiques de catégorisation du lot (sexe, maturité, etc) - * - * @since 4.5 - */ - protected Collection<Caracteristic> notEditableCaracteristic; + private boolean inRafaleRowCreation; - protected final Caracteristic sexCaracteristic; - - /** - * Caracteristique de maturité du protocole - */ - protected Caracteristic maturityCaracteristic; - - protected final AverageWeightsHistogramModel averageWeightsHistogramModel; - protected final FrequenciesHistogramModel frequenciesHistogramModel; - - protected final PropertyChangeListener rowInErrorChangedListener = new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - reloadNonEmptyIndividualObservationRowsInError(); - } - }; + private final AverageWeightsHistogramModel averageWeightsHistogramModel; + private final FrequenciesHistogramModel frequenciesHistogramModel; + private final IndividualObservationBatchUIModel individualObservationModel; public SpeciesFrequencyUIModel(SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport, WeightUnit individualObservationWeightUnit, @@ -342,16 +283,27 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa this.weightUnit = speciesOrBenthosBatchUISupport.getWeightUnit(); this.individualObservationWeightUnit = individualObservationWeightUnit; this.sampleCategoryModel = sampleCategoryModel; - this.sexCaracteristic = sexCaracteristic; + this.totalComputedOrNotWeight = new ComputableData<>(); this.totalComputedOrNotWeight.addPropagateListener(PROPERTY_TOTAL_WEIGHT, this); + this.copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; + this.canEditLengthStep = true; + this.cache = new SpeciesFrequencyUIModelCache(); + this.frequenciesConfigurationMode = FrequencyConfigurationMode.AUTO_GEN; setEmptyRows(new HashSet<>()); + this.individualObservationModel = new IndividualObservationBatchUIModel(sexCaracteristic, individualObservationWeightUnit, defaultCaracteristic); + +// JavaBeanObjectPropagateChangeListener.listenAndPropagate(individualObservationModel, +// this, +// IndividualObservationBatchUIModel.PROPERTY_NON_EMPTY_ROWS_IN_ERROR, +// "nonEmptyIndividualObservationRowsInError"); + this.averageWeightsHistogramModel = new AverageWeightsHistogramModel(weightUnit); this.frequenciesHistogramModel = new FrequenciesHistogramModel(); + } - this.defaultCaracteristic = defaultCaracteristic == null ? new ArrayList<>() : new ArrayList<>(defaultCaracteristic); - - setIndividualObservationRowsInError(new HashSet<>()); + public SpeciesFrequencyUIModelCache getCache() { + return cache; } public AverageWeightsHistogramModel getAverageWeightsHistogramModel() { @@ -403,7 +355,7 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa Float lengthStep = row.getLengthStep(); valid = lengthStep != null && lengthStep > 0 - && numberOfRows(lengthStep) < 2; + && cache.numberOfRows(lengthStep) < 2; } if (valid) { @@ -833,19 +785,8 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } } - if (individualObservationRows != null) { - for (IndividualObservationBatchRowModel row : individualObservationRows) { - - if (row.isEmpty(notEditableCaracteristic)) { - // la ligne est vide - continue; - } - - // une ligne non vide et complete a ete trouvee - // on ne peut plus editer - result = false; - break; - } + if (result) { + result = individualObservationModel.recomputeCanEditLengthStep(); } setCanEditLengthStep(result); @@ -877,86 +818,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa return rtp != null; } - public int numberOfRows(float lengthStep) { - return cache.numberOfRows(lengthStep); - } - - public Map<Float, SpeciesFrequencyRowModel> getRowCache() { - return cache.getRowCache(); - } - - public List<IndividualObservationBatchRowModel> getIndividualObservationRows() { - return individualObservationRows; - } - - public void setIndividualObservationRows(List<IndividualObservationBatchRowModel> individualObservationRows) { - Object oldValue = getIndividualObservationRows(); - this.individualObservationRows = individualObservationRows; - firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_ROWS, oldValue, individualObservationRows); - - individualObservationRowsInError.clear(); - for (IndividualObservationBatchRowModel row : individualObservationRows) { - if (!row.isValid()) { - individualObservationRowsInError.add(row); - } - } - setIndividualObservationRowsInError(individualObservationRowsInError); - } - - public Set<IndividualObservationBatchRowModel> getIndividualObservationRowsInError() { - return individualObservationRowsInError; - } - - public void setIndividualObservationRowsInError(Set<IndividualObservationBatchRowModel> individualObservationRowsInError) { - if (this.individualObservationRowsInError != null) { - this.individualObservationRowsInError.forEach(row -> row.removePropertyChangeListener(rowInErrorChangedListener)); - } - this.individualObservationRowsInError = individualObservationRowsInError; - if (this.individualObservationRowsInError != null) { - this.individualObservationRowsInError.forEach(row -> row.addPropertyChangeListener(rowInErrorChangedListener)); - } - reloadNonEmptyIndividualObservationRowsInError(); - } - - public void addIndividualObservationRowInError(IndividualObservationBatchRowModel row) { - boolean nonEmptyIndividualObservationInError = isNonEmptyIndividualObservationRowsInError(); - Object oldValue = new HashSet<>(individualObservationRowsInError); - individualObservationRowsInError.add(row); - row.addPropertyChangeListener(rowInErrorChangedListener); - firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, oldValue, individualObservationRowsInError); - setNonEmptyIndividualObservationRowsInError(nonEmptyIndividualObservationInError); - } - - public void removeIndividualObservationRowInError(IndividualObservationBatchRowModel row) { - boolean nonEmptyIndividualObservationInError = isNonEmptyIndividualObservationRowsInError(); - Object oldValue = new HashSet<>(individualObservationRowsInError); - individualObservationRowsInError.remove(row); - row.removePropertyChangeListener(rowInErrorChangedListener); - firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, oldValue, individualObservationRowsInError); - setNonEmptyIndividualObservationRowsInError(nonEmptyIndividualObservationInError); - } - - public boolean isNonEmptyIndividualObservationRowsInError() { - return individualObservationRowsInError != null - && individualObservationRowsInError.stream().anyMatch(row -> !row.isEmpty(notEditableCaracteristic)); - } - - public void setNonEmptyIndividualObservationRowsInError(boolean oldNonEmptyIndividualObservationInError) { - firePropertyChange(PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, - oldNonEmptyIndividualObservationInError, - isNonEmptyIndividualObservationRowsInError()); - } - - public void reloadNonEmptyIndividualObservationRowsInError() { - firePropertyChange(PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, - null, - isNonEmptyIndividualObservationRowsInError()); - } - - public boolean isNonEmptyIndividualObservationRow() { - return individualObservationRows.stream().anyMatch(row -> !row.isEmpty(notEditableCaracteristic)); - } - public void recomputeRowsValidateState() { if (log.isInfoEnabled()) { @@ -967,20 +828,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } - public void recomputeIndividualObservationRowsValidateState() { - - if (log.isInfoEnabled()) { - log.info("Revalidate all individual observation rows"); - } - - individualObservationRows.forEach(this::recomputeIndividualObservationRowValidState); - - } - - public List<Caracteristic> getDefaultCaracteristic() { - return defaultCaracteristic; - } - public boolean isRowComputationInProgress() { return rowComputationInProgress; } @@ -1007,68 +854,6 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa this.inRafaleRowCreation = inRafaleRowCreation; } - public Collection<Caracteristic> getNotEditableCaracteristic() { - return notEditableCaracteristic; - } - - public void setNotEditableCaracteristic(Collection<Caracteristic> notEditableCaracteristic) { - Object oldValue = getNotEditableCaracteristic(); - this.notEditableCaracteristic = notEditableCaracteristic; - firePropertyChange(PROPERTY_NOT_EDITABLE_CARACTERISTIC, oldValue, notEditableCaracteristic); - } - - public Caracteristic getSexCaracteristic() { - return sexCaracteristic; - } - - public CaracteristicQualitativeValue getGender(IndividualObservationBatchRowModel row) { - return row.getCaracteristicQualitativeValue(sexCaracteristic); - } - - public CaracteristicQualitativeValue getGender(CaracteristicMap caracteristicMap) { - return caracteristicMap.getQualitativeValue(sexCaracteristic); - } - - public boolean withMaturityCaracteristic() { - return maturityCaracteristic != null; - } - - public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) { - Object oldValue = this.maturityCaracteristic; - this.maturityCaracteristic = maturityCaracteristic; - firePropertyChange(PROPERTY_MATURITY_CARACTERISTIC, oldValue, maturityCaracteristic); - } - - public CaracteristicQualitativeValue getMaturityValue(IndividualObservationBatchRowModel row) { - - CaracteristicQualitativeValue caracteristicValue = null; - if (withMaturityCaracteristic()) { - caracteristicValue = row.getCaracteristicQualitativeValue(maturityCaracteristic); - } - return caracteristicValue; - - } - - public CaracteristicQualitativeValue getMaturityValue(CaracteristicMap caracteristicMap) { - - CaracteristicQualitativeValue caracteristicValue = null; - if (withMaturityCaracteristic()) { - caracteristicValue = caracteristicMap.getQualitativeValue(maturityCaracteristic); - } - return caracteristicValue; - - } - - public void moveMaturityValueFromCaracteristicsToDefaultCaracteristics(IndividualObservationBatchRowModel newRow) { - - if (withMaturityCaracteristic()) { - - Serializable caracteristicValue = newRow.getCaracteristics().remove(maturityCaracteristic); - newRow.getDefaultCaracteristics().putIfAbsent(maturityCaracteristic, caracteristicValue); - - } - } - protected final void recomputeRowValidState(SpeciesFrequencyRowModel row) { // recompute row valid state @@ -1085,35 +870,30 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa } - protected final void recomputeIndividualObservationRowValidState(IndividualObservationBatchRowModel row) { - - // recompute row valid state - boolean valid = row.computeValid(); - - // apply it to row - row.setValid(valid); - - if (valid) { - removeIndividualObservationRowInError(row); - } else { - addIndividualObservationRowInError(row); - } - - } - public SpeciesOrBenthosBatchUISupport getSpeciesOrBenthosBatchUISupport() { return speciesOrBenthosBatchUISupport; } - public void setMaturityValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue maturityState) { - result.getDefaultCaracteristics().put(maturityCaracteristic, maturityState); + public WeightUnit getIndividualObservationWeightUnit() { + return individualObservationWeightUnit; } - public void setGenderValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue gender) { - result.getDefaultCaracteristics().put(sexCaracteristic, gender); + public IndividualObservationBatchUIModel getIndividualObservationModel() { + return individualObservationModel; } - public WeightUnit getIndividualObservationWeightUnit() { - return individualObservationWeightUnit; + private boolean nonEmptyIndividualObservationRowsInError; + + // Ne pas supprimer utiliser par la validation + public boolean isNonEmptyIndividualObservationRowsInError() { + return nonEmptyIndividualObservationRowsInError; + } + + // Ne pas supprimer utiliser par la validation + public void setNonEmptyIndividualObservationRowsInError(boolean nonEmptyIndividualObservationRowsInError) { + boolean oldValue = this.nonEmptyIndividualObservationRowsInError; + this.nonEmptyIndividualObservationRowsInError = nonEmptyIndividualObservationRowsInError; + firePropertyChanged(PROPERTY_NON_EMPTY_INDIVIDUAL_OBSERVATION_ROWS_IN_ERROR, oldValue, nonEmptyIndividualObservationRowsInError); } + } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java index 02ab245..32ab9ae 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java @@ -39,11 +39,7 @@ import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; import javax.swing.SwingUtilities; -import java.util.ArrayList; -import java.util.Collections; import java.util.Date; -import java.util.List; -import java.util.Map; import static org.nuiton.i18n.I18n.t; @@ -83,38 +79,41 @@ public class ApplySpeciesFrequencyRafaleAction { SpeciesFrequencyTableModel tableModel = handler.getTableModel(); - Map<Float, SpeciesFrequencyRowModel> rowsByStep = model.getRowCache(); - - SpeciesFrequencyRowModel row = rowsByStep.get(aroundLengthStep); - - int rowIndex; - - if (row != null) { - - // increments current row - Integer number = row.getNumber(); - row.setNumber((number == null ? 0 : number) + 1); - rowIndex = tableModel.updateRow(row); - - } else { - - // create a new row - - row = tableModel.createNewRow(); - row.setLengthStep(aroundLengthStep); - row.setNumber(1); - row.setValid(handler.isRowValid(row)); - - // get new index - List<Float> steps = new ArrayList<>(rowsByStep.keySet()); - steps.add(aroundLengthStep); - - Collections.sort(steps); - - rowIndex = steps.indexOf(aroundLengthStep); - - tableModel.addNewRow(rowIndex, row); - } + SpeciesFrequencyRowModel row = tableModel.addRafaleRow(aroundLengthStep); + int rowIndex = tableModel.getRowIndex(row); + +// Map<Float, SpeciesFrequencyRowModel> rowsByStep = model.getRowCache(); +// +// SpeciesFrequencyRowModel row = rowsByStep.get(aroundLengthStep); +// +// int rowIndex; +// +// if (row != null) { +// +// // increments current row +// Integer number = row.getNumber(); +// row.setNumber((number == null ? 0 : number) + 1); +// rowIndex = tableModel.updateRow(row); +// +// } else { +// +// // create a new row +// +// row = tableModel.createNewRow(); +// row.setLengthStep(aroundLengthStep); +// row.setNumber(1); +// row.setValid(handler.isRowValid(row)); +// +// // get new index +// List<Float> steps = new ArrayList<>(rowsByStep.keySet()); +// steps.add(aroundLengthStep); +// +// Collections.sort(steps); +// +// rowIndex = steps.indexOf(aroundLengthStep); +// +// tableModel.addNewRow(rowIndex, row); +// } int totalNumber = model.computeTotalNumber(); model.setTotalNumber(totalNumber); @@ -131,16 +130,19 @@ public class ApplySpeciesFrequencyRafaleAction { logsTableModel.addNewRow(0, newLogRow); if (model.isAddIndividualObservationOnRafale()) { - IndividualObservationBatchTableModel obsTableModel = - (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); - - IndividualObservationBatchRowModel obsRow = obsTableModel.getEmptyRow(); - if (obsRow == null) { - obsRow = obsTableModel.createNewRow(); - obsTableModel.addNewRow(obsRow); - } - obsRow.setSize(step); - obsTableModel.updateRow(obsRow); + + IndividualObservationBatchTableModel obsTableModel = (IndividualObservationBatchTableModel) ui.getObsTable().getModel(); + + IndividualObservationBatchRowModel obsRow = obsTableModel.addRafaleRow(step); + +// IndividualObservationBatchRowModel obsRow = obsTableModel.getEmptyRow(); +// if (obsRow == null) { +// obsRow = obsTableModel.createNewRow(); +// obsTableModel.addNewRow(obsRow); +// } +// obsRow.setSize(step); +// obsTableModel.updateRow(obsRow); + newLogRow.setObsRow(obsRow); int rowIndex = obsTableModel.getRowIndex(obsRow); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/GenerateSpeciesFrequencyLengthStepsAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/GenerateSpeciesFrequencyLengthStepsAction.java index 074be40..411476e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/GenerateSpeciesFrequencyLengthStepsAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/GenerateSpeciesFrequencyLengthStepsAction.java @@ -24,23 +24,13 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac * #L% */ -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; -import fr.ifremer.tutti.util.Numbers; import jaxx.runtime.SwingUtil; import jaxx.runtime.swing.JTables; import javax.swing.AbstractAction; import java.awt.event.ActionEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -69,31 +59,32 @@ public class GenerateSpeciesFrequencyLengthStepsAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { - SpeciesFrequencyUIModel model = ui.getModel(); +// SpeciesFrequencyUIModel model = ui.getModel(); SpeciesFrequencyTableModel tableModel = ui.getHandler().getTableModel(); - - Map<Float, SpeciesFrequencyRowModel> rowsByStep = model.getRowCache(); - - Float minStep = model.getLengthStep(model.getMinStep()); - Float maxStep = model.getLengthStep(model.getMaxStep()); - Caracteristic lengthStepCaracteristic = model.getLengthStepCaracteristic(); - - Set<Float> existingKeys = new HashSet<>(rowsByStep.keySet()); - List<SpeciesFrequencyRowModel> rows = new ArrayList<>(rowsByStep.values()); - - for (float i = minStep, step = model.getStep(); i <= maxStep; i = Numbers.getRoundedLengthStep(i + step, true)) { - - if (!existingKeys.contains(i)) { - - // add it - SpeciesFrequencyRowModel newRow = tableModel.createNewRow(); - newRow.setLengthStep(i); - newRow.setLengthStepCaracteristic(lengthStepCaracteristic); - rows.add(newRow); - } - } - Collections.sort(rows); - model.setRows(rows); + tableModel.generateRows(); + +// Map<Float, SpeciesFrequencyRowModel> rowsByStep = model.getRowCache(); +// +// Float minStep = model.getLengthStep(model.getMinStep()); +// Float maxStep = model.getLengthStep(model.getMaxStep()); +// Caracteristic lengthStepCaracteristic = model.getLengthStepCaracteristic(); +// +// Set<Float> existingKeys = new HashSet<>(rowsByStep.keySet()); +// List<SpeciesFrequencyRowModel> rows = new ArrayList<>(rowsByStep.values()); +// +// for (float i = minStep, step = model.getStep(); i <= maxStep; i = Numbers.getRoundedLengthStep(i + step, true)) { +// +// if (!existingKeys.contains(i)) { +// +// // add it +// SpeciesFrequencyRowModel newRow = tableModel.createNewRow(); +// newRow.setLengthStep(i); +// newRow.setLengthStepCaracteristic(lengthStepCaracteristic); +// rows.add(newRow); +// } +// } +// Collections.sort(rows); +// model.setRows(rows); // select first cell in table (see http://forge.codelutin.com/issues/2496) JTables.doSelectCell(ui.getTable(), 0, 1); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java index 4a644df..edb1495 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ImportMultiPostSpeciesSupportAction.java @@ -27,9 +27,9 @@ import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.service.catches.multipost.MultiPostImportResult; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyCellComponent; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; @@ -38,14 +38,10 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.Spe import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler; -import javax.swing.JOptionPane; import java.io.File; import java.util.List; -import static org.nuiton.i18n.I18n.t; - /** * @author Tony Chemit - chemit@codelutin.com * @since 4.5 @@ -89,62 +85,13 @@ public abstract class ImportMultiPostSpeciesSupportAction extends LongActionSupp if (doAction) { - String message = "<ul>"; - boolean ask = false; - if (isImportFrequencies() && getModel().isNonEmptyRows()) { - ask = true; - message = "<li>" + t("tutti.askBeforeMultiPostImport.frequencies.message") + "</li>"; - } - - if (isImportIndivudalObservations() && getModel().getIndividualObservationRows().size() > 0 - && getModel().isNonEmptyIndividualObservationRow()) { - ask = true; - message += "<li>" + t("tutti.askBeforeMultiPostImport.observations.message") + "</li>"; - } - message += "</ul>"; - - if (ask) { - - String htmlMessage = String.format(AbstractApplicationUIHandler.CONFIRMATION_FORMAT, - t("tutti.askBeforeMultiPostImport.message", message), - t("tutti.askBeforeMultiPostImport.help")); - - int saveResponse = JOptionPane.showOptionDialog( - getHandler().getTopestUI(), - htmlMessage, - t("tutti.askBeforeMultiPostImport.title"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, - new String[]{t("tutti.option.cleanAndImport"), t("tutti.option.cancelImport")}, - t("tutti.option.cleanAndImport")); - - switch (saveResponse) { - case 0: + // choose file to import + file = chooseFile(getFileChooserTitle(), + getFileChooserButton(), + "^.*\\." + getFileExtension(), + getFileExtensionDescription()); - // do action - doAction = true; - break; - case 1: - - // cancel import - doAction = false; - - } - - } - - if (doAction) { - - // choose file to import - file = chooseFile(getFileChooserTitle(), - getFileChooserButton(), - "^.*\\." + getFileExtension(), - getFileExtensionDescription()); - - doAction = file != null; - - } + doAction = file != null; } @@ -189,6 +136,8 @@ public abstract class ImportMultiPostSpeciesSupportAction extends LongActionSupp getDataContext().getDefaultIndividualObservationCaracteristics(), individualObservations); + //FIXME Il faut reporter le poids de sous-échantillons + //FIXME Faire un «reset» avant pour l'algorithme de prélèvement getHandler().loadFrequenciesAndObservations(frequencyRows, individualObservationRows); getModel().setModify(true); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java index 9a23f0f..a2337bf 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java @@ -75,7 +75,6 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc t("tutti.editSpeciesFrequencies.action.removeObservations.confirm.title"), JOptionPane.YES_NO_OPTION); - if (answer == JOptionPane.YES_OPTION) { SpeciesFrequencyUIModel model = ui.getModel(); @@ -94,23 +93,18 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc boolean removeSize = removeWeight || model.isCopyIndividualObservationSize(); if (removeWeight) { - frequencyTableModel.removeWeightToFrequencyRow(row.getSize(), row.getWeight()); + float weightToRemove = frequencyTableModel.convertWeightFromIndividualObservation(row.getWeight()); + frequencyTableModel.removeWeightToFrequencyRow(row.getSize(), weightToRemove); } if (removeSize) { - frequencyTableModel.decrementFrequencyRowsNumbers(row); + frequencyTableModel.decrementFrequencyRowsNumbers(row.getSize()); } individualObservationUICache.decrements(row); - model.removeIndividualObservationRowInError(row); }); - int minSelection = obsTable.getSelectionModel().getMinSelectionIndex(); - int maxSelection = obsTable.getSelectionModel().getMaxSelectionIndex(); - - //FIXME On devrait faire un seul appel vers le table model - obsTableModel.getRows().removeAll(rowsToDelete); - obsTableModel.fireTableRowsDeleted(minSelection, maxSelection); + obsTableModel.removeRows(rowsToDelete); model.setModify(true); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java index c230ea2..7957c95 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ResetSpeciesFrequencyAction.java @@ -100,7 +100,7 @@ public class ResetSpeciesFrequencyAction extends LongActionSupport<SpeciesFreque IndividualObservationUICache individualObservationUICache = handler.getIndividualObservationUICache(); individualObservationUICache.decrementsAll(); - model.setIndividualObservationRows(new ArrayList<>()); + model.getIndividualObservationModel().setRows(new ArrayList<>()); model.setCanDisplayNotifications(true); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java index 06f22ef..a3e5153 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java @@ -22,8 +22,6 @@ package fr.ifremer.tutti.ui.swing.util.table; * #L% */ -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; @@ -32,6 +30,9 @@ import org.nuiton.util.beans.Binder; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -71,7 +72,7 @@ public abstract class AbstractTuttiTableUIModel<E, R extends AbstractTuttiBeanUI setValid(CollectionUtils.isEmpty(rowsInErorr)); } }); - setRowsInError(Sets.<R>newHashSet()); + setRowsInError(new HashSet<>()); } public List<R> getRows() { @@ -80,7 +81,7 @@ public abstract class AbstractTuttiTableUIModel<E, R extends AbstractTuttiBeanUI public void setRows(List<R> rows) { if (rows == null) { - rows = Lists.newArrayList(); + rows = new ArrayList<>(); } this.rows = rows; @@ -118,4 +119,9 @@ public abstract class AbstractTuttiTableUIModel<E, R extends AbstractTuttiBeanUI rowsInError.remove(row); firePropertyChange(PROPERTY_ROWS_IN_ERROR, null, rowsInError); } + + public void removeRowsInError(Collection<R> rows) { + rowsInError.removeAll(rows); + firePropertyChange(PROPERTY_ROWS_IN_ERROR, null, rowsInError); + } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.