r173 - in trunk: tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config tutti-persistence-adagio/src/main/resources tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol tutti-ui-swing/src/main/resources/i18n
Author: tchemit Date: 2013-01-11 15:13:28 +0100 (Fri, 11 Jan 2013) New Revision: 173 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/173 Log: refs #1807: [Persistence] Adagio r?\195?\169f?\195?\169rentiel (correction de certaines requetes) refs #1810: [PROTOCOLE] Ecran de saisie (ajout nouvelles colonnes dans le mod?\195?\168le) Removed: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTreeModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTreeNode.java Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfigOption.java trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/ReferentialTest.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryType.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx 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/SpeciesBatchUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java 2013-01-11 14:13:28 UTC (rev 173) @@ -966,16 +966,16 @@ Caracteristic target = new Caracteristic(); target.setId(String.valueOf(source[0])); - target.setParameterName(String.valueOf(source[1])); - target.setMatrixName(String.valueOf(source[2])); - target.setFractionName(String.valueOf(source[3])); - target.setMethodName(String.valueOf(source[4])); - target.setNumberType(Boolean.valueOf(source[5].toString())); - target.setQualitativeType(Boolean.valueOf(source[6].toString())); - target.setSignifFiguresNumber(Integer.valueOf(source[7].toString())); - target.setMaximumNumberDecimals(Integer.valueOf(source[8].toString())); - target.setPrecision(Float.valueOf(source[9].toString())); - target.setUnit(String.valueOf(source[10])); + target.setParameterName((String)source[1]); + target.setMatrixName((String)source[2]); + target.setFractionName((String)source[3]); + target.setMethodName((String)source[4]); + target.setNumberType((Boolean)source[5]); + target.setQualitativeType((Boolean)source[6]); + target.setSignifFiguresNumber((Integer)source[7]); + target.setMaximumNumberDecimals((Integer)source[8]); + target.setPrecision((Float)source[9]); + target.setUnit((String)source[10]); setStatus((fr.ifremer.adagio.core.dao.referential.Status) source[11], target); return target; } Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfigOption.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfigOption.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfigOption.java 2013-01-11 14:13:28 UTC (rev 173) @@ -62,8 +62,8 @@ true), DB_ENUMERATION_PATH( "tutti.persistence.db.enumerationPath", - "Chemin du fichier de correspondance des énumérations", - "${tutti.data.directory}/enumerations.properties", + "Chemin du fichier de correspondance des constantes", + "${tutti.data.directory}/enumerations-v3.properties", File.class, true, true), Modified: trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml =================================================================== --- trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml 2013-01-11 14:13:28 UTC (rev 173) @@ -24,7 +24,7 @@ --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" - "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> + "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!--<fetch-profile name="tutti">--> @@ -90,9 +90,9 @@ sc.program.code AS programCode, year(sc.departureDateTime) AS year, sc.name, - lh.locationHierarchyPk.parent.location.id AS countryId, - lh.locationHierarchyPk.parent.location.label AS countryLabel, - lh.locationHierarchyPk.parent.location.name AS countryName, + lh.locationHierarchyPk.parent.id AS countryId, + lh.locationHierarchyPk.parent.label AS countryLabel, + lh.locationHierarchyPk.parent.name AS countryName, sc.departureDateTime, sc.returnDateTime, sc.vessel.code as vesselCode, @@ -237,7 +237,7 @@ p.id, p.firstname, p.lastname, - p.department, + p.department.name, p.status FROM PersonImpl p @@ -477,6 +477,9 @@ p.method.name AS methodName, p.parameter.isAlphanumeric AS isAlphanumeric, p.parameter.isQualitative AS isQualitative, + p.signifFiguresNumber, + p.maximumNumberDecimals, + p.precision, p.unit.symbol AS symbol, p.status AS status FROM PmfmImpl p Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/ReferentialTest.java =================================================================== --- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/ReferentialTest.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/ReferentialTest.java 2013-01-11 14:13:28 UTC (rev 173) @@ -50,8 +50,6 @@ @ClassRule public static final DatabaseResource dbResource = new DatabaseResource(); - - @Test public void getAllProgramZone() { List<Zone> result = dbResource.getDriver().getAllProgramZone(); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryType.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryType.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryType.java 2013-01-11 14:13:28 UTC (rev 173) @@ -40,9 +40,6 @@ * @since 0.3 */ public enum SampleCategoryType implements DecoratorService.LabelAware { - species( - n_("tutti.sampleCategoryType.species"), - SampleCategoryEnum.species), sortedUnsorted( n_("tutti.sampleCategoryType.sortedUnsorted"), SampleCategoryEnum.sortedUnsorted), @@ -86,7 +83,6 @@ static { enumToType = Maps.newEnumMap(SampleCategoryEnum.class); - enumToType.put(SampleCategoryEnum.species, species); enumToType.put(SampleCategoryEnum.sortedUnsorted, sortedUnsorted); enumToType.put(SampleCategoryEnum.size, size); enumToType.put(SampleCategoryEnum.sex, sex); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java 2013-01-11 14:13:28 UTC (rev 173) @@ -52,12 +52,8 @@ public static final String PROPERTY_SPECIES_TO_CONFIRM = "speciesToConfirm"; - public static final String PROPERTY_SPECIES_CATEGORY = "speciesCategory"; + public static final String PROPERTY_SPECIES = "species"; - public static final String PROPERTY_SPECIES_CATEGORY_VALUE = "speciesCategoryValue"; - - public static final String PROPERTY_SPECIES_CATEGORY_WEIGHT = "speciesCategoryWeight"; - public static final String PROPERTY_SORTED_UNSORTED_CATEGORY = "sortedUnsortedCategory"; public static final String PROPERTY_SORTED_UNSORTED_CATEGORY_VALUE = "sortedUnsortedCategoryValue"; @@ -113,11 +109,11 @@ public static final String PROPERTY_SAMPLE_CATEGORY = "sampleCategory"; /** - * Species category. + * Species. * - * @since 0.2 + * @since 0.3 */ - protected SampleCategory<Species> speciesCategory; + protected Species species; /** * Is catch is vrac or horsVrac?. @@ -247,7 +243,6 @@ public SpeciesBatchRowModel() { super(SpeciesBatch.class, fromBeanBinder, toBeanBinder); frequency = Lists.newArrayList(); - speciesCategory = SampleCategory.newSample(SampleCategoryType.species); sortedUnsortedCategory = SampleCategory.newSample(SampleCategoryType.sortedUnsorted); sizeCategory = SampleCategory.newSample(SampleCategoryType.size); sexCategory = SampleCategory.newSample(SampleCategoryType.sex); @@ -281,10 +276,6 @@ public SampleCategory<?> getSampleCategory(SampleCategoryEnum sampleCategoryEnum) { switch (sampleCategoryEnum) { - - case species: - sampleCategory = getSpeciesCategory(); - break; case sortedUnsorted: sampleCategory = getSortedUnsortedCategory(); break; @@ -309,34 +300,16 @@ //-- Species category --// //------------------------------------------------------------------------// - public SampleCategory<Species> getSpeciesCategory() { - return speciesCategory; + public Species getSpecies() { + return species; } - public void setSpeciesCategory(SampleCategory<Species> speciesCategory) { - Object oldCategory = getSpeciesCategory(); - Object oldValue = getSpeciesCategoryValue(); - Object oldWeight = getSpeciesCategoryWeight(); - this.speciesCategory = speciesCategory; - firePropertyChange(PROPERTY_SPECIES_CATEGORY, oldCategory, speciesCategory); - firePropertyChange(PROPERTY_SPECIES_CATEGORY_VALUE, oldValue, getSpeciesCategoryValue()); - firePropertyChange(PROPERTY_SPECIES_CATEGORY_WEIGHT, oldWeight, getSpeciesCategoryWeight()); + public void setSpecies(Species species) { + Object oldCategory = getSpecies(); + this.species = species; + firePropertyChange(PROPERTY_SPECIES, oldCategory, species); } - public Species getSpeciesCategoryValue() { - return speciesCategory.getCategoryValue(); - } - - public Float getSpeciesCategoryWeight() { - return speciesCategory.getCategoryWeight(); - } - - public void setSpeciesCategoryWeight(Float speciesCategoryWeight) { - Object oldValue = getSpeciesCategoryWeight(); - speciesCategory.setCategoryWeight(speciesCategoryWeight); - firePropertyChange(PROPERTY_SPECIES_CATEGORY_WEIGHT, oldValue, speciesCategoryWeight); - } - //------------------------------------------------------------------------// //-- SortedUnsorted category --// //------------------------------------------------------------------------// Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java 2013-01-11 14:13:28 UTC (rev 173) @@ -84,12 +84,10 @@ } } - public static final ColumnIdentifier<SpeciesBatchRowModel> SPECIES_CATEGORY = SampleColumnIdentifier.newId( - SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY, - SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY_WEIGHT, - SampleCategoryType.species, - n_("tutti.table.species.batch.header.speciesCategory"), - n_("tutti.table.species.batch.header.speciesCategory")); + public static final ColumnIdentifier<SpeciesBatchRowModel> SPECIES = ColumnIdentifier.newId( + SpeciesBatchRowModel.PROPERTY_SPECIES, + n_("tutti.table.species.batch.header.species"), + n_("tutti.table.species.batch.header.species")); public static final ColumnIdentifier<SpeciesBatchRowModel> SORTED_UNSORTED_CATEGORY = SampleColumnIdentifier.newId( SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY, @@ -193,7 +191,6 @@ frequencyCols.add(COMPUTED_WEIGHT); sampleCols = Sets.newHashSet(); - sampleCols.add(SPECIES_CATEGORY); sampleCols.add(SORTED_UNSORTED_CATEGORY); sampleCols.add(SIZE_CATEGORY); sampleCols.add(SEX_CATEGORY); @@ -266,7 +263,7 @@ SpeciesBatchRowModel entry = getEntry(rowIndex); // check from protocol what is possible ? - Species species = entry.getSpeciesCategoryValue(); + Species species = entry.getSpecies(); if (species == null) { Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTreeModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTreeModel.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTreeModel.java 2013-01-11 14:13:28 UTC (rev 173) @@ -1,293 +0,0 @@ -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 com.google.common.collect.HashMultimap; -import com.google.common.collect.Maps; -import com.google.common.collect.Multimap; -import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; -import org.apache.commons.collections.CollectionUtils; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Map; - -/** - * @author tchemit <chemit@codelutin.com> - * @since 0.2 - */ -public class SpeciesBatchTreeModel implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * Root node (with no sampling on it. - * - * @since 0.2 - */ - protected final SpeciesBatchTreeNode root; - - /** - * Property which are used to sub sampling. - * - * @since 0.2 - */ - protected String[] samplingOrder; - - /** - * Mapping from row to node. - * - * @since 0.2 - */ - protected final Map<SpeciesBatchRowModel, SpeciesBatchTreeNode> rowToNode; - - /** - * Mapping from node to row. - * - * @since 0.2 - */ - protected final Multimap<SpeciesBatchTreeNode, SpeciesBatchRowModel> nodeToRow; - - public SpeciesBatchTreeModel(String... samplingOrder) { - this.samplingOrder = samplingOrder; - root = new SpeciesBatchTreeNode(); - rowToNode = Maps.newHashMap(); - nodeToRow = HashMultimap.create(); - } - -// public void populate(List<SpeciesBatchRowModel> rows) { -// -// clear(); -// -// for (SpeciesBatchRowModel row : rows) { -// -// SpeciesBatchTreeNode node = getSamplingNode(row); -// -// // check if row is valid -// boolean rowIsValid = isValid(row, node); -// -// // set it in row -// row.setValid(rowIsValid); -// } -// } - - public String[] getSamplingOrder() { - return samplingOrder; - } - - public void setSamplingOrder(String... samplingOrder) { - this.samplingOrder = samplingOrder; - clear(); - } - - protected void clear() { - // clear tree representation - root.removeAllChildren(); - - // clear mappings - rowToNode.clear(); - nodeToRow.clear(); - } - - public SpeciesBatchTreeNode removeNodeFromCache(SpeciesBatchRowModel row) { - SpeciesBatchTreeNode result = rowToNode.remove(row); - if (result != null) { - - nodeToRow.remove(result, row); - } - return result; - } - - public SpeciesBatchTreeNode getSamplingNode(SpeciesBatchRowModel row) { - - // search frist in cache - SpeciesBatchTreeNode result = rowToNode.get(row); - - if (result == null) { - - // not in cache must build the path - result = getSamplingNode(root, 0, row); - - if (result == root) { - - // this means an empty row, so no node for it - result = null; - - } else { - - // found a row with a sampling, add it in cache - rowToNode.put(row, result); - nodeToRow.put(result, row); - } - } - return result; - } - - protected SpeciesBatchTreeNode getSamplingNode(SpeciesBatchTreeNode node, - int samplingIndex, - SpeciesBatchRowModel row) { - - String samplingKey = samplingOrder[samplingIndex]; - - Serializable samplingValue = (Serializable) - TuttiUIUtil.getProperty(row, samplingKey); - - SpeciesBatchTreeNode result; - - if (samplingValue == null) { - - // was already on last sampling node - result = node; - } else { - - result = node.getChild(samplingValue); - - if (result == null) { - - // new node, creates it and add it as child of current node - result = new SpeciesBatchTreeNode(samplingKey, samplingValue); - node.add(result); - } - - if (samplingIndex < samplingOrder.length) { - - // can try to find yet another sampling level - result = getSamplingNode(result, samplingIndex + 1, row); - } - } - - return result; - } - -// public SamplingContext createSamplingContext(SpeciesBatchTreeNode rootNode) { -// -// Set<SpeciesBatchRowModel> childRows = Sets.newHashSet(); -// -// SpeciesBatchRowModel superSamplingRow = getNodeToRow(rootNode); -// -// float totalWeight = 0f; -// for (int i = 0, nbChildren = rootNode.getChildCount(); i < nbChildren; i++) { -// SpeciesBatchTreeNode node = rootNode.getChildAt(i); -// -// SpeciesBatchRowModel row = getNodeToRow(node); -// if (row != null) { -// CaracteristicQualitativeValue sortedUnsortedCategory = -// row.getSortedUnsortedCategory(); -// if (sortedUnsortedCategory != null && -// "unsorted".equals(sortedUnsortedCategory.getName())) { -// -// // never take account of a such child -// -// } else { -// -// childRows.add(row); -// Float weight = row.getWeight(); -// if (weight != null) { -// totalWeight += weight; -// } -// } -// } -// } -// SamplingContext result = new SamplingContext(rootNode, -// superSamplingRow, -// childRows, -// totalWeight); -// return result; -// } - - public SpeciesBatchRowModel getNodeToRow(SpeciesBatchTreeNode node) { - Collection<SpeciesBatchRowModel> rows = nodeToRow.get(node); - - SpeciesBatchRowModel result = null; - if (CollectionUtils.isNotEmpty(rows)) { - for (SpeciesBatchRowModel next : rows) { - if (next.isValid()) { - result = next; - break; - } - } - } - return result; - } - - public boolean isValid(SpeciesBatchRowModel row, SpeciesBatchTreeNode newNode) { - - // row must be on a sampling and having a weight - boolean result = row.getWeight() != null && newNode != null; - - // make sure there is not already another row for this node - if (result && CollectionUtils.size(nodeToRow.get(newNode)) > 1) { - result = false; - } - - return result; - } - -// public static class SamplingContext { -// -// private final SpeciesBatchTreeNode rootNode; -// -// private final SpeciesBatchRowModel superSamplingRow; -// -// private final Set<SpeciesBatchRowModel> samplingRows; -// -// private final float totalWeight; -// -// public SamplingContext(SpeciesBatchTreeNode rootNode, -// SpeciesBatchRowModel superSamplingRow, -// Set<SpeciesBatchRowModel> samplingRows, -// float totalWeight) { -// this.rootNode = rootNode; -// this.superSamplingRow = superSamplingRow; -// this.samplingRows = samplingRows; -// this.totalWeight = totalWeight; -// } -// -// public SpeciesBatchTreeNode getRootNode() { -// return rootNode; -// } -// -// public SpeciesBatchRowModel getSuperSamplingRow() { -// return superSamplingRow; -// } -// -// public Set<SpeciesBatchRowModel> getSamplingRows() { -// return samplingRows; -// } -// -// public float getTotalWeight() { -// return totalWeight; -// } -// -// public void applyNewSampleValues(float samplingWeight, -// Float samplingRatio) { -// -// for (SpeciesBatchRowModel row : samplingRows) { -// row.setSampleWeight(samplingWeight); -// row.setSamplingRatio(samplingRatio); -// } -// } -// } -} Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTreeNode.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTreeNode.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTreeNode.java 2013-01-11 14:13:28 UTC (rev 173) @@ -1,175 +0,0 @@ -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 org.apache.commons.lang3.ObjectUtils; - -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.TreeNode; -import java.io.Serializable; -import java.util.Arrays; - -/** - * Defines a node of a species catches sampling. - * <p/> - * A path in the tree gives a sampling path. - * <p/> - * UserObject is the {@code samplingValue}. It can be null only on root node. - * - * @author tchemit <chemit@codelutin.com> - * @since 0.2 - */ -public class SpeciesBatchTreeNode extends DefaultMutableTreeNode { - - private static final long serialVersionUID = 1L; - - /** - * Property name defining the sampling. - * <p/> - * <strong>Note:</strong> can be null (only for root node). - * - * @since 0.2 - */ - protected final String samplingKey; - - public SpeciesBatchTreeNode() { - this(null, null); - } - - public SpeciesBatchTreeNode(String samplingKey, - Serializable samplingValue) { - this.samplingKey = samplingKey; - setUserObject(samplingValue); - } - - public String getSamplingPropertyKey() { - return samplingKey; - } - - public boolean matchSamplingValue(Serializable value) { - Serializable samplingValue = getUserObject(); - - boolean result = ObjectUtils.equals(value, samplingValue); - return result; - } - - public SpeciesBatchTreeNode getChild(Serializable samplingValue) { - SpeciesBatchTreeNode result = null; - - for (int i = 0, max = getChildCount(); i < max; i++) { - SpeciesBatchTreeNode child = getChildAt(i); - if (child.matchSamplingValue(samplingValue)) { - - // found matching child - result = child; - break; - } - } - return result; - } - - @Override - public Serializable getUserObject() { - return (Serializable) super.getUserObject(); - } - - @Override - public SpeciesBatchTreeNode getChildAt(int index) { - return (SpeciesBatchTreeNode) super.getChildAt(index); - } - - @Override - public SpeciesBatchTreeNode getParent() { - return (SpeciesBatchTreeNode) super.getParent(); - } - - @Override - public SpeciesBatchTreeNode getRoot() { - return (SpeciesBatchTreeNode) super.getRoot(); - } - - @Override - public SpeciesBatchTreeNode getFirstChild() { - return (SpeciesBatchTreeNode) super.getFirstChild(); - } - - @Override - public SpeciesBatchTreeNode getLastChild() { - return (SpeciesBatchTreeNode) super.getLastChild(); - } - - @Override - public SpeciesBatchTreeNode getChildAfter(TreeNode aChild) { - return (SpeciesBatchTreeNode) super.getChildAfter(aChild); - } - - @Override - public SpeciesBatchTreeNode getChildBefore(TreeNode aChild) { - return (SpeciesBatchTreeNode) super.getChildBefore(aChild); - } - - @Override - public SpeciesBatchTreeNode getNextSibling() { - return (SpeciesBatchTreeNode) super.getNextSibling(); - } - - @Override - public SpeciesBatchTreeNode getPreviousSibling() { - return (SpeciesBatchTreeNode) super.getPreviousSibling(); - } - - @Override - public SpeciesBatchTreeNode getFirstLeaf() { - return (SpeciesBatchTreeNode) super.getFirstLeaf(); - } - - @Override - public SpeciesBatchTreeNode getLastLeaf() { - return (SpeciesBatchTreeNode) super.getLastLeaf(); - } - - @Override - public SpeciesBatchTreeNode getNextLeaf() { - return (SpeciesBatchTreeNode) super.getNextLeaf(); - } - - @Override - public SpeciesBatchTreeNode getPreviousLeaf() { - return (SpeciesBatchTreeNode) super.getPreviousLeaf(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof SpeciesBatchTreeNode)) return false; - - SpeciesBatchTreeNode that = (SpeciesBatchTreeNode) o; - - Object[] path = getUserObjectPath(); - Object[] path2 = that.getUserObjectPath(); - return Arrays.equals(path, path2); - } - -} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css 2013-01-11 14:13:28 UTC (rev 173) @@ -81,16 +81,26 @@ #splitSpeciesBatchMenu { text: "tutti.action.splitSpeciesBatch"; + toolTipTexttext: "tutti.action.splitSpeciesBatch.tip"; mnemonic: S; actionIcon: batch-split; - enabled: {model.isSplitSpeciesBatchEnabled()}; + enabled: {model.isTableViewModeAll() && model.isSplitSpeciesBatchEnabled()}; } +#removeSpeciesBatchMenu { + text: "tutti.action.removeSpeciesBatch"; + toolTipText: "tutti.action.removeSpeciesBatch.tip"; + mnemonic: R; + actionIcon: batch-delete; + enabled: {model.isTableViewModeAll() && model.isRemoveSpeciesBatchEnabled()}; +} + #removeSpeciesSubBatchMenu { text: "tutti.action.removeSpeciesSubBatch"; + tooltiptext: "tutti.action.removeSpeciesSubBatch.tip"; mnemonic: R; actionIcon: batch-delete; - enabled: {model.isRemoveSpeciesSubBatchEnabled()}; + enabled: {model.isTableViewModeAll() && model.isRemoveSpeciesSubBatchEnabled()}; } #table { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx 2013-01-11 14:13:28 UTC (rev 173) @@ -84,6 +84,8 @@ <!--onPopupMenuWillBecomeVisible='handler.updateTablePopup()'>--> <JMenuItem id='splitSpeciesBatchMenu' onActionPerformed='handler.splitSpeciesBatch()'/> + <JMenuItem id='removeSpeciesBatchMenu' + onActionPerformed='handler.removeSpeciesBatch()'/> <JMenuItem id='removeSpeciesSubBatchMenu' onActionPerformed='handler.removeSpeciesSubBatch()'/> </JPopupMenu> 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-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-01-11 14:13:28 UTC (rev 173) @@ -85,13 +85,12 @@ public static final Set<String> SAMPLING_PROPERTIES = Sets.newHashSet( SpeciesBatchRowModel.PROPERTY_SAMPLE_CATEGORY, - SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY, + SpeciesBatchRowModel.PROPERTY_SPECIES, SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY, SpeciesBatchRowModel.PROPERTY_SIZE_CATEGORY, SpeciesBatchRowModel.PROPERTY_SEX_CATEGORY, SpeciesBatchRowModel.PROPERTY_MATURITY_CATEGORY, SpeciesBatchRowModel.PROPERTY_AGE_CATEGORY, - SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY_WEIGHT, SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY_WEIGHT, SpeciesBatchRowModel.PROPERTY_SIZE_CATEGORY_WEIGHT, SpeciesBatchRowModel.PROPERTY_SEX_CATEGORY_WEIGHT, @@ -115,8 +114,7 @@ SpeciesBatchUI ui) { super(parentUi, SpeciesBatchRowModel.PROPERTY_SPECIES_TO_CONFIRM, - SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY, - SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY_WEIGHT, + SpeciesBatchRowModel.PROPERTY_SPECIES, SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY, SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY_WEIGHT, SpeciesBatchRowModel.PROPERTY_SIZE_CATEGORY, @@ -173,13 +171,13 @@ // root batch sample categroy is species Preconditions.checkState( - aBatch.getSampleCategoryType() == SampleCategoryEnum.species, + aBatch.getSampleCategoryType() == SampleCategoryEnum.sortedUnsorted, "Root species batch must be a species sample " + "category but was:" + aBatch.getSampleCategoryType()); SpeciesBatchRowModel rootRow = loadSpeciesBatch(aBatch, null, rows); - speciesUsed.add(rootRow.getSpeciesCategoryValue()); + speciesUsed.add(rootRow.getSpecies()); } availableSpecies.removeAll(speciesUsed); } @@ -209,10 +207,10 @@ // a row is valid if species category is not empty and valid // then if any of none empty category is valid - boolean result = !row.getSpeciesCategory().isEmpty() && - row.getSpeciesCategory().isValid(); + boolean result = row.getSpecies() != null && + !row.getSortedUnsortedCategory().isEmpty() && + row.getSortedUnsortedCategory().isValid(); - result &= row.getSortedUnsortedCategory().isEmptyOrValid(); result &= row.getSizeCategory().isEmptyOrValid(); result &= row.getSexCategory().isEmptyOrValid(); result &= row.getMaturityCategory().isEmptyOrValid(); @@ -292,7 +290,10 @@ } @Override - protected void onRowValidStateChanged(int rowIndex, SpeciesBatchRowModel row, Boolean oldValue, Boolean newValue) { + protected void onRowValidStateChanged(int rowIndex, + SpeciesBatchRowModel row, + Boolean oldValue, + Boolean newValue) { super.onRowValidStateChanged(rowIndex, row, oldValue, newValue); // when row valid state has changed, recompute action enabled states @@ -383,11 +384,8 @@ Species species = persistenceService.getSpecies( protocolSpecy.getSpeciesId()); allSpecies.add(species); - speciesSampleCategories.put(species, SampleCategoryType.species); + speciesSampleCategories.put(species, SampleCategoryType.sortedUnsorted); - if (protocolSpecy.isSortedUnsortedEnabled()) { - speciesSampleCategories.put(species, SampleCategoryType.sortedUnsorted); - } if (protocolSpecy.isSizeEnabled()) { speciesSampleCategories.put(species, SampleCategoryType.size); } @@ -417,7 +415,6 @@ // each species can use any category for (Species species : allSpecies) { - speciesSampleCategories.put(species, SampleCategoryType.species); speciesSampleCategories.put(species, SampleCategoryType.sortedUnsorted); speciesSampleCategories.put(species, SampleCategoryType.size); speciesSampleCategories.put(species, SampleCategoryType.sex); @@ -446,12 +443,12 @@ Decorator<CaracteristicQualitativeValue> caracteristicDecorator = getDecorator(CaracteristicQualitativeValue.class, null); - { // SpeciesCategory column + { // Species column - addSampleCategoryColumnToModel(columnModel, - SpeciesBatchTableModel.SPECIES_CATEGORY, - getDecorator(Species.class, null), - defaultRenderer); + addColumnToModel(columnModel, + null, + newTableCellRender(Species.class), + SpeciesBatchTableModel.SPECIES); } { // SortedUnsortedCategory column @@ -597,12 +594,11 @@ SpeciesBatchTableModel tableModel = getTableModel(); SpeciesBatchRowModel newRow = tableModel.createNewRow(); - SampleCategory<Species> speciesCategory = newRow.getSpeciesCategory(); Species species = createModel.getSpecies(); - speciesCategory.setCategoryValue(species); - speciesCategory.setCategoryWeight(createModel.getBatchWeight()); - newRow.setSampleCategory(speciesCategory); + newRow.setSpecies(species); + //TODO Add sortedUnosrtedCategory + recomputeRowValidState(newRow); tableModel.addNewRow(newRow); @@ -699,6 +695,77 @@ // table.requestFocus(); } + public void removeSpeciesBatch() { + + JXTable table = getTable(); + + int rowIndex = table.getSelectedRow(); + + Preconditions.checkState(rowIndex != -1, + "Cant remove batch if no batch selected"); + + SpeciesBatchTableModel tableModel = getTableModel(); + SpeciesBatchRowModel selectedBatch = tableModel.getEntry(rowIndex); + + Preconditions.checkState(!TuttiEntities.isNew(selectedBatch), + "Can't remove batch if batch is not persisted"); + + if (!selectedBatch.isBatchRoot()) { + + // remove all sub batches of his parent + + SpeciesBatchRowModel parentBatch = selectedBatch.getBatchParent(); + + // get parent row index + int parentIndex = tableModel.getRowIndex(parentBatch); + + // select it + table.setRowSelectionInterval(parentIndex, parentIndex); + + // remove all his children + removeSpeciesSubBatch(); + + } else { + + // remove selected batch and all his children + + // collect of rows to remove from model + Set<SpeciesBatchRowModel> rowToRemove = + Sets.newHashSet(selectedBatch); + + collectChilds(selectedBatch, rowToRemove); + + // remove all rows from the model + getModel().getRows().removeAll(rowToRemove); + + // remove childs from parent batch + selectedBatch.setBatchChilds(null); + + // save parent batch (will destroy all his childs from db) + persistenceService.deleteSpeciesBatch(selectedBatch.getId()); + + // refresh table from parent batch row index to the end + tableModel.fireTableDataChanged(); + + if (tableModel.getRowCount() > 0) { + + // select first row + AbstractSelectTableAction.doSelectCell(table, 0, 0); + } else { + + table.clearSelection(); + } + + if (table.isEditing()) { + + // but no edit it + table.getCellEditor().stopCellEditing(); + } + } + + + } + public void removeSpeciesSubBatch() { JXTable table = getTable(); @@ -903,6 +970,7 @@ boolean enableSplit = false; boolean enableRemove = false; + boolean enableRemoveSub = false; if (rowIndex != -1) { @@ -920,6 +988,7 @@ enableSplit = true; enableRemove = true; + enableRemoveSub = true; } if (enableSplit) { @@ -931,13 +1000,20 @@ if (enableRemove) { - // can remove sub batch if selected batch is not a leaf + // can remove batch if selected batch is not a leaf enableRemove = !row.isBatchLeaf(); } + + if (enableRemoveSub) { + + // can remove sub batch if selected batch is not a leaf + enableRemoveSub = !row.isBatchLeaf(); + } } getModel().setCreateSpeciesBatchEnabled(enableAdd); getModel().setSplitSpeciesBatchEnabled(enableSplit); - getModel().setRemoveSpeciesSubBatchEnabled(enableRemove); + getModel().setRemoveSpeciesBatchEnabled(enableRemove); + getModel().setRemoveSpeciesSubBatchEnabled(enableRemoveSub); } @@ -1019,9 +1095,7 @@ newRow.setSpeciesToConfirm(parentRow.getSpeciesToConfirm()); newRow.setBatchParent(parentRow); - if (sampleCategoryEnum != SampleCategoryEnum.species) { - newRow.setSpeciesCategory(parentRow.getSpeciesCategory()); - } + newRow.setSpecies(parentRow.getSpecies()); if (sampleCategoryEnum != SampleCategoryEnum.sortedUnsorted) { newRow.setSortedUnsortedCategory(parentRow.getSortedUnsortedCategory()); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIModel.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIModel.java 2013-01-11 14:13:28 UTC (rev 173) @@ -50,6 +50,7 @@ public static final String PROPERTY_SPLIT_SPECIES_BATCH_ENABLED = "splitSpeciesBatchEnabled"; public static final String PROPERTY_REMOVE_SPECIES_SUB_BATCH_ENABLED = "removeSpeciesSubBatchEnabled"; + public static final String PROPERTY_REMOVE_SPECIES_BATCH_ENABLED = "removeSpeciesBatchEnabled"; /** * Sampling order (sets by protocol). @@ -94,6 +95,13 @@ protected boolean splitSpeciesBatchEnabled; /** + * Can user remove a selected species batch? + * + * @since 0.3 + */ + protected boolean removeSpeciesBatchEnabled; + + /** * Can user remove a selected species sub batches? * * @since 0.3 @@ -213,6 +221,16 @@ firePropertyChange(PROPERTY_SPLIT_SPECIES_BATCH_ENABLED, oldValue, splitSpeciesBatchEnabled); } + public boolean isRemoveSpeciesBatchEnabled() { + return removeSpeciesBatchEnabled; + } + + public void setRemoveSpeciesBatchEnabled(boolean removeSpeciesBatchEnabled) { + Object oldValue = isRemoveSpeciesBatchEnabled(); + this.removeSpeciesBatchEnabled = removeSpeciesBatchEnabled; + firePropertyChange(PROPERTY_REMOVE_SPECIES_BATCH_ENABLED, oldValue, removeSpeciesBatchEnabled); + } + public boolean isRemoveSpeciesSubBatchEnabled() { return removeSpeciesSubBatchEnabled; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java 2013-01-11 14:13:28 UTC (rev 173) @@ -41,8 +41,6 @@ public static final String PROPERTY_SPECIES = "species"; - public static final String PROPERTY_SORTED_UNSORTED_ENABLED = "sortedUnsortedEnabled"; - public static final String PROPERTY_SIZE_ENABLED = "sizeEnabled"; public static final String PROPERTY_SEX_ENABLED = "sexEnabled"; @@ -55,8 +53,6 @@ protected Species species; - protected boolean sortedUnsortedEnabled; - protected boolean sizeEnabled; protected boolean sexEnabled; @@ -93,16 +89,6 @@ firePropertyChange(PROPERTY_SPECIES, oldValue, species); } - public boolean isSortedUnsortedEnabled() { - return sortedUnsortedEnabled; - } - - public void setSortedUnsortedEnabled(boolean sortedUnsortedEnabled) { - Object oldValue = isSortedUnsortedEnabled(); - this.sortedUnsortedEnabled = sortedUnsortedEnabled; - firePropertyChange(PROPERTY_SORTED_UNSORTED_ENABLED, oldValue, sortedUnsortedEnabled); - } - public boolean isSizeEnabled() { return sizeEnabled; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesTableModel.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesTableModel.java 2013-01-11 14:13:28 UTC (rev 173) @@ -42,11 +42,6 @@ n_("tutti.table.protocol.species.header.speciesId"), n_("tutti.table.protocol.species.header.speciesId")); - public static final ColumnIdentifier<EditProtocolSpeciesRowModel> SORTED_UNSORTED_ENABLED = ColumnIdentifier.newId( - EditProtocolSpeciesRowModel.PROPERTY_SORTED_UNSORTED_ENABLED, - n_("tutti.table.protocol.species.header.sortedUnsorted"), - n_("tutti.table.protocol.species.header.sortedUnsorted")); - public static final ColumnIdentifier<EditProtocolSpeciesRowModel> SIZE_ENABLED = ColumnIdentifier.newId( EditProtocolSpeciesRowModel.PROPERTY_SIZE_ENABLED, n_("tutti.table.protocol.species.header.size"), @@ -87,7 +82,6 @@ result.setSizeEnabled(true); result.setSexEnabled(true); result.setAgeEnabled(true); - result.setSortedUnsortedEnabled(true); result.setValid(false); return result; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-01-11 14:13:28 UTC (rev 173) @@ -99,8 +99,7 @@ public EditProtocolUIHandler(TuttiUIContext context, EditProtocolUI ui) { super(context); this.ui = ui; - columToSampleCategory = HashBiMap.create(SampleCategoryEnum.values().length); - columToSampleCategory.put(EditProtocolSpeciesTableModel.SORTED_UNSORTED_ENABLED, SampleCategoryEnum.sortedUnsorted); + columToSampleCategory = HashBiMap.create(SampleCategoryEnum.values().length-1); columToSampleCategory.put(EditProtocolSpeciesTableModel.SIZE_ENABLED, SampleCategoryEnum.size); columToSampleCategory.put(EditProtocolSpeciesTableModel.SEX_ENABLED, SampleCategoryEnum.sex); columToSampleCategory.put(EditProtocolSpeciesTableModel.MATURITY_ENABLED, SampleCategoryEnum.maturity); 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-01-11 13:41:36 UTC (rev 172) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-11 14:13:28 UTC (rev 173) @@ -24,14 +24,18 @@ tutti.action.reload.ui=Recharger l'interface graphique tutti.action.removeCaracteristic=Supprimer la caractéristique tutti.action.removeSpecies=Supprimer l'espèce -tutti.action.removeSpeciesSubBatch=Supprimer les lots +tutti.action.removeSpeciesSubBatch=Supprimer les lots fils +tutti.action.removeSpeciesSubBatch.tip=Supprimer tous les lots fils du lot sélectionné +tutti.action.removeSpeciesBatch=Supprimer le lot +tutti.action.removeSpeciesBatch.tip=Supprimer le lot courant (celui de la ligne sélectionnée) et tous ces fils tutti.action.reset.fishingOperationValidState=Réinitialiser tutti.action.save=Enregistrer tutti.action.selectCampaign=Campagne tutti.action.selectCampaign.tip=Sélectionner la campagne à utiliser tutti.action.site=Site tutti.action.site.tip=Accéder au site du projet Tutti -tutti.action.splitSpeciesBatch=Catégoriser un lot +tutti.action.splitSpeciesBatch=Catégoriser le lot +tutti.action.splitSpeciesBatch.tip=Catégoriser le lot courant (celui de la ligne sélectionné) tutti.action.validateCatches=Valider les captures tutti.action.validateCatches.tip=Valider les captures tutti.application.config=Configuration de l'application Tutti
participants (1)
-
tchemit@users.forge.codelutin.com