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 fe4f48b73dec212087c14259671f45b27408f266 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Apr 26 13:16:35 2016 +0200 Toujours utiliser la même colonne pour la maturité (See #8273) --- .../IndividualObservationBatchTableHandler.java | 85 +++++++++++----------- .../IndividualObservationBatchTableModel.java | 23 +++--- .../frequency/MaturityColumnIdentifier.java | 45 ++++++++++++ .../frequency/SpeciesFrequencyUIHandler.java | 15 ++-- .../resources/i18n/tutti-ui-swing_en_GB.properties | 2 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 2 + 6 files changed, 110 insertions(+), 62 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 a442060..402a73c 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 @@ -52,14 +52,15 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.autocomplete.ComboBoxCellEditor; import org.jdesktop.swingx.decorator.HighlightPredicate; import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.jdesktop.swingx.table.TableColumnExt; import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.decorator.Decorator; -import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; +import javax.swing.JComboBox; import javax.swing.event.TableModelEvent; import java.awt.Color; import java.beans.PropertyChangeListener; @@ -73,6 +74,8 @@ import java.util.Objects; import java.util.Set; import java.util.function.Function; +import static org.nuiton.i18n.I18n.t; + /** * To manage individual observations. * @@ -114,13 +117,11 @@ public class IndividualObservationBatchTableHandler implements Closeable { */ private final Map<String, Caracteristic> maturityCaracteristics; /** - * L'identifiant de la colonne de maturité si elle existe. - */ - private ColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId; - /** * Décorateur d'espèce. */ private final Decorator<Species> speciesDecorator; + private final Decorator<Caracteristic> caracteristicDecorator; + private final Decorator<Caracteristic> caracteristicTipDecorator; /** * Pour calculer la recopie d'une observation individuelle vers les mensurations. */ @@ -167,6 +168,8 @@ public class IndividualObservationBatchTableHandler implements Closeable { this.uiHandler = ui.getHandler(); this.speciesDecorator = uiHandler.getDecorator(Species.class, DecoratorService.WITH_SURVEY_CODE_NO_NAME); + this.caracteristicDecorator = uiHandler.getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_PARAMETER_ONLY_WITH_UNIT); + this.caracteristicTipDecorator = uiHandler.getDecorator(Caracteristic.class, DecoratorService.CARACTERISTIC_WITH_UNIT); this.individualObservationTable = ui.getObsTable(); this.frequencyTableModel = uiHandler.getTableModel(); @@ -368,6 +371,15 @@ public class IndividualObservationBatchTableHandler implements Closeable { caracteristic); } + + // Maturity caracteristic column + + Decorator<CaracteristicQualitativeValue> caracteristicQualitativeDecorator = uiHandler.getDecorator(CaracteristicQualitativeValue.class, null); + uiHandler.addComboDataColumnToModel(columnModel, + IndividualObservationBatchTableModel.MATURITY, + caracteristicQualitativeDecorator, + new ArrayList<>()); + { // Other caracteristics column Set<Caracteristic> caracteristicsToSkip = Collections.unmodifiableSet( @@ -520,23 +532,11 @@ public class IndividualObservationBatchTableHandler implements Closeable { @Override public void close() { - // on supprime la colonne maturité en fermant, pour avoir les même colonnes qu'à la création de l'écran (important pour la swing session) - removeMaturityColumnIfPresent(); - model.getIndividualObservationUICache().close(); model.getSamplingCodeUICache().close(); } - protected void removeMaturityColumnIfPresent() { - if (maturityColumnId != null) { - TableColumnExt maturityColumn = individualObservationTable.getColumnExt(maturityColumnId); - individualObservationTable.removeColumn(maturityColumn); - individualObservationTableModel.removeMaturityIdentifier(maturityColumnId); - maturityColumnId = null; - } - } - public List<IndividualObservationBatchRowModel> loadRows(Species species, List<IndividualObservationBatchRowModel> individualObservations) { individualObservationTableModel.setSpecies(species); @@ -591,43 +591,39 @@ public class IndividualObservationBatchTableHandler implements Closeable { // Add maturity column if necessary individualObservationsModel.setMaturityCaracteristic(maturityCaracteristic); - if (maturityCaracteristic != null) { + MaturityColumnIdentifier columnIdentifier = IndividualObservationBatchTableModel.MATURITY; + columnIdentifier.setCaracteristic(maturityCaracteristic); - // remove the row sorter while we add the new column - individualObservationTable.setRowSorter(null); - individualObservationTable.setAutoCreateRowSorter(false); + TableColumnExt columnModel = ((TableColumnModelExt) individualObservationTable.getColumnModel()).getColumnExt(columnIdentifier); - TableColumnModelExt columnModel = (TableColumnModelExt) individualObservationTable.getColumnModel(); + boolean noMaturity = maturityCaracteristic == null; - ColumnIdentifier<IndividualObservationBatchRowModel> maturityColumnId = uiHandler.addCaracteristicColumnToModel(individualObservationTable, - columnModel, - maturityCaracteristic); + columnModel.setVisible(!noMaturity); + ComboBoxCellEditor cellEditor = (ComboBoxCellEditor) columnModel.getCellEditor(); + JComboBox comboBox = (JComboBox) cellEditor.getComponent(); - Objects.requireNonNull(maturityColumnId); - this.maturityColumnId = maturityColumnId; + List<CaracteristicQualitativeValue> dataList; - individualObservationTableModel.addMaturityIdentifier(maturityColumnId); + String title; + String tip; - // on cherche le bon index où insérer la colonne maturité (avant les autres caractéristiques, mais elle peut etre cachee) - int modelIndex = columnModel.getColumnExt(IndividualObservationBatchTableModel.OTHER_CARACTERISTICS).getModelIndex(); - int indexToMove = individualObservationTable.convertColumnIndexToView(modelIndex); + if (noMaturity) { + dataList = Collections.emptyList(); + title = t(columnIdentifier.getHeaderI18nKey()); + tip = t(columnIdentifier.getHeaderTipI18nKey()); - // si la colonne autres caracteristiques est cachée, alors on cherche la première colonne suivante non cachée - int columnCount = columnModel.getColumnCount(true); - while (indexToMove == -1 && modelIndex < columnCount) { - indexToMove = individualObservationTable.convertColumnIndexToView(modelIndex); - modelIndex++; - } - // si une colonne après celle des autres caractéristiques est visible, on déplace la maturité avant cette colonne - // sinon, on laisse la maturité à la fin - if (modelIndex != -1) { - individualObservationTable.moveColumn(columnModel.getColumnCount() - 1, indexToMove); + } else { + dataList = new ArrayList<>(maturityCaracteristic.getQualitativeValue()); + if (!dataList.isEmpty() && dataList.get(0) != null) { + dataList.add(0, null); } - // reset the row sorter - individualObservationTable.setAutoCreateRowSorter(true); - + title = caracteristicDecorator.toString(maturityCaracteristic); + tip = caracteristicTipDecorator.toString(maturityCaracteristic); } + columnModel.setTitle(title); + columnModel.setToolTipText(tip); + SwingUtil.fillComboBox(comboBox, dataList, null); } @@ -674,5 +670,6 @@ public class IndividualObservationBatchTableHandler implements Closeable { } } + } 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 49fee2d..ec5388d 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 @@ -71,6 +71,8 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab n("tutti.editIndividualObservationBatch.table.header.size"), n("tutti.editIndividualObservationBatch.table.header.size.tip")); + public static final MaturityColumnIdentifier MATURITY = new MaturityColumnIdentifier(); + public static final ColumnIdentifier<IndividualObservationBatchRowModel> OTHER_CARACTERISTICS = ColumnIdentifier.newId( IndividualObservationBatchRowModel.PROPERTY_CARACTERISTICS, n("tutti.editIndividualObservationBatch.table.header.otherCaracteristics"), @@ -114,6 +116,8 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab this.uiModel = uiModel; this.model = uiModel.getIndividualObservationModel(); this.weightUnit = weightUnit; + //FIXME A quoi ça sert ? la maturité est une default caracteristic donc l'éditeur de sa colonne fait le taf, non ? + //FIXME Eviter de mettre des listeners à drotie, à gauche, tout mettre au même endroit si possible qu'on ai une meilleure vision de ce qui se passe // Lorsque la caracteristique de maturité change, on met à jour defaultCaracteristicsMap this.model.addPropertyChangeListener(IndividualObservationBatchUIModel.PROPERTY_MATURITY_CARACTERISTIC, new PropertyChangeListener() { @Override @@ -147,14 +151,6 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } } - public void addMaturityIdentifier(ColumnIdentifier<IndividualObservationBatchRowModel> maturityIdentifer) { - identifiers.add(maturityIdentifer); - } - - public void removeMaturityIdentifier(ColumnIdentifier<IndividualObservationBatchRowModel> maturityIdentifer) { - identifiers.remove(maturityIdentifer); - } - public void setDefaultCaracteristicValues(CaracteristicMap defaultCaracteristicValues) { defaultCaracteristicsMap.replaceAll( (caracteristic, serializable) -> defaultCaracteristicValues.get(caracteristic) @@ -184,8 +180,7 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab } } - //FIXME Revoir ça, je comprends pas le but (mais en ayant déplacer le samplingCodePrefix ailleurs cela doit peut-être - //FIXME éviter de faire cela...) + //FIXME A quoi ça sert ? (j'ai déplacé le samplingCodePrefix ailleurs cela doit peut-être éviter de faire cela...) // quand l'utilisateur change le prefix dans la conf, si la ligne a deja un code prélèvement, // le prefix reste le même, même si l'utilisateur supprime le code et en regénère un // il faut pousser le nouveau prefix si l'utilisateur supprime le code @@ -206,7 +201,13 @@ public class IndividualObservationBatchTableModel extends AbstractApplicationTab ColumnIdentifier<IndividualObservationBatchRowModel> columnIdentifier) { boolean editable; - if (columnIdentifier instanceof CaracteristicColumnIdentifier) { + if (columnIdentifier instanceof MaturityColumnIdentifier) { + + MaturityColumnIdentifier maturityColumnIdentifier = (MaturityColumnIdentifier) columnIdentifier; + + editable = maturityColumnIdentifier.withCaracteristic(); + + } else if (columnIdentifier instanceof CaracteristicColumnIdentifier) { CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> caracteristicColumnIdentifier = (CaracteristicColumnIdentifier<IndividualObservationBatchRowModel>) columnIdentifier; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/MaturityColumnIdentifier.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/MaturityColumnIdentifier.java new file mode 100644 index 0000000..ef0c5fc --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/MaturityColumnIdentifier.java @@ -0,0 +1,45 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; + +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.ui.swing.util.table.CaracteristicColumnIdentifier; + +import static org.nuiton.i18n.I18n.n; + +/** + * Définition de la colonne de maturité (sa caractéristique est variale selon l'espèce du lot). + * + * Created on 26/04/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 4.5 + */ +public class MaturityColumnIdentifier extends CaracteristicColumnIdentifier<IndividualObservationBatchRowModel> { + + public MaturityColumnIdentifier() { + super(null, + IndividualObservationBatchRowModel.PROPERTY_DEFAULT_CARACTERISTICS, + n("tutti.editIndividualObservationBatch.table.header.maturityNotUsed"), + n("tutti.editIndividualObservationBatch.table.header.maturityNotUsed.tip")); + } + + public void setCaracteristic(Caracteristic caracteristic) { + this.caracteristic = caracteristic; + } + + public boolean withCaracteristic() { + return caracteristic != null; + } + + @Override + public Object getValue(IndividualObservationBatchRowModel entry) { + return caracteristic == null ? null : super.getValue(entry); + } + + @Override + public void setValue(IndividualObservationBatchRowModel entry, Object value) { + if (caracteristic != null) { + super.setValue(entry, value); + } + } + +} 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 77822e6..945b417 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 @@ -624,10 +624,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci EditSpeciesBatchPanelUI parent = getParentContainer(EditSpeciesBatchPanelUI.class); parent.switchToEditBatch(); - //FIXME Voir si on doit encore faire ça après le switch ? je pense que oui... -// // on supprime la colonne maturité en fermant, pour avoir les même colonnes qu'à la création de l'écran (important pour la swing session) -// removeMaturityColumnIfPresent(); - } public void editBatch(FrequencyCellEditor editor, String title) { @@ -635,9 +631,6 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SpeciesBatchRowModel speciesBatch = editor.getEditRow(); Objects.requireNonNull(speciesBatch, "Impossible d'éditer un lot non renseigné"); - // on enlève la colonne spécifique à l'espèce précédente - individualObservationBatchTableHandler.removeMaturityColumnIfPresent(); - SpeciesFrequencyUIModel model = getModel(); Objects.requireNonNull(title, "title can't be null here ?!"); @@ -1284,6 +1277,14 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } @Override + protected <R, B> TableColumnExt addComboDataColumnToModel(TableColumnModel model, + ColumnIdentifier<R> identifier, + Decorator<B> decorator, + List<B> data) { + return super.addComboDataColumnToModel(model, identifier, decorator, data); + } + + @Override protected void installTableKeyListener(TableColumnModel columnModel, JTable table, boolean enterToChangeRow) { super.installTableKeyListener(columnModel, table, enterToChangeRow); } 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 01b66f8..9e80615 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 @@ -1021,6 +1021,8 @@ tutti.editIndividualObservationBatch.table.header.id= tutti.editIndividualObservationBatch.table.header.id.tip= tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic= tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic.tip= +tutti.editIndividualObservationBatch.table.header.maturityNotUsed= +tutti.editIndividualObservationBatch.table.header.maturityNotUsed.tip= tutti.editIndividualObservationBatch.table.header.otherCaracteristics= tutti.editIndividualObservationBatch.table.header.otherCaracteristics.tip= tutti.editIndividualObservationBatch.table.header.rank= 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 b60f8a9..2d7bd5c 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 @@ -960,6 +960,8 @@ tutti.editIndividualObservationBatch.table.header.file=Pièces jointes tutti.editIndividualObservationBatch.table.header.file.tip=Pièces jointes tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic=Classe de taille tutti.editIndividualObservationBatch.table.header.lengthStepCaracteristic.tip=Classe de taille +tutti.editIndividualObservationBatch.table.header.maturityNotUsed=Maturité +tutti.editIndividualObservationBatch.table.header.maturityNotUsed.tip=Maturité non définie dans le procotole pour ce taxon tutti.editIndividualObservationBatch.table.header.otherCaracteristics=Autres caractéristiques tutti.editIndividualObservationBatch.table.header.otherCaracteristics.tip=Autres caractéristiques tutti.editIndividualObservationBatch.table.header.rank=N° -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.