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 7fb821629b08b74af5b2fa675fab14fbd00d288c Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 2 19:09:14 2014 +0100 refs #6129 mapping des champs du trait avec les colonnes + début import dans le trait --- .../entities/protocol/TuttiProtocols.java | 4 + .../src/main/xmi/tutti-persistence.zargo | Bin 57440 -> 57963 bytes .../src/main/xmi/tutti-persistence.zargo~ | Bin 57378 -> 57440 bytes .../filtered-resources/tutti-help-fr.properties | 3 +- .../swing/action/ImportFromColumnFileAction.java | 187 +++++++++++++++++++ .../action/LoadProtocolImportColumnsAction.java | 13 +- .../tutti/ui/swing/action/SaveProtocolAction.java | 5 + .../content/operation/EditFishingOperationUI.css | 9 + .../content/operation/EditFishingOperationUI.jaxx | 1 + .../content/protocol/CaracteristicMappingUI.css | 13 ++ .../content/protocol/CaracteristicMappingUI.jaxx | 12 +- .../protocol/CaracteristicMappingUIHandler.java | 203 +++++++++++++++++---- .../protocol/CaracteristicMappingUIModel.java | 21 +++ .../EditProtocolOperationFieldsRowModel.java | 66 +++++++ .../EditProtocolOperationFieldsTableModel.java | 37 ++++ .../content/protocol/EditProtocolUIHandler.java | 4 + .../content/protocol/EditProtocolUIModel.java | 63 +++++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 11 ++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 11 ++ 19 files changed, 614 insertions(+), 49 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 acfb9b9..afa555c 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,6 +76,8 @@ 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 void toFile(TuttiProtocol protocol, File file) { String id = protocol.getId(); @@ -353,6 +355,8 @@ public class TuttiProtocols extends AbstractTuttiProtocols { } result.setCaracteristicMapping(caracteristicMappingRows); + //TODO finish + return result; } diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo b/tutti-persistence/src/main/xmi/tutti-persistence.zargo index b3c7107..4f0e671 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo differ diff --git a/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ index 982bb6a..b3c7107 100644 Binary files a/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ and b/tutti-persistence/src/main/xmi/tutti-persistence.zargo~ differ 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 0ef2271..f5c6bc6 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -1,5 +1,5 @@ #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Mon Dec 01 10:21:58 CET 2014 +#Mon Dec 01 16:05:35 CET 2014 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -171,6 +171,7 @@ tutti.editCruise.help=editCruise.html tutti.editFishingOperation.action.attachments.help=editFishingOperation.html\#traitActions tutti.editFishingOperation.action.cancelEditFishingOperation.help=editFishingOperation.html\#traitActions tutti.editFishingOperation.action.importCasino.help=editFishingOperation.html\#traitActions +tutti.editFishingOperation.action.importFromColumnFile.help= tutti.editFishingOperation.action.resetFishingOperationValidState.help=editFishingOperation.html\#traitActions tutti.editFishingOperation.action.saveEditFishingOperation.help=editFishingOperation.html\#traitActions tutti.editFishingOperation.field.comment.help=editFishingOperation.html\#traitFields 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 new file mode 100644 index 0000000..259f96f --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -0,0 +1,187 @@ +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.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.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.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.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.10 + */ +public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingOperationUIModel, EditFishingOperationUI, EditFishingOperationUIHandler> { + + private static final Log log = LogFactory.getLog(LoadProtocolImportColumnsAction.class); + + protected File columnsFile; + + public ImportFromColumnFileAction(EditFishingOperationUIHandler handler) { + super(handler, true); + } + + @Override + public boolean prepareAction() throws Exception { + boolean result = super.prepareAction(); + + if (result) { + columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), + t("tutti.editFishingOperation.action.chooseColumnsFile.import"), + "^.*\\.csv", t("tutti.common.file.csv")); + + result = columnsFile != null; + } + + return result; + } + + @Override + public void doAction() throws Exception { + + Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); + + ImportFromColumnFile importModel = new ImportFromColumnFile(';', headers); + Import<FishingOperation> operationUIModelImport = + Import.newImport(importModel, new FileInputStream(columnsFile)); + + TuttiProtocol protocol = getDataContext().getProtocol(); + final Map<String, OperationFieldMappingRow> mappingRowsByField = + Maps.uniqueIndex(protocol.getOperationFieldMapping(), new Function<OperationFieldMappingRow, String>() { + @Override + public String apply(OperationFieldMappingRow operationFieldMappingRow) { + return operationFieldMappingRow.getField(); + } + }); + + // predicate to check if the row matches the model key defined by the protocol + Predicate<FishingOperation> predicate = new Predicate<FishingOperation>() { + @Override + public boolean apply(FishingOperation fishingOperation) { + + String operationNumberColumn = mappingRowsByField.get(FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER).getImportColumn(); + String stationColumn = mappingRowsByField.get(FishingOperation.PROPERTY_STATION_NUMBER).getImportColumn(); + String startDateColumn = mappingRowsByField.get(FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE).getImportColumn(); + + EditFishingOperationUIModel model = getModel(); + boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); + boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), model.getFishingOperationNumber()); + boolean sameGearShootingStartDate = Objects.equals(fishingOperation.getGearShootingStartDate(), model.getGearShootingStartDate()); + + return (StringUtils.isBlank(stationColumn) || sameStationNumber) + && (StringUtils.isBlank(operationNumberColumn) || sameFishingOperationNumber) + && (StringUtils.isBlank(startDateColumn) || sameGearShootingStartDate); + } + }; + + boolean found = false; + while (!found && operationUIModelImport.iterator().hasNext()) { + FishingOperation next = operationUIModelImport.iterator().next(); + if (predicate.apply(next)) { + getModel().fromEntity(next); + found = true; + } + } + + if (!found) { + throw new Exception(t("tutti.editFishingOperation.action.importColumns.operationNotFound")); + } + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); + } + + protected class ImportFromColumnFile extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { + + public ImportFromColumnFile(char separator, Set<String> headers) { + super(separator); + + TuttiProtocol protocol = getDataContext().getProtocol(); + Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping(); + + for (OperationFieldMappingRow mappingRow : operationFieldMapping) { + String importColumn = mappingRow.getImportColumn(); + if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { + + String field = mappingRow.getField(); + ValueParser valueParser; + switch (field) { + case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_NUMBER: + valueParser = TuttiCsvUtil.INTEGER; + break; + + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE: + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE: + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE: + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE: + case EditFishingOperationUIModel.PROPERTY_TRAWL_DISTANCE: + valueParser = TuttiCsvUtil.FLOAT; + break; + + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE: + case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_DATE: + valueParser = TuttiCsvUtil.DAY_TIME; + break; + + case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE: + case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID: + valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN; + break; + + case EditFishingOperationUIModel.PROPERTY_GEAR: + case EditFishingOperationUIModel.PROPERTY_VESSEL: + case EditFishingOperationUIModel.PROPERTY_STRATA: + case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: + case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: + case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: + + default: + valueParser = TuttiCsvUtil.STRING; + + } + newMandatoryColumn(importColumn, field, valueParser); + } + } + for (String header : headers) { + newIgnoredColumn(header); + } + } + + @Override + public FishingOperation newEmptyInstance() { + return FishingOperations.newFishingOperation(); + } + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java index 725e2cd..e807876 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/LoadProtocolImportColumnsAction.java @@ -6,6 +6,7 @@ import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIHandler; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.ext.CsvReaders; import java.io.File; import java.io.FileInputStream; @@ -47,14 +48,10 @@ public class LoadProtocolImportColumnsAction extends AbstractTuttiAction<EditPro @Override public void doAction() throws Exception { - FileInputStream fileInputStream = new FileInputStream(columnsFile); - CsvReader csvReader = new CsvReader(fileInputStream, ';', Charset.forName("UTF-8")); - if (csvReader.readHeaders()) { - String[] headers = csvReader.getHeaders(); - List<String> importColumns = Arrays.asList(headers); - Collections.sort(importColumns); - getModel().setImportColumns(importColumns); - } + String[] headers = CsvReaders.getHeader(columnsFile, ';'); + List<String> importColumns = Arrays.asList(headers); + Collections.sort(importColumns); + getModel().setImportColumns(importColumns); } @Override 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 c6378be..4d96eab 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 @@ -26,6 +26,7 @@ package fr.ifremer.tutti.ui.swing.action; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +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.service.PersistenceService; @@ -74,6 +75,10 @@ public class SaveProtocolAction extends AbstractTuttiAction<EditProtocolUIModel, new ArrayList<>(getUI().getCaracteristicsTable().getModel().getCaracteristicMapping().values()); bean.setCaracteristicMapping(caracteristicMappingRows); + List<OperationFieldMappingRow> operationFieldMappingRows = + new ArrayList<>(getUI().getCaracteristicsTable().getModel().getOperationFieldMappingRows().values()); + bean.setOperationFieldMapping(operationFieldMappingRows); + // get the species protocols from the table List<SpeciesProtocol> speciesProtocols = Lists.newArrayList(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css index 8a362e6..fe79d09 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css @@ -80,6 +80,15 @@ JXDatePicker { _onlyVerticalScrollable: true; } +#importFromColumnFile { + actionIcon: import; + text: "tutti.editFishingOperation.action.importFromColumnFile"; + toolTipText: "tutti.editFishingOperation.action.importFromColumnFile.tip"; + i18nMnemonic: "tutti.editFishingOperation.action.importFromColumnFile.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFromColumnFileAction.class}; + _help: {"tutti.editFishingOperation.action.importFromColumnFile.help"}; +} + #fishingOperationAttachmentsButton { enabled: {model.getId() != null}; toolTipText: "tutti.editFishingOperation.action.attachments.tip"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx index 23b0c18..909b0d3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx @@ -154,6 +154,7 @@ public EditFishingOperationUI(FishingOperationsUI parentUI) { constructorParams='"tuttihelp.editeditFishingOperation.help"'/> <JToolBar id='traitGeneralTabPaneToolBar'> + <JButton id='importFromColumnFile'/> <ButtonAttachment id='fishingOperationAttachmentsButton' constructorParams='getHandler().getContext(), getModel()'/> </JToolBar> 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 index 4773389..d92ab70 100644 --- 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 @@ -1,7 +1,20 @@ +#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 index 8706193..52c3949 100644 --- 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 @@ -34,7 +34,13 @@ <CaracteristicMappingUIModel id='model' initializer='getContextValue(CaracteristicMappingUIModel.class)'/> - <JScrollPane constraints="BorderLayout.CENTER"> - <JXTable id='caracteristicsTable'/> - </JScrollPane> + <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 index b3f2903..5c4252a 100644 --- 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 @@ -1,31 +1,36 @@ 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.JAXXUtil; import jaxx.runtime.SwingUtil; -import jaxx.runtime.swing.editor.bean.BeanUIUtil; 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.autocomplete.ObjectToStringConverter; import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.jdesktop.swingx.table.TableColumnExt; -import org.nuiton.decorator.Decorator; 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) @@ -100,6 +105,7 @@ public class CaracteristicMappingUIHandler CaracteristicMappingUIModel model = new CaracteristicMappingUIModel(); model.setCaracteristics(editProtocolUIModel.getCaracteristics()); + model.setOperationFieldMappingRows(editProtocolUIModel.getOperationFieldMapping()); editProtocolUIModel.addPropertyChangeListener(EditProtocolUIModel.PROPERTY_CARACTERISTIC_MAPPING, new PropertyChangeListener() { @Override @@ -108,6 +114,13 @@ public class CaracteristicMappingUIHandler } }); + 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) { @@ -127,12 +140,8 @@ public class CaracteristicMappingUIHandler dataToList.add(null); } - JComboBox comboBox = new JComboBox(); - SwingUtil.fillComboBox(comboBox, dataToList, null); - - TableColumnExt col = getTable().getColumnExt(2); - ComboBoxCellEditor editor = new ComboBoxCellEditor(comboBox); - col.setCellEditor(editor); + populateImportColumnTableEditor(getTable(), 2, dataToList); + populateImportColumnTableEditor(getUI().getOperationFieldsMapping(), 1, dataToList); } }); @@ -140,54 +149,174 @@ public class CaracteristicMappingUIHandler 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); - JXTable caracteristicsMappingTable = caracteristicMappingUI.getCaracteristicsTable(); + // init caracteristics mappingtable + { + JXTable caracteristicsMappingTable = getTable(); - DefaultTableColumnModelExt columnModel = new DefaultTableColumnModelExt(); + 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); -// } -// }); + // 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); + 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())); + addComboDataColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.TYPE, + getDecorator(CaracteristicType.class, null), + Lists.newArrayList(CaracteristicType.getTabTypes())); - addColumnToModel(columnModel, - EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); + addColumnToModel(columnModel, + EditProtocolCaracteristicsTableModel.IMPORT_FILE_COLUMN); - EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel, caracteristics); - caracteristicsMappingTable.setModel(tableModel); - caracteristicsMappingTable.setColumnModel(columnModel); + EditProtocolCaracteristicsTableModel tableModel = new EditProtocolCaracteristicsTableModel(columnModel, caracteristics); + caracteristicsMappingTable.setModel(tableModel); + caracteristicsMappingTable.setColumnModel(columnModel); - initTable(caracteristicsMappingTable); + 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) { - populateTable((Collection<CaracteristicMappingRow>) evt.getNewValue()); + 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 populateTable(Collection<CaracteristicMappingRow> values) { + protected void populateCaracteristicsTable(Collection<CaracteristicMappingRow> values) { List<EditProtocolCaracteristicsRowModel> rows = new ArrayList<EditProtocolCaracteristicsRowModel>(); for (CaracteristicMappingRow row : values) { EditProtocolCaracteristicsRowModel rowModel = getTableModel().createNewRow(); @@ -195,7 +324,7 @@ public class CaracteristicMappingUIHandler recomputeRowValidState(rowModel); rows.add(rowModel); } - getTableModel().setRows(rows); + getModel().setRows(rows); } @Override 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 index 03538c9..a353eb5 100644 --- 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 @@ -4,6 +4,7 @@ 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; @@ -23,11 +24,14 @@ public class CaracteristicMappingUIModel extends AbstractTuttiTableUIModel<Carac 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() { @@ -60,6 +64,23 @@ public class CaracteristicMappingUIModel extends AbstractTuttiTableUIModel<Carac 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; } 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 new file mode 100644 index 0000000..ac16751 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsRowModel.java @@ -0,0 +1,66 @@ +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 + */ +public class EditProtocolOperationFieldsRowModel extends AbstractTuttiBeanUIModel<OperationFieldMappingRow, EditProtocolOperationFieldsRowModel> { + + public static final String PROPERTY_FIELD = "field"; + public static final String PROPERTY_IMPORT_FILE_COLUMN = "importFileColumn"; + + protected String field; + protected String importFileColumn; + + protected static final Binder<OperationFieldMappingRow, EditProtocolOperationFieldsRowModel> fromBeanBinder = + BinderFactory.newBinder(OperationFieldMappingRow.class, + EditProtocolOperationFieldsRowModel.class); + + protected static final Binder<EditProtocolOperationFieldsRowModel, OperationFieldMappingRow> toBeanBinder = + BinderFactory.newBinder(EditProtocolOperationFieldsRowModel.class, + OperationFieldMappingRow.class); + + public EditProtocolOperationFieldsRowModel() { + super(fromBeanBinder, toBeanBinder); + } + + public String getField() { + return field; + } + + public void setField(String field) { + Object oldValue = getField(); + this.field = field; + firePropertyChanged(PROPERTY_FIELD, oldValue, field); + } + + public String getImportFileColumn() { + return importFileColumn; + } + + public void setImportFileColumn(String importFileColumn) { + Object oldValue = getImportFileColumn(); + this.importFileColumn = importFileColumn; + firePropertyChanged(PROPERTY_IMPORT_FILE_COLUMN, oldValue, importFileColumn); + } + + @Override + protected OperationFieldMappingRow newEntity() { + return new OperationFieldMappingRowBean(); + } +} 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 new file mode 100644 index 0000000..5d636a9 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolOperationFieldsTableModel.java @@ -0,0 +1,37 @@ +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; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class EditProtocolOperationFieldsTableModel extends AbstractApplicationTableModel<EditProtocolOperationFieldsRowModel> { + + public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> FIELD = ColumnIdentifier.newId( + EditProtocolOperationFieldsRowModel.PROPERTY_FIELD, + n("tutti.editProtocol.table.header.operationFields.field"), + n("tutti.editProtocol.table.header.operationFields.field.tip")); + + public static final ColumnIdentifier<EditProtocolCaracteristicsRowModel> IMPORT_FILE_COLUMN = ColumnIdentifier.newId( + EditProtocolOperationFieldsRowModel.PROPERTY_IMPORT_FILE_COLUMN, + n("tutti.editProtocol.table.header.operationFields.importFileColumn"), + n("tutti.editProtocol.table.header.operationFields.importFileColumn.tip")); + + public EditProtocolOperationFieldsTableModel(TableColumnModelExt columnModel) { + super(columnModel, false, false); + setNoneEditableCols(FIELD); + } + + @Override + public EditProtocolOperationFieldsRowModel createNewRow() { + return new EditProtocolOperationFieldsRowModel(); + } +} 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 d7c4c66..ab141b5 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 @@ -34,6 +34,7 @@ import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModelEntry; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +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.persistence.entities.referential.Speciess; @@ -458,8 +459,11 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI } }); + model.setVersion(TuttiProtocols.CURRENT_PROTOCOL_VERSION); + dialog = new SelectSpeciesUI(false, this.ui); + ui.getCaracteristicsTable().getModel().setModify(false); listenModelModifiy(ui.getCaracteristicsTable().getModel()); } 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 506a97b..5650ef4 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 @@ -26,6 +26,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; +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; @@ -665,4 +666,66 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, editObject.setImportColumns(importColumns); firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns()); } + + @Override + public void setOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) { + editObject.setOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + } + + @Override + public Collection<OperationFieldMappingRow> getOperationFieldMapping() { + return editObject.getOperationFieldMapping(); + } + + @Override + public boolean containsAllOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) { + return editObject.containsAllOperationFieldMapping(operationFieldMapping); + } + + @Override + public boolean containsOperationFieldMapping(OperationFieldMappingRow operationFieldMapping) { + return editObject.containsOperationFieldMapping(operationFieldMapping); + } + + @Override + public boolean removeAllOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) { + boolean removeAllOperationFieldMapping = editObject.removeAllOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + return removeAllOperationFieldMapping; + } + + @Override + public boolean removeOperationFieldMapping(OperationFieldMappingRow operationFieldMapping) { + boolean removeOperationFieldMapping = editObject.removeOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + return removeOperationFieldMapping; + } + + @Override + public void addAllOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) { + editObject.addAllOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + } + + @Override + public void addOperationFieldMapping(OperationFieldMappingRow operationFieldMapping) { + editObject.addOperationFieldMapping(operationFieldMapping); + firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping()); + } + + @Override + public int sizeOperationFieldMapping() { + return editObject.sizeOperationFieldMapping(); + } + + @Override + public boolean isOperationFieldMappingEmpty() { + return editObject.isOperationFieldMappingEmpty(); + } + + @Override + public OperationFieldMappingRow getOperationFieldMapping(int index) { + return editObject.getOperationFieldMapping(index); + } } 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 6f21ba3..a061cdb 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 @@ -690,10 +690,16 @@ tutti.editFishingOperation.action.attachments.tip= tutti.editFishingOperation.action.cancelEditFishingOperation= tutti.editFishingOperation.action.cancelEditFishingOperation.mnemonic= tutti.editFishingOperation.action.cancelEditFishingOperation.tip= +tutti.editFishingOperation.action.chooseColumnsFile.import= tutti.editFishingOperation.action.deleteFishingOperation.message= tutti.editFishingOperation.action.deleteFishingOperation.tip= tutti.editFishingOperation.action.deleteFishingOperation.title= tutti.editFishingOperation.action.editFishingOperation.tip= +tutti.editFishingOperation.action.importColumns.operationNotFound= +tutti.editFishingOperation.action.importColumns.success= +tutti.editFishingOperation.action.importFromColumnFile= +tutti.editFishingOperation.action.importFromColumnFile.mnemonic= +tutti.editFishingOperation.action.importFromColumnFile.tip= tutti.editFishingOperation.action.resetEditFishingOperation= tutti.editFishingOperation.action.resetEditFishingOperation.mnemonic= tutti.editFishingOperation.action.resetEditFishingOperation.tip= @@ -703,6 +709,7 @@ tutti.editFishingOperation.action.resetFishingOperationValidState.tip= tutti.editFishingOperation.action.saveEditFishingOperation.mnemonic= tutti.editFishingOperation.action.saveEditFishingOperation.tip= tutti.editFishingOperation.action.saveFishingOperation= +tutti.editFishingOperation.action.title.choose.importColumnsFile= tutti.editFishingOperation.askCancelEditBeforeLeaving.cancelEditFishingOperation= tutti.editFishingOperation.askSaveBeforeLeaving.createFishingOperation= tutti.editFishingOperation.askSaveBeforeLeaving.saveFishingOperation= @@ -972,6 +979,10 @@ tutti.editProtocol.table.header.countIfNoFrequency= tutti.editProtocol.table.header.countIfNoFrequency.tip= tutti.editProtocol.table.header.lengthStep= tutti.editProtocol.table.header.lengthStep.tip= +tutti.editProtocol.table.header.operationFields.field= +tutti.editProtocol.table.header.operationFields.field.tip= +tutti.editProtocol.table.header.operationFields.importFileColumn= +tutti.editProtocol.table.header.operationFields.importFileColumn.tip= tutti.editProtocol.table.header.speciesReferenceTaxonId= tutti.editProtocol.table.header.speciesReferenceTaxonId.tip= tutti.editProtocol.table.header.speciesSurveyCode= 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 53967e3..dffeadc 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 @@ -674,10 +674,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.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.mnemonic=c +tutti.editFishingOperation.action.importFromColumnFile.tip=Import du fichier de colonnes tutti.editFishingOperation.action.resetEditFishingOperation=Réinitialiser tutti.editFishingOperation.action.resetEditFishingOperation.mnemonic=R tutti.editFishingOperation.action.resetEditFishingOperation.tip=Réinitialiser l'édition du trait @@ -687,6 +693,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.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 @@ -952,6 +959,10 @@ tutti.editProtocol.table.header.countIfNoFrequency=Dénombrement tutti.editProtocol.table.header.countIfNoFrequency.tip=L'espèce doit elle être dénombrée ? tutti.editProtocol.table.header.lengthStep=Mode de mensuration tutti.editProtocol.table.header.lengthStep.tip=Comment mesurer les classes de taille ? (si vide alors pas de mesure) +tutti.editProtocol.table.header.operationFields.field=Champ +tutti.editProtocol.table.header.operationFields.field.tip=Champ du formulaire de trait +tutti.editProtocol.table.header.operationFields.importFileColumn=Colonne du fichier d'import +tutti.editProtocol.table.header.operationFields.importFileColumn.tip=Colonne du fichier d'import tutti.editProtocol.table.header.speciesReferenceTaxonId=Espèce tutti.editProtocol.table.header.speciesReferenceTaxonId.tip=Code Rubin – Nom scientifique tutti.editProtocol.table.header.speciesSurveyCode=Code campagne -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.