Author: kmorin Date: 2013-03-26 17:47:05 +0100 (Tue, 26 Mar 2013) New Revision: 682 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/682 Log: refs #1868 [CAPTURE] - Import/Export PUPITRI Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SplitSpeciesBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportPupitriAction.java Removed: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/AbstractChangeScreenAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/AbstractChangeScreenAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/AbstractChangeScreenAction.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/AbstractChangeScreenAction.java 2013-03-26 16:47:05 UTC (rev 682) @@ -86,7 +86,6 @@ TuttiUIContext context = getContext(); - Exception error = null; try { TuttiScreen previousScreen = context.getScreen(); @@ -105,18 +104,20 @@ context.setScreen(screen); } catch (Exception e) { - error = e; throw e; - } finally { + } + } - if (error != null) - - if (context.isDbLoaded()) { - - context.setScreen(TuttiScreen.SELECT_CRUISE); - } else { - context.setScreen(TuttiScreen.MANAGE_DB); - } + @Override + public void postFailedAction(Throwable error) { + TuttiUIContext context = getContext(); + if (error != null) { + if (context.isDbLoaded()) { + context.setScreen(TuttiScreen.SELECT_CRUISE); + } else { + context.setScreen(TuttiScreen.MANAGE_DB); + } } } + } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java 2013-03-26 16:47:05 UTC (rev 682) @@ -57,4 +57,16 @@ getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_EDIT); super.doAction(); } + + @Override + public void postFailedAction(Throwable error) { +// TuttiUIContext context = getContext(); +// if (error != null) { +// if (context.isDbLoaded()) { +// context.setScreen(TuttiScreen.SELECT_CRUISE); +// } else { +// context.setScreen(TuttiScreen.MANAGE_DB); +// } +// } + } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java 2013-03-26 16:47:05 UTC (rev 682) @@ -537,7 +537,8 @@ Integer objectId = Integer.valueOf(batch.getId()); attachments = persistenceService.getAllAttachments(objectId); getModel().setCatchEnabled(true); - } catch (InvalidBatchModelException e) { + + } catch (Exception e) { // batch is not compatible with Tutti if (log.isDebugEnabled()) { @@ -569,7 +570,7 @@ // 4) Propagate new selected fishingoperation to others tabs - ui.getSpeciesTabContent().getHandler().selectFishingOperation(batch == null ? null : bean); + ui.getSpeciesTabContent().getHandler().selectFishingOperation(batch == null ? null : bean); ui.getBenthosTabContent().getHandler().selectFishingOperation(batch == null ? null : bean); // ui.getPlanktonTabContent().getHandler().selectFishingOperation(bean); // ui.getMacroWasteTabContent().getHandler().selectFishingOperation(bean); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2013-03-26 16:47:05 UTC (rev 682) @@ -147,7 +147,13 @@ operation.setCruise(cruise); } editFishingOperationAction.setFishingOperation(operation); - AbstractTuttiAction.runAction(editFishingOperationAction); +// try { + AbstractTuttiAction.runAction(editFishingOperationAction); + +// } catch(RuntimeException e) { +// getModel().setSelectedFishingOperation(null); +//// throw e; +// } } } }); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriAction.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriAction.java 2013-03-26 16:47:05 UTC (rev 682) @@ -24,24 +24,25 @@ * #L% */ -import com.google.common.base.Function; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Multimap; -import com.google.common.collect.Multimaps; import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum; +import fr.ifremer.tutti.persistence.entities.data.SexEnum; +import fr.ifremer.tutti.persistence.entities.data.SizeEnum; import fr.ifremer.tutti.persistence.entities.data.SortedUnsortedEnum; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.pupitri.PupitriCatch; import fr.ifremer.tutti.service.pupitri.TuttiPupitriImportExportService; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SplitSpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; import org.apache.commons.logging.Log; @@ -50,7 +51,6 @@ import javax.swing.JOptionPane; import java.io.File; import java.util.List; -import java.util.Map; import static org.nuiton.i18n.I18n._; @@ -66,16 +66,49 @@ protected File importedCarrouselFile; + protected File importedSpeciesFile; + protected ImportPupitriPopupUI importPupitriDialog; protected TuttiProtocol currentProtocol; protected PersistenceService persistenceService; + protected CaracteristicQualitativeValue sortedCaracteristic; + + protected CaracteristicQualitativeValue unsortedCaracteristic; + + protected CaracteristicQualitativeValue maleCaracteristic; + + protected CaracteristicQualitativeValue femaleCaracteristic; + + protected CaracteristicQualitativeValue smallCaracteristic; + + protected CaracteristicQualitativeValue mediumCaracteristic; + + protected CaracteristicQualitativeValue bigCaracteristic; + public ImportPupitriAction(EditCatchesUIHandler handler) { super(handler, false); persistenceService = getContext().getPersistenceService(); importPupitriDialog = new ImportPupitriPopupUI(handler.getContext()); + + // get the sorted/unsorted caracteristics + Caracteristic sortedUnsortedcaracteristic = + persistenceService.getSortedUnsortedCaracteristic(); + sortedCaracteristic = + SortedUnsortedEnum.SORTED.getValue(sortedUnsortedcaracteristic); + unsortedCaracteristic = + SortedUnsortedEnum.UNSORTED.getValue(sortedUnsortedcaracteristic); + + Caracteristic sexCaracteristic = persistenceService.getSexCaracteristic(); + maleCaracteristic = SexEnum.MALE.getValue(sexCaracteristic); + femaleCaracteristic = SexEnum.FEMALE.getValue(sexCaracteristic); + + Caracteristic sizeCaracteristic = persistenceService.getSizeCategoryCaracteristic(); + smallCaracteristic = SizeEnum.SMALL.getValue(sizeCaracteristic); + mediumCaracteristic = SizeEnum.MEDIUM.getValue(sizeCaracteristic); + bigCaracteristic = SizeEnum.BIG.getValue(sizeCaracteristic); } @Override @@ -118,7 +151,10 @@ importPupitriDialog.open(); importedTrunkFile = importPupitriDialog.getTrunkFile().getSelectedFile(); importedCarrouselFile = importPupitriDialog.getCarrouselFile().getSelectedFile(); - result = importedTrunkFile != null && importedCarrouselFile != null; + importedSpeciesFile = importPupitriDialog.getSpeciesFile().getSelectedFile(); + result = importedTrunkFile != null + && importedCarrouselFile != null + && importedSpeciesFile != null; } return result; @@ -141,54 +177,85 @@ model.setCatchTotalRejectedWeight(catchBatch.getCatchTotalRejectedWeight()); model.setCatchTotalSortedTremisWeight(catchBatch.getCatchTotalSortedTremisWeight()); - addFileAsAttachment(importedTrunkFile); - - // import carrousel - Map<String, Float> sortedWeights = Maps.newLinkedHashMap(); - Map<String, Float> unsortedWeights = Maps.newLinkedHashMap(); - pupitriImportExportService.importPupitriCarrousel(importedCarrouselFile, operation, catchBatch, sortedWeights, unsortedWeights); + List<PupitriCatch> catches = + pupitriImportExportService.importPupitriCarrousel(importedCarrouselFile, + importedSpeciesFile, + operation, + catchBatch, + getDataContext().getReferentSpeciesWithSurveyCode()); // remove existing species SpeciesBatchUIModel speciesBatchUIModel = getUI().getSpeciesTabContent().getModel(); List<SpeciesBatchRowModel> rows = speciesBatchUIModel.getRows(); for (SpeciesBatchRowModel row : rows) { - persistenceService.deleteSpeciesBatch(row.getId()); + if (row.isBatchRoot()) { + persistenceService.deleteSpeciesBatch(row.getId()); + } } speciesBatchUIModel.setRows(null); - // get the map of species by survey code - Multimap<String, Species> speciesBySurveyCode = - Multimaps.index(getDataContext().getReferentSpeciesWithSurveyCode(), new Function<Species, String>() { - @Override - public String apply(Species input) { - String surveyCode = String.valueOf(input.getSurveyCode()); - int end = Math.min(surveyCode.length(), 7); - return surveyCode.substring(0, end); - } - }); - - // get the sorted/unsorted caracteristic - Caracteristic caracteristic = - persistenceService.getSortedUnsortedCaracteristic(); - CaracteristicQualitativeValue sortedvalue = - SortedUnsortedEnum.SORTED.getValue(caracteristic); - // add the valid species in the species table SpeciesBatchUIHandler speciesBatchUIHandler = getUI().getSpeciesTabContent().getHandler(); - for (String speciesId : sortedWeights.keySet()) { + for (PupitriCatch pupitriCatch : catches) { + Float catchWeight = pupitriCatch.getWeightBySign().get(PupitriCatch.Signs.DEFAULT); + CaracteristicQualitativeValue cqv = pupitriCatch.isSorted() ? + sortedCaracteristic : unsortedCaracteristic; - Float weight = sortedWeights.get(speciesId); - List<Species> speciesList = Lists.newArrayList(speciesBySurveyCode.get(speciesId.trim())); - if (!speciesList.isEmpty()) { - Species species = speciesList.get(0); - ImportPupitriSpeciesBatchRootRowModel rowModel = new ImportPupitriSpeciesBatchRootRowModel(species, sortedvalue, weight); - speciesBatchUIHandler.addBatch(rowModel); + ImportPupitriSpeciesBatchRootRowModel rowModel = + new ImportPupitriSpeciesBatchRootRowModel( + pupitriCatch.getSpecies(), cqv, catchWeight); + + speciesBatchUIHandler.addBatch(rowModel); + + if (catchWeight == null) { + SampleCategoryEnum category = null; + List<SplitSpeciesBatchRowModel> splitRows = Lists.newArrayList(); + for (PupitriCatch.Signs s : pupitriCatch.getWeightBySign().keySet()) { + CaracteristicQualitativeValue splitCqv = null; + switch (s) { + case MALE: + splitCqv = maleCaracteristic; + category = SampleCategoryEnum.sex; + break; + + case FEMALE: + splitCqv = femaleCaracteristic; + category = SampleCategoryEnum.sex; + break; + + case SMALL: + splitCqv = smallCaracteristic; + category = SampleCategoryEnum.size; + break; + + case MEDIUM: + splitCqv = mediumCaracteristic; + category = SampleCategoryEnum.size; + break; + + case BIG: + splitCqv = bigCaracteristic; + category = SampleCategoryEnum.size; + break; + } + SplitSpeciesBatchRowModel row = new SplitSpeciesBatchRowModel(); + row.setCategoryType(category); + row.setCategoryValue(splitCqv); + row.setWeight(pupitriCatch.getWeightBySign().get(s)); + row.setValid(true); + splitRows.add(row); + } + speciesBatchUIHandler.splitBatch(category, splitRows); } } model.setCatchTotalSortedCarousselWeight(catchBatch.getCatchTotalSortedCarousselWeight()); + + // add attachments + addFileAsAttachment(importedTrunkFile); addFileAsAttachment(importedCarrouselFile); + addFileAsAttachment(importedSpeciesFile); } @@ -249,7 +316,7 @@ } public boolean isValid() { - return species != null && batchWeight != null && sortedUnsortedCategory != null; + return species != null && sortedUnsortedCategory != null; } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.css 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.css 2013-03-26 16:47:05 UTC (rev 682) @@ -51,6 +51,18 @@ acceptAllFileFilterUsed: false; } +#speciesFileLabel { + text: "tutti.importPupitri.field.speciesFile"; + labelFor: {carrouselFile}; +} + +#speciesFile { + directoryEnabled: false; + exts: {_("tutti.importPupitri.speciesFile.extension")}; + extsDescription: {_("tutti.importPupitri.speciesFile.extension.description")}; + acceptAllFileFilterUsed: false; +} + #cancelButton { actionIcon: cancel; text: "tutti.common.cancel"; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.jaxx 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.jaxx 2013-03-26 16:47:05 UTC (rev 682) @@ -81,6 +81,15 @@ </row> <row> + <cell> + <JLabel id='speciesFileLabel'/> + </cell> + <cell weightx='1'> + <FileEditor id='speciesFile'/> + </cell> + </row> + + <row> <cell columns='2'> <JPanel layout='{new GridLayout(1,0)}'> <JButton id='cancelButton' onActionPerformed='handler.cancel()'/> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUIHandler.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUIHandler.java 2013-03-26 16:47:05 UTC (rev 682) @@ -67,6 +67,7 @@ protected void resetFields() { ui.getTrunkFile().setSelectedFile((String) null); ui.getCarrouselFile().setSelectedFile((String) null); + ui.getSpeciesFile().setSelectedFile((String) null); } public void open() { @@ -82,7 +83,8 @@ public void validate() { if (ui.getTrunkFile().getSelectedFile() != null - && ui.getCarrouselFile().getSelectedFile() != null) { + && ui.getCarrouselFile().getSelectedFile() != null + && ui.getSpeciesFile().getSelectedFile() != null) { ui.dispose(); } else { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-03-26 16:47:05 UTC (rev 682) @@ -48,7 +48,6 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.species.create.CreateSpeciesBatchUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyCellComponent; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.split.SplitSpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.split.SplitSpeciesBatchUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.split.SplitSpeciesBatchUIModel; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; @@ -631,11 +630,11 @@ recomputeRowValidState(newRow); + saveRow(newRow); + tableModel.addNewRow(newRow); AbstractSelectTableAction.doSelectCell(getTable(), tableModel.getRowCount() - 1, 0); - saveRow(newRow); - // update speciesUsed addToSpeciesUsed(newRow); } @@ -690,61 +689,52 @@ } } - public void splitBatch(SplitSpeciesBatchUIModel splitModel) { - if (splitModel.isValid()) { + public void splitBatch(SampleCategoryEnum sampleCategoryEnum, List<SplitSpeciesBatchRowModel> rows) { + JXTable table = getTable(); - JXTable table = getTable(); + // get selected row + int insertRow = table.getSelectedRow(); - // get selected row - int insertRow = table.getSelectedRow(); + SpeciesBatchTableModel tableModel = getTableModel(); + SpeciesBatchRowModel parentBatch = tableModel.getEntry(insertRow); - SpeciesBatchTableModel tableModel = getTableModel(); - SpeciesBatchRowModel parentBatch = tableModel.getEntry(insertRow); + // Create rows in batch table model - // create batch rows + List<SpeciesBatchRowModel> newBatches = Lists.newArrayList(); + for (SplitSpeciesBatchRowModel row : rows) { + if (row.isValid()) { - SampleCategoryEnum sampleCategoryEnum = splitModel.getSelectedCategory(); + // can keep this row + SpeciesBatchRowModel newBatch = tableModel.createNewRow(); - // Create rows in batch table model + loadBatchRow(parentBatch, + newBatch, + sampleCategoryEnum, + row.getCategoryValue(), + row.getWeight()); - List<SpeciesBatchRowModel> newBatches = Lists.newArrayList(); - for (SplitSpeciesBatchRowModel row : splitModel.getRows()) { - if (row.isValid()) { + recomputeRowValidState(newBatch); + newBatches.add(newBatch); - // can keep this row - SpeciesBatchRowModel newBatch = tableModel.createNewRow(); - - loadBatchRow(parentBatch, - newBatch, - sampleCategoryEnum, - row.getCategoryValue(), - row.getWeight()); - - recomputeRowValidState(newBatch); - newBatches.add(newBatch); - - tableModel.addNewRow(++insertRow, newBatch); - } + tableModel.addNewRow(++insertRow, newBatch); + AbstractSelectTableAction.doSelectCell(getTable(), insertRow, 0); } + } - // add new batches to his parent - parentBatch.setChildBatch(newBatches); + // add new batches to his parent + parentBatch.setChildBatch(newBatches); - //TODO Should only save parentBatch (will persist all his childs) + //TODO Should only save parentBatch (will persist all his childs) //saveRow(parentBatch); - // save new batches - saveRows(newBatches); + // save new batches + saveRows(newBatches); - SpeciesBatchUIModel model = getModel(); - model.setLeafNumber(model.getLeafNumber() + newBatches.size() - 1); - } + SpeciesBatchUIModel model = getModel(); + model.setLeafNumber(model.getLeafNumber() + newBatches.size() - 1); recomputeBatchActionEnable(); -// // reselect this cell -// AbstractSelectTableAction.doSelectCell(table, rowIndex, 0); -// table.requestFocus(); } public void updateTotalFromFrequencies(SpeciesBatchRowModel row) { @@ -797,11 +787,9 @@ if (TuttiEntities.isNew(catchBean)) { - SpeciesBatchRowModel batchParent = row.getParentBatch(); String parentBatchId = null; - - if (batchParent != null) { - parentBatchId = batchParent.getId(); + if (parent != null) { + parentBatchId = parent.getId(); } if (log.isInfoEnabled()) { Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SplitSpeciesBatchRowModel.java (from rev 677, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SplitSpeciesBatchRowModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SplitSpeciesBatchRowModel.java 2013-03-26 16:47:05 UTC (rev 682) @@ -0,0 +1,102 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species; + +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 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 fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.ui.swing.content.operation.catches.SampleCategory; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +import java.io.Serializable; + +/** + * A row in the {@link SplitSpeciesBatchUIModel}. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.3 + */ +public class SplitSpeciesBatchRowModel + extends AbstractTuttiBeanUIModel<SplitSpeciesBatchRowModel, SplitSpeciesBatchRowModel> { + + private static final long serialVersionUID = 1L; + + public static final String PROPERTY_CATEGORY_VALUE = "categoryValue"; + + public static final String PROPERTY_WEIGHT = "weight"; + + /** + * Delegate sample category which contains category value + weight. + * + * @since 0.3 + */ + protected final SampleCategory<Serializable> category = SampleCategory.newSample(null); + + public SplitSpeciesBatchRowModel() { + super(SplitSpeciesBatchRowModel.class, null, null); + } + + public SampleCategoryEnum getCategoryType() { + return category.getCategoryType(); + } + + public void setCategoryType(SampleCategoryEnum categoryType) { + category.setCategoryType(categoryType); + } + + public Serializable getCategoryValue() { + return category.getCategoryValue(); + } + + public void setCategoryValue(Serializable categoryValue) { + Object oldValue = getCategoryValue(); + category.setCategoryValue(categoryValue); + firePropertyChange(PROPERTY_CATEGORY_VALUE, oldValue, categoryValue); + } + + public void setCategoryValue(CaracteristicQualitativeValue categoryValue) { + Object oldValue = getCategoryValue(); + category.setCategoryValue(categoryValue); + firePropertyChange(PROPERTY_CATEGORY_VALUE, oldValue, categoryValue); + } + + public void setCategoryValue(Float categoryValue) { + Object oldValue = getCategoryValue(); + category.setCategoryValue(categoryValue); + firePropertyChange(PROPERTY_CATEGORY_VALUE, oldValue, categoryValue); + } + + public Float getWeight() { + return category.getCategoryWeight(); + } + + public void setWeight(Float weight) { + Object oldValue = getWeight(); + category.setCategoryWeight(weight); + firePropertyChange(PROPERTY_WEIGHT, oldValue, weight); + } + +} \ No newline at end of file Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java 2013-03-26 16:47:05 UTC (rev 682) @@ -1,110 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content.operation.catches.species.split; - -/* - * #%L - * Tutti :: UI - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2012 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 fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; -import fr.ifremer.tutti.ui.swing.content.operation.catches.SampleCategory; -import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; - -import java.io.Serializable; - -/** - * A row in the {@link SplitSpeciesBatchUIModel}. - * - * @author tchemit <chemit@codelutin.com> - * @since 0.3 - */ -public class SplitSpeciesBatchRowModel - extends AbstractTuttiBeanUIModel<SplitSpeciesBatchRowModel, SplitSpeciesBatchRowModel> { - - private static final long serialVersionUID = 1L; - - public static final String PROPERTY_CATEGORY_VALUE = "categoryValue"; - - public static final String PROPERTY_WEIGHT = "weight"; - - /** - * Delegate sample category which contains category value + weight. - * - * @since 0.3 - */ - protected final SampleCategory<Serializable> category = SampleCategory.newSample(null); - - protected static final Binder<SplitSpeciesBatchRowModel, SplitSpeciesBatchRowModel> fromBeanBinder = - BinderFactory.newBinder(SplitSpeciesBatchRowModel.class, - SplitSpeciesBatchRowModel.class); - - protected static final Binder<SplitSpeciesBatchRowModel, SplitSpeciesBatchRowModel> toBeanBinder = - BinderFactory.newBinder(SplitSpeciesBatchRowModel.class, - SplitSpeciesBatchRowModel.class); - - public SplitSpeciesBatchRowModel() { - super(SplitSpeciesBatchRowModel.class, fromBeanBinder, toBeanBinder); - } - - public SampleCategoryEnum getCategoryType() { - return category.getCategoryType(); - } - - public void setCategoryType(SampleCategoryEnum categoryType) { - category.setCategoryType(categoryType); - } - - public Serializable getCategoryValue() { - return category.getCategoryValue(); - } - - public void setCategoryValue(Serializable categoryValue) { - Object oldValue = getCategoryValue(); - category.setCategoryValue(categoryValue); - firePropertyChange(PROPERTY_CATEGORY_VALUE, oldValue, categoryValue); - } - - public void setCategoryValue(CaracteristicQualitativeValue categoryValue) { - Object oldValue = getCategoryValue(); - category.setCategoryValue(categoryValue); - firePropertyChange(PROPERTY_CATEGORY_VALUE, oldValue, categoryValue); - } - - public void setCategoryValue(Float categoryValue) { - Object oldValue = getCategoryValue(); - category.setCategoryValue(categoryValue); - firePropertyChange(PROPERTY_CATEGORY_VALUE, oldValue, categoryValue); - } - - public Float getWeight() { - return category.getCategoryWeight(); - } - - public void setWeight(Float weight) { - Object oldValue = getWeight(); - category.setCategoryWeight(weight); - firePropertyChange(PROPERTY_WEIGHT, oldValue, weight); - } - -} \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java 2013-03-26 16:47:05 UTC (rev 682) @@ -24,6 +24,7 @@ * #L% */ +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SplitSpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; import org.jdesktop.swingx.table.TableColumnModelExt; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java 2013-03-26 16:47:05 UTC (rev 682) @@ -24,6 +24,7 @@ * #L% */ +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SplitSpeciesBatchRowModel; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum; @@ -32,6 +33,7 @@ import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.SampleCategory; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUI; @@ -300,7 +302,12 @@ } EditCatchesUI parent = SwingUtil.getParentContainer(ui, EditCatchesUI.class); - parent.getSpeciesTabContent().getHandler().splitBatch(getModel()); + SplitSpeciesBatchUIModel model = getModel(); + if (model.isValid()) { + parent.getSpeciesTabContent().getHandler().splitBatch( + model.getSelectedCategory(), + model.getRows()); + } // close dialog closeUI(ui); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java 2013-03-26 16:47:05 UTC (rev 682) @@ -24,6 +24,7 @@ * #L% */ +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SplitSpeciesBatchRowModel; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchRowModel; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.css 2013-03-26 16:47:05 UTC (rev 682) @@ -201,6 +201,15 @@ _help: {"tutti.editProtocol.action.exportProtocolSpecies.help"}; } +#exportPupitriButton { + actionIcon: export; + text: "tutti.editProtocol.action.exportPupitri"; + toolTipText: "tutti.editProtocol.action.exportPupitri.tip"; + i18nMnemonic: "tutti.editProtocol.action.exportPupitri.mnemonic"; + _tuttiAction: {ExportPupitriAction.class}; + _help: {"tutti.editProtocol.action.exportPupitri.help"}; +} + #selectOtherBenthosButton { text: "tutti.editProtocol.action.selectOtherBenthos"; toolTipText: "tutti.editProtocol.action.selectOtherBenthos.tip"; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUI.jaxx 2013-03-26 16:47:05 UTC (rev 682) @@ -141,6 +141,7 @@ constraints='BorderLayout.NORTH'> <JButton id='importSpeciesButton'/> <JButton id='exportSpeciesButton'/> + <JButton id='exportPupitriButton'/> </JPanel> <Table fill='both' constraints='BorderLayout.CENTER'> Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportPupitriAction.java (from rev 677, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportProtocolSpeciesAction.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportPupitriAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/ExportPupitriAction.java 2013-03-26 16:47:05 UTC (rev 682) @@ -0,0 +1,127 @@ +package fr.ifremer.tutti.ui.swing.content.protocol; + +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 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 com.google.common.collect.Lists; +import fr.ifremer.tutti.TuttiIOUtil; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.protocol.TuttiProtocolImportExportService; +import fr.ifremer.tutti.service.pupitri.TuttiPupitriImportExportService; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.File; +import java.util.List; + +import static org.nuiton.i18n.I18n._; + +/** + * To export protocol species. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.0 + */ +public class ExportPupitriAction extends AbstractTuttiAction<EditProtocolUIModel, EditProtocolUI, EditProtocolUIHandler> { + + /** Logger. */ + private static final Log log = + LogFactory.getLog(ExportPupitriAction.class); + + private File file; + + public ExportPupitriAction(EditProtocolUIHandler handler) { + super(handler, true); + } + + @Override + protected boolean prepareAction() throws Exception { + + boolean doAction = super.prepareAction(); + + if (doAction) { + + // choose file to export + file = TuttiUIUtil.chooseFile( + getContext().getMainUI(), + _("tutti.editProtocol.title.choose.speciesExportFile"), + _("tutti.editProtocol.action.chooseProtocolSpeciesFile"), + "^.*\\.ibts", _("tutti.common.file.ibts") + ); + if (file == null) { + + // user cancel + doAction = false; + } else { + + // add extension if missing + file = TuttiIOUtil.addExtensionIfMissing(file, ".ibts"); + + // ask user to confirm overwrite. + doAction = getHandler().askOverwriteFile(file); + } + } + return doAction; + } + + @Override + protected void releaseAction() { + file = null; + super.releaseAction(); + } + + @Override + protected void doAction() throws Exception { + Preconditions.checkNotNull(file); + if (log.isInfoEnabled()) { + log.info("Will export protocol species to file: " + file); + } + + EditProtocolUIModel model = getModel(); + + // build species protocol to export + + List<Species> speciesList = Lists.newArrayList(); + for (EditProtocolSpeciesRowModel row : model.getSpecies()) { + if (row.isValid()) { + Species species = row.getSpecies(); + species.setSurveyCode(row.getSpeciesSurveyCode()); + speciesList.add(species); + } + } + + // import + TuttiPupitriImportExportService service = + getContext().getTuttiPupitriImportExportService(); + + service.exportSpecies(speciesList, file); + + sendMessage(_("tutti.flash.info.species.exported.from.protocol", + file)); + } +} \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiUIHandler.java 2013-03-26 16:47:05 UTC (rev 682) @@ -366,11 +366,11 @@ protected Component getTopestUI() { Component result; TuttiActionUI actionUI = getContext().getActionUI(); - if (actionUI.isVisible()) { +// if (actionUI.isVisible()) { result = actionUI; - } else { - result = getContext().getMainUI(); - } +// } else { +// result = getContext().getMainUI(); +// } return result; } Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-03-26 16:47:05 UTC (rev 682) @@ -53,6 +53,7 @@ tutti.common.cancel= tutti.common.cancel.mnemonic= tutti.common.file.csv= +tutti.common.file.ibts= tutti.common.file.protocol= tutti.common.file.zip= tutti.common.validate= @@ -508,6 +509,9 @@ tutti.editProtocol.action.exportProtocolSpecies= tutti.editProtocol.action.exportProtocolSpecies.mnemonic= tutti.editProtocol.action.exportProtocolSpecies.tip= +tutti.editProtocol.action.exportPupitri= +tutti.editProtocol.action.exportPupitri.mnemonic= +tutti.editProtocol.action.exportPupitri.tip= tutti.editProtocol.action.importProtocolBenthos= tutti.editProtocol.action.importProtocolBenthos.mnemonic= tutti.editProtocol.action.importProtocolBenthos.tip= @@ -716,7 +720,10 @@ tutti.importPupitri.error.fileMissing.message= tutti.importPupitri.error.fileMissing.title= tutti.importPupitri.field.carrouselFile= +tutti.importPupitri.field.speciesFile= tutti.importPupitri.field.trunkFile= +tutti.importPupitri.speciesFile.extension= +tutti.importPupitri.speciesFile.extension.description= tutti.importPupitri.title= tutti.importPupitri.trunkFile.extension= tutti.importPupitri.trunkFile.extension.description= Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-03-26 16:46:19 UTC (rev 681) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-03-26 16:47:05 UTC (rev 682) @@ -52,6 +52,7 @@ tutti.common.cancel=Annuler tutti.common.cancel.mnemonic=A tutti.common.file.csv=Extension d'un fichier csv +tutti.common.file.ibts= tutti.common.file.protocol=Extension d'un fichier de protocole Tutti tutti.common.file.zip=Extension d'une archive zip tutti.common.validate=Valider @@ -518,6 +519,9 @@ tutti.editProtocol.action.exportProtocolSpecies=Exporter les espèces tutti.editProtocol.action.exportProtocolSpecies.mnemonic=è tutti.editProtocol.action.exportProtocolSpecies.tip=Exporter les espèces du protocole +tutti.editProtocol.action.exportPupitri= +tutti.editProtocol.action.exportPupitri.mnemonic= +tutti.editProtocol.action.exportPupitri.tip= tutti.editProtocol.action.importProtocolBenthos=Importer les benthos tutti.editProtocol.action.importProtocolBenthos.mnemonic=i tutti.editProtocol.action.importProtocolBenthos.tip=Importer les benthos dans le protocole @@ -725,7 +729,10 @@ tutti.importPupitri.error.fileMissing.message=Vous devez sélectionner un fichier pour le trémie et un fichier pour le carrousel pour pouvoir continuer l'import. tutti.importPupitri.error.fileMissing.title=Fichier non renseigné tutti.importPupitri.field.carrouselFile=Fichier du carrousel +tutti.importPupitri.field.speciesFile=Fichier des espèces tutti.importPupitri.field.trunkFile=Fichier du trémie +tutti.importPupitri.speciesFile.extension=ibts +tutti.importPupitri.speciesFile.extension.description=Fichier des espèces (.ibts) tutti.importPupitri.title=Import Pupitri tutti.importPupitri.trunkFile.extension=tnk tutti.importPupitri.trunkFile.extension.description=Fichier du trémie (.tnk)