branch feature/ecran_obs_individuelles updated (f600d0c -> be0ac0e)
This is an automated email from the git hooks/post-receive script. New change to branch feature/ecran_obs_individuelles in repository tutti. See http://git.codelutin.com/tutti.git from f600d0c ajout d'une ligne d'observation individuelle quand on ajoute en rafale (refs #8019) new 815f48c - ajout du numéro de l'observation - suppression d'observations refs #8019 new a9c22e9 use lanbdas where possible new be0ac0e - copie des donnees d'observation individuelles dans le tableau des mensurations en fonction du mode - suppression ou ecrasement des données au changement de mode de copie refs #8019 The 3 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit be0ac0efc3c93bfe2fa24c7dc7977f7235b19ad5 Author: Kevin Morin <morin@codelutin.com> Date: Mon Feb 29 16:04:42 2016 +0100 - copie des donnees d'observation individuelles dans le tableau des mensurations en fonction du mode - suppression ou ecrasement des données au changement de mode de copie refs #8019 commit a9c22e976e587b4871778c52276c16ba6b5ee0d0 Author: Kevin Morin <morin@codelutin.com> Date: Fri Feb 26 16:35:25 2016 +0100 use lanbdas where possible commit 815f48cbc956f2bc62ba4b988107f71ee2b6309f Author: Kevin Morin <morin@codelutin.com> Date: Fri Feb 26 16:23:13 2016 +0100 - ajout du numéro de l'observation - suppression d'observations refs #8019 Summary of changes: .../filtered-resources/tutti-help-fr.properties | 3 +- .../IndividualObservationBatchTableModel.java | 44 +- .../frequency/SpeciesFrequencyRowModel.java | 30 ++ .../species/frequency/SpeciesFrequencyUI.jaxx | 8 +- .../species/frequency/SpeciesFrequencyUI.jcss | 18 +- .../frequency/SpeciesFrequencyUIHandler.java | 446 ++++++++++++++------- .../species/frequency/SpeciesFrequencyUIModel.java | 25 +- .../frequency/actions/RemoveObservationAction.java | 74 ++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 12 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 15 +- 10 files changed, 510 insertions(+), 165 deletions(-) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/ecran_obs_individuelles in repository tutti. See http://git.codelutin.com/tutti.git commit 815f48cbc956f2bc62ba4b988107f71ee2b6309f Author: Kevin Morin <morin@codelutin.com> Date: Fri Feb 26 16:23:13 2016 +0100 - ajout du numéro de l'observation - suppression d'observations refs #8019 --- .../filtered-resources/tutti-help-fr.properties | 3 +- .../IndividualObservationBatchTableModel.java | 17 +++--- .../species/frequency/SpeciesFrequencyUI.jaxx | 8 ++- .../species/frequency/SpeciesFrequencyUI.jcss | 11 +++- .../frequency/SpeciesFrequencyUIHandler.java | 57 +++++++------------- .../frequency/actions/RemoveObservationAction.java | 63 ++++++++++++++++++++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 10 ++++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 12 +++-- 8 files changed, 127 insertions(+), 54 deletions(-) diff --git a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties index 5c19430..a8feb3f 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -1,5 +1,5 @@ #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Fri Feb 26 11:49:12 CET 2016 +#Fri Feb 26 15:28:11 CET 2016 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -300,6 +300,7 @@ tutti.editSpeciesBatch.sortSpeciesBatch.help=editFishingOperation.html\#captureE tutti.editSpeciesFrequencies.action.addLengthStepCaracteristic.help=editFishingOperation.html\#captureEspecesMensurationActions tutti.editSpeciesFrequencies.action.cancel.help=editFishingOperation.html\#captureEspecesMensurationActions tutti.editSpeciesFrequencies.action.generate.help=editFishingOperation.html\#captureEspecesMensurationActions +tutti.editSpeciesFrequencies.action.removeObservation.help= tutti.editSpeciesFrequencies.action.reset.help=editFishingOperation.html\#captureEspecesMensurationActions tutti.editSpeciesFrequencies.action.saveAndClose.help=editFishingOperation.html\#captureEspecesMensurationActions tutti.editSpeciesFrequencies.action.saveAndContinue.help=editFishingOperation.html\#captureEspecesMensurationActions diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java index f22197b..c59fd4a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java @@ -37,15 +37,10 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab private static final long serialVersionUID = 1L; - public static final ColumnIdentifier<IndividualObservationBatchRowModel> ID = ColumnIdentifier.newId( - IndividualObservationBatchRowModel.PROPERTY_ID, - n("tutti.editIndividualObservationBatch.table.header.id"), - n("tutti.editIndividualObservationBatch.table.header.id.tip")); - - public static final ColumnIdentifier<IndividualObservationBatchRowModel> SPECIES = ColumnIdentifier.newId( - IndividualObservationBatchRowModel.PROPERTY_SPECIES, - n("tutti.editIndividualObservationBatch.table.header.species"), - n("tutti.editIndividualObservationBatch.table.header.species.tip")); + public static final ColumnIdentifier<IndividualObservationBatchRowModel> RANK = ColumnIdentifier.newId( + IndividualObservationBatchRowModel.PROPERTY_RANK_ORDER, + n("tutti.editIndividualObservationBatch.table.header.rank"), + n("tutti.editIndividualObservationBatch.table.header.rank.tip")); public static final ColumnIdentifier<IndividualObservationBatchRowModel> WEIGHT = ColumnIdentifier.newId( IndividualObservationBatchRowModel.PROPERTY_WEIGHT, @@ -89,7 +84,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab super(columnModel, true, true); this.weightUnit = weightUnit; - setNoneEditableCols(ID); + setNoneEditableCols(RANK); } @Override @@ -99,6 +94,8 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab // by default empty row is not valid result.setValid(false); + result.setRankOrder(getRowCount() + 1); + return result; } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx index 5031b49..54ba830 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx @@ -82,6 +82,10 @@ public SpeciesFrequencyUI(TuttiUI parentUI) { <SaveAndCloseSpeciesFrequencyAction id="saveAndCloseAction" constructorParams="this"/> <SaveAndContinueSpeciesFrequencyAction id="saveAndContinueAction" constructorParams="this"/> + <JPopupMenu id='obsTablePopup'> + <JMenuItem id='deleteObsRowsMenu'/> + </JPopupMenu> + <Table id='configurationPanel' fill="both" anchor="west" constraints='BorderLayout.CENTER'> <row> @@ -267,7 +271,9 @@ public SpeciesFrequencyUI(TuttiUI parentUI) { onActionPerformed='model.setCopyIndividualObservationMode(CopyIndividualObservationMode.SIZE)'/> </HBox> <JScrollPane id='obsPanel' constraints="BorderLayout.CENTER"> - <JXTable id='obsTable'/> + <JXTable id='obsTable' + onMouseClicked='handler.autoSelectRowInTable(event, obsTablePopup)' + onKeyPressed='handler.openRowMenu(event, obsTablePopup)'/> </JScrollPane> </JPanel> </JSplitPane> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss index 689d824..c51fe03 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss @@ -50,6 +50,15 @@ ComputableDataEditor { _help: {"tutti.editSpeciesFrequencies.help"}; } +#deleteObsRowsMenu { + actionIcon: delete2; + text: "tutti.editSpeciesFrequencies.action.removeObservation"; + toolTipText: "tutti.editSpeciesFrequencies.action.removeObservation.tip"; + i18nMnemonic: "tutti.editSpeciesFrequencies.action.removeObservation.mnemonic"; + _simpleAction: {fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions.RemoveObservationAction.class}; + _help: {"tutti.editSpeciesFrequencies.action.removeObservation.help"}; +} + //configurationPanel #frequencyModePanel { @@ -343,7 +352,7 @@ ComputableDataEditor { } #obsTable { - selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionMode: {ListSelectionModel.MULTIPLE_INTERVAL_SELECTION}; selectionBackground: {null}; selectionForeground: {Color.BLACK}; sortable: false; 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 86c936e..41fec5d 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 @@ -88,6 +88,7 @@ import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.JTextField; import javax.swing.SwingUtilities; +import javax.swing.event.TableModelEvent; import javax.swing.table.TableCellRenderer; import java.awt.BorderLayout; import java.awt.Color; @@ -675,7 +676,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci //-- Internal methods --// //------------------------------------------------------------------------// - protected void initDataTable() { JXTable table = getTable(); @@ -891,12 +891,15 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = getDecorator(CaracteristicQualitativeValue.class, null); -// { -// // Id column -// -// addIdColumnToModel(columnModel, IndividualObservationBatchTableModel.ID, obsTable); -// -// } + { + // Rank column + + addIntegerColumnToModel(columnModel, + IndividualObservationBatchTableModel.RANK, + TuttiUI.INT_10_DIGITS_PATTERN, + obsTable); + + } { // Weight column @@ -1004,37 +1007,17 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci installTableKeyListener(columnModel, obsTable); - } + tableModel.addTableModelListener(e -> { -// protected void addIdColumnToModel(TableColumnModel model, -// ColumnIdentifier identifier, -// JTable table) { -// -// final TableCellRenderer defaultRenderer = table.getDefaultRenderer(Number.class); -// final Decorator<String> idDecorator = getDecorator(String.class, DecoratorService.SPACE_EVERY_3_DIGIT); -// -// TableCellRenderer idTableCellRenderer = new TableCellRenderer() { -// @Override -// public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { -// -// String text = null; -// if (value != null) { -// text = idDecorator.toString(value); -// } -// -// Component result = defaultRenderer.getTableCellRendererComponent(table, text, isSelected, hasFocus, row, column); -// if (result instanceof JLabel) { -// JLabel jLabel = (JLabel) result; -// jLabel.setHorizontalTextPosition(SwingConstants.RIGHT); -// -// } -// return result; -// } -// }; -// -// addColumnToModel(model, null, idTableCellRenderer, identifier); -// -// } + if (e.getType() == TableModelEvent.DELETE) { + int firstRow = e.getFirstRow(); + for (int i = firstRow ; i < tableModel.getRowCount() ; i++) { + tableModel.getRows().get(i).setRankOrder(i + 1); + } + } + }); + + } protected void consumeFeedRecord(FeedReaderMeasureRecord record) { if (record.isValid()) { 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 new file mode 100644 index 0000000..ed32fd8 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/RemoveObservationAction.java @@ -0,0 +1,63 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions; + +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; +import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; +import org.jdesktop.swingx.JXTable; + +import javax.swing.JOptionPane; +import java.util.Collection; +import java.util.HashSet; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 4.5 + */ +public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequencyUI> { + + public RemoveObservationAction(SpeciesFrequencyUI speciesFrequencyUI) { + super(speciesFrequencyUI, false); + } + + @Override + protected void onActionPerformed(SpeciesFrequencyUI ui) { + JXTable obsTable = ui.getObsTable(); + IndividualObservationBatchTableModel obsTableModel = + (IndividualObservationBatchTableModel) obsTable.getModel(); + + int[] selectedRowIndexes = obsTable.getSelectedRows(); + Collection<IndividualObservationBatchRowModel> rowsToDelete = new HashSet<>(); + + for (int selectedRowIndex : selectedRowIndexes) { + rowsToDelete.add(obsTableModel.getRows().get(selectedRowIndex)); + } + + String message; + if (rowsToDelete.size() == 1) { + message = t("tutti.editSpeciesFrequencies.action.removeObservation.confirm.message"); + } else { + message = t("tutti.editSpeciesFrequencies.action.removeObservations.confirm.message", rowsToDelete.size()); + } + + int answer = JOptionPane.showConfirmDialog(ui, + message, + t("tutti.editSpeciesFrequencies.action.removeObservations.confirm.title"), + JOptionPane.YES_NO_OPTION); + + + if (answer == JOptionPane.YES_OPTION) { + + int minSelection = obsTable.getSelectionModel().getMinSelectionIndex(); + int maxSelection = obsTable.getSelectionModel().getMaxSelectionIndex(); + obsTableModel.getRows().removeAll(rowsToDelete); + obsTableModel.fireTableRowsDeleted(minSelection, maxSelection); + + if (obsTable.getRowCount() == 0) { + obsTableModel.addNewRow(); + } + } + } +} diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 1046e78..d62ccbc 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -4,6 +4,7 @@ Pr\\u00e9l\\u00e8vement= application.action.create.error= application.error.ui.business.warning= jaxx.application.action.create.error= +jaxx.application.common.askBeforeDelete.help= left= next= right= @@ -1424,6 +1425,12 @@ tutti.editSpeciesFrequencies.action.cancel.tip= tutti.editSpeciesFrequencies.action.generate= tutti.editSpeciesFrequencies.action.generate.mnemonic= tutti.editSpeciesFrequencies.action.generate.tip= +tutti.editSpeciesFrequencies.action.removeObservation= +tutti.editSpeciesFrequencies.action.removeObservation.confirm.message= +tutti.editSpeciesFrequencies.action.removeObservation.mnemonic= +tutti.editSpeciesFrequencies.action.removeObservation.tip= +tutti.editSpeciesFrequencies.action.removeObservations.confirm.message= +tutti.editSpeciesFrequencies.action.removeObservations.confirm.title= tutti.editSpeciesFrequencies.action.reset= tutti.editSpeciesFrequencies.action.reset.mnemonic= tutti.editSpeciesFrequencies.action.reset.tip= @@ -1501,6 +1508,9 @@ tutti.editSpeciesFrequencies.logTable.header.label= tutti.editSpeciesFrequencies.logTable.header.lengthStep= tutti.editSpeciesFrequencies.logTable.removeRow.confirm.message= tutti.editSpeciesFrequencies.logTable.removeRow.confirm.title= +tutti.editSpeciesFrequencies.removeObservationRow.message= +tutti.editSpeciesFrequencies.removeObservationRows.message= +tutti.editSpeciesFrequencies.removeObservationRows.title= tutti.editSpeciesFrequencies.simpleCountingAndFrequencies= tutti.editSpeciesFrequencies.table.header.lengthStep= tutti.editSpeciesFrequencies.table.header.number= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 123b840..02ff596 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -919,16 +919,14 @@ tutti.editIndividualObservationBatch.table.header.comment=Commentaire tutti.editIndividualObservationBatch.table.header.comment.tip=Commentaire tutti.editIndividualObservationBatch.table.header.file=Pièces jointes tutti.editIndividualObservationBatch.table.header.file.tip=Pièces jointes -tutti.editIndividualObservationBatch.table.header.id=Id -tutti.editIndividualObservationBatch.table.header.id.tip=Identifiant du lot tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic=Classe de taille tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic.tip=Classe de taille tutti.editIndividualObservationBatch.table.header.otherCaracteristics=Autres caractéristiques tutti.editIndividualObservationBatch.table.header.otherCaracteristics.tip=Autres caractéristiques +tutti.editIndividualObservationBatch.table.header.rank=N° +tutti.editIndividualObservationBatch.table.header.rank.tip=N° de l'observation tutti.editIndividualObservationBatch.table.header.size=Taille tutti.editIndividualObservationBatch.table.header.size.tip=Taille -tutti.editIndividualObservationBatch.table.header.species=Espèce -tutti.editIndividualObservationBatch.table.header.species.tip=Espèce tutti.editIndividualObservationBatch.table.header.weight=Poids tutti.editIndividualObservationBatch.table.header.weight.tip=Poids individuel tutti.editIndividualObservationCaracteristics.action.cancel=Annuler @@ -1349,6 +1347,12 @@ tutti.editSpeciesFrequencies.action.cancel.tip=Annuler l'édition des mensuratio tutti.editSpeciesFrequencies.action.generate=Générer tutti.editSpeciesFrequencies.action.generate.mnemonic=G tutti.editSpeciesFrequencies.action.generate.tip=Générer les mensurations +tutti.editSpeciesFrequencies.action.removeObservation=Supprimer +tutti.editSpeciesFrequencies.action.removeObservation.confirm.message=<html>Vous êtes sur le point de supprimer l'observation sélectionnée.<hr/>Êtes-vous sur de vouloir la supprimer ?</html> +tutti.editSpeciesFrequencies.action.removeObservation.mnemonic=S +tutti.editSpeciesFrequencies.action.removeObservation.tip=Supprimer les lignes sélectionnées +tutti.editSpeciesFrequencies.action.removeObservations.confirm.message=<html>Vous êtes sur le point de supprimer les %s observations sélectionnées.<hr/>Êtes-vous sur de vouloir les supprimer ?</html> +tutti.editSpeciesFrequencies.action.removeObservations.confirm.title=Suppression d'observations individuelles tutti.editSpeciesFrequencies.action.reset=Réinitialiser tutti.editSpeciesFrequencies.action.reset.mnemonic=R tutti.editSpeciesFrequencies.action.reset.tip=Supprimer toutes les mensurations saisies -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/ecran_obs_individuelles in repository tutti. See http://git.codelutin.com/tutti.git commit a9c22e976e587b4871778c52276c16ba6b5ee0d0 Author: Kevin Morin <morin@codelutin.com> Date: Fri Feb 26 16:35:25 2016 +0100 use lanbdas where possible --- .../frequency/SpeciesFrequencyUIHandler.java | 159 +++++++++------------ 1 file changed, 64 insertions(+), 95 deletions(-) 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 41fec5d..ac7f38d 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 @@ -25,7 +25,6 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; -import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderEvent; import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderListener; import fr.ifremer.tutti.ichtyometer.feed.record.FeedReaderMeasureRecord; import fr.ifremer.tutti.persistence.entities.TuttiEntities; @@ -97,8 +96,6 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -153,26 +150,19 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SpeciesFrequencyRowModel.PROPERTY_NUMBER, SpeciesFrequencyRowModel.PROPERTY_WEIGHT); - this.feedReaderListener = new FeedReaderListener() { + this.feedReaderListener = event -> { - @Override - public void recordRead(FeedReaderEvent event) { - - final FeedReaderMeasureRecord record = event.getRecord(); + final FeedReaderMeasureRecord record = event.getRecord(); - SwingUtilities.invokeLater( - new Runnable() { - @Override - public void run() { - if (!getModel().isSimpleCountingMode()) { + SwingUtilities.invokeLater( + () -> { + if (!getModel().isSimpleCountingMode()) { - // can try to consume value - consumeFeedRecord(record); - } - } + // can try to consume value + consumeFeedRecord(record); } - ); - } + } + ); }; } @@ -195,8 +185,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci public boolean isRowValid(SpeciesFrequencyRowModel row) { SpeciesFrequencyUIModel model = getModel(); - boolean valid = model.isRowValid(row); - return valid; + return model.isRowValid(row); } @@ -270,25 +259,16 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci this.ui.setContextValue(model); // listen when ichtyometer is connected or not and adjust the listener - getContext().addPropertyChangeListener(TuttiUIContext.PROPERTY_ICHTYOMETER_CONNECTED, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - boolean connected = (boolean) evt.getNewValue(); - - if (connected && SpeciesFrequencyUIHandler.this.frequencyEditor != null) { + getContext().addPropertyChangeListener(TuttiUIContext.PROPERTY_ICHTYOMETER_CONNECTED, evt -> { + boolean connected = (boolean) evt.getNewValue(); - // listen when itchtyometer is connected and this ui is showing - listenItchtyometer(); - } + if (connected && SpeciesFrequencyUIHandler.this.frequencyEditor != null) { - SwingUtilities.invokeLater( - new Runnable() { - @Override - public void run() { - updateLogVisibility(); - } - }); + // listen when itchtyometer is connected and this ui is showing + listenItchtyometer(); } + + SwingUtilities.invokeLater(this::updateLogVisibility); }); } @@ -338,71 +318,59 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci }); // when lengthStepCaracteristic changed, let's updates all row with the new value - model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_LENGTH_STEP_CARACTERISTIC, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - Caracteristic newValue = (Caracteristic) evt.getNewValue(); - // get step from the pmfm - float step = getStep(newValue); - getModel().setStep(step); - getModel().setDataSetIntervalWidth(step); - frequenciesChart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step == 1f)); - if (CollectionUtils.isNotEmpty(getModel().getRows())) { - for (SpeciesFrequencyRowModel rowModel : getModel().getRows()) { - rowModel.setLengthStepCaracteristic(newValue); - recomputeRowValidState(rowModel); - } + model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_LENGTH_STEP_CARACTERISTIC, evt -> { + Caracteristic newValue = (Caracteristic) evt.getNewValue(); + // get step from the pmfm + float step1 = getStep(newValue); + getModel().setStep(step1); + getModel().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()) { + rowModel.setLengthStepCaracteristic(newValue); + recomputeRowValidState(rowModel); } - SpeciesFrequencyUIHandler.this.ui.getValidator().doValidate(); } + SpeciesFrequencyUIHandler.this.ui.getValidator().doValidate(); }); // when lengthStepCaracteristicUnit changed, let's updates the label of some fields - model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_LENGTH_STEP_CARACTERISTIC_UNIT, new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { + model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_LENGTH_STEP_CARACTERISTIC_UNIT, evt -> { - String unit = (String) evt.getNewValue(); + String unit = (String) evt.getNewValue(); - if (unit == null) { + if (unit == null) { - unit = t("tutti.editSpeciesFrequencies.unkownStepUnit"); - } + unit = t("tutti.editSpeciesFrequencies.unkownStepUnit"); + } - getUI().getMinStepLabel().setText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.minStep"), unit)); - getUI().getMinStepLabel().setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.minStep.tip"), unit)); + getUI().getMinStepLabel().setText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.minStep"), unit)); + getUI().getMinStepLabel().setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.minStep.tip"), unit)); - getUI().getMaxStepLabel().setText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.maxStep"), unit)); - getUI().getMaxStepLabel().setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.maxStep.tip"), unit)); + getUI().getMaxStepLabel().setText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.maxStep"), unit)); + getUI().getMaxStepLabel().setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.maxStep.tip"), unit)); - getUI().getRafaleStepLabel().setText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.rafaleStep"), unit)); - getUI().getRafaleStepLabel().setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.rafaleStep.tip"), unit)); + getUI().getRafaleStepLabel().setText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.rafaleStep"), unit)); + getUI().getRafaleStepLabel().setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.field.rafaleStep.tip"), unit)); - TableColumnExt column = (TableColumnExt) getUI().getTable().getColumn(SpeciesFrequencyTableModel.LENGTH_STEP); - column.setHeaderValue(getLabelWithUnit(t("tutti.editSpeciesFrequencies.table.header.lengthStep"), unit)); - column.setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.table.header.lengthStep"), unit)); - } + TableColumnExt column = (TableColumnExt) getUI().getTable().getColumn(SpeciesFrequencyTableModel.LENGTH_STEP); + column.setHeaderValue(getLabelWithUnit(t("tutti.editSpeciesFrequencies.table.header.lengthStep"), unit)); + column.setToolTipText(getLabelWithUnit(t("tutti.editSpeciesFrequencies.table.header.lengthStep"), unit)); }); // when configuration mode change, let's focus the best component (see http://forge.codelutin.com/issues/4035) - model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_FREQUENCIES_CONFIGURATION_MODE, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - final FrequencyConfigurationMode newValue = (FrequencyConfigurationMode) evt.getNewValue(); - SwingUtilities.invokeLater( - new Runnable() { - @Override - public void run() { - JComponent componentToFocus = getComponentToFocus(newValue); - if (componentToFocus != null) { - componentToFocus.grabFocus(); - } - updateLogVisibility(); - } + model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_FREQUENCIES_CONFIGURATION_MODE, evt -> { + final FrequencyConfigurationMode newValue = (FrequencyConfigurationMode) evt.getNewValue(); + SwingUtilities.invokeLater( + () -> { + JComponent componentToFocus = getComponentToFocus(newValue); + if (componentToFocus != null) { + componentToFocus.grabFocus(); } - ); - } + updateLogVisibility(); + } + ); }); model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_USE_RTP, evt -> { @@ -639,17 +607,18 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci mode = FrequencyConfigurationMode.SIMPLE_COUNTING; } } - } - if (log.isDebugEnabled()) { - log.debug("Will edit batch row: " + speciesBatch + " with " + rows.size() + " frequency"); - } + if (log.isDebugEnabled()) { + log.debug("Will edit batch row: " + speciesBatch + " with " + rows.size() + " frequency"); + } - Integer number = speciesBatch.getNumber(); - if (number != null && rows.isEmpty()) { - mode = FrequencyConfigurationMode.SIMPLE_COUNTING; - model.setSimpleCount(number); + Integer number = speciesBatch.getNumber(); + if (number != null && rows.isEmpty()) { + mode = FrequencyConfigurationMode.SIMPLE_COUNTING; + model.setSimpleCount(number); + } } + // make sure configuration mode will be rebound model.setConfigurationMode(null); model.setConfigurationMode(mode); @@ -860,7 +829,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci // create log table model SpeciesFrequencyLogsTableModel logTableModel = new SpeciesFrequencyLogsTableModel(logColumnModel); - logTableModel.setRows(new ArrayList<SpeciesFrequencyLogRowModel>()); + logTableModel.setRows(new ArrayList<>()); logTable.setModel(logTableModel); logTable.setColumnModel(logColumnModel); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/ecran_obs_individuelles in repository tutti. See http://git.codelutin.com/tutti.git commit be0ac0efc3c93bfe2fa24c7dc7977f7235b19ad5 Author: Kevin Morin <morin@codelutin.com> Date: Mon Feb 29 16:04:42 2016 +0100 - copie des donnees d'observation individuelles dans le tableau des mensurations en fonction du mode - suppression ou ecrasement des données au changement de mode de copie refs #8019 --- .../IndividualObservationBatchTableModel.java | 27 +- .../frequency/SpeciesFrequencyRowModel.java | 30 +++ .../species/frequency/SpeciesFrequencyUI.jcss | 7 +- .../frequency/SpeciesFrequencyUIHandler.java | 288 ++++++++++++++++++--- .../species/frequency/SpeciesFrequencyUIModel.java | 25 +- .../frequency/actions/RemoveObservationAction.java | 11 + .../resources/i18n/tutti-ui-swing_en_GB.properties | 2 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 3 + 8 files changed, 348 insertions(+), 45 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java index c59fd4a..d71cdb7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchTableModel.java @@ -22,6 +22,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservatio * #L% */ +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.type.WeightUnit; import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; @@ -52,11 +54,6 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab n("tutti.editIndividualObservationBatch.table.header.size"), n("tutti.editIndividualObservationBatch.table.header.size.tip")); - public static final ColumnIdentifier<IndividualObservationBatchRowModel> LENGTH_STEP_CARACTERISTIC = ColumnIdentifier.newId( - IndividualObservationBatchRowModel.PROPERTY_LENGTH_STEP_CARACTERISTIC, - n("tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic"), - n("tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic.tip")); - public static final ColumnIdentifier<IndividualObservationBatchRowModel> OTHER_CARACTERISTICS = ColumnIdentifier.newId( IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS, n("tutti.editIndividualObservationBatch.table.header.otherCaracteristics"), @@ -79,6 +76,10 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab */ protected final WeightUnit weightUnit; + protected Species species; + + protected Caracteristic lengthstepCaracteristic; + public IndividualObservationBatchTableModel(WeightUnit weightUnit, TableColumnModelExt columnModel) { super(columnModel, true, true); @@ -87,6 +88,20 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab setNoneEditableCols(RANK); } + public void setSpecies(Species species) { + this.species = species; + if (rows != null) { + rows.forEach(row -> row.setSpecies(species)); + } + } + + public void setLengthstepCaracteristic(Caracteristic lengthstepCaracteristic) { + this.lengthstepCaracteristic = lengthstepCaracteristic; + if (rows != null) { + rows.forEach(row -> row.setLengthStepCaracteristic(lengthstepCaracteristic)); + } + } + @Override public IndividualObservationBatchRowModel createNewRow() { IndividualObservationBatchRowModel result = @@ -95,6 +110,8 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab // by default empty row is not valid result.setValid(false); result.setRankOrder(getRowCount() + 1); + result.setSpecies(species); + result.setLengthStepCaracteristic(lengthstepCaracteristic); return result; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyRowModel.java index faffe38..a9122d7 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyRowModel.java @@ -191,6 +191,23 @@ public class SpeciesFrequencyRowModel extends AbstractTuttiBeanUIModel<SpeciesBa firePropertyChange(PROPERTY_NUMBER, oldValue, number); } + public void incNumber() { + if (number == null) { + number = 0; + } + setNumber(number + 1); + } + + public void decNumber() { + decNumber(1); + } + + public void decNumber(int nb) { + if (number != null && number >= nb) { + setNumber(number - nb); + } + } + @Override public Float getWeight() { return computedOrNotWeight.getData(); @@ -203,6 +220,19 @@ public class SpeciesFrequencyRowModel extends AbstractTuttiBeanUIModel<SpeciesBa firePropertyChange(PROPERTY_WEIGHT, oldValue, weight); } + /** + * @param weightToAdd weight (can be negative) to add + */ + public void addToWeight(float weightToAdd) { + Float weight = computedOrNotWeight.getData(); + if (weight == null) { + weight = 0f; + } + if (weight + weightToAdd >= 0) { + setWeight(weight + weightToAdd); + } + } + public Float getComputedWeight() { return computedOrNotWeight.getComputedData(); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss index c51fe03..e66d35e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss @@ -223,7 +223,6 @@ ComputableDataEditor { #samplingWarningLabel { foreground: {Color.RED}; - text: "Prélèvement"; } #dataFieldPanel { @@ -326,7 +325,7 @@ ComputableDataEditor { toolTipText: "tutti.editSpeciesFrequencies.field.copyToSizeTableMode.all.tip"; i18nMnemonic: "tutti.editSpeciesFrequencies.field.copyToSizeTableMode.all.mnemonic"; value: "all"; - //selected: {model.isSimpleCountingMode()}; + selected: {model.isCopyIndividualObservationAll()}; buttonGroup: "copyToSizeTableMode"; _help: {"tutti.editSpeciesFrequencies.field.copyToSizeTableMode.all.help"}; } @@ -336,7 +335,7 @@ ComputableDataEditor { toolTipText: "tutti.editSpeciesFrequencies.field.copyToSizeTableMode.nothing.tip"; i18nMnemonic: "tutti.editSpeciesFrequencies.field.copyToSizeTableMode.nothing.mnemonic"; value: "nothing"; - //selected: {model.isSimpleCountingMode()}; + selected: {model.isCopyIndividualObservationNothing()}; buttonGroup: "copyToSizeTableMode"; _help: {"tutti.editSpeciesFrequencies.field.copyToSizeTableMode.nothing.help"}; } @@ -346,7 +345,7 @@ ComputableDataEditor { toolTipText: "tutti.editSpeciesFrequencies.field.copyToSizeTableMode.size.tip"; i18nMnemonic: "tutti.editSpeciesFrequencies.field.copyToSizeTableMode.size.mnemonic"; value: "size"; - //selected: {model.isSimpleCountingMode()}; + selected: {model.isCopyIndividualObservationSize()}; buttonGroup: "copyToSizeTableMode"; _help: {"tutti.editSpeciesFrequencies.field.copyToSizeTableMode.size.help"}; } 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 ac7f38d..7b93051 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 @@ -25,6 +25,7 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderEvent; import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderListener; import fr.ifremer.tutti.ichtyometer.feed.record.FeedReaderMeasureRecord; import fr.ifremer.tutti.persistence.entities.TuttiEntities; @@ -44,6 +45,7 @@ import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.FrequencyConfigurationMode; +import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.CopyIndividualObservationMode; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchRowModel; @@ -62,6 +64,7 @@ import fr.ifremer.tutti.ui.swing.util.comment.CommentCellRenderer; import fr.ifremer.tutti.ui.swing.util.computable.ComputableDataTableCell; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; import fr.ifremer.tutti.ui.swing.util.table.CaracteristicColumnIdentifier; +import fr.ifremer.tutti.util.Weights; import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections4.CollectionUtils; @@ -83,6 +86,7 @@ import org.nuiton.jaxx.application.ApplicationBusinessException; import javax.swing.JComponent; import javax.swing.JFrame; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.JTextField; @@ -96,6 +100,8 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -144,25 +150,76 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci protected ApplySpeciesFrequencyRafaleAction applySpeciesFrequencyRafaleAction; + protected PropertyChangeListener obsChangedListener; + public SpeciesFrequencyUIHandler() { super(SpeciesFrequencyRowModel.PROPERTY_LENGTH_STEP, SpeciesFrequencyRowModel.PROPERTY_NUMBER, SpeciesFrequencyRowModel.PROPERTY_WEIGHT); - this.feedReaderListener = event -> { + this.feedReaderListener = new FeedReaderListener() { - final FeedReaderMeasureRecord record = event.getRecord(); + @Override + public void recordRead(FeedReaderEvent event) { + final FeedReaderMeasureRecord record = event.getRecord(); - SwingUtilities.invokeLater( - () -> { - if (!getModel().isSimpleCountingMode()) { + SwingUtilities.invokeLater( + () -> { + if (!getModel().isSimpleCountingMode()) { - // can try to consume value - consumeFeedRecord(record); + // can try to consume value + consumeFeedRecord(record); + } } + ); + } + }; + + this.obsChangedListener = new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + IndividualObservationBatchRowModel row = (IndividualObservationBatchRowModel) evt.getSource(); + String propertyName = evt.getPropertyName(); + + if (getModel().mustCopyIndividualObservationSize() + && IndividualObservationBatchRowModel.PROPERTY_SIZE.equals(propertyName)) { + + Float oldValue = (Float) evt.getOldValue(); + Float newValue = (Float) evt.getNewValue(); + updateFrequencyRowsNumbers(oldValue, newValue); + + Float weight = row.getWeight(); + if (getModel().mustCopyIndividualObservationWeight() && weight != null) { + updateFrequencyRowsWeights(oldValue, -weight); + updateFrequencyRowsWeights(newValue, weight); } - ); + } + + if (getModel().mustCopyIndividualObservationWeight() + && IndividualObservationBatchRowModel.PROPERTY_WEIGHT.equals(propertyName)) { + + 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 (weightToAdd != null) { + updateFrequencyRowsWeights(row.getSize(), weightToAdd); + } + } + } + }; } @@ -322,8 +379,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci Caracteristic newValue = (Caracteristic) evt.getNewValue(); // get step from the pmfm float step1 = getStep(newValue); - getModel().setStep(step1); - getModel().setDataSetIntervalWidth(step1); + 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())) { @@ -333,6 +390,8 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } } SpeciesFrequencyUIHandler.this.ui.getValidator().doValidate(); + + ((IndividualObservationBatchTableModel) ui.getObsTable().getModel()).setLengthstepCaracteristic(newValue); }); // when lengthStepCaracteristicUnit changed, let's updates the label of some fields @@ -385,6 +444,82 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci obsTableModel.setRows((List<IndividualObservationBatchRowModel>) evt.getNewValue()); }); + model.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, evt -> { + + CopyIndividualObservationMode newCopyMode = (CopyIndividualObservationMode) evt.getNewValue(); + CopyIndividualObservationMode oldCopyMode = (CopyIndividualObservationMode) evt.getOldValue(); + + if (oldCopyMode == CopyIndividualObservationMode.NOTHING) { + + long rowsWithData = model.getRows().stream() + .filter(row -> row.getLengthStep() != null + || row.getNumber() != null + || row.getWeight() != null) + .count(); + + if (rowsWithData > 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) { + return; + } + } + } + + model.getRows().clear(); + model.reloadRows(); + + if (newCopyMode != null) { + if (newCopyMode != CopyIndividualObservationMode.NOTHING) { + + Caracteristic lengthStepCaracteristic = model.getLengthStepCaracteristic(); + for (IndividualObservationBatchRowModel obsRow : model.getIndividualObservationRows()) { + + Float size = obsRow.getSize(); + if (size != null) { + size = model.getLengthStep(size); + if (log.isInfoEnabled()) { + log.info("size : " + size); + } + SpeciesFrequencyRowModel row = model.getRowCache().get(size); + if (row == null) { + row = getTableModel().createNewRow(); + row.setLengthStep(size); + row.setLengthStepCaracteristic(lengthStepCaracteristic); + model.getRows().add(row); + model.getRowCache().put(size, row); + } + row.incNumber(); + if (newCopyMode == CopyIndividualObservationMode.ALL && obsRow.getWeight() != null) { + row.addToWeight(obsRow.getWeight()); + } + } + } + + Collections.sort(model.getRows()); + + } else { + getTableModel().addNewRow(); + } + + model.reloadRows(); + + } + + getTableModel().fireTableDataChanged(); + + }); + // set the pattern to the weight in simple counting mode according to the weight unit ui.getSimpleCountingWeightField().setNumberPattern(weightUnit.getNumberEditorPattern()); @@ -469,7 +604,15 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci model.setMinStep(null); model.setMaxStep(null); model.setRtp(null); - model.setIndividualObservationRows(new ArrayList<>()); + + ((IndividualObservationBatchTableModel) ui.getObsTable().getModel()).setSpecies(speciesBatch.getSpecies()); + + ArrayList<IndividualObservationBatchRowModel> individualObservationRows = new ArrayList<>(); + IndividualObservationBatchRowModel emptyRow = + ((IndividualObservationBatchTableModel) ui.getObsTable().getModel()).createNewRow(); + emptyRow.addPropertyChangeListener(obsChangedListener); + individualObservationRows.add(emptyRow); + model.setIndividualObservationRows(individualObservationRows); frequencyEditor = editor; @@ -641,6 +784,62 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } + public void updateFrequencyRowsNumbers(Float lengthStepToDec, Float lengthStepToInc) { + if (log.isInfoEnabled()) { + log.info("updateFrequencyRowsNumbers " + lengthStepToDec + ", " + lengthStepToInc); + } + + SpeciesFrequencyTableModel tableModel = getTableModel(); + + if (lengthStepToDec != null) { + lengthStepToDec = getModel().getLengthStep(lengthStepToDec); + + SpeciesFrequencyRowModel row = getRowForLengthstep(lengthStepToDec); + row.decNumber(); + + if (row.getNumber() == 0) { + int rowIndex = tableModel.getRowIndex(row); + tableModel.removeRow(rowIndex); + getModel().getRowCache().remove(lengthStepToDec); + + } else { + tableModel.updateRow(row); + } + } + + if (lengthStepToInc != null) { + lengthStepToInc = getModel().getLengthStep(lengthStepToInc); + + SpeciesFrequencyRowModel row = getRowForLengthstep(lengthStepToInc); + row.incNumber(); + tableModel.updateRow(row); + } + } + + public void updateFrequencyRowsWeights(Float lengthStep, Float weight) { + if (log.isInfoEnabled()) { + log.info("updateFrequencyRowsWeights " + lengthStep + ", " + weight); + } + if (lengthStep != null && weight != null) { + + SpeciesFrequencyTableModel tableModel = getTableModel(); + + lengthStep = getModel().getLengthStep(lengthStep); + + SpeciesFrequencyRowModel row = getRowForLengthstep(lengthStep); + row.addToWeight(weight); + + if (Weights.isNullOrZero(row.getWeight())) { + int rowIndex = tableModel.getRowIndex(row); + tableModel.removeRow(rowIndex); + getModel().getRowCache().remove(lengthStep); + + } else { + tableModel.updateRow(row); + } + } + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// @@ -870,14 +1069,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } - { // Weight column - - addFloatColumnToModel(columnModel, - IndividualObservationBatchTableModel.WEIGHT, - weightUnit, - obsTable); - } - { // Size column addFloatColumnToModel(columnModel, @@ -886,18 +1077,16 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci obsTable); } - { // Length step caracteristic column - - addComboDataColumnToModel(columnModel, - IndividualObservationBatchTableModel.LENGTH_STEP_CARACTERISTIC, - getDecorator(Caracteristic.class, null), - getDataContext().getLengthStepCaracteristics()); + { // Weight column + addFloatColumnToModel(columnModel, + IndividualObservationBatchTableModel.WEIGHT, + weightUnit, + obsTable); } List<Caracteristic> defaultCaracteristic = getModel().getDefaultCaracteristic(); - for (Caracteristic caracteristic : defaultCaracteristic) { String header = caracteristicDecorator.toString(caracteristic); String headerTip = caracteristicTipDecorator.toString(caracteristic); @@ -978,14 +1167,27 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci tableModel.addTableModelListener(e -> { - if (e.getType() == TableModelEvent.DELETE) { - int firstRow = e.getFirstRow(); - for (int i = firstRow ; i < tableModel.getRowCount() ; i++) { - tableModel.getRows().get(i).setRankOrder(i + 1); - } + int firstRow = e.getFirstRow(); + int lastRow = e.getLastRow(); + + switch (e.getType()) { + case TableModelEvent.DELETE: + for (int i = firstRow ; i < tableModel.getRowCount() ; i++) { + tableModel.getRows().get(i).setRankOrder(i + 1); + } + break; + + case TableModelEvent.INSERT: + for (int i = firstRow ; i <= lastRow ; i++) { + IndividualObservationBatchRowModel newRow = tableModel.getRows().get(i); + newRow.addPropertyChangeListener(obsChangedListener); + + if (getModel().mustCopyIndividualObservationSize()) { + updateFrequencyRowsNumbers(null, newRow.getSize()); + } + } } }); - } protected void consumeFeedRecord(FeedReaderMeasureRecord record) { @@ -1096,6 +1298,28 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci return label + " (" + unit + ")"; } + protected SpeciesFrequencyRowModel getRowForLengthstep(float lengthstep) { + Map<Float, SpeciesFrequencyRowModel> rowCache = getModel().getRowCache(); + + SpeciesFrequencyRowModel row = rowCache.get(lengthstep); + + if (row == null) { + row = getTableModel().createNewRow(); + row.setLengthStep(lengthstep); + rowCache.put(lengthstep, row); + + // get new index + List<Float> steps = Lists.newArrayList(rowCache.keySet()); + steps.add(lengthstep); + Collections.sort(steps); + + int indexToInsert = steps.indexOf(lengthstep); + getTableModel().addNewRow(indexToInsert, row); + } + + return row; + } + @Override public <E> void initBeanFilterableComboBox(BeanFilterableComboBox<E> comboBox, List<E> data, E selectedData) { super.initBeanFilterableComboBox(comboBox, data, selectedData); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java index b94a76b..ef543ba 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 @@ -242,7 +242,7 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa * What to copy from the individual observations to the data table * @since 4.5 */ - protected CopyIndividualObservationMode copyIndividualObservationMode; + protected CopyIndividualObservationMode copyIndividualObservationMode = CopyIndividualObservationMode.NOTHING; /** * To store frequencies graph series. @@ -326,11 +326,8 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa if (averageWeight != null) { averageWeightsSeries.addOrUpdate(lengthStep, averageWeight); } - } - } - } recomputeTotalNumberAndWeight(); @@ -605,6 +602,26 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa firePropertyChange(PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE, oldValue, copyIndividualObservationMode); } + public boolean mustCopyIndividualObservationSize() { + return isCopyIndividualObservationAll() || isCopyIndividualObservationSize(); + } + + public boolean mustCopyIndividualObservationWeight() { + return isCopyIndividualObservationAll(); + } + + public boolean isCopyIndividualObservationAll() { + return copyIndividualObservationMode == CopyIndividualObservationMode.ALL; + } + + public boolean isCopyIndividualObservationNothing() { + return copyIndividualObservationMode == CopyIndividualObservationMode.NOTHING; + } + + public boolean isCopyIndividualObservationSize() { + return copyIndividualObservationMode == CopyIndividualObservationMode.SIZE; + } + public Set<SpeciesFrequencyRowModel> getEmptyRows() { return emptyRows; } 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 ed32fd8..61bb6fc 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 @@ -3,6 +3,8 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.ac import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.individualobservation.IndividualObservationBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; import org.jdesktop.swingx.JXTable; @@ -50,6 +52,15 @@ public class RemoveObservationAction extends SimpleActionSupport<SpeciesFrequenc if (answer == JOptionPane.YES_OPTION) { + SpeciesFrequencyUIModel model = ui.getModel(); + SpeciesFrequencyUIHandler handler = ui.getHandler(); + + rowsToDelete.forEach(row -> { + if (model.mustCopyIndividualObservationSize()) { + handler.updateFrequencyRowsNumbers(row.getSize(), null); + } + }); + int minSelection = obsTable.getSelectionModel().getMinSelectionIndex(); int maxSelection = obsTable.getSelectionModel().getMaxSelectionIndex(); obsTableModel.getRows().removeAll(rowsToDelete); diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index d62ccbc..9b4f06d 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -970,6 +970,8 @@ tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic= tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic.tip= tutti.editIndividualObservationBatch.table.header.otherCaracteristics= tutti.editIndividualObservationBatch.table.header.otherCaracteristics.tip= +tutti.editIndividualObservationBatch.table.header.rank= +tutti.editIndividualObservationBatch.table.header.rank.tip= tutti.editIndividualObservationBatch.table.header.size= tutti.editIndividualObservationBatch.table.header.size.tip= tutti.editIndividualObservationBatch.table.header.species= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 02ff596..e75bab3 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -1367,6 +1367,9 @@ tutti.editSpeciesFrequencies.askBeforeSave.help=Que voulez-vous faire?<ul><li><s tutti.editSpeciesFrequencies.askBeforeSave.message=La saisie comporte des classes de taille avec et sans poids associés.<br/><strong>Seules les classes de taille avec poids seront dans ce cas sauvegardées.</strong> tutti.editSpeciesFrequencies.askBeforeSave.title=Confirmer l'enregistrement des mensurations tutti.editSpeciesFrequencies.averageWeight.label=Poids moyen +tutti.editSpeciesFrequencies.changeCopyMode.confirm.help=Que voulez-vous faire ?<ul><li><strong>Annuler</strong> pour ne pas changer de mode de copie</li><li><strong>OK</strong> pour changer de mode de copie et supprimer les données saisies</li></ul> +tutti.editSpeciesFrequencies.changeCopyMode.confirm.message=Vous êtes sur le point de changer de mode de copie alors que des données ont été saisies dans les mensurations.<br/>Si vous changez de mode, les données vont être supprimées. +tutti.editSpeciesFrequencies.changeCopyMode.confirm.title=Changement de mode de copie tutti.editSpeciesFrequencies.error.itchyometer.bad.record=La mesure provenant de l'ichtyomètre n'est pas valide (la donnée est peut-être corrompue) \:<br/><ul><li>Enregistrement \: <strong>%s</strong></li><li>CRC \: <strong>%s</strong></li><li>CRC calculé \: <strong>%s</strong></li></ul> tutti.editSpeciesFrequencies.error.length.doublon=La classe de taille <strong>%s</strong> est utilisée plusieurs fois (deuxième occurrence trouvée à la ligne <strong>%s</strong>), ce qui n'est pas autorisé.<hr/>Veuillez corriger cela pour pouvoir enregistrer les mensurations. tutti.editSpeciesFrequencies.field.addIndividualObservationOnRafale=Ajouter aux observations individuelles -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm