This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 65484e68b6aaf38f8b8039a26cf878aab06528cd Author: Kevin Morin <morin@codelutin.com> Date: Wed Dec 10 09:22:20 2014 +0100 empecher de saisir plusieurs fois la même colonne dans les caracteristiques --- .../tutti/ui/swing/action/SaveProtocolAction.java | 5 +- .../fishing/AbstractCaracteristicTabUIHandler.java | 1 + .../content/protocol/EditProtocolUIHandler.java | 70 +++++++++++++++++++++- .../content/protocol/EditProtocolUIModel.java | 50 +++++++++++++++- .../resources/i18n/tutti-ui-swing_fr_FR.properties | 16 ++--- 5 files changed, 128 insertions(+), 14 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java index be1ba1a..c0a14f6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/SaveProtocolAction.java @@ -81,7 +81,7 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, Collection<EditProtocolCaracteristicsRowModel> protocolCaracteristicMappingRows = getUI().getModel().getCaracteristicMappingRows(); List<CaracteristicMappingRow> caracteristicMappingRows = new ArrayList<CaracteristicMappingRow>(); for (EditProtocolCaracteristicsRowModel row : protocolCaracteristicMappingRows) { - if (row.getPsfm() != null && row.getType() != null) { + if (row.isValid()) { caracteristicMappingRows.add(row.toEntity()); } } @@ -90,7 +90,8 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, List<EditProtocolOperationFieldsRowModel> protocolOperationFieldMappingRows = getUI().getModel().getOperationFieldMappingRows(); List<OperationFieldMappingRow> operationFieldMappingRows = new ArrayList<OperationFieldMappingRow>(); for (EditProtocolOperationFieldsRowModel row : protocolOperationFieldMappingRows) { - if (StringUtils.isNotBlank(row.getField()) && StringUtils.isNotBlank(row.getImportColumn())) { + if (StringUtils.isNotBlank(row.getField()) && StringUtils.isNotBlank(row.getImportColumn()) + && row.isValid()) { operationFieldMappingRows.add(row.toEntity()); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java index c8a8317..a4cab77 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/AbstractCaracteristicTabUIHandler.java @@ -213,6 +213,7 @@ public abstract class AbstractCaracteristicTabUIHandler for (Caracteristic caracteristic : caracteristicMap.keySet()) { thisCaracteristicMap.put(caracteristic, caracteristicMap.get(caracteristic)); } + getModel().setModify(true); updateRows(); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java index de0aed7..8333438 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java @@ -812,10 +812,26 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI @Override public void propertyChange(PropertyChangeEvent evt) { EditProtocolCaracteristicsRowModel row = (EditProtocolCaracteristicsRowModel) evt.getSource(); - row.setValid(row.getType() != null); + EditProtocolUIModel model = getModel(); + + if (EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_COLUMN.equals(evt.getPropertyName())) { + String oldValue = (String) evt.getOldValue(); + if (oldValue != null) { + model.decNumberOfRows(oldValue); + } + String newValue = (String) evt.getNewValue(); + if (newValue != null) { + model.incNumberOfRows(newValue); + } + + recomputeRowsValidState(); + + } else { + row.setValid(isCaracteristicsRowValid(row)); + } if (row.isValid()) { - getModel().setModify(true); + model.setModify(true); } } }); @@ -982,6 +998,28 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI protected EditProtocolOperationFieldsRowModel createOperationFieldRow(String property, String column) { EditProtocolOperationFieldsRowModel newRow = new EditProtocolOperationFieldsRowModel(); + newRow.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + EditProtocolOperationFieldsRowModel row = (EditProtocolOperationFieldsRowModel) evt.getSource(); + EditProtocolUIModel model = getModel(); + + //update number of rows by column + if (EditProtocolOperationFieldsRowModel.PROPERTY_IMPORT_COLUMN.equals(evt.getPropertyName())) { + String oldValue = (String) evt.getOldValue(); + if (oldValue != null) { + model.decNumberOfRows(oldValue); + } + String newValue = (String) evt.getNewValue(); + if (newValue != null) { + model.incNumberOfRows(newValue); + } + + recomputeRowsValidState(); + } + } + }); + newRow.setValid(true); newRow.setField(property); newRow.setImportColumn(column); newRow.setValid(true); @@ -994,6 +1032,34 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return newRow; } + protected void recomputeRowsValidState() { + EditProtocolUIModel model = getModel(); + + for (EditProtocolCaracteristicsRowModel row : model.getCaracteristicMappingRows()) { + row.setValid(isCaracteristicsRowValid(row)); + } + + for (EditProtocolOperationFieldsRowModel row : model.getOperationFieldMappingRows()) { + row.setValid(isOperationFieldsRowValid(row)); + } + + getCaracteristicsMappingTable().repaint(); + getOperationFieldsMappingTable().repaint(); + } + + protected boolean isOperationFieldsRowValid(EditProtocolOperationFieldsRowModel row) { + EditProtocolUIModel model = getModel(); + String importColumn = row.getImportColumn(); + return importColumn == null || model.numberOfRows(importColumn) < 2; + } + + protected boolean isCaracteristicsRowValid(EditProtocolCaracteristicsRowModel row) { + EditProtocolUIModel model = getModel(); + String importColumn = row.getImportColumn(); + return row.getType() != null && + (importColumn == null || model.numberOfRows(importColumn) < 2); + } + protected void populateImportColumnTableEditors() { Collection<String> importColumns = getModel().getImportColumns(); ArrayList<String> dataToList = new ArrayList<String>(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java index ef50154..0ef2903 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java @@ -23,6 +23,7 @@ package fr.ifremer.tutti.ui.swing.content.protocol; */ import com.google.common.base.Function; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; @@ -35,9 +36,11 @@ import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; +import org.apache.commons.lang3.mutable.MutableInt; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -127,9 +130,18 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, protected Map<String, Caracteristic> allCaracteristic; - protected Map<Caracteristic, EditProtocolCaracteristicsRowModel> caracteristicMappingRows; + protected Map<Caracteristic, EditProtocolCaracteristicsRowModel> caracteristicMappingRows = + new HashMap<Caracteristic, EditProtocolCaracteristicsRowModel>(); - protected List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows; + protected List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows = + new ArrayList<EditProtocolOperationFieldsRowModel>(); + + /** + * Number of rows for each column + * + * @since 3.10 + */ + protected Map<String, MutableInt> numberOfRowsByColumn = new HashMap<String, MutableInt>(); protected List<EditProtocolSpeciesRowModel> speciesRow; @@ -794,4 +806,38 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, public OperationFieldMappingRow getOperationFieldMapping(int index) { return editObject.getOperationFieldMapping(index); } + + public int numberOfRows(String column) { + int result = 0; + MutableInt mutableInt = numberOfRowsByColumn.get(column); + if (mutableInt != null) { + result = mutableInt.intValue(); + } + return result; + } + + public void resetNumbersOfRows() { + numberOfRowsByColumn = new HashMap<String, MutableInt>(); + } + + public int incNumberOfRows(String column) { + MutableInt mutableInt = numberOfRowsByColumn.get(column); + if (mutableInt == null) { + mutableInt = new MutableInt(1); + numberOfRowsByColumn.put(column, mutableInt); + } else { + mutableInt.increment(); + } + return mutableInt.intValue(); + + } + + public int decNumberOfRows(String column) { + MutableInt mutableInt = numberOfRowsByColumn.get(column); + Preconditions.checkNotNull(mutableInt); + Preconditions.checkArgument(mutableInt.intValue() > 0); + mutableInt.decrement(); + return mutableInt.intValue(); + } + } 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 a79fdca..fc0ec56 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 @@ -677,16 +677,16 @@ tutti.editFishingOperation.action.attachments.tip=Pièces-jointes de l'opératio tutti.editFishingOperation.action.cancelEditFishingOperation=Annuler tutti.editFishingOperation.action.cancelEditFishingOperation.mnemonic=A tutti.editFishingOperation.action.cancelEditFishingOperation.tip=Annuler la création du trait -tutti.editFishingOperation.action.chooseColumnsFile.import=Choisir le fichier de colonnes +tutti.editFishingOperation.action.chooseColumnsFile.import=Choisir le fichier de paramètres tutti.editFishingOperation.action.deleteFishingOperation.message=Vous êtes sur le point de supprimer l'opération de pêche <strong>%s</strong> tutti.editFishingOperation.action.deleteFishingOperation.tip=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.deleteFishingOperation.title=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.editFishingOperation.tip=Éditer l'opération de pêche tutti.editFishingOperation.action.importColumns.operationNotFound=Le trait n'a pas été trouvé dans le fichier importé tutti.editFishingOperation.action.importColumns.success=Les données du fichier ont été importées dans le trait -tutti.editFishingOperation.action.importFromColumnFile=Import du fichier de colonnes +tutti.editFishingOperation.action.importFromColumnFile=Import du fichier de paramètre tutti.editFishingOperation.action.importFromColumnFile.mnemonic=c -tutti.editFishingOperation.action.importFromColumnFile.tip=Import du fichier de colonnes +tutti.editFishingOperation.action.importFromColumnFile.tip=Import du fichier de paramètres tutti.editFishingOperation.action.resetEditFishingOperation=Réinitialiser tutti.editFishingOperation.action.resetEditFishingOperation.mnemonic=R tutti.editFishingOperation.action.resetEditFishingOperation.tip=Réinitialiser l'édition du trait @@ -696,7 +696,7 @@ tutti.editFishingOperation.action.resetFishingOperationValidState.tip=Réinitial tutti.editFishingOperation.action.saveEditFishingOperation.mnemonic=E tutti.editFishingOperation.action.saveEditFishingOperation.tip=Enregistrer le trait tutti.editFishingOperation.action.saveFishingOperation=Enregistrer -tutti.editFishingOperation.action.title.choose.importColumnsFile=Importer par fichier de colonnes +tutti.editFishingOperation.action.title.choose.importColumnsFile=Importer le fichier de paramètres tutti.editFishingOperation.askCancelEditBeforeLeaving.cancelEditFishingOperation=Le trait modifié n'est pas valide et ne peut pas être enregistré tutti.editFishingOperation.askSaveBeforeLeaving.createFishingOperation=Le trait n'a pas été créé tutti.editFishingOperation.askSaveBeforeLeaving.saveFishingOperation=Des modifications sur le trait n'ont pas été enregistrées @@ -880,7 +880,7 @@ tutti.editProtocol.action.addCaracteristicMapping.mnemonic=j tutti.editProtocol.action.addCaracteristicMapping.tip=Ajouter aux caractéristiques du trait tutti.editProtocol.action.addSpeciesProtocol.mnemonic=j tutti.editProtocol.action.addSpeciesProtocol.tip=Ajouter une espèce au protocole -tutti.editProtocol.action.chooseColumnsFile.import=Choisir le fichier contenant les colonnes +tutti.editProtocol.action.chooseColumnsFile.import=Choisir le fichier de paramètres tutti.editProtocol.action.chooseProtocolBenthosFile=Choisir le fichier des benthos tutti.editProtocol.action.chooseProtocolCaracteristicFile=Choisir le fichier des caractéristiques tutti.editProtocol.action.chooseProtocolSpeciesFile=Choisir le fichier des espèces @@ -910,9 +910,9 @@ tutti.editProtocol.action.importProtocolBenthos.tip=Importer les benthos dans le tutti.editProtocol.action.importProtocolCaracteristic=Importer les caractéristiques tutti.editProtocol.action.importProtocolCaracteristic.mnemonic=i tutti.editProtocol.action.importProtocolCaracteristic.tip=Importer les caractéristiques dans le protocole -tutti.editProtocol.action.importProtocolColumns=Importer les colonnes d'import +tutti.editProtocol.action.importProtocolColumns=Importer le fichier de paramètres tutti.editProtocol.action.importProtocolColumns.mnemonic=c -tutti.editProtocol.action.importProtocolColumns.tip=Importer les colonnes d'import +tutti.editProtocol.action.importProtocolColumns.tip=Importer le fichier de paramètres tutti.editProtocol.action.importProtocolSpecies=Importer les espèces tutti.editProtocol.action.importProtocolSpecies.mnemonic=é tutti.editProtocol.action.importProtocolSpecies.speciesInBenthos=Les espèces suivantes n'ont pas été importées car elles sont déjà présentes dans le benthos \:<ul>%s</ul> @@ -937,7 +937,7 @@ tutti.editProtocol.action.selectOtherBenthos.tip=Sélectionner une autre espèce tutti.editProtocol.action.selectOtherSpecies=... tutti.editProtocol.action.selectOtherSpecies.mnemonic=. tutti.editProtocol.action.selectOtherSpecies.tip=Sélectionner une autre espèce (dans les synonymes) -tutti.editProtocol.action.title.choose.importColumnsFile=Importer les colonnes d'import +tutti.editProtocol.action.title.choose.importColumnsFile=Importer le fichier de paramètres tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveProtocol=Le protocole n'est pas valide et ne peut pas être enregistré tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveSampleCategoryModel=La catégorisation n'est pas valide et ne peut pas être enregistré tutti.editProtocol.askSaveBeforeLeaving.saveProtocol=Des modifications sur le protocole n'ont pas été enregistrées -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.