Author: tchemit Date: 2013-01-14 22:43:11 +0100 (Mon, 14 Jan 2013) New Revision: 197 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/197 Log: refs #1805: [Onglet Poisson] Assistance ?\195?\160 la saisie des lots de poissons Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiEnumerationFile.java trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceDevImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.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/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/operation/catches/species/split/CreateSpeciesBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIHandler.java 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/catches/species/split/CreateSpeciesBatchUIModel-error-validation.xml trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java 2013-01-14 21:43:11 UTC (rev 197) @@ -35,6 +35,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; 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.Country; import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -143,6 +144,8 @@ Vessel getVessel(String vesselCode); + boolean isSortedQualitativeValue(CaracteristicQualitativeValue value); + //------------------------------------------------------------------------// //-- Program methods --// //------------------------------------------------------------------------// Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java 2013-01-14 21:43:11 UTC (rev 197) @@ -27,6 +27,7 @@ import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Country; import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -126,4 +127,6 @@ Person getPerson(Integer personId); Gear getGear(Integer gearId); + + boolean isSortedQualitativeValue(CaracteristicQualitativeValue value); } Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiEnumerationFile.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiEnumerationFile.java 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiEnumerationFile.java 2013-01-14 21:43:11 UTC (rev 197) @@ -116,15 +116,18 @@ @Value("${LocationLevelId.RECTANGLE_STATISTIQUE_MED}") public final Integer RECTANGLE_STATISTIQUE_MED = null; + @Value("${QualitativeValueId.VRAC}") + public final Integer QUALITATIVE_VRAC_ID = null; + @Value("${StatusCode.ENABLE}") public final String STATUS_VALID_CODE = null; @Value("${StatusCode.TEMPORARY}") public final String STATUS_TEMPORARY_CODE = null; - + @Value("${PersonId.UNKNOWN_RECORDER_PERSON}") public final Integer PERSON_ID_UNKNOWN_RECORDER_PERSON = null; - + @Value("${QualityFlagCode.NOTQUALIFIED}") public final String QUALITY_FLAG_CODE_NOT_QUALIFIED = null; @@ -160,5 +163,6 @@ Preconditions.checkNotNull(RECTANGLE_STATISTIQUE_MED, "LocationLevelId.RECTANGLE_STATISTIQUE_MED constant not found"); Preconditions.checkNotNull(STATUS_VALID_CODE, "StatusCode.ENABLE constant not found"); Preconditions.checkNotNull(STATUS_TEMPORARY_CODE, "StatusCode.TEMPORARY constant not found"); + Preconditions.checkNotNull(QUALITATIVE_VRAC_ID, "QualitativeValueId.VRAC constant not found"); } } 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-14 18:25:01 UTC (rev 196) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java 2013-01-14 21:43:11 UTC (rev 197) @@ -35,6 +35,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; 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.Country; import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -73,7 +74,7 @@ LogFactory.getLog(TuttiPersistenceAdagioImpl.class); @Autowired(required = true) - protected ReferentialPersistenceService referentielService; + protected ReferentialPersistenceService referentialService; @Autowired(required = true) protected ProgramPersistenceService programService; @@ -130,132 +131,137 @@ @Override public List<Zone> getAllProgramZone() { - return referentielService.getAllProgramZone(); + return referentialService.getAllProgramZone(); } @Override public List<Country> getAllCountry() { - return referentielService.getAllCountry(); + return referentialService.getAllCountry(); } @Override public List<Vessel> getAllScientificVessel() { - return referentielService.getAllScientificVessel(); + return referentialService.getAllScientificVessel(); } @Override public List<Vessel> getAllFishingVessel() { - return referentielService.getAllFishingVessel(); + return referentialService.getAllFishingVessel(); } @Override public List<Species> getAllSpecies() { - return referentielService.getAllSpecies(); + return referentialService.getAllSpecies(); } @Override public List<Species> getAllBenthosSpecies() { - return referentielService.getAllBenthosSpecies(); + return referentialService.getAllBenthosSpecies(); } @Override public List<Species> getAllPlanktonSpecies() { - return referentielService.getAllPlanktonSpecies(); + return referentialService.getAllPlanktonSpecies(); } @Override public Species getSpecies(String speciesId) { - return referentielService.getSpecies(speciesId); + return referentialService.getSpecies(speciesId); } @Override public List<FishingOperationLocation> getAllFishingOperationStrata(String zoneId) { - return referentielService.getAllFishingOperationStrata(zoneId); + return referentialService.getAllFishingOperationStrata(zoneId); } @Override public List<FishingOperationLocation> getAllFishingOperationSubStrata(String locationId) { - return referentielService.getAllFishingOperationSubStrata(locationId); + return referentialService.getAllFishingOperationSubStrata(locationId); } @Override public List<FishingOperationLocation> getAllFishingOperationLocation(String locationId) { - return referentielService.getAllFishingOperationLocation(locationId); + return referentialService.getAllFishingOperationLocation(locationId); } @Override public List<Caracteristic> getAllFishingOperationEnvironmentCaracteristic() { - return referentielService.getAllFishingOperationEnvironmentCaracteristic(); + return referentialService.getAllFishingOperationEnvironmentCaracteristic(); } @Override public List<Caracteristic> getAllFishingOperationGearCaracteristic() { - return referentielService.getAllFishingOperationGearCaracteristic(); + return referentialService.getAllFishingOperationGearCaracteristic(); } @Override public List<Caracteristic> getAllFishingOperationHydrologicCaracteristic() { - return referentielService.getAllFishingOperationHydrologicCaracteristic(); + return referentialService.getAllFishingOperationHydrologicCaracteristic(); } @Override public List<Caracteristic> getAllSpeciesLengthStepCaracteristic() { - return referentielService.getAllSpeciesLengthStepCaracteristic(); + return referentialService.getAllSpeciesLengthStepCaracteristic(); } @Override public Caracteristic getSizeCategoryCaracteristic() { - return referentielService.getSizeCategoryCaracteristic(); + return referentialService.getSizeCategoryCaracteristic(); } @Override public Caracteristic getSexCaracteristic() { - return referentielService.getSexCaracteristic(); + return referentialService.getSexCaracteristic(); } @Override public Caracteristic getSortedUnsortedCaracteristic() { - return referentielService.getSortedUnsortedCaracteristic(); + return referentialService.getSortedUnsortedCaracteristic(); } @Override public Caracteristic getMaturityCaracteristic() { - return referentielService.getMaturityCaracteristic(); + return referentialService.getMaturityCaracteristic(); } @Override public Caracteristic getMacroWasteCategoryCaracteristic() { - return referentielService.getMacroWasteCategoryCaracteristic(); + return referentialService.getMacroWasteCategoryCaracteristic(); } @Override public Caracteristic getMacroWasteSizeCategoryCaracteristic() { - return referentielService.getMacroWasteSizeCategoryCaracteristic(); + return referentialService.getMacroWasteSizeCategoryCaracteristic(); } @Override public List<Gear> getAllScientificGear() { - return referentielService.getAllScientificGear(); + return referentialService.getAllScientificGear(); } @Override public List<Gear> getAllFishingGear() { - return referentielService.getAllFishingGear(); + return referentialService.getAllFishingGear(); } @Override public List<Person> getAllPerson() { - return referentielService.getAllPerson(); + return referentialService.getAllPerson(); } @Override public Vessel getVessel(String vesselCode) { - return referentielService.getVessel(vesselCode); + return referentialService.getVessel(vesselCode); } @Override + public boolean isSortedQualitativeValue(CaracteristicQualitativeValue value) { + return referentialService.isSortedQualitativeValue(value); + } + + @Override public Person getPerson(Integer personId) { - return referentielService.getPerson(personId); + return referentialService.getPerson(personId); } //------------------------------------------------------------------------// Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-01-14 21:43:11 UTC (rev 197) @@ -157,7 +157,7 @@ "refDate", DateType.INSTANCE, new Date(), "statusValidCode", StringType.INSTANCE, enumeration.STATUS_VALID_CODE, "statusTemporaryCode", StringType.INSTANCE, enumeration.STATUS_TEMPORARY_CODE - ); + ); Vessel result = loadVessel(source); return result; } @@ -227,6 +227,12 @@ } @Override + public boolean isSortedQualitativeValue(CaracteristicQualitativeValue value) { + return value != null && + enumeration.QUALITATIVE_VRAC_ID.toString().equals(value.getId()); + } + + @Override public List<Species> getAllSpecies() { TaxonRefTaxVO[] sources = taxonNameDao.getAllTaxonRefTax(); Modified: trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java =================================================================== --- trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java 2013-01-14 21:43:11 UTC (rev 197) @@ -49,6 +49,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; 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.Country; import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -244,6 +245,11 @@ } @Override + public boolean isSortedQualitativeValue(CaracteristicQualitativeValue value) { + return referentialPersistenceService.isSortedQualitativeValue(value); + } + + @Override public List<Species> getAllSpecies() { return referentialPersistenceService.getAllSpecies(); } Modified: trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceDevImpl.java =================================================================== --- trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceDevImpl.java 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceDevImpl.java 2013-01-14 21:43:11 UTC (rev 197) @@ -29,6 +29,7 @@ import fr.ifremer.tutti.persistence.entities.IdAware; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Country; import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -224,7 +225,12 @@ return getBean(Gear.class.getName(), gearCode.toString()); } + @Override + public boolean isSortedQualitativeValue(CaracteristicQualitativeValue value) { + return value !=null && value.getId().equals("311"); + } + protected <B extends IdAware> List<B> getData(String entityType) { List<B> result = (List<B>) cache.get(entityType); return result; Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-01-14 21:43:11 UTC (rev 197) @@ -39,6 +39,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; 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.Country; import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -280,6 +281,11 @@ } @Override + public boolean isSortedQualitativeValue(CaracteristicQualitativeValue value) { + return devDriver.isSortedQualitativeValue(value); + } + + @Override public Person getPerson(Integer personId) { return devDriver.getPerson(personId); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java 2013-01-14 21:43:11 UTC (rev 197) @@ -25,7 +25,6 @@ */ import org.apache.commons.lang3.builder.ReflectionToStringBuilder; -import org.apache.commons.lang3.builder.ToStringBuilder; import java.io.Serializable; 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-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java 2013-01-14 21:43:11 UTC (rev 197) @@ -184,7 +184,7 @@ Multimap<Species, SampleCategoryType> speciesSampleCategories) { super(columnModel, false, false); this.speciesSampleCategories = speciesSampleCategories; - setNoneEditableCols(); + setNoneEditableCols(SPECIES); frequencyCols = Sets.newHashSet(); frequencyCols.add(COMPUTED_NUMBER); 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-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-01-14 21:43:11 UTC (rev 197) @@ -25,6 +25,7 @@ */ import com.google.common.base.Preconditions; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; @@ -144,8 +145,8 @@ SpeciesBatchUIModel model = getModel(); - List<Species> availableSpecies = - Lists.newArrayList(model.getAllSpecies()); + Multimap<CaracteristicQualitativeValue, Species> availableSpecies = + ArrayListMultimap.create(); List<SpeciesBatchRowModel> rows; @@ -183,7 +184,7 @@ } } - model.setAvailableSpecies(availableSpecies); + model.setSpeciesUsed(availableSpecies); model.setRows(rows); recomputeBatchActionEnable(); } @@ -589,7 +590,11 @@ Species species = createModel.getSpecies(); newRow.setSpecies(species); - //TODO Add sortedUnosrtedCategory + CaracteristicQualitativeValue sortedUnsortedCategory = createModel.getSortedUnsortedCategory(); + SampleCategory<CaracteristicQualitativeValue> category = newRow.getSortedUnsortedCategory(); + category.setCategoryValue(sortedUnsortedCategory); + category.setCategoryWeight(createModel.getBatchWeight()); + newRow.setSampleCategory(category); recomputeRowValidState(newRow); @@ -597,8 +602,8 @@ saveRow(newRow); - // update available species list - getModel().getAvailableSpecies().remove(species); + // update species used map + getModel().getSpeciesUsed().put(sortedUnsortedCategory, species); } @@ -957,8 +962,9 @@ int rowIndex = getTable().getSelectedRow(); - boolean enableAdd = - CollectionUtils.isNotEmpty(getModel().getAvailableSpecies()); + //TODO Improve this test + boolean enableAdd = true; +// CollectionUtils.isNotEmpty(getModel().getAvailableSpecies()); boolean enableSplit = false; boolean enableRemove = false; @@ -992,8 +998,8 @@ if (enableRemove) { - // can remove batch if selected batch is not a leaf - enableRemove = !row.isBatchLeaf(); + // can always remove the batch + enableRemove = true; } if (enableRemoveSub) { 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-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIModel.java 2013-01-14 21:43:11 UTC (rev 197) @@ -24,6 +24,8 @@ * #L% */ +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.AbstractTuttiBatchUIModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; @@ -41,7 +43,7 @@ public static final String PROPERTY_TABLE_VIEW_MODE = "tableViewMode"; - public static final String PROPERTY_AVAILABLE_SPECIES = "availableSpecies"; + public static final String PROPERTY_SPECIES_USED = "speciesUsed"; public static final String PROPERTY_ALL_SPECIES = "allSpecies"; @@ -50,8 +52,15 @@ 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"; + public static final String PROPERTY_TABLE_VIEW_MODE_ALL = "tableViewModeAll"; + + public static final String PROPERTY_TABLE_VIEW_MODE_LEAF = "tableViewModeLeaf"; + + public static final String PROPERTY_TABLE_VIEW_MODE_ROOT = "tableViewModeRoot"; + /** * Sampling order (sets by protocol). * @@ -67,11 +76,11 @@ protected List<Species> allSpecies; /** - * All available species (says available species that are not used in any batch). + * Species already used in some batches. * * @since 0.3 */ - protected List<Species> availableSpecies; + protected Multimap<CaracteristicQualitativeValue, Species> speciesUsed; /** * What to show in the table. @@ -164,9 +173,9 @@ Object oldValue = getTableViewMode(); this.tableViewMode = tableViewMode; firePropertyChange(PROPERTY_TABLE_VIEW_MODE, oldValue, tableViewMode); - firePropertyChange("tableViewModeAll", null, isTableViewModeAll()); - firePropertyChange("tableViewModeLeaf", null, isTableViewModeLeaf()); - firePropertyChange("tableViewModeRoot", null, isTableViewModeRoot()); + firePropertyChange(PROPERTY_TABLE_VIEW_MODE_ALL, null, isTableViewModeAll()); + firePropertyChange(PROPERTY_TABLE_VIEW_MODE_LEAF, null, isTableViewModeLeaf()); + firePropertyChange(PROPERTY_TABLE_VIEW_MODE_ROOT, null, isTableViewModeRoot()); } public boolean isTableViewModeAll() { @@ -191,16 +200,16 @@ firePropertyChange(PROPERTY_ALL_SPECIES, oldValue, allSpecies); } - public List<Species> getAvailableSpecies() { - return availableSpecies; + public Multimap<CaracteristicQualitativeValue, Species> getSpeciesUsed() { + return speciesUsed; } - public void setAvailableSpecies(List<Species> availableSpecies) { - Object oldValue = getAvailableSpecies(); - this.availableSpecies = availableSpecies; - firePropertyChange(PROPERTY_AVAILABLE_SPECIES, oldValue, availableSpecies); + public void setSpeciesUsed(Multimap<CaracteristicQualitativeValue, Species> speciesUsed) { + this.speciesUsed = speciesUsed; + firePropertyChange(PROPERTY_SPECIES_USED, null, speciesUsed); } + public boolean isCreateSpeciesBatchEnabled() { return createSpeciesBatchEnabled; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.css 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.css 2013-01-14 21:43:11 UTC (rev 197) @@ -52,6 +52,16 @@ data: {model.getAvailableSpecies()}; } +#sortedUnsortedCategoryLabel { + text: "tutti.label.createSpeciesBatch.sortedUnsortedCategory"; + labelFor: {sortedUnsortedCategoryComboBox}; +} + +#sortedUnsortedCategoryComboBox { + property: sortedUnsortedCategory; + selectedItem: {model.getSortedUnsortedCategory()}; +} + #batchWeightLabel { text: "tutti.label.createSpeciesBatch.batchWeight"; labelFor: {batchWeightField}; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.jaxx 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUI.jaxx 2013-01-14 21:43:11 UTC (rev 197) @@ -26,6 +26,7 @@ <import> fr.ifremer.tutti.persistence.entities.referential.Species + fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue fr.ifremer.tutti.ui.swing.content.operation.catches.species.SampleCategoryType fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUI @@ -72,6 +73,8 @@ <BeanValidator id='validator' bean='model' errorTableModel='errorTableModel' uiClass='jaxx.runtime.validator.swing.ui.ImageValidationUI'> <field name='species' component='speciesComboBox'/> + <field name='sortedUnsortedCategory' + component='sortedUnsortedCategoryComboBox'/> <field name='batchWeight' component='batchWeightField'/> </BeanValidator> @@ -90,6 +93,18 @@ </cell> </row> + <!-- Sorted / Unsorted Category --> + <row> + <cell anchor='west'> + <JLabel id='sortedUnsortedCategoryLabel'/> + </cell> + <cell weightx='1.0'> + <BeanComboBox id='sortedUnsortedCategoryComboBox' + constructorParams='this' + genericType='CaracteristicQualitativeValue'/> + </cell> + </row> + <!-- Species batch weight --> <row> <cell anchor='west'> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIHandler.java 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIHandler.java 2013-01-14 21:43:11 UTC (rev 197) @@ -24,8 +24,14 @@ * #L% */ +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import fr.ifremer.tutti.persistence.TuttiPersistence; +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.ui.swing.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchUIModel; @@ -35,6 +41,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.List; /** @@ -56,9 +64,27 @@ */ private final CreateSpeciesBatchUI ui; - public CreateSpeciesBatchUIHandler(SpeciesBatchUI parentUi, CreateSpeciesBatchUI ui) { + private final TuttiPersistence persistenceService; + + private final CaracteristicQualitativeValue sortedValue; + + public CreateSpeciesBatchUIHandler(SpeciesBatchUI parentUi, + CreateSpeciesBatchUI ui) { super(parentUi.getHandler().getContext()); this.ui = ui; + persistenceService = context.getService(PersistenceService.class); + + Caracteristic caracteristic = + persistenceService.getSortedUnsortedCaracteristic(); + + CaracteristicQualitativeValue v = null; + for (CaracteristicQualitativeValue value : caracteristic.getQualitativeValue()) { + if (persistenceService.isSortedQualitativeValue(value)) { + v = value; + break; + } + } + sortedValue = v; } //------------------------------------------------------------------------// @@ -82,6 +108,52 @@ Lists.<Species>newArrayList(), null); + Caracteristic caracteristic = + persistenceService.getSortedUnsortedCaracteristic(); + + initBeanComboBox(ui.getSortedUnsortedCategoryComboBox(), + caracteristic.getQualitativeValue(), + null); + + getModel().addPropertyChangeListener(CreateSpeciesBatchUIModel.PROPERTY_SPECIES, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + CreateSpeciesBatchUIModel source = + (CreateSpeciesBatchUIModel) evt.getSource(); + Species newValue = (Species) evt.getNewValue(); + + if (log.isInfoEnabled()) { + log.info("New Selected species "+(newValue==null?null:newValue.getCodeMemo())); + } + + if (newValue == null || source.getSpeciesUsed() == null) { + + source.setSortedUnsortedCategory(null); + + } else { + + // look for best value : if sorted is available then use it + + List<CaracteristicQualitativeValue> qualitativeValues = + ui.getSortedUnsortedCategoryComboBox().getData(); + + CaracteristicQualitativeValue newCategory = null; + + for (CaracteristicQualitativeValue qualitativeValue : qualitativeValues) { + if (source.isSpeciesAndCategoryAvailable(newValue, qualitativeValue)) { + newCategory = qualitativeValue; + + if (newCategory.equals(sortedValue)) { + break; + } + } + } + source.setSortedUnsortedCategory(newCategory); + } + } + }); + SwingValidatorUtil.installUI(ui.getErrorTable(), new SwingValidatorMessageTableRenderer()); @@ -135,13 +207,28 @@ ui.getValidator().setBean(model); model.setSpecies(null); + model.setSortedUnsortedCategory(null); model.setBatchWeight(null); List<Species> speciesToUse = Lists.newArrayList(); - if (batchModel != null) { + Multimap<CaracteristicQualitativeValue, Species> speciesUsed; + boolean reset = batchModel == null; + if (reset) { + speciesUsed = ArrayListMultimap.create(); + } else { + speciesUsed = batchModel.getSpeciesUsed(); + } - speciesToUse.addAll(batchModel.getAvailableSpecies()); + model.setSpeciesUsed(speciesUsed); + + if (!reset) { + + // compute which species can still be used + + List<Species> allSpecies = batchModel.getAllSpecies(); + + speciesToUse.addAll(allSpecies); } ui.getSpeciesComboBox().setData(speciesToUse); 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-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel.java 2013-01-14 21:43:11 UTC (rev 197) @@ -24,10 +24,13 @@ * #L% */ +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.AbstractTuttiBeanUIModel; import java.util.List; +import java.util.Set; /** * Model of {@link CreateSpeciesBatchUI}. @@ -43,6 +46,8 @@ public static final String PROPERTY_SPECIES = "species"; + public static final String PROPERTY_SORTED_UNSORTED_CATEGORY = "sortedUnsortedCategory"; + public static final String PROPERTY_BATCH_WEIGHT = "batchWeight"; /** @@ -60,12 +65,26 @@ protected Species species; /** + * Sorted Unsorted category. + * + * @since 0.3 + */ + protected CaracteristicQualitativeValue sortedUnsortedCategory; + + /** * Incoming batch weight to split. * * @since 0.3 */ protected Float batchWeight; + /** + * Already used species by sortedUnsorted category. + * + * @since 0.3 + */ + protected Multimap<CaracteristicQualitativeValue, Species> speciesUsed; + public CreateSpeciesBatchUIModel() { super(CreateSpeciesBatchUIModel.class, null, null); } @@ -90,6 +109,16 @@ firePropertyChange(PROPERTY_SPECIES, oldSpecies, getSpecies()); } + public CaracteristicQualitativeValue getSortedUnsortedCategory() { + return sortedUnsortedCategory; + } + + public void setSortedUnsortedCategory(CaracteristicQualitativeValue sortedUnsortedCategory) { + Object oldSpecies = getSortedUnsortedCategory(); + this.sortedUnsortedCategory = sortedUnsortedCategory; + firePropertyChange(PROPERTY_SORTED_UNSORTED_CATEGORY, oldSpecies, sortedUnsortedCategory); + } + public Float getBatchWeight() { return batchWeight; } @@ -100,4 +129,41 @@ firePropertyChange(PROPERTY_BATCH_WEIGHT, oldValue, batchWeight); } + public void setSpeciesUsed(Multimap<CaracteristicQualitativeValue, Species> speciesUsed) { + this.speciesUsed = speciesUsed; + } + + public Multimap<CaracteristicQualitativeValue, Species> getSpeciesUsed() { + return speciesUsed; + } + + public boolean isSpeciesAndCategoryAvailable() { + boolean result = species != null && sortedUnsortedCategory != null && + isSpeciesAndCategoryAvailable(species, sortedUnsortedCategory); + return result; + } + + public boolean isSpeciesAndCategoryAvailable(Species species, + CaracteristicQualitativeValue sortedUnsortedCategory) { + boolean result = !speciesUsed.containsEntry(sortedUnsortedCategory, species); + + if (result) { + + // species - category still no used + + Set<CaracteristicQualitativeValue> categories = speciesUsed.keySet(); + result = categories.isEmpty(); + for (CaracteristicQualitativeValue category : categories) { + + if (!speciesUsed.containsEntry(category, species)) { + + // ok found a category available + result = true; + break; + } + } + + } + return result; + } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel-error-validation.xml 2013-01-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/CreateSpeciesBatchUIModel-error-validation.xml 2013-01-14 21:43:11 UTC (rev 197) @@ -31,8 +31,31 @@ <message>tutti.validator.error.createSpeciesBatch.species.required </message> </field-validator> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ sortedUnsortedCategory == null || speciesAndCategoryAvailable ]]> + </param> + <message> + tutti.validator.error.createSpeciesBatch.speciesAndCategory.notAvailable + </message> + </field-validator> </field> + <field name="sortedUnsortedCategory"> + <field-validator type="required" short-circuit="true"> + <message>tutti.validator.error.createSpeciesBatch.sortedUnsortedCategory.required + </message> + </field-validator> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ species == null || speciesAndCategoryAvailable ]]> + </param> + <message> + tutti.validator.error.createSpeciesBatch.speciesAndCategory.notAvailable + </message> + </field-validator> + </field> + <field name="batchWeight"> <field-validator type="required" short-circuit="true"> 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-14 18:25:01 UTC (rev 196) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-14 21:43:11 UTC (rev 197) @@ -79,6 +79,7 @@ tutti.label.catches.speciesTotalWeight=Poids TOTAL (kg) tutti.label.comment=Commentaire tutti.label.createSpeciesBatch.batchWeight=Poids du lot +tutti.label.createSpeciesBatch.sortedUnsortedCategory=V / HV tutti.label.createSpeciesBatch.species=Espèce du lot tutti.label.cruise=Campagne tutti.label.cruise.beginDate=Date de début @@ -277,7 +278,9 @@ tutti.tooltip.comment.none=Pas de commentaire tutti.validator.error.createSpeciesBatch.batchWeight.invalidValue=Le poids du lot doit être strictement positif tutti.validator.error.createSpeciesBatch.batchWeight.required=Le poids du lot est obligatoire +tutti.validator.error.createSpeciesBatch.sortedUnsortedCategory.required=LA catégorie Vrac / Hors Vrac est obligatoire tutti.validator.error.createSpeciesBatch.species.required=L'espèce est obligatoire +tutti.validator.error.createSpeciesBatch.speciesAndCategory.notAvailable=Couple (espèce - Vrac/Hors Vrac) déjà utilisée tutti.validator.error.cruise.beginDate.required=La date de début est obligatoire tutti.validator.error.cruise.country.required=Le pays est obligatoire tutti.validator.error.cruise.endDate.required=La date de fin est obligatoire