r665 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/content/operation/catches java/fr/ifremer/tutti/ui/swing/content/operation/catches/species java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split resources/fr/ifremer/tutti/ui/swing/content/operation resources/i18n
Author: kmorin Date: 2013-03-22 19:08:00 +0100 (Fri, 22 Mar 2013) New Revision: 665 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/665 Log: refs #1868 [CAPTURE] - Import/Export PUPITRI refs #2106 [ESPECE] - saisie des mensurations : cliquer sur "simple d?\195?\169nombrement" alors qu'il y a des mensurations de saisie Added: 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/SpeciesBatchRootRowModel.java Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ComputeWeightsAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.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/species/SpeciesBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel.java trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml 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/TuttiUIContext.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-03-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-03-22 18:08:00 UTC (rev 665) @@ -36,6 +36,7 @@ import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiServiceContext; import fr.ifremer.tutti.service.protocol.TuttiProtocolImportExportService; +import fr.ifremer.tutti.service.pupitri.TuttiPupitriImportExportService; import fr.ifremer.tutti.service.referential.TuttiReferentialImportExportService; import fr.ifremer.tutti.service.referential.TuttiReferentialSynchronizeService; import fr.ifremer.tutti.ui.swing.config.TuttiApplicationConfig; @@ -320,6 +321,10 @@ public TuttiProtocolImportExportService getTuttiProtocolImportExportService() { return serviceContext.getService(TuttiProtocolImportExportService.class); } + + public TuttiPupitriImportExportService getTuttiPupitriImportExportService() { + return serviceContext.getService(TuttiPupitriImportExportService.class); + } public TuttiReferentialImportExportService getTuttiReferentialImportExportService() { return serviceContext.getService(TuttiReferentialImportExportService.class); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ComputeWeightsAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ComputeWeightsAction.java 2013-03-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ComputeWeightsAction.java 2013-03-22 18:08:00 UTC (rev 665) @@ -65,24 +65,30 @@ if (speciesTotalSortedWeight == null) { speciesTotalSortedWeight = model.getSpeciesTotalSortedComputedWeight(); } - Float speciesTotalUnsortedWeight = model.getSpeciesTotalUnsortedComputedWeight(); + Float carrouselWeight = model.getCatchTotalSortedCarousselWeight(); + Float totalUnsortedWeight = model.getSpeciesTotalUnsortedComputedWeight(); + Float totalSortedWeight; + if (carrouselWeight != null) { + totalSortedWeight = carrouselWeight; + } else { + totalSortedWeight = speciesTotalSortedWeight; + } model.setCatchTotalSortedComputedWeight(speciesTotalSortedWeight); - model.setCatchTotalUnsortedComputedWeight(speciesTotalUnsortedWeight); + model.setCatchTotalUnsortedComputedWeight(totalUnsortedWeight); Float totalWeight = model.getCatchTotalWeight(); Float rejectedWeight = model.getCatchTotalRejectedWeight(); - + if (rejectedWeight == null && totalWeight != null) { - if (!totalWeight.equals(speciesTotalUnsortedWeight - + speciesTotalSortedWeight)) { + if (!totalWeight.equals(totalUnsortedWeight + + totalSortedWeight)) { throw new TuttiBusinessException(_("tutti.editCatchBatch.action.computeWeights.error.incoherentTotal")); } else { - model.setCatchTotalRejectedComputedWeight(totalWeight - - speciesTotalUnsortedWeight - - speciesTotalSortedWeight); + - totalUnsortedWeight + - totalSortedWeight); } } else if (totalWeight == null) { @@ -90,13 +96,13 @@ rejectedWeight = 0f; model.setCatchTotalRejectedComputedWeight(0f); } - model.setCatchTotalComputedWeight(speciesTotalUnsortedWeight - + speciesTotalSortedWeight + model.setCatchTotalComputedWeight(totalUnsortedWeight + + totalSortedWeight + rejectedWeight); } else if (rejectedWeight != null - && !totalWeight.equals(speciesTotalUnsortedWeight - + speciesTotalSortedWeight + && !totalWeight.equals(totalUnsortedWeight + + totalSortedWeight + rejectedWeight)) { throw new TuttiBusinessException(_("tutti.editCatchBatch.action.computeWeights.error.incoherentTotal")); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css 2013-03-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css 2013-03-22 18:08:00 UTC (rev 665) @@ -105,6 +105,7 @@ #catchTotalSortedTremisWeightField { enabled: false; + text: {getWeightStringValue(model.getCatchTotalSortedTremisWeight())}; } #catchTotalSortedCarousselWeightLabel { @@ -116,6 +117,7 @@ #catchTotalSortedCarousselWeightField { enabled: false; + text: {getWeightStringValue(model.getCatchTotalSortedCarousselWeight())}; } #catchTotalRejectedWeightLabel { @@ -293,6 +295,7 @@ text: "tutti.editCatchBatch.action.importPupitri"; toolTipText: "tutti.editCatchBatch.action.importPupitri.tip"; i18nMnemonic: "tutti.editCatchBatch.action.importPupitri.mnemonic"; + /*enabled: {model.getCatchTotalSortedTremisWeight() == null};*/ _tuttiAction: {ImportPupitriAction.class}; _help: {"tutti.editCatchBatch.action.importPupitri.help"}; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-03-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-03-22 18:08:00 UTC (rev 665) @@ -45,7 +45,9 @@ import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.io.File; import java.util.Set; +import javax.swing.Action; import static org.nuiton.i18n.I18n._; import static org.nuiton.i18n.I18n.n_; 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-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriAction.java 2013-03-22 18:08:00 UTC (rev 665) @@ -24,20 +24,240 @@ * #L% */ +import com.google.common.base.Function; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +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.protocol.SpeciesProtocol; +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.TuttiPupitriImportExportService; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchRootRowModel; +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.util.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import java.io.File; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import javax.swing.JOptionPane; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import static org.nuiton.i18n.I18n._; + /** * @author tchemit <chemit@codelutin.com> * @since 1.0 */ public class ImportPupitriAction extends AbstractTuttiAction<EditCatchesUIModel, EditCatchesUI, EditCatchesUIHandler> { + private Log log = LogFactory.getLog(ImportPupitriAction.class); + + protected File importedTrunkFile; + + protected File importedCarrouselFile; + + protected ImportPupitriPopupUI importPupitriDialog; + + protected TuttiProtocol currentProtocol; + + protected PersistenceService persistenceService; + public ImportPupitriAction(EditCatchesUIHandler handler) { super(handler, false); + persistenceService = getContext().getPersistenceService(); + importPupitriDialog = new ImportPupitriPopupUI(handler.getContext()); } @Override + protected boolean prepareAction() throws Exception { + boolean result = true; + + if (!getContext().isProtocolFilled()) { + result = false; + + } else { + String protocolId = getContext().getProtocolId(); + currentProtocol = persistenceService.getProtocol(protocolId); + result = currentProtocol != null && !currentProtocol.getSpecies().isEmpty(); + } + + if (!result) { + JOptionPane.showMessageDialog(getContext().getActionUI(), + _("tutti.editCatchBatch.action.importPupitri.noProtocol.message"), + _("tutti.editCatchBatch.action.importPupitri.noProtocol.title"), + JOptionPane.ERROR_MESSAGE); + } + + SpeciesBatchUIModel speciesBatchUIModel = getUI().getSpeciesTabContent().getModel(); + if (result && speciesBatchUIModel.getRowCount() > 0) { + String htmlMessage = String.format( + AbstractTuttiUIHandler.CONFIRMATION_FORMAT, + _("tutti.editCatchBatch.action.importPupitri.existingData.message"), + _("tutti.editCatchBatch.action.importPupitri.existingData.help")); + + int answer = JOptionPane.showConfirmDialog(getContext().getActionUI(), + htmlMessage, + _("tutti.editCatchBatch.action.importPupitri.existingData.title"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.WARNING_MESSAGE); + + result = answer == JOptionPane.OK_OPTION; + } + + if (result) { + importPupitriDialog.open(); + importedTrunkFile = importPupitriDialog.getTrunkFile().getSelectedFile(); + importedCarrouselFile = importPupitriDialog.getCarrouselFile().getSelectedFile(); + result = importedTrunkFile != null && importedCarrouselFile != null; + } + + return result; + } + + @Override protected void doAction() throws Exception { - //TODO + TuttiPupitriImportExportService pupitriImportExportService = + getContext().getTuttiPupitriImportExportService(); + + EditCatchesUIModel model = getModel(); + + FishingOperation operation = model.getFishingOperation(); + CatchBatch catchBatch = model.getCatchBatch(); + + + // import trunk + pupitriImportExportService.importPupitriTrunk(importedTrunkFile, operation, catchBatch); + + 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); + + // remove existing species + SpeciesBatchUIModel speciesBatchUIModel = getUI().getSpeciesTabContent().getModel(); + List<SpeciesBatchRowModel> rows = speciesBatchUIModel.getRows(); + for (SpeciesBatchRowModel row : rows) { + 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 = null; + for (CaracteristicQualitativeValue value : caracteristic.getQualitativeValue()) { + if (persistenceService.isSortedQualitativeValue(value)) { + sortedvalue = value; + break; + } + } + + // add the valid species in the species table + SpeciesBatchUIHandler speciesBatchUIHandler = getUI().getSpeciesTabContent().getHandler(); + for (String speciesId : sortedWeights.keySet()) { + + 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.addSpeciesBatch(rowModel); + } + } + + model.setCatchTotalSortedCarousselWeight(catchBatch.getCatchTotalSortedCarousselWeight()); + addFileAsAttachment(importedCarrouselFile); + } + + protected void addFileAsAttachment(File f) { + EditCatchesUIModel model = getModel(); + + Attachment attachment = new Attachment(); + attachment.setObjectType(model.getObjectType()); + attachment.setObjectId(Integer.valueOf(model.getObjectId())); + attachment.setName(f.getName()); + attachment.setComment("import pupitri"); + attachment = persistenceService.createAttachment(attachment, f); + + model.addAttachment(attachment); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + sendMessage(_("")); + } + + @Override + protected void releaseAction() { + super.releaseAction(); + importedTrunkFile = null; + importedCarrouselFile = null; + currentProtocol = null; + } + + class ImportPupitriSpeciesBatchRootRowModel implements SpeciesBatchRootRowModel { + + Species species; + + CaracteristicQualitativeValue sortedUnsortedCategory; + + Float batchWeight; + + public ImportPupitriSpeciesBatchRootRowModel(Species species, + CaracteristicQualitativeValue sortedUnsortedCategory, + Float batchWeight) { + + this.species = species; + this.sortedUnsortedCategory = sortedUnsortedCategory; + this.batchWeight = batchWeight; + } + + public Species getSpecies() { + return species; + } + + public CaracteristicQualitativeValue getSortedUnsortedCategory() { + return sortedUnsortedCategory; + } + + public Float getBatchWeight() { + return batchWeight; + } + + public boolean isValid() { + return species != null && batchWeight != null && sortedUnsortedCategory != null; + } + + } } Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.css (from rev 662, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/attachment/AttachmentEditorUI.css) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.css (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.css 2013-03-22 18:08:00 UTC (rev 665) @@ -0,0 +1,67 @@ +/* + * #%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% +*/ + +#importPupitriDialog { + modal: true; + title: "tutti.importPupitri.title"; +} + +#trunkFileLabel { + text: "tutti.importPupitri.field.trunkFile"; + labelFor: {trunkFile}; +} + +#trunkFile { + directoryEnabled: false; + exts: {_("tutti.importPupitri.trunkFile.extension")}; + extsDescription: {_("tutti.importPupitri.trunkFile.extension.description")}; + acceptAllFileFilterUsed: false; +} + +#carrouselFileLabel { + text: "tutti.importPupitri.field.carrouselFile"; + labelFor: {carrouselFile}; +} + +#carrouselFile { + directoryEnabled: false; + exts: {_("tutti.importPupitri.carrouselFile.extension")}; + extsDescription: {_("tutti.importPupitri.carrouselFile.extension.description")}; + acceptAllFileFilterUsed: false; +} + +#cancelButton { + actionIcon: cancel; + text: "tutti.common.cancel"; + toolTipText: "tutti.common.cancel"; + i18nMnemonic: "tutti.common.cancel.mnemonic"; +} + +#validateButton { + actionIcon: add; + text: "tutti.common.validate"; + toolTipText: "tutti.common.validate"; + i18nMnemonic: "tutti.common.validate.mnemonic"; +} + Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.jaxx (from rev 662, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/attachment/AttachmentEditorUI.jaxx) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.jaxx (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUI.jaxx 2013-03-22 18:08:00 UTC (rev 665) @@ -0,0 +1,94 @@ +<!-- + #%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% + --> +<JDialog id='importPupitriDialog' layout='{new BorderLayout()}'> + + <import> + fr.ifremer.tutti.ui.swing.TuttiUIContext + + jaxx.runtime.swing.editor.FileEditor + org.jdesktop.swingx.JXTitledPanel + javax.swing.JComponent + </import> + + <script><![CDATA[ + +public ImportPupitriPopupUI(TuttiUIContext context) { + super(context.getMainUI()); + setContextValue(context); + ImportPupitriPopupUIHandler handler = new ImportPupitriPopupUIHandler(context, this); + setContextValue(handler); + handler.beforeInitUI(); +} + +protected void $afterCompleteSetup() { + getHandler().afterInitUI(); +} + +public void open() { + handler.open(); +} + ]]></script> + + <!-- if true, display the form to add attachments + and the button to remove existing attachments --> + <Boolean id='editable' javaBean='true'/> + + <!-- bean property --> + <!--<AttachmentModelAware id='bean' javaBean='null'/>--> + + <ImportPupitriPopupUIHandler id='handler' + initializer='getContextValue(ImportPupitriPopupUIHandler.class)'/> + + <Table id='mainPanel' fill='both'> + + <row> + <cell> + <JLabel id='trunkFileLabel'/> + </cell> + <cell weightx='1'> + <FileEditor id='trunkFile'/> + </cell> + </row> + + <row> + <cell> + <JLabel id='carrouselFileLabel'/> + </cell> + <cell weightx='1'> + <FileEditor id='carrouselFile'/> + </cell> + </row> + + <row> + <cell columns='2'> + <JPanel layout='{new GridLayout(1,0)}'> + <JButton id='cancelButton' onActionPerformed='handler.cancel()'/> + <JButton id='validateButton' onActionPerformed='handler.validate()'/> + </JPanel> + </cell> + </row> + + </Table> + +</JDialog> \ No newline at end of file Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUIHandler.java (from rev 662, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/attachment/AttachmentEditorUIHandler.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUIHandler.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/ImportPupitriPopupUIHandler.java 2013-03-22 18:08:00 UTC (rev 665) @@ -0,0 +1,96 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches; + +/* + * #%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.ui.swing.TuttiUIContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.JOptionPane; +import jaxx.runtime.SwingUtil; + +import static org.nuiton.i18n.I18n._; + +/** + * @author kmorin <morin@codelutin.com> + * @author tchemit <chemit@codelutin.com> + * @since 0.2 + */ +public class ImportPupitriPopupUIHandler { + + /** Logger. */ + private static final Log log = + LogFactory.getLog(ImportPupitriPopupUIHandler.class); + + protected final ImportPupitriPopupUI ui; + + protected final TuttiUIContext context; + + public ImportPupitriPopupUIHandler(TuttiUIContext context, + ImportPupitriPopupUI ui) { + this.context = context; + this.ui = ui; + } + + protected void beforeInitUI() { + } + + protected void afterInitUI() { + ui.getTrunkFile().setDialogOwner(ui); + ui.getCarrouselFile().setDialogOwner(ui); + ui.pack(); + ui.setResizable(true); + } + + protected void resetFields() { + ui.getTrunkFile().setSelectedFile((String) null); + ui.getCarrouselFile().setSelectedFile((String) null); + } + + public void open() { + resetFields(); + SwingUtil.center(context.getMainUI(), ui); + ui.setVisible(true); + } + + public void cancel() { + resetFields(); + ui.dispose(); + } + + public void validate() { + if (ui.getTrunkFile().getSelectedFile() != null + && ui.getCarrouselFile().getSelectedFile() != null) { + ui.dispose(); + + } else { + JOptionPane.showMessageDialog(ui, + _("tutti.importPupitri.error.fileMissing.message"), + _("tutti.importPupitri.error.fileMissing.title"), + JOptionPane.ERROR_MESSAGE); + } + } + +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRootRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRootRowModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRootRowModel.java 2013-03-22 18:08:00 UTC (rev 665) @@ -0,0 +1,19 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species; + +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.Species; + +/** + * + * @author kmorin <kmorin@codelutin.com> + */ +public interface SpeciesBatchRootRowModel { + + Species getSpecies(); + + CaracteristicQualitativeValue getSortedUnsortedCategory(); + + Float getBatchWeight(); + + boolean isValid(); +} 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-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-03-22 18:08:00 UTC (rev 665) @@ -638,19 +638,19 @@ parent.getHandler().setSpeciesSelectedCard(EditCatchesUIHandler.CREATE_BATCH_CARD); } - public void addSpeciesBatch(CreateSpeciesBatchUIModel createModel) { - if (createModel.isValid()) { + public void addSpeciesBatch(SpeciesBatchRootRowModel speciesBatchRootRowModel) { + if (speciesBatchRootRowModel.isValid()) { SpeciesBatchTableModel tableModel = getTableModel(); SpeciesBatchRowModel newRow = tableModel.createNewRow(); - Species species = createModel.getSpecies(); + Species species = speciesBatchRootRowModel.getSpecies(); newRow.setSpecies(species); - CaracteristicQualitativeValue sortedUnsortedCategory = createModel.getSortedUnsortedCategory(); + CaracteristicQualitativeValue sortedUnsortedCategory = speciesBatchRootRowModel.getSortedUnsortedCategory(); SampleCategory<CaracteristicQualitativeValue> category = newRow.getSortedUnsortedCategory(); category.setCategoryValue(sortedUnsortedCategory); - category.setCategoryWeight(createModel.getBatchWeight()); + category.setCategoryWeight(speciesBatchRootRowModel.getBatchWeight()); newRow.setSampleCategory(category); recomputeRowValidState(newRow); @@ -904,8 +904,10 @@ // can split if selected batch is a leaf enableSplit = row.isBatchLeaf() - && selectedRowCount == 1 - && row.getComputedNumber() == null; + && selectedRowCount == 1 + && row.getNumber() == null + && (row.getComputedNumber() == null + || row.getComputedNumber() == 0); } if (enableRename) { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css 2013-03-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.css 2013-03-22 18:08:00 UTC (rev 665) @@ -232,3 +232,14 @@ enabled: {model.isValid()}; _help: {"tutti.editSpeciesFrequencies.action.save.help"}; } + +#dataInFrequenciesWarningContainer { + background: {new java.awt.Color(245, 218, 88)}; + visible: {!org.apache.commons.collections.CollectionUtils.isEmpty(model.getBatch().getFrequency())}; +} + +#dataInFrequenciesWarning { + actionIcon: warning; + border: {new javax.swing.border.EmptyBorder(5, 10, 5, 10)}; + text: "tutti.editSpeciesFrequencies.simpleCountingAndFrequencies"; +} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx 2013-03-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx 2013-03-22 18:08:00 UTC (rev 665) @@ -196,6 +196,13 @@ </JScrollPane> <Table constraints='"noLengthCaracteristicPmfm"' fill='horizontal'> <row> + <cell columns='2'> + <JPanel id='dataInFrequenciesWarningContainer' layout='{new BorderLayout(10, 10)}'> + <JLabel id='dataInFrequenciesWarning' constraints='BorderLayout.CENTER'/> + </JPanel> + </cell> + </row> + <row> <cell> <JLabel id='simpleCountingLabel'/> </cell> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel.java 2013-03-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel.java 2013-03-22 18:08:00 UTC (rev 665) @@ -28,6 +28,7 @@ import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchRootRowModel; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -40,7 +41,8 @@ * @author tchemit <chemit@codelutin.com> * @since 0.3 */ -public class CreateSpeciesBatchUIModel extends AbstractTuttiBeanUIModel<CreateSpeciesBatchUIModel, CreateSpeciesBatchUIModel> { +public class CreateSpeciesBatchUIModel extends AbstractTuttiBeanUIModel<CreateSpeciesBatchUIModel, CreateSpeciesBatchUIModel> + implements SpeciesBatchRootRowModel { private final static Log log = LogFactory.getLog(CreateSpeciesBatchUIModel.class); Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml 2013-03-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-warning-validation.xml 2013-03-22 18:08:00 UTC (rev 665) @@ -33,12 +33,30 @@ <field name='strata'> <field-validator type="fieldexpression" short-circuit="true"> <param name="expression"> - <![CDATA[ strata != null ]]> + <![CDATA[ strata != null || subStrata != null || location != null ]]> </param> <message>tutti.validator.error.fishingOperation.strataLocation.required</message> </field-validator> </field> + <field name='subStrata'> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ strata != null || subStrata != null || location != null ]]> + </param> + <message>tutti.validator.error.fishingOperation.strataLocation.required</message> + </field-validator> + </field> + + <field name='location'> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ strata != null || subStrata != null || location != null ]]> + </param> + <message>tutti.validator.error.fishingOperation.strataLocation.required</message> + </field-validator> + </field> + <field name="gearShootingStartDate"> <field-validator type="fieldexpression" short-circuit="true"> Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml 2013-03-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml 2013-03-22 18:08:00 UTC (rev 665) @@ -89,6 +89,24 @@ </field-validator> </field> + <field name='subStrata'> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ strata != null || subStrata != null || location != null ]]> + </param> + <message>tutti.validator.error.fishingOperation.strataLocation.required</message> + </field-validator> + </field> + + <field name='location'> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ strata != null || subStrata != null || location != null ]]> + </param> + <message>tutti.validator.error.fishingOperation.strataLocation.required</message> + </field-validator> + </field> + <field name="gearShootingStartDate"> <field-validator type="required" short-circuit="true"> 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-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-03-22 18:08:00 UTC (rev 665) @@ -1,3 +1,4 @@ += swing.error.desktop.browse.not.supported= swing.error.desktop.not.supported= tutti.about.bottomText= @@ -46,9 +47,13 @@ tutti.common.askOverwriteFile.title= tutti.common.askSaveBeforeLeaving.help= tutti.common.askSaveBeforeLeaving.title= +tutti.common.cancel= +tutti.common.cancel.mnemonic= tutti.common.file.csv= tutti.common.file.protocol= tutti.common.file.zip= +tutti.common.validate= +tutti.common.validate.mnemonic= tutti.config.action.reload.actions= tutti.config.action.reload.application= tutti.config.action.reload.ui= @@ -178,7 +183,12 @@ tutti.editCatchBatch.action.computeWeights.replaceTotalSortedWeight.title= tutti.editCatchBatch.action.computeWeights.tip= tutti.editCatchBatch.action.importPupitri= +tutti.editCatchBatch.action.importPupitri.existingData.help= +tutti.editCatchBatch.action.importPupitri.existingData.message= +tutti.editCatchBatch.action.importPupitri.existingData.title= tutti.editCatchBatch.action.importPupitri.mnemonic= +tutti.editCatchBatch.action.importPupitri.noProtocol.message= +tutti.editCatchBatch.action.importPupitri.noProtocol.title= tutti.editCatchBatch.action.importPupitri.tip= tutti.editCatchBatch.action.saveCatchBatch= tutti.editCatchBatch.action.saveCatchBatch.mnemonic= @@ -542,6 +552,7 @@ tutti.editSpeciesFrequencies.field.step= tutti.editSpeciesFrequencies.field.step.tip= tutti.editSpeciesFrequencies.label.no.configuration= +tutti.editSpeciesFrequencies.simpleCountingAndFrequencies= tutti.editSpeciesFrequencies.table.header.lengthStep= tutti.editSpeciesFrequencies.table.header.number= tutti.editSpeciesFrequencies.table.header.weight= @@ -583,6 +594,15 @@ tutti.gearUseFeatureTable.table.header.key= tutti.gearUseFeatureTable.table.header.value= tutti.gearUseFeatureTable.title= +tutti.importPupitri.carrouselFile.extension= +tutti.importPupitri.carrouselFile.extension.description= +tutti.importPupitri.error.fileMissing.message= +tutti.importPupitri.error.fileMissing.title= +tutti.importPupitri.field.carrouselFile= +tutti.importPupitri.field.trunkFile= +tutti.importPupitri.title= +tutti.importPupitri.trunkFile.extension= +tutti.importPupitri.trunkFile.extension.description= tutti.label.catches.planktonTotalSampleWeight= tutti.label.catches.planktonTotalWeight= tutti.label.tab.accidentel= 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-22 18:04:43 UTC (rev 664) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-03-22 18:08:00 UTC (rev 665) @@ -1,3 +1,4 @@ += swing.error.desktop.browse.not.supported= swing.error.desktop.not.supported= tutti.about.bottomText=Copyright %s - %s - version %s @@ -45,9 +46,13 @@ tutti.common.askOverwriteFile.title=Confirmer l'écrasement d'un fichier... tutti.common.askSaveBeforeLeaving.help=Que voulez-vous faire?<ul><li><strong>Annuler</strong> pour rester sur cet écran</li><li><strong>Non</strong> pour quitter l'écran en abandonnant les modifications en cours</li><li><strong>Oui</strong> pour quitter l'écran après enregistrement des modifications</li></ul> tutti.common.askSaveBeforeLeaving.title=Modifications non enregistrées +tutti.common.cancel=Annuler +tutti.common.cancel.mnemonic=A tutti.common.file.csv=Extension d'un fichier csv tutti.common.file.protocol=Extension d'un fichier de protocole Tutti tutti.common.file.zip=Extension d'une archive zip +tutti.common.validate=Valider +tutti.common.validate.mnemonic=V tutti.config.action.reload.actions=Recharger les actions tutti.config.action.reload.application=Recharger l'application tutti.config.action.reload.ui=Recharger l'interface graphique @@ -175,7 +180,12 @@ tutti.editCatchBatch.action.computeWeights.replaceTotalSortedWeight.title=Poids total VRAC peu différent du Poids total Vrac trié tutti.editCatchBatch.action.computeWeights.tip=Elever les poids tutti.editCatchBatch.action.importPupitri=Import Pupitri +tutti.editCatchBatch.action.importPupitri.existingData.help=Que voulez-vous faire ?<ul><li><strong>Annuler</strong> pour ne pas importer les données Pupitri et conserver les espèces saisies</li><li><strong>OK</strong> pour supprimer les espèces existantes et les remplacer par les données de Pupitri</li></ul> +tutti.editCatchBatch.action.importPupitri.existingData.message=Des espèces ont déjà été saisies dans la capture. Si vous continuez, elles vont être écrasées. +tutti.editCatchBatch.action.importPupitri.existingData.title=Données existantes tutti.editCatchBatch.action.importPupitri.mnemonic=I +tutti.editCatchBatch.action.importPupitri.noProtocol.message= +tutti.editCatchBatch.action.importPupitri.noProtocol.title= tutti.editCatchBatch.action.importPupitri.tip=Import Pupitri tutti.editCatchBatch.action.saveCatchBatch=Sauver tutti.editCatchBatch.action.saveCatchBatch.mnemonic=S @@ -192,9 +202,9 @@ tutti.editCatchBatch.field.benthosTotalWeight.tip= tutti.editCatchBatch.field.catchTotalRejectedWeight=Poids total NON TRIÉ (kg) tutti.editCatchBatch.field.catchTotalRejectedWeight.tip= -tutti.editCatchBatch.field.catchTotalSortedCarousselWeight=Caroussel observé (*) +tutti.editCatchBatch.field.catchTotalSortedCarousselWeight=Caroussel observé tutti.editCatchBatch.field.catchTotalSortedCarousselWeight.tip= -tutti.editCatchBatch.field.catchTotalSortedTremisWeight=Tremie (*) +tutti.editCatchBatch.field.catchTotalSortedTremisWeight=Tremie tutti.editCatchBatch.field.catchTotalSortedTremisWeight.tip= tutti.editCatchBatch.field.catchTotalSortedWeight=Poids total VRAC (kg) tutti.editCatchBatch.field.catchTotalSortedWeight.tip= @@ -541,6 +551,7 @@ tutti.editSpeciesFrequencies.field.step=Pas de la classe de taille tutti.editSpeciesFrequencies.field.step.tip= tutti.editSpeciesFrequencies.label.no.configuration=< Pas de configuration > +tutti.editSpeciesFrequencies.simpleCountingAndFrequencies=Des mensurations ont été saisies dans le tableau. Saisir un simple dénombrement les effacera. tutti.editSpeciesFrequencies.table.header.lengthStep=Classe de taille tutti.editSpeciesFrequencies.table.header.number=Nombre tutti.editSpeciesFrequencies.table.header.weight=Poids observé (kg) @@ -582,6 +593,15 @@ tutti.gearUseFeatureTable.table.header.key=Caractéristique tutti.gearUseFeatureTable.table.header.value=Valeur tutti.gearUseFeatureTable.title=Mise en oeuvre de l'engin +tutti.importPupitri.carrouselFile.extension=car +tutti.importPupitri.carrouselFile.extension.description=Fichier du carrousel (.car) +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.trunkFile=Fichier du trémie +tutti.importPupitri.title=Import Pupitri +tutti.importPupitri.trunkFile.extension=tnk +tutti.importPupitri.trunkFile.extension.description=Fichier du trémie (.tnk) tutti.label.catches.planktonTotalSampleWeight=Poids total échantillonné tutti.label.catches.planktonTotalWeight=Poids total tutti.label.tab.accidentel=Captures accidentelles @@ -826,7 +846,7 @@ tutti.validator.error.fishingOperation.gear.required=L'engin est obligatoire tutti.validator.error.fishingOperation.stationNumber.required=Le numéro de station est obligatoire tutti.validator.error.fishingOperation.stationNumber.too.long=Valeur trop longue (limitée à %s caractères) -tutti.validator.error.fishingOperation.strataLocation.required=La strate doit être renseignée +tutti.validator.error.fishingOperation.strataLocation.required=La strate, sous-strate ou localité doit être renseignée tutti.validator.error.fishingOperation.trawlDistance.required=La distance est obligatoire tutti.validator.error.fishingOperation.trawlDistance.tooLong=La distance du trait dépasse 3 milles marin (5556 m), merci de vérifier les coordonnées tutti.validator.error.fishingOperation.trawlNetNumber.required=Le numéro de poche est obligatoire
participants (1)
-
kmorin@users.forge.codelutin.com