This is an automated email from the git hooks/post-receive script. New commit to branch feature/5954 in repository tutti. See http://git.codelutin.com/tutti.git commit 538a1cad82fe0ed27a1d2baa929eb628639eb69b Author: Kevin Morin <morin@codelutin.com> Date: Mon Dec 8 17:38:25 2014 +0100 refactoring : table des caractéristiques non éditable, ajouter les caractéristiques depuis la liste déroulante au dessus --- .../entities/protocol/TuttiProtocols.java | 87 ++--- .../filtered-resources/tutti-help-fr.properties | 5 +- .../action/AddCaracteristicMappingAction.java | 96 ++++++ .../swing/action/ImportFromColumnFileAction.java | 87 +++-- .../swing/action/ImportProtocolBenthosAction.java | 2 +- .../swing/action/ImportProtocolSpeciesAction.java | 2 +- .../tutti/ui/swing/action/SaveProtocolAction.java | 24 +- .../content/protocol/CaracteristicMappingUI.css | 20 -- .../content/protocol/CaracteristicMappingUI.jaxx | 46 --- .../protocol/CaracteristicMappingUIHandler.java | 343 -------------------- .../protocol/CaracteristicMappingUIModel.java | 99 ------ .../EditProtocolCaracteristicsRowModel.java | 18 +- .../EditProtocolCaracteristicsTableModel.java | 6 +- .../EditProtocolOperationFieldsRowModel.java | 25 +- .../EditProtocolOperationFieldsTableModel.java | 5 +- .../ui/swing/content/protocol/EditProtocolUI.css | 31 ++ .../ui/swing/content/protocol/EditProtocolUI.jaxx | 30 +- .../content/protocol/EditProtocolUIHandler.java | 355 +++++++++++++++------ .../content/protocol/EditProtocolUIModel.java | 28 ++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 4 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 4 + 21 files changed, 610 insertions(+), 707 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java index afa555c..eaeae66 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java @@ -76,7 +76,7 @@ public class TuttiProtocols extends AbstractTuttiProtocols { /** Logger. */ private static final Log log = LogFactory.getLog(TuttiProtocols.class); - public static final int CURRENT_PROTOCOL_VERSION = 3; + public static final Integer CURRENT_PROTOCOL_VERSION = 3; public static void toFile(TuttiProtocol protocol, File file) { @@ -97,63 +97,70 @@ public class TuttiProtocols extends AbstractTuttiProtocols { } public static TuttiProtocol fromFile(File file) { - + TuttiProtocol result; Reader fileReader = null; try { fileReader = Files.newReader(file, Charsets.UTF_8); YamlReader reader = new YamlReader(fileReader, createConfig()); - TuttiProtocol result = reader.read(typeOfTuttiProtocol()); + result = reader.read(typeOfTuttiProtocol()); fileReader.close(); - // transform String to Integer... + if (!CURRENT_PROTOCOL_VERSION.equals(result.getVersion())) { + result = migrateProtocol(file); + } - Integer sampleCategoryIdToRemove = PmfmId.SORTED_UNSORTED.getValue(); + } catch (Exception e) { + result = migrateProtocol(file); - if (!result.isBenthosEmpty()) { - for (SpeciesProtocol speciesProtocol : result.getBenthos()) { - List mandatorySampleCategoryId = speciesProtocol.getMandatorySampleCategoryId(); - List<Integer> mandatorySampleCategoryIdInteger = Lists.newArrayList(); - for (Object o : mandatorySampleCategoryId) { - mandatorySampleCategoryIdInteger.add(Integer.valueOf(o.toString())); - } - mandatorySampleCategoryIdInteger.remove(sampleCategoryIdToRemove); - speciesProtocol.setMandatorySampleCategoryId(mandatorySampleCategoryIdInteger); + } finally { + IOUtils.closeQuietly(fileReader); + } + Integer sampleCategoryIdToRemove = PmfmId.SORTED_UNSORTED.getValue(); + // transform String to Integer... + if (!result.isBenthosEmpty()) { + for (SpeciesProtocol speciesProtocol : result.getBenthos()) { + List mandatorySampleCategoryId = speciesProtocol.getMandatorySampleCategoryId(); + List<Integer> mandatorySampleCategoryIdInteger = Lists.newArrayList(); + for (Object o : mandatorySampleCategoryId) { + mandatorySampleCategoryIdInteger.add(Integer.valueOf(o.toString())); } - } - if (!result.isSpeciesEmpty()) { - for (SpeciesProtocol speciesProtocol : result.getSpecies()) { - List mandatorySampleCategoryId = speciesProtocol.getMandatorySampleCategoryId(); - List<Integer> mandatorySampleCategoryIdInteger = Lists.newArrayList(); - for (Object o : mandatorySampleCategoryId) { - mandatorySampleCategoryIdInteger.add(Integer.valueOf(o.toString())); - } - mandatorySampleCategoryIdInteger.remove(sampleCategoryIdToRemove); - speciesProtocol.setMandatorySampleCategoryId(mandatorySampleCategoryIdInteger); + mandatorySampleCategoryIdInteger.remove(sampleCategoryIdToRemove); + speciesProtocol.setMandatorySampleCategoryId(mandatorySampleCategoryIdInteger); + } + } + if (!result.isSpeciesEmpty()) { + for (SpeciesProtocol speciesProtocol : result.getSpecies()) { + List mandatorySampleCategoryId = speciesProtocol.getMandatorySampleCategoryId(); + List<Integer> mandatorySampleCategoryIdInteger = Lists.newArrayList(); + for (Object o : mandatorySampleCategoryId) { + mandatorySampleCategoryIdInteger.add(Integer.valueOf(o.toString())); } + mandatorySampleCategoryIdInteger.remove(sampleCategoryIdToRemove); + speciesProtocol.setMandatorySampleCategoryId(mandatorySampleCategoryIdInteger); + } - return result; + } - } catch (Exception e) { - //try to load a v2 - try { - // try to load a v1 - TuttiProtocol2 tuttiProtocol2 = fromFileV2(file); + return result; + } - TuttiProtocol result = fromTuttiProtocol2(tuttiProtocol2); - return result; + protected static TuttiProtocol migrateProtocol(File file) { + //try to load a v2 + try { + // try to load a v1 + TuttiProtocol2 tuttiProtocol2 = fromFileV2(file); - } catch (Exception ee) { - // try to load a v1 - TuttiProtocol1 tuttiProtocol1 = fromFileV1(file); + TuttiProtocol result = fromTuttiProtocol2(tuttiProtocol2); + return result; - TuttiProtocol result = fromTuttiProtocol1(tuttiProtocol1); - return result; - } + } catch (Exception ee) { + // try to load a v1 + TuttiProtocol1 tuttiProtocol1 = fromFileV1(file); - } finally { - IOUtils.closeQuietly(fileReader); + TuttiProtocol result = fromTuttiProtocol1(tuttiProtocol1); + return result; } } 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 f5c6bc6..2597777 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,6 @@ #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Mon Dec 01 16:05:35 CET 2014 +#Mon Dec 08 17:29:36 CET 2014 +\ "tutti.editProtocol.action.addCaracteristicMapping.help"\ = tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -225,6 +226,7 @@ tutti.editProgram.field.name.help=editProgram.html\#fields tutti.editProgram.field.zone.help=editProgram.html\#fields tutti.editProgram.help=editProgram.html tutti.editProtocol.action.addBenthosProtocol.help=editProtocol.html\#actionsBenthos +tutti.editProtocol.action.addCaracteristicMapping.help= tutti.editProtocol.action.addSpeciesProtocol.help=editProtocol.html\#actionsSpecies tutti.editProtocol.action.closeEditProtocol.help=editProtocol.html\#actions tutti.editProtocol.action.exportProtocolAllCaracteristic.help=editProtocol.html\#actionsCaracteristics @@ -242,6 +244,7 @@ tutti.editProtocol.action.saveProtocol.help=editProtocol.html\#actions tutti.editProtocol.action.selectOtherBenthos.help=editProtocol.html\#actionsBenthos tutti.editProtocol.action.selectOtherSpecies.help=editProtocol.html\#actionsSpecies tutti.editProtocol.field.benthos.help=editProtocol.html\#fieldsBenthos +tutti.editProtocol.field.caracteristicMapping.help= tutti.editProtocol.field.comment.help=editProtocol.html\#fields tutti.editProtocol.field.gearUseFeature.help=editProtocol.html\#fieldsCaracteristics tutti.editProtocol.field.individualObservation.help=editProtocol.html\#fieldsCaracteristics diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java new file mode 100644 index 0000000..6b72393 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AddCaracteristicMappingAction.java @@ -0,0 +1,96 @@ +package fr.ifremer.tutti.ui.swing.action; + +/* + * #%L + * Tutti :: UI + * %% + * Copyright (C) 2012 - 2014 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Preconditions; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolCaracteristicsRowModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolCaracteristicsTableModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolSpeciesRowModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolSpeciesTableModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUI; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIHandler; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; + +import java.util.Collection; + +import static org.nuiton.i18n.I18n.t; + +/** + * To add a new species protocol. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.0 + */ +public class AddCaracteristicMappingAction extends AbstractTuttiAction<EditProtocolUIModel, EditProtocolUI, EditProtocolUIHandler> { + + public AddCaracteristicMappingAction(EditProtocolUIHandler handler) { + super(handler, false); + } + + protected Caracteristic caracteristic; + + protected EditProtocolCaracteristicsRowModel newRow; + + @Override + public void doAction() throws Exception { + + EditProtocolUI ui = getUI(); + + BeanFilterableComboBox<Caracteristic> caracteristicMappingCombBox = ui.getCaracteristicMappingComboBox(); + + caracteristic = (Caracteristic) caracteristicMappingCombBox.getSelectedItem(); + Preconditions.checkNotNull( + caracteristic, "Can't add a speciesProtocol with a null species"); + + // add new row to model (do it after combo stuff for ui best display) + newRow = handler.createEditProtocolCaracteristicsRowModel(); + newRow.setPsfm(caracteristic); + + getModel().getCaracteristicMappingRows().add(newRow); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + + // update comboboxes + getUI().getCaracteristicMappingComboBox().removeItem(caracteristic); + + // fire row was inserted in table model + EditProtocolCaracteristicsTableModel tableModel = getHandler().getCaracteristicMappingTableModel(); + tableModel.fireTableRowsInserted(newRow); + + // select this new row + int rowIndex = tableModel.getRowIndex(newRow); + SwingUtil.setSelectionInterval(handler.getCaracteristicsMappingTable(), rowIndex); + + // add notification + String caracteristicStr = decorate(caracteristic); + sendMessage(t("tutti.flash.info.caracteristic.add.to.protocol", + caracteristicStr)); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java index 259f96f..aaa73f6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -1,34 +1,36 @@ package fr.ifremer.tutti.ui.swing.action; -import com.csvreader.CsvReader; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.FishingOperations; import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.service.TuttiCsvUtil; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; -import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUIModel; -import org.apache.commons.io.Charsets; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.csv.Import; +import org.nuiton.csv.Import2; +import org.nuiton.csv.ImportConf; +import org.nuiton.csv.ImportRow; import org.nuiton.csv.ValueParser; import org.nuiton.csv.ext.CsvReaders; import java.io.File; import java.io.FileInputStream; -import java.nio.charset.Charset; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collection; -import java.util.Date; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -46,6 +48,8 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO protected File columnsFile; + protected String error; + public ImportFromColumnFileAction(EditFishingOperationUIHandler handler) { super(handler, true); } @@ -70,9 +74,12 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); - ImportFromColumnFile importModel = new ImportFromColumnFile(';', headers); - Import<FishingOperation> operationUIModelImport = - Import.newImport(importModel, new FileInputStream(columnsFile)); + ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers)); + ImportConf conf = new ImportConf(); + conf.setStrictMode(false); +// conf.setIgnoreUnknownHeader(true); + Import2<FishingOperation> operationUIModelImport = + Import2.newImport(conf, importModel, new FileInputStream(columnsFile)); TuttiProtocol protocol = getDataContext().getProtocol(); final Map<String, OperationFieldMappingRow> mappingRowsByField = @@ -104,28 +111,44 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO }; boolean found = false; - while (!found && operationUIModelImport.iterator().hasNext()) { - FishingOperation next = operationUIModelImport.iterator().next(); - if (predicate.apply(next)) { - getModel().fromEntity(next); + Iterator<ImportRow<FishingOperation>> iterator = operationUIModelImport.iterator(); + while (!found && iterator.hasNext()) { + ImportRow<FishingOperation> next = iterator.next(); + FishingOperation fishingOperation = next.getBean(); + + if (predicate.apply(fishingOperation)) { + if (next.isValid()) { + getModel().fromEntity(fishingOperation); + + } else { + if (log.isErrorEnabled()) { + log.error(next.getErrors()); + } + error = next.getErrors().toString(); + } found = true; } } if (!found) { - throw new Exception(t("tutti.editFishingOperation.action.importColumns.operationNotFound")); + error = t("tutti.editFishingOperation.action.importColumns.operationNotFound"); } } @Override public void postSuccessAction() { super.postSuccessAction(); - sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); + if (error != null) { + displayErrorMessage("error", error); + } else { + sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); + } + error = null; } - protected class ImportFromColumnFile extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { + protected class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { - public ImportFromColumnFile(char separator, Set<String> headers) { + public ImportFromColumnFileModel(char separator, Set<String> headers) { super(separator); TuttiProtocol protocol = getDataContext().getProtocol(); @@ -156,16 +179,38 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO break; case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE: - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID: valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN; break; + case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID: + valueParser = TuttiCsvUtil.BOOLEAN; + break; + case EditFishingOperationUIModel.PROPERTY_GEAR: + List<Gear> gears = new ArrayList<>(getDataContext().getFishingGears()); + gears.addAll(getDataContext().getScientificGears()); + Map<String, Gear> gearUniverse = TuttiEntities.splitById(gears); + valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); + break; + case EditFishingOperationUIModel.PROPERTY_VESSEL: - case EditFishingOperationUIModel.PROPERTY_STRATA: - case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: + List<Vessel> vessels = new ArrayList<>(getDataContext().getFishingVessels()); + vessels.addAll(getDataContext().getScientificVessels()); + Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels); + valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); + break; + +// case EditFishingOperationUIModel.PROPERTY_STRATA: +// case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: +// Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById(getDataContext().getL); +// valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); +// break; + case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: + Map<String, Person> personUniverse = TuttiEntities.splitById(getDataContext().getPersons()); + valueParser = newForeignKeyValue(Person.class, field, personUniverse); + break; default: valueParser = TuttiCsvUtil.STRING; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolBenthosAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolBenthosAction.java index 377c076..b120e79 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolBenthosAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolBenthosAction.java @@ -108,7 +108,7 @@ public class ImportProtocolBenthosAction extends AbstractTuttiAction<EditProtoco // build rows from imported+merged protocol // (will also remove all synonyms of species referent used) List<EditProtocolSpeciesRowModel> rows = - handler.toRows(protocol.getBenthos()); + handler.toSpeciesRows(protocol.getBenthos()); // update species comboBox getUI().getSpeciesComboBox().getHandler().reset(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolSpeciesAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolSpeciesAction.java index 718d459..4a4a7f5 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolSpeciesAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportProtocolSpeciesAction.java @@ -108,7 +108,7 @@ public class ImportProtocolSpeciesAction extends AbstractTuttiAction<EditProtoco // build rows from imported+merged protocol // (will also remove all synonyms of species referent used) List<EditProtocolSpeciesRowModel> rows = - handler.toRows(protocol.getSpecies()); + handler.toSpeciesRows(protocol.getSpecies()); // update species comboBox getUI().getSpeciesComboBox().getHandler().reset(); 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 4d96eab..b1702f9 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 @@ -23,6 +23,8 @@ package fr.ifremer.tutti.ui.swing.action; * #L% */ +import com.google.common.base.Function; +import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; @@ -31,12 +33,16 @@ import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolCaracteristicsRowModel; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolOperationFieldsRowModel; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolSpeciesRowModel; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUI; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIHandler; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.util.StringUtil; import java.util.ArrayList; import java.util.List; @@ -71,12 +77,22 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, TuttiProtocol bean = model.toBean(); - List<CaracteristicMappingRow> caracteristicMappingRows = - new ArrayList<>(getUI().getCaracteristicsTable().getModel().getCaracteristicMapping().values()); + List<EditProtocolCaracteristicsRowModel> protocolCaracteristicMappingRows = getUI().getModel().getCaracteristicMappingRows(); + List<CaracteristicMappingRow> caracteristicMappingRows = new ArrayList<CaracteristicMappingRow>(); + for (EditProtocolCaracteristicsRowModel row : protocolCaracteristicMappingRows) { + if (row.getPsfm() != null && row.getType() != null) { + caracteristicMappingRows.add(row.toEntity()); + } + } bean.setCaracteristicMapping(caracteristicMappingRows); - List<OperationFieldMappingRow> operationFieldMappingRows = - new ArrayList<>(getUI().getCaracteristicsTable().getModel().getOperationFieldMappingRows().values()); + 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())) { + operationFieldMappingRows.add(row.toEntity()); + } + } bean.setOperationFieldMapping(operationFieldMappingRows); // get the species protocols from the table diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css deleted file mode 100644 index d92ab70..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.css +++ /dev/null @@ -1,20 +0,0 @@ -#splitpane { - orientation: {JSplitPane.VERTICAL_SPLIT}; - resizeWeight: 1.0; -} - -#caracteristicsTable { - selectionMode: {ListSelectionModel.SINGLE_SELECTION}; - selectionBackground: {null}; - selectionForeground: {Color.BLACK}; - sortable: false; - enabled: true; -} - -#operationFieldsTable { - selectionMode: {ListSelectionModel.SINGLE_SELECTION}; - selectionBackground: {null}; - selectionForeground: {Color.BLACK}; - sortable: false; - enabled: true; -} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx deleted file mode 100644 index 52c3949..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUI.jaxx +++ /dev/null @@ -1,46 +0,0 @@ -<JPanel layout="{new BorderLayout()}" - implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<CaracteristicMappingUIModel, CaracteristicMappingUIHandler>'> - - <import> - fr.ifremer.tutti.persistence.entities.referential.Caracteristic - fr.ifremer.tutti.persistence.entities.referential.Species - - fr.ifremer.tutti.ui.swing.TuttiHelpBroker - fr.ifremer.tutti.ui.swing.util.TuttiUI - fr.ifremer.tutti.ui.swing.util.TuttiUIUtil - - jaxx.runtime.swing.editor.bean.BeanFilterableComboBox - jaxx.runtime.swing.editor.bean.BeanDoubleList - - java.awt.Color - - javax.swing.ListSelectionModel - - org.jdesktop.swingx.JXTable - - static org.nuiton.i18n.I18n.t - static jaxx.runtime.SwingUtil.getStringValue - - </import> - - <script><![CDATA[ - - public CaracteristicMappingUI(TuttiUI parentUI) { - TuttiUIUtil.setParentUI(this, parentUI); - } - ]]> - </script> - - <CaracteristicMappingUIModel id='model' - initializer='getContextValue(CaracteristicMappingUIModel.class)'/> - - <JSplitPane id="splitpane" constraints="BorderLayout.CENTER"> - <JScrollPane> - <JXTable id='caracteristicsTable'/> - </JScrollPane> - <JScrollPane> - <JXTable id='operationFieldsMapping'/> - </JScrollPane> - </JSplitPane> - -</JPanel> \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java deleted file mode 100644 index 5c4252a..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIHandler.java +++ /dev/null @@ -1,343 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content.protocol; - -import com.google.common.collect.Lists; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; -import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; -import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import jaxx.runtime.SwingUtil; -import jaxx.runtime.validator.swing.SwingValidator; -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.table.DefaultTableColumnModelExt; -import org.jdesktop.swingx.table.TableColumnExt; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; - -import javax.swing.*; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableCellRenderer; -import java.awt.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static org.nuiton.i18n.I18n.t; - -/** - * @author Kevin Morin (Code Lutin) - * @since x.x - */ -public class CaracteristicMappingUIHandler - extends AbstractTuttiTableUIHandler<EditProtocolCaracteristicsRowModel, CaracteristicMappingUIModel, CaracteristicMappingUI> { - - private static final Log log = LogFactory.getLog(CaracteristicMappingUIHandler.class); - - public CaracteristicMappingUIHandler() { - super(EditProtocolCaracteristicsRowModel.PROPERTY_PSFM, - EditProtocolCaracteristicsRowModel.PROPERTY_TYPE, - EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_FILE_COLUMN); - } - - @Override - public AbstractApplicationTableModel<EditProtocolCaracteristicsRowModel> getTableModel() { - return (EditProtocolCaracteristicsTableModel) getTable().getModel(); - } - - @Override - public JXTable getTable() { - return getUI().getCaracteristicsTable(); - } - - @Override - protected boolean isRowValid(EditProtocolCaracteristicsRowModel row) { - return row.getPsfm() != null && row.getType() != null; - } - - @Override - protected void saveSelectedRowIfRequired(TuttiBeanMonitor<EditProtocolCaracteristicsRowModel> rowMonitor, - EditProtocolCaracteristicsRowModel row) { - if (row.isValid()) { - // there is a valid bean attached to the monitor - - if (rowMonitor.wasModified()) { - - // monitored bean was modified, save it - if (log.isInfoEnabled()) { - log.info("Row " + row + " was modified, will save it"); - } - - getModel().getCaracteristicMapping().put(row.getPsfm().getId(), row.toBean()); - } - } - - } - - @Override - public void onCloseUI() { - - } - - @Override - public SwingValidator<CaracteristicMappingUIModel> getValidator() { - return null; - } - - @Override - protected JComponent getComponentToFocus() { - return null; - } - - @Override - public void beforeInit(CaracteristicMappingUI ui) { - super.beforeInit(ui); - - EditProtocolUIModel editProtocolUIModel = - ui.getContextValue(EditProtocolUIModel.class); - - CaracteristicMappingUIModel model = new CaracteristicMappingUIModel(); - model.setCaracteristics(editProtocolUIModel.getCaracteristics()); - model.setOperationFieldMappingRows(editProtocolUIModel.getOperationFieldMapping()); - - editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_CARACTERISTIC_MAPPING, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - getModel().setCaracteristicMappingRows((List<CaracteristicMappingRow>) evt.getNewValue()); - } - }); - - editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_OPERATION_FIELD_MAPPING, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - getModel().setOperationFieldMappingRows((List<OperationFieldMappingRow>) evt.getNewValue()); - } - }); - - editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_IMPORT_COLUMNS, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - - Collection<String> newValue = (Collection<String>) evt.getNewValue(); - ArrayList<String> dataToList = new ArrayList<String>(); - - if (newValue != null) { - dataToList.addAll(newValue); - - // add a null value at first position - if (!dataToList.isEmpty() && dataToList.get(0) != null) { - dataToList.add(0, null); - } - - } else { - dataToList.add(null); - } - - populateImportColumnTableEditor(getTable(), 2, dataToList); - populateImportColumnTableEditor(getUI().getOperationFieldsMapping(), 1, dataToList); - - } - }); - - ui.setContextValue(model); - } - - protected void populateImportColumnTableEditor(JXTable table, int columnIndex, ArrayList<String> dataToList) { - JComboBox comboBox = new JComboBox(); - SwingUtil.fillComboBox(comboBox, dataToList, null); - - TableColumnExt col = table.getColumnExt(columnIndex); - ComboBoxCellEditor editor = new ComboBoxCellEditor(comboBox); - col.setCellEditor(editor); - } - - @Override - public void afterInit(CaracteristicMappingUI caracteristicMappingUI) { - - initUI(this.ui); - - // init caracteristics mappingtable - { - JXTable caracteristicsMappingTable = getTable(); - - DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); - - // getModel().addPropertyChangeListener(EditProtocolUIModel.PROPERTY_LENGTH_CLASSES_PMFM_ID, new PropertyChangeListener() { - // @Override - // public void propertyChange(PropertyChangeEvent evt) { - // List<String> ids = (List<String>) evt.getNewValue(); - // selectLengthClasses(ids, comboBox); - // } - // }); - - List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(getModel().getCaracteristics()); - addComboDataColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.PSFM_ID, - getDecorator(Caracteristic.class, null), - caracteristics); - - addComboDataColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.TYPE, - getDecorator(CaracteristicType.class, null), - Lists.newArrayList(CaracteristicType.getTabTypes())); - - addColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); - - EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel, caracteristics); - caracteristicsMappingTable.setModel(tableModel); - caracteristicsMappingTable.setColumnModel(columnModel); - - initTable(caracteristicsMappingTable); - - getModel().setRows(new ArrayList<EditProtocolCaracteristicsRowModel>()); - } - - // init operation fields table - { - JXTable operationFieldsTable = getUI().getOperationFieldsMapping(); - - DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); - - addColumnToModel(columnModel, - null, - new DefaultTableCellRenderer() { - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - setText(t("tutti.editFishingOperation.field." + value.toString())); - return this; - } - }, - EditProtocolOperationFieldsTableModel.FIELD); - - addColumnToModel(columnModel, - EditProtocolOperationFieldsTableModel.IMPORT_FILE_COLUMN); - - EditProtocolOperationFieldsTableModel tableModel = new EditProtocolOperationFieldsTableModel(columnModel); - operationFieldsTable.setModel(tableModel); - operationFieldsTable.setColumnModel(columnModel); - - // by default do not authorize to change column orders - operationFieldsTable.getTableHeader().setReorderingAllowed(false); - - addHighlighters(operationFieldsTable); - - tableModel.setRows(new ArrayList<EditProtocolOperationFieldsRowModel>()); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_STATION_NUMBER); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_START_LATITUDE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_START_LONGITUDE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_END_DATE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_END_LATITUDE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR_SHOOTING_END_LONGITUDE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_FISHING_OPERATION_RECTILIGNE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_TRAWL_DISTANCE); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_FISHING_OPERATION_VALID); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_MULTIRIG_AGGREGATION); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_RECORDER_PERSON); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_GEAR); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_VESSEL); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_STRATA); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_SUB_STRATA); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_LOCATION); - createOperationFieldRow(tableModel, FishingOperation.PROPERTY_SECONDARY_VESSEL); - //TODO voir avec Vincent comment on gère le cas où aucun des champs clé n'est renseigné - - // when model data change let's propagate it table model -// getModel().addPropertyChangeListener(AbstractTuttiTableUIModel.PROPERTY_ROWS, new PropertyChangeListener() { -// @Override -// public void propertyChange(PropertyChangeEvent evt) { -// log.info("row schanged"); -// onModelRowsChanged((List<R>) evt.getNewValue()); -// } -// }); - - // always scroll to selected row - SwingUtil.scrollToTableSelection(operationFieldsTable); - } - - getModel().addPropertyChangeListener(CaracteristicMappingUIModel.PROPERTY_CARACTERISTIC_MAPPING_ROWS, - new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - populateCaracteristicsTable((Collection<CaracteristicMappingRow>) evt.getNewValue()); - } - }); - - getModel().addPropertyChangeListener(CaracteristicMappingUIModel.PROPERTY_OPERATION_FIELD_MAPPING_ROWS, - new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - populateFieldsTable((Map<String, OperationFieldMappingRow>) evt.getNewValue()); - } - }); - - } - - protected void createOperationFieldRow(EditProtocolOperationFieldsTableModel tableModel, String property) { - EditProtocolOperationFieldsRowModel row = tableModel.createNewRow(); - row.setField(property); - row.setValid(true); - row.addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - EditProtocolOperationFieldsRowModel row = (EditProtocolOperationFieldsRowModel) evt.getSource(); - Map<String, OperationFieldMappingRow> operationFieldMappingRows = getModel().getOperationFieldMappingRows(); - - OperationFieldMappingRow operationFieldMappingRow = operationFieldMappingRows.get(row.getField()); - if (operationFieldMappingRow != null) { - operationFieldMappingRow.setImportColumn(row.getImportFileColumn()); - - } else { - operationFieldMappingRows.put(row.getField(), row.toBean()); - } - getModel().setModify(true); - } - }); - tableModel.addNewRow(row); - } - - protected void populateFieldsTable(Map<String, OperationFieldMappingRow> fieldRows) { - EditProtocolOperationFieldsTableModel tableModel = - (EditProtocolOperationFieldsTableModel) getUI().getOperationFieldsMapping().getModel(); - for (EditProtocolOperationFieldsRowModel row : tableModel.getRows()) { - OperationFieldMappingRow mappingRow = fieldRows.get(row.getField()); - if (mappingRow != null) { - row.setImportFileColumn(mappingRow.getImportColumn()); - } - } - } - - protected void populateCaracteristicsTable(Collection<CaracteristicMappingRow> values) { - List<EditProtocolCaracteristicsRowModel> rows = new ArrayList<EditProtocolCaracteristicsRowModel>(); - for (CaracteristicMappingRow row : values) { - EditProtocolCaracteristicsRowModel rowModel = getTableModel().createNewRow(); - rowModel.fromEntity(row); - recomputeRowValidState(rowModel); - rows.add(rowModel); - } - getModel().setRows(rows); - } - - @Override - protected void initTable(JXTable table) { - super.initTable(table); - installTableKeyListener(table.getColumnModel(), table); - } - - @Override - protected void onRowModified(int rowIndex, EditProtocolCaracteristicsRowModel row, - String propertyName, Object oldValue, Object newValue) { - recomputeRowValidState(row); - super.onRowModified(rowIndex, row, propertyName, oldValue, newValue); - saveSelectedRowIfNeeded(); - } -} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java deleted file mode 100644 index a353eb5..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/CaracteristicMappingUIModel.java +++ /dev/null @@ -1,99 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content.protocol; - -import com.google.common.base.Function; -import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; -import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; -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; -import java.util.Map; - -/** - * @author Kevin Morin (Code Lutin) - * @since x.x - */ -public class CaracteristicMappingUIModel extends AbstractTuttiTableUIModel<CaracteristicMappingRow, EditProtocolCaracteristicsRowModel, CaracteristicMappingUIModel> { - - public static final String PROPERTY_CARACTERISTIC_MAPPING_ROWS = "caracteristicMappingRows"; - public static final String PROPERTY_CARACTERISTICS_IN_MAPPING = "caracteristicsInMapping"; - public static final String PROPERTY_OPERATION_FIELD_MAPPING_ROWS = "operationFieldMappingRows"; - - protected List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(); - - protected Map<String, CaracteristicMappingRow> caracteristicMappingRows = new HashMap<String, CaracteristicMappingRow>(); - - protected Map<String, OperationFieldMappingRow> operationFieldMappingRows = new HashMap<String, OperationFieldMappingRow>(); - - protected List<String> importColumns = new ArrayList<String>(); - - public CaracteristicMappingUIModel() { - super(CaracteristicMappingRow.class, null, null); - } - - public List<Caracteristic> getCaracteristics() { - return caracteristics; - } - - public void setCaracteristics(List<Caracteristic> caracteristics) { - this.caracteristics = caracteristics; - } - - public Map<String, CaracteristicMappingRow> getCaracteristicMapping() { - return caracteristicMappingRows; - } - - public void setCaracteristicMappingRows(List<CaracteristicMappingRow> caracteristicMappingRows) { - this.caracteristicMappingRows = new HashMap<String, CaracteristicMappingRow>(); - if (caracteristicMappingRows != null) { - this.caracteristicMappingRows.putAll(Maps.uniqueIndex(caracteristicMappingRows, new Function<CaracteristicMappingRow, String>() { - @Override - public String apply(CaracteristicMappingRow caracteristicMappingRow) { - return caracteristicMappingRow.getPmfmId(); - } - })); - } - firePropertyChanged(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, caracteristicMappingRows); - firePropertyChanged(PROPERTY_CARACTERISTICS_IN_MAPPING, null, this.caracteristicMappingRows.values()); - } - - public Map<String, OperationFieldMappingRow> getOperationFieldMappingRows() { - return operationFieldMappingRows; - } - - public void setOperationFieldMappingRows(Collection<OperationFieldMappingRow> operationFieldMappingRows) { - this.operationFieldMappingRows = new HashMap<String, OperationFieldMappingRow>(); - if (operationFieldMappingRows != null) { - this.operationFieldMappingRows.putAll(Maps.uniqueIndex(operationFieldMappingRows, new Function<OperationFieldMappingRow, String>() { - @Override - public String apply(OperationFieldMappingRow operationFieldMappingRow) { - return operationFieldMappingRow.getField(); - } - })); - } - firePropertyChanged(PROPERTY_OPERATION_FIELD_MAPPING_ROWS, null, this.operationFieldMappingRows); - } - - public List<String> getImportColumns() { - return importColumns; - } - - public void setImportColumns(List<String> importColumns) { - this.importColumns.clear(); - if (importColumns != null) { - this.importColumns.addAll(importColumns); - } - } - - @Override - protected CaracteristicMappingRow newEntity() { - return new CaracteristicMappingRowBean(); - } -} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java index c845b8e..d2ec82a 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsRowModel.java @@ -1,7 +1,5 @@ package fr.ifremer.tutti.ui.swing.content.protocol; -import com.google.common.base.Function; -import com.google.common.collect.Maps; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; @@ -23,12 +21,12 @@ public class EditProtocolCaracteristicsRowModel extends AbstractTuttiBeanUIModel public static final String PROPERTY_PSFM = "psfm"; public static final String PROPERTY_TYPE = "type"; - public static final String PROPERTY_IMPORT_FILE_COLUMN = "importFileColumn"; + public static final String PROPERTY_IMPORT_COLUMN = "importColumn"; protected Map<String, Caracteristic> caracteristicMap; protected Caracteristic psfm; protected CaracteristicType type; - protected String importFileColumn; + protected String importColumn; protected static final Binder<CaracteristicMappingRow, EditProtocolCaracteristicsRowModel> fromBeanBinder = BinderFactory.newBinder(CaracteristicMappingRow.class, @@ -63,14 +61,14 @@ public class EditProtocolCaracteristicsRowModel extends AbstractTuttiBeanUIModel firePropertyChanged(PROPERTY_TYPE, oldValue, type); } - public String getImportFileColumn() { - return importFileColumn; + public String getImportColumn() { + return importColumn; } - public void setImportFileColumn(String importFileColumn) { - Object oldValue = getImportFileColumn(); - this.importFileColumn = importFileColumn; - firePropertyChanged(PROPERTY_IMPORT_FILE_COLUMN, oldValue, importFileColumn); + public void setImportColumn(String importColumn) { + Object oldValue = getImportColumn(); + this.importColumn = importColumn; + firePropertyChanged(PROPERTY_IMPORT_COLUMN, oldValue, importColumn); } public String getPmfmId() { diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java index 6e262ed..93de4ae 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolCaracteristicsTableModel.java @@ -28,13 +28,13 @@ public class EditProtocolCaracteristicsTableModel extends AbstractApplicationTab n("tutti.editProtocol.table.header.caracteristics.type.tip")); public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> IMPORT_FILE_COLUMN = ColumnIdentifier.newId( - EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_FILE_COLUMN, + EditProtocolCaracteristicsRowModel.PROPERTY_IMPORT_COLUMN, n("tutti.editProtocol.table.header.caracteristics.importFileColumn"), n("tutti.editProtocol.table.header.caracteristics.importFileColumn.tip")); public EditProtocolCaracteristicsTableModel(TableColumnModelExt columnModel, Collection<Caracteristic> caracteristics) { - super(columnModel, true, true); - setNoneEditableCols(); + super(columnModel, false, false); + setNoneEditableCols(PSFM_ID); this.caracteristics = caracteristics; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java index ac16751..f0a9b53 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java @@ -1,20 +1,11 @@ package fr.ifremer.tutti.ui.swing.content.protocol; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRowBean; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRowBean; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - /** * @author Kevin Morin (Code Lutin) * @since 3.10 @@ -22,10 +13,10 @@ import java.util.Map; public class EditProtocolOperationFieldsRowModel extends AbstractTuttiBeanUIModel<OperationFieldMappingRow, EditProtocolOperationFieldsRowModel> { public static final String PROPERTY_FIELD = "field"; - public static final String PROPERTY_IMPORT_FILE_COLUMN = "importFileColumn"; + public static final String PROPERTY_IMPORT_COLUMN = "importColumn"; protected String field; - protected String importFileColumn; + protected String importColumn; protected static final Binder<OperationFieldMappingRow, EditProtocolOperationFieldsRowModel> fromBeanBinder = BinderFactory.newBinder(OperationFieldMappingRow.class, @@ -49,14 +40,14 @@ public class EditProtocolOperationFieldsRowModel extends AbstractTuttiBeanUIMode firePropertyChanged(PROPERTY_FIELD, oldValue, field); } - public String getImportFileColumn() { - return importFileColumn; + public String getImportColumn() { + return importColumn; } - public void setImportFileColumn(String importFileColumn) { - Object oldValue = getImportFileColumn(); - this.importFileColumn = importFileColumn; - firePropertyChanged(PROPERTY_IMPORT_FILE_COLUMN, oldValue, importFileColumn); + public void setImportColumn(String importColumn) { + Object oldValue = getImportColumn(); + this.importColumn = importColumn; + firePropertyChanged(PROPERTY_IMPORT_COLUMN, oldValue, importColumn); } @Override diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java index 5d636a9..0be5d51 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java @@ -1,12 +1,9 @@ package fr.ifremer.tutti.ui.swing.content.protocol; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; -import java.util.Collection; - import static org.nuiton.i18n.I18n.n; /** @@ -21,7 +18,7 @@ public class EditProtocolOperationFieldsTableModel extends AbstractApplicationTa n("tutti.editProtocol.table.header.operationFields.field.tip")); public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> IMPORT_FILE_COLUMN = ColumnIdentifier.newId( - EditProtocolOperationFieldsRowModel.PROPERTY_IMPORT_FILE_COLUMN, + EditProtocolOperationFieldsRowModel.PROPERTY_IMPORT_COLUMN, n("tutti.editProtocol.table.header.operationFields.importFileColumn"), n("tutti.editProtocol.table.header.operationFields.importFileColumn.tip")); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css index aec68ad..d12659f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css @@ -76,6 +76,37 @@ JTextField { border: {new javax.swing.border.EmptyBorder(5, 10, 5, 10)}; } +#caracteristicMappingComboBox { + enabled: {!caracteristicMappingComboBox.isEmpty()}; + toolTipText: "tutti.editProtocol.field.caracteristicMapping.tip"; + _help: {"tutti.editProtocol.field.caracteristicMapping.help"}; +} + +#addCaracteristicMappingButton { + actionIcon: add; + toolTipText: "tutti.editProtocol.action.addCaracteristicMapping.tip"; + i18nMnemonic: "tutti.editProtocol.action.addCaracteristicMapping.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.AddCaracteristicMappingAction.class}; + enabled: { caracteristicMappingComboBox.getSelectedItem() != null }; + _help: { "tutti.editProtocol.action.addCaracteristicMapping.help" }; +} + +#caracteristicsMappingTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; + enabled: true; +} + +#operationFieldsMappingTable { + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; + enabled: true; +} + #speciesComboBox { enabled: {!speciesComboBox.isEmpty()}; toolTipText: "tutti.editProtocol.field.species.tip"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx index 1644756..a976187 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx @@ -121,7 +121,35 @@ genericType='Caracteristic'/> </tab> <tab title='tutti.editProtocol.tab.caracteristic.mapping'> - <CaracteristicMappingUI id='caracteristicsTable' constructorParams="(TuttiUI)this"/> + <Table fill='both'> + + <row fill='both'> + <cell fill='both' weightx='1'> + <BeanFilterableComboBox id='caracteristicMappingComboBox' + constructorParams='this' + genericType='Caracteristic'/> + </cell> + <cell fill='both'> + <JButton id='addCaracteristicMappingButton'/> + </cell> + </row> + <row fill='both' weighty='1'> + <cell fill='both' columns='2'> + <JScrollPane> + <JXTable id='caracteristicsMappingTable'/> + </JScrollPane> + </cell> + </row> + <row fill='both' weighty='1'> + <cell fill='both' columns='2'> + <JScrollPane> + <JXTable id='operationFieldsMappingTable'/> + </JScrollPane> + </cell> + </row> + </Table> + <!--<CaracteristicMappingUI id='caracteristicsTable' constructorParams="(TuttiUI)this"/>--> + </tab> </JTabbedPane> </JPanel> 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 ab141b5..410d831 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 @@ -22,16 +22,20 @@ package fr.ifremer.tutti.ui.swing.content.protocol; * #L% */ +import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import fr.ifremer.adagio.core.dao.referential.pmfm.Pmfm; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModelEntry; +import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; +import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; @@ -64,19 +68,17 @@ import org.jdesktop.swingx.table.TableColumnExt; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.swing.util.CloseableUI; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JTabbedPane; -import javax.swing.ListSelectionModel; +import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; +import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumnModel; -import java.awt.Dimension; +import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; @@ -123,6 +125,14 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return ui.getBenthosTable(); } + public JXTable getCaracteristicsMappingTable() { + return ui.getCaracteristicsMappingTable(); + } + + public JXTable getOperationFieldsMappingTable() { + return ui.getOperationFieldsMappingTable(); + } + public EditProtocolSpeciesTableModel getSpeciesTableModel() { return (EditProtocolSpeciesTableModel) getSpeciesTable().getModel(); } @@ -135,6 +145,14 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return selectedItem != null && selectedItem instanceof Species; } + public EditProtocolCaracteristicsTableModel getCaracteristicMappingTableModel() { + return (EditProtocolCaracteristicsTableModel) getCaracteristicsMappingTable().getModel(); + } + + public EditProtocolOperationFieldsTableModel getEditProtocolOperationFieldsMappingTableModel() { + return (EditProtocolOperationFieldsTableModel) getOperationFieldsMappingTable().getModel(); + } + //------------------------------------------------------------------------// //-- AbstractTuttiUIHandler methods --// //------------------------------------------------------------------------// @@ -265,20 +283,38 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI Lists.newArrayList(referents), null); initBeanFilterableComboBox(this.ui.getBenthosComboBox(), Lists.newArrayList(referents), null); + initBeanFilterableComboBox(ui.getCaracteristicMappingComboBox(), + new ArrayList<Caracteristic>(model.getCaracteristics()), + null); + List<EditProtocolCaracteristicsRowModel> caracteristicMappingRows; + List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows; List<EditProtocolSpeciesRowModel> speciesRows; List<EditProtocolSpeciesRowModel> benthosRows; + model.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_IMPORT_COLUMNS, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + populateImportColumnTableEditors(); + + } + }); + incrementsMessage("Préparation des interfaces graphiques"); // build species and benthos rows if (protocol == null) { + caracteristicMappingRows = Lists.newArrayList(); + operationFieldMappingRows = Lists.newArrayList(); speciesRows = Lists.newArrayList(); benthosRows = Lists.newArrayList(); } else { - speciesRows = toRows(protocol.getSpecies()); - benthosRows = toRows(protocol.getBenthos()); + caracteristicMappingRows = toProtocolCaracteristicRows(protocol.getCaracteristicMapping()); + operationFieldMappingRows = toProtocolOperationFieldsRows(protocol.getOperationFieldMapping()); + + speciesRows = toSpeciesRows(protocol.getSpecies()); + benthosRows = toSpeciesRows(protocol.getBenthos()); if (log.isDebugEnabled()) { log.debug("Will edit protocol with " + @@ -290,9 +326,12 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI // set to model (will propagate to tableModel) model.setSpeciesRow(speciesRows); model.setBenthosRow(benthosRows); + model.setCaracteristicMappingRows(caracteristicMappingRows); + model.setOperationFieldMappingRows(operationFieldMappingRows); this.ui.getSpeciesComboBox().reset(); this.ui.getBenthosComboBox().reset(); + this.ui.getCaracteristicMappingComboBox().reset(); { // create species table model @@ -427,6 +466,78 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI Lists.newArrayList(model.getCaracteristics()), model.getIndividualObservationPmfmId()); + // init caracteristics mappingtable + { + JXTable caracteristicsMappingTable = getCaracteristicsMappingTable(); + + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + + addColumnToModel(columnModel, + null, + newTableCellRender(Caracteristic.class), + EditProtocolCaracteristicsTableModel.PSFM_ID); + + addComboDataColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.TYPE, + getDecorator(CaracteristicType.class, null), + Lists.newArrayList(CaracteristicType.getTabTypes())); + + addColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); + + List<Caracteristic> caracteristics = new ArrayList<Caracteristic>(getModel().getCaracteristics()); + EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel, caracteristics); + caracteristicsMappingTable.setModel(tableModel); + caracteristicsMappingTable.setColumnModel(columnModel); + + // by default do not authorize to change column orders + caracteristicsMappingTable.getTableHeader().setReorderingAllowed(false); + + addHighlighters(caracteristicsMappingTable); + + // always scroll to selected row + SwingUtil.scrollToTableSelection(caracteristicsMappingTable); + + tableModel.setRows(caracteristicMappingRows); + } + + // init operation fields table + { + JXTable operationFieldsTable = getUI().getOperationFieldsMappingTable(); + + DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + + addColumnToModel(columnModel, + null, + new DefaultTableCellRenderer() { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + setText(t("tutti.editFishingOperation.field." + value.toString())); + return this; + } + }, + EditProtocolOperationFieldsTableModel.FIELD); + + addColumnToModel(columnModel, + EditProtocolOperationFieldsTableModel.IMPORT_FILE_COLUMN); + + EditProtocolOperationFieldsTableModel tableModel = new EditProtocolOperationFieldsTableModel(columnModel); + operationFieldsTable.setModel(tableModel); + operationFieldsTable.setColumnModel(columnModel); + + // by default do not authorize to change column orders + operationFieldsTable.getTableHeader().setReorderingAllowed(false); + + addHighlighters(operationFieldsTable); + + tableModel.setRows(operationFieldMappingRows); + + // always scroll to selected row + SwingUtil.scrollToTableSelection(operationFieldsTable); + } + + populateImportColumnTableEditors(); + // if new protocol can already cancel his creation model.setModify(model.isCreate() || model.isCleaned()); @@ -443,10 +554,6 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI break; case 1: -// selectedDoubleList = EditProtocolUIHandler.this.ui.getGearUseFeatureList(); -// break; -// -// case 2: selectedDoubleList = EditProtocolUIHandler.this.ui.getIndividualObservationList(); break; @@ -463,8 +570,6 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI dialog = new SelectSpeciesUI(false, this.ui); - ui.getCaracteristicsTable().getModel().setModify(false); - listenModelModifiy(ui.getCaracteristicsTable().getModel()); } @Override @@ -472,7 +577,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return getUI().getNameField(); } - public List<EditProtocolSpeciesRowModel> toRows(List<SpeciesProtocol> speciesProtocols) { + public List<EditProtocolSpeciesRowModel> toSpeciesRows(List<SpeciesProtocol> speciesProtocols) { BeanFilterableComboBox<Species> speciesComboBox = ui.getSpeciesComboBox(); Preconditions.checkNotNull(speciesComboBox.getData()); BeanFilterableComboBox<Species> benthosComboBox = ui.getBenthosComboBox(); @@ -547,6 +652,84 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return result; } + public List<EditProtocolCaracteristicsRowModel> toProtocolCaracteristicRows(List<CaracteristicMappingRow> caracteristicMappingRows) { + BeanFilterableComboBox<Caracteristic> caracteristicMappingComboBox = ui.getCaracteristicMappingComboBox(); + Preconditions.checkNotNull(caracteristicMappingComboBox.getData()); + + EditProtocolUIModel model = getModel(); + + Set<Caracteristic> caracteristicSet = Sets.newHashSet(); + List<EditProtocolCaracteristicsRowModel> result = Lists.newArrayList(); + if (CollectionUtils.isNotEmpty(caracteristicMappingRows)) { + for (CaracteristicMappingRow caracteristicMappingRow : caracteristicMappingRows) { + String pmfmId = caracteristicMappingRow.getPmfmId(); + + if (pmfmId == null) { + + continue; + } + + // make sure it exists + caracteristicSet.add(model.getAllCaracteristic().get(pmfmId)); + + EditProtocolCaracteristicsRowModel row = createEditProtocolCaracteristicsRowModel(); + row.fromBean(caracteristicMappingRow); + row.setValid(row.getType() != null); + + result.add(row); + } + + caracteristicMappingComboBox.removeItems(caracteristicSet); + } + + return result; + } + + public List<EditProtocolOperationFieldsRowModel> toProtocolOperationFieldsRows(Collection<OperationFieldMappingRow> operationFieldMappingRows) { + List<EditProtocolOperationFieldsRowModel> result = Lists.newArrayList(); + + if (operationFieldMappingRows == null) { + operationFieldMappingRows = new ArrayList<OperationFieldMappingRow>(); + } + Map<String, OperationFieldMappingRow> rowsByField = Maps.uniqueIndex(operationFieldMappingRows, + new Function<OperationFieldMappingRow, String>() { + @Override + public String apply(OperationFieldMappingRow operationFieldMappingRow) { + return operationFieldMappingRow.getField(); + } + }); + + List<String> properties = Lists.newArrayList( + FishingOperation.PROPERTY_STATION_NUMBER, + FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER, + FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE, + FishingOperation.PROPERTY_GEAR_SHOOTING_START_LATITUDE, + FishingOperation.PROPERTY_GEAR_SHOOTING_START_LONGITUDE, + FishingOperation.PROPERTY_GEAR_SHOOTING_END_DATE, + FishingOperation.PROPERTY_GEAR_SHOOTING_END_LATITUDE, + FishingOperation.PROPERTY_GEAR_SHOOTING_END_LONGITUDE, + FishingOperation.PROPERTY_FISHING_OPERATION_RECTILIGNE, + FishingOperation.PROPERTY_TRAWL_DISTANCE, + FishingOperation.PROPERTY_FISHING_OPERATION_VALID, + FishingOperation.PROPERTY_MULTIRIG_AGGREGATION, + FishingOperation.PROPERTY_RECORDER_PERSON, + FishingOperation.PROPERTY_GEAR, + FishingOperation.PROPERTY_VESSEL, + FishingOperation.PROPERTY_STRATA, + FishingOperation.PROPERTY_SUB_STRATA, + FishingOperation.PROPERTY_LOCATION, + FishingOperation.PROPERTY_SECONDARY_VESSEL + ); + //TODO voir avec Vincent comment on gère le cas où aucun des champs clé n'est renseigné + + for (String property : properties) { + OperationFieldMappingRow row = rowsByField.get(property); + EditProtocolOperationFieldsRowModel newRow = createOperationFieldRow(property, row != null ? row.getImportColumn() : null); + result.add(newRow); + } + return result; + } + @Override public void onCloseUI() { if (log.isDebugEnabled()) { @@ -555,7 +738,6 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI clearValidators(); ui.getTabPanel().setSelectedIndex(0); - closeUI(ui.getCaracteristicsTable()); } @Override @@ -605,6 +787,24 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI return model.getSelectedSpecies(); } + public EditProtocolCaracteristicsRowModel createEditProtocolCaracteristicsRowModel() { + EditProtocolCaracteristicsRowModel newRow = new EditProtocolCaracteristicsRowModel(getModel().getCaracteristics()); + + newRow.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + EditProtocolCaracteristicsRowModel row = (EditProtocolCaracteristicsRowModel) evt.getSource(); + row.setValid(row.getType() != null); + + if (row.isValid()) { + getModel().setModify(true); + } + } + }); + + return newRow; + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// @@ -758,6 +958,49 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI tableModel.setRows(rows); } + protected EditProtocolOperationFieldsRowModel createOperationFieldRow(String property, String column) { + EditProtocolOperationFieldsRowModel newRow = new EditProtocolOperationFieldsRowModel(); + newRow.setField(property); + newRow.setImportColumn(column); + newRow.setValid(true); + newRow.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + getModel().setModify(true); + } + }); + return newRow; + } + + protected void populateImportColumnTableEditors() { + Collection<String> importColumns = getModel().getImportColumns(); + ArrayList<String> dataToList = new ArrayList<String>(); + + if (importColumns != null) { + dataToList.addAll(importColumns); + + // add a null value at first position + if (!dataToList.isEmpty() && dataToList.get(0) != null) { + dataToList.add(0, null); + } + + } else { + dataToList.add(null); + } + + populateImportColumnTableEditor(getUI().getCaracteristicsMappingTable(), 2, dataToList); + populateImportColumnTableEditor(getUI().getOperationFieldsMappingTable(), 1, dataToList); + } + + protected void populateImportColumnTableEditor(JXTable table, int columnIndex, ArrayList<String> dataToList) { + JComboBox comboBox = new JComboBox(); + SwingUtil.fillComboBox(comboBox, dataToList, null); + + TableColumnExt col = table.getColumnExt(columnIndex); + ComboBoxCellEditor editor = new ComboBoxCellEditor(comboBox); + col.setCellEditor(editor); + } + protected static class UpdateSelectedList implements PropertyChangeListener { private final BeanDoubleListModel<Caracteristic> model; @@ -828,84 +1071,4 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI } } -// public static class SpeciesDecoratorListener implements ActionListener { -// -// protected final JXTable table; -// -// protected final ButtonGroup buttonGroup; -// -// protected final TuttiDecorator<Species> decorator; -// -// protected final TableColumnExt column; -// -// public SpeciesDecoratorListener(JXTable table, -// ButtonGroup buttonGroup) { -// this.table = table; -// this.buttonGroup = buttonGroup; -// this.column = (TableColumnExt) table.getColumn(0); -// this.decorator = TuttiUIUtil.getSpeciesColumnDecorator(column); -// } -// -// @Override -// public void actionPerformed(ActionEvent e) { -// -// JRadioButtonMenuItem source = (JRadioButtonMenuItem) e.getSource(); -// buttonGroup.setSelected(source.getModel(), true); -// -// Integer index = -// (Integer) source.getClientProperty(SPECIES_DECORATOR_INDEX); -// -// if (log.isInfoEnabled()) { -// log.info("Selected decorator context index: " + index); -// } -// -// decorator.setContextIndex(index); -// -// column.setComparator(decorator.getCurrentComparator()); -// -// -// EditProtocolSpeciesTableModel tableModel = -// (EditProtocolSpeciesTableModel) table.getModel(); -// -// // keep selected rows -// int[] rowIndexes = table.getSelectedRows(); -// List<EditProtocolSpeciesRowModel> rowsToReSelect = Lists.newArrayList(); -// for (int viewRowIndex : rowIndexes) { -// int modelRowIndex = table.convertRowIndexToModel(viewRowIndex); -// EditProtocolSpeciesRowModel row = tableModel.getEntry(modelRowIndex); -// rowsToReSelect.add(row); -// } -// -// // fire model (will reload the comparator) -// tableModel.fireTableDataChanged(); -// -// // reselect rows -// for (EditProtocolSpeciesRowModel row : rowsToReSelect) { -// int modelRowIndex = tableModel.getRowIndex(row); -// int viewRowIndex = table.convertRowIndexToView(modelRowIndex); -// table.addRowSelectionInterval(viewRowIndex, viewRowIndex); -// } -// } -// } -// -// private static class ShowSpeciesDecoratorPopupListener extends MouseAdapter { -// private final JPopupMenu popup; -// -// public ShowSpeciesDecoratorPopupListener(JPopupMenu popup) { -// this.popup = popup; -// } -// -// @Override -// public void mouseClicked(MouseEvent e) { -// JTableHeader source = (JTableHeader) e.getSource(); -// Point point = e.getPoint(); -// int columnIndex = source.columnAtPoint(point); -// -// boolean rightClick = SwingUtilities.isRightMouseButton(e); -// if (columnIndex == 0 && rightClick) { -// e.consume(); -// popup.show(source, e.getX(), e.getY()); -// } -// } -// } } 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 5650ef4..ec9f584 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 @@ -48,6 +48,10 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, private static final long serialVersionUID = 1L; + public static final String PROPERTY_CARACTERISTIC_MAPPING_ROWS = "caracteristicMappingRows"; + + public static final String PROPERTY_OPERATION_FIELD_MAPPING_ROWS = "operationFieldMappingRows"; + public static final String PROPERTY_SPECIES_ROW = "speciesRow"; public static final String PROPERTY_BENTHOS_ROW = "benthosRow"; @@ -116,6 +120,10 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, protected Map<String, Caracteristic> allCaracteristic; + protected List<EditProtocolCaracteristicsRowModel> caracteristicMappingRows; + + protected List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows; + protected List<EditProtocolSpeciesRowModel> speciesRow; protected List<EditProtocolSpeciesRowModel> benthosRow; @@ -151,6 +159,26 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, setIndividualObservationPmfmId(ids); } + public List<EditProtocolCaracteristicsRowModel> getCaracteristicMappingRows() { + return caracteristicMappingRows; + } + + public void setCaracteristicMappingRows(List<EditProtocolCaracteristicsRowModel> caracteristicMappingRows) { + Object oldValue = getCaracteristicMappingRows(); + this.caracteristicMappingRows = caracteristicMappingRows; + firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING_ROWS, oldValue, caracteristicMappingRows); + } + + public List<EditProtocolOperationFieldsRowModel> getOperationFieldMappingRows() { + return operationFieldMappingRows; + } + + public void setOperationFieldMappingRows(List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows) { + Object oldValue = getOperationFieldMappingRows(); + this.operationFieldMappingRows = operationFieldMappingRows; + firePropertyChange(PROPERTY_OPERATION_FIELD_MAPPING_ROWS, oldValue, operationFieldMappingRows); + } + public List<EditProtocolSpeciesRowModel> getSpeciesRow() { return speciesRow; } 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 a061cdb..6188409 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 @@ -887,6 +887,8 @@ tutti.editProgram.title.create.program= tutti.editProgram.title.edit.program= tutti.editProtocol.action.addBenthosProtocol.mnemonic= tutti.editProtocol.action.addBenthosProtocol.tip= +tutti.editProtocol.action.addCaracteristicMapping.mnemonic= +tutti.editProtocol.action.addCaracteristicMapping.tip= tutti.editProtocol.action.addSpeciesProtocol.mnemonic= tutti.editProtocol.action.addSpeciesProtocol.tip= tutti.editProtocol.action.chooseColumnsFile.import= @@ -953,6 +955,7 @@ tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveSampleCategoryModel= tutti.editProtocol.askSaveBeforeLeaving.saveProtocol= tutti.editProtocol.askSaveBeforeLeaving.saveSampleCategoryModel= tutti.editProtocol.field.benthos.tip= +tutti.editProtocol.field.caracteristicMapping.tip= tutti.editProtocol.field.comment= tutti.editProtocol.field.comment.tip= tutti.editProtocol.field.protocol.name= @@ -1288,6 +1291,7 @@ tutti.flash.info.benthos.imported.in.protocol.oneReplaced= tutti.flash.info.benthos.imported.in.protocol.severalReplaced= tutti.flash.info.benthos.remove.from.protocol= tutti.flash.info.benthos.replaced= +tutti.flash.info.caracteristic.add.to.protocol= tutti.flash.info.caracteristic.imported.in.protocol= tutti.flash.info.caractristic.exported.from.protocol= tutti.flash.info.cruiseCreated= 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 dffeadc..a4321a5 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 @@ -871,6 +871,8 @@ tutti.editProgram.title.create.program=Créer une nouvelle série de campagne tutti.editProgram.title.edit.program=Éditer une série de campagne existante tutti.editProtocol.action.addBenthosProtocol.mnemonic=j tutti.editProtocol.action.addBenthosProtocol.tip=Ajouter une espèce du benthos au protocole +tutti.editProtocol.action.addCaracteristicMapping.mnemonic= +tutti.editProtocol.action.addCaracteristicMapping.tip= 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 @@ -933,6 +935,7 @@ tutti.editProtocol.askCancelEditBeforeLeaving.cancelSaveSampleCategoryModel=La c tutti.editProtocol.askSaveBeforeLeaving.saveProtocol=Des modifications sur le protocole n'ont pas été enregistrées tutti.editProtocol.askSaveBeforeLeaving.saveSampleCategoryModel=Des modifications sur la catégorisation n'ont pas été enregistrées tutti.editProtocol.field.benthos.tip=Benthos +tutti.editProtocol.field.caracteristicMapping.tip= tutti.editProtocol.field.comment=Commentaire tutti.editProtocol.field.comment.tip=Commentaire tutti.editProtocol.field.protocol.name=Nom @@ -1243,6 +1246,7 @@ tutti.flash.info.benthos.imported.in.protocol.oneReplaced=Benthos importés dans tutti.flash.info.benthos.imported.in.protocol.severalReplaced=Benthos importés dans le protocole depuis le fichier <strong>%s</strong>. %s remplacées par leur référent. tutti.flash.info.benthos.remove.from.protocol=Les benthos ont été retirés du protocole. tutti.flash.info.benthos.replaced=Le benthos <strong>%s</strong> a été remplacé par son référent <strong>%s</strong>. +tutti.flash.info.caracteristic.add.to.protocol= tutti.flash.info.caracteristic.imported.in.protocol=Caractéristiques importées dans le protocole depuis le fichier <strong>%s</strong>. tutti.flash.info.caractristic.exported.from.protocol=Caractéristiques du protocole exportées dans le fichier <strong>%s</strong>. tutti.flash.info.cruiseCreated=La campagne <strong>%s</strong> a été créée. -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.