r805 - in trunk: tutti-service/src/main/java/fr/ifremer/tutti/service tutti-service/src/main/java/fr/ifremer/tutti/service/catches tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data tutti-service/src/main/resources/i18n tutti-ui-swing/src/main/filtered-resources tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise tutti-ui-swing/src/m
Author: kmorin Date: 2013-04-16 16:43:22 +0200 (Tue, 16 Apr 2013) New Revision: 805 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/805 Log: refs #1883 [RAPPORT] - Rapport de contr?\195?\180le apr?\195?\168s saisie Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingException.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseFishingOperationAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIModel.java trunk/tutti-ui-swing/src/main/resources/icons/error.png trunk/tutti-ui-swing/src/main/resources/icons/fatal.png trunk/tutti-ui-swing/src/main/resources/icons/info.png trunk/tutti-ui-swing/src/main/resources/icons/warning.png Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/ValidationService.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiScreen.java 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/EditSelectedCruiseCatchesAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/ValidationService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/ValidationService.java 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/ValidationService.java 2013-04-16 14:43:22 UTC (rev 805) @@ -45,6 +45,10 @@ */ public class ValidationService extends AbstractTuttiService { + public static final String VALIDATION_CONTEXT_EDIT = "edit"; + + public static final String VALIDATION_CONTEXT_VALIDATE = "validate"; + public NuitonValidatorResult validateCruise(Cruise cruise) { NuitonValidator<Cruise> validator = NuitonValidatorFactory.newValidator(Cruise.class); NuitonValidatorResult result = validator.validate(cruise); @@ -63,8 +67,8 @@ return result; } - public NuitonValidatorResult validateFishingOperation(FishingOperation fishingOperation) { - NuitonValidator<FishingOperation> validator = NuitonValidatorFactory.newValidator(FishingOperation.class); + public NuitonValidatorResult validateFishingOperation(FishingOperation fishingOperation, String context) { + NuitonValidator<FishingOperation> validator = NuitonValidatorFactory.newValidator(FishingOperation.class, context); NuitonValidatorResult result = validator.validate(fishingOperation); return result; } Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingException.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingException.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingException.java 2013-04-16 14:43:22 UTC (rev 805) @@ -0,0 +1,33 @@ +package fr.ifremer.tutti.service.catches; + +import fr.ifremer.tutti.TuttiBusinessException; + +/** + * @author kmorin <kmorin@codelutin.com> + */ +public class TuttiWeightComputingException extends TuttiBusinessException { + + public enum CatchType { + SPECIES, BENTHOS, MARINE_LITTER + } + + protected CatchType catchType; + + protected int index; + + public TuttiWeightComputingException(String message, + CatchType catchType, + int index) { + super(message); + this.catchType = catchType; + this.index = index; + } + + public CatchType getCatchType() { + return catchType; + } + + public int getIndex() { + return index; + } +} Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java 2013-04-16 14:43:22 UTC (rev 805) @@ -24,6 +24,7 @@ * #L% */ +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import fr.ifremer.tutti.TuttiBusinessException; import fr.ifremer.tutti.persistence.entities.data.BatchContainer; @@ -98,11 +99,35 @@ String fishingOperationId = fishingOperation.getId(); CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(fishingOperationId); - BatchContainer<SpeciesBatch> rootSpeciesBatch = persistenceService.getRootSpeciesBatch(fishingOperationId); - BatchContainer<BenthosBatch> rootBenthosBatch = persistenceService.getRootBenthosBatch(fishingOperationId); - BatchContainer<MarineLitterBatch> rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(fishingOperationId); + BatchContainer<SpeciesBatch> rootSpeciesBatch; try { + rootSpeciesBatch = getComputedSpeciesBatches(fishingOperation); + + } catch (TuttiBusinessException e) { + result.put(fishingOperationId, e.getMessage()); + rootSpeciesBatch = persistenceService.getRootSpeciesBatch(fishingOperationId); + } + + BatchContainer<BenthosBatch> rootBenthosBatch; + try { + rootBenthosBatch = getComputedBenthosBatches(fishingOperation); + + } catch (TuttiBusinessException e) { + result.put(fishingOperationId, e.getMessage()); + rootBenthosBatch = persistenceService.getRootBenthosBatch(fishingOperationId); + } + + BatchContainer<MarineLitterBatch> rootMarineLitterBatch; + try { + rootMarineLitterBatch = getComputedMarineLitterBatches(fishingOperation); + + } catch (TuttiBusinessException e) { + result.put(fishingOperationId, e.getMessage()); + rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(fishingOperationId); + } + + try { if (catchBatch != null) { computeCatchBatchWeights(catchBatch, rootSpeciesBatch, @@ -116,6 +141,65 @@ return result; } + /** + * To check if can compute the weights of the given operation + * <p/> + * If no error found, then return is a empty list, otherwise the errors found + * + * @param fishingOperation the operation to check. + * @return list of errors, or empty list if no error found. + * @since 1.4 + */ + public List<String> checkOperation(FishingOperation fishingOperation) { + + if (log.isDebugEnabled()) { + log.debug("Will check fishingOperation: " + fishingOperation); + } + + List<String> result = Lists.newArrayList(); + String fishingOperationId = fishingOperation.getId(); + CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(fishingOperationId); + + BatchContainer<SpeciesBatch> rootSpeciesBatch; + try { + rootSpeciesBatch = getComputedSpeciesBatches(fishingOperation); + + } catch (TuttiBusinessException e) { + result.add(e.getMessage()); + rootSpeciesBatch = persistenceService.getRootSpeciesBatch(fishingOperationId); + } + + BatchContainer<BenthosBatch> rootBenthosBatch; + try { + rootBenthosBatch = getComputedBenthosBatches(fishingOperation); + + } catch (TuttiBusinessException e) { + result.add(e.getMessage()); + rootBenthosBatch = persistenceService.getRootBenthosBatch(fishingOperationId); + } + + BatchContainer<MarineLitterBatch> rootMarineLitterBatch; + try { + rootMarineLitterBatch = getComputedMarineLitterBatches(fishingOperation); + + } catch (TuttiBusinessException e) { + result.add(e.getMessage()); + rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(fishingOperationId); + } + + try { + if (catchBatch != null) { + computeCatchBatchWeights(catchBatch, + rootSpeciesBatch, + rootBenthosBatch, + rootMarineLitterBatch); + } + } catch (TuttiBusinessException e) { + result.add(e.getMessage()); + } + return result; + } + public void computeCatchBatchWeights(CatchBatch catchBatch, BatchContainer<SpeciesBatch> rootSpeciesBatch, BatchContainer<BenthosBatch> rootBenthosBatch, @@ -165,7 +249,7 @@ catchBatch.setSpeciesTotalSortedComputedWeight(speciesTotalSortedWeight); } else if (speciesTotalSortedWeight < speciesTotalComputedSortedWeight) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentSpeciesTotalSorted")); + throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.species.error.incoherentTotalSorted")); } catchBatch.setSpeciesTotalUnsortedComputedWeight(speciesTotalComputedUnsortedWeight); @@ -219,7 +303,7 @@ catchBatch.setBenthosTotalSortedComputedWeight(benthosTotalSortedWeight); } else if (benthosTotalSortedWeight < benthosTotalComputedSortedWeight) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentBenthosTotalSorted")); + throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.benthos.error.incoherentTotalSorted")); } catchBatch.setBenthosTotalUnsortedComputedWeight(benthosTotalComputedUnsortedWeight); @@ -248,7 +332,7 @@ marineLitterTotalWeight = marineLitterTotalComputedWeight; } else if (marineLitterTotalComputedWeight != null && marineLitterTotalWeight < marineLitterTotalComputedWeight) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentMarineLitterTotal")); + throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.marineLitter.error.incoherentTotal")); } // nothing to do with the marine litter weight, it is an isolated weight @@ -267,7 +351,7 @@ if (rejectedWeight == null && totalWeight != null) { if (!totalWeight.equals(totalUnsortedWeight + totalSortedWeight)) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentTotal")); + throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.error.incoherentTotal")); } else { catchBatch.setCatchTotalRejectedComputedWeight(totalWeight @@ -285,7 +369,7 @@ + rejectedWeight); } else if (!totalWeight.equals(totalUnsortedWeight + totalSortedWeight + rejectedWeight)) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentTotal")); + throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.error.incoherentTotal")); } } @@ -310,10 +394,13 @@ BatchContainer<BenthosBatch> rootBenthosBatch = persistenceService.getRootBenthosBatch(operation.getId()); - List<BenthosBatch> roots = rootBenthosBatch.getChildren(); + currentBenthosRowIndex = 0; + if (rootBenthosBatch != null) { + List<BenthosBatch> roots = rootBenthosBatch.getChildren(); - for (BenthosBatch batch : roots) { - computeBenthosBatch(batch); + for (BenthosBatch batch : roots) { + computeBenthosBatch(batch); + } } return rootBenthosBatch; @@ -324,7 +411,6 @@ BatchContainer<MarineLitterBatch> rootMarineLitterBatch = persistenceService.getRootMarineLitterBatch(operation.getId()); - return rootMarineLitterBatch; } @@ -358,7 +444,7 @@ batch.setSampleCategoryComputedWeight(sum); } else if (categoryWeight < sum) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentParentCategoryWeight")); + throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.species.error.incoherentParentCategoryWeight")); } else { sum = categoryWeight; @@ -391,7 +477,7 @@ } if (categoryWeight == null && rowWeight != null) { -// throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentRowWeightCategory")); +// throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.error.incoherentRowWeightCategory")); } else if (categoryWeight == null && frequencyWeight != null) { // if the category weight is null and the frequencies have a weight, @@ -405,13 +491,13 @@ // if the weight of the frequencies is different from the category // weight, then set the weight of the sample if (frequencyWeight > categoryWeight) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentCategoryWeight")); + throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.species.error.incoherentCategoryWeight")); } else if (rowWeight == null) { batch.setComputedWeight(frequencyWeight); } else if (!rowWeight.equals(frequencyWeight)) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentRowWeightFrequency")); + throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.species.error.incoherentRowWeightFrequency")); } result = categoryWeight; @@ -423,13 +509,18 @@ result = categoryWeight; } } + if (result == null && batch.getParentBatch() == null) { + throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.species.error.noWeight")); + } return result; } + private int currentBenthosRowIndex; protected Float computeBenthosBatch(BenthosBatch batch) { Float result = null; + int thisIndex = currentBenthosRowIndex++; Float categoryWeight = batch.getSampleCategoryWeight(); Float rowWeight = batch.getWeight(); @@ -458,12 +549,16 @@ batch.setSampleCategoryComputedWeight(sum); } else if (categoryWeight < sum) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentParentCategoryWeight")); + throw new TuttiWeightComputingException( + _("tutti.service.operations.computeWeights.benthos.error.incoherentParentCategoryWeight"), + TuttiWeightComputingException.CatchType.BENTHOS, + thisIndex); } else { sum = categoryWeight; } result = sum; + } } else {// the row is a leaf @@ -491,7 +586,7 @@ } if (categoryWeight == null && rowWeight != null) { -// throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentRowWeightCategory")); +// throw new TuttiBusinessException(_("tutti.service.operations.computeWeights.error.incoherentRowWeightCategory")); } else if (categoryWeight == null && frequencyWeight != null) { // if the category weight is null and the frequencies have a weight, @@ -505,13 +600,19 @@ // if the weight of the frequencies is different from the category // weight, then set the weight of the sample if (frequencyWeight > categoryWeight) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentCategoryWeight")); + throw new TuttiWeightComputingException( + _("tutti.service.operations.computeWeights.benthos.error.incoherentCategoryWeight"), + TuttiWeightComputingException.CatchType.BENTHOS, + thisIndex); } else if (rowWeight == null) { batch.setComputedWeight(frequencyWeight); } else if (!rowWeight.equals(frequencyWeight)) { - throw new TuttiBusinessException(_("tutti.service.catches.computeWeights.error.incoherentRowWeightFrequency")); + throw new TuttiWeightComputingException( + _("tutti.service.operations.computeWeights.benthos.error.incoherentRowWeightFrequency"), + TuttiWeightComputingException.CatchType.BENTHOS, + thisIndex); } result = categoryWeight; @@ -523,6 +624,13 @@ result = categoryWeight; } } + if (result == null + && batch.getParentBatch() == null) { + throw new TuttiWeightComputingException( + _("tutti.service.operations.computeWeights.benthos.error.noWeight"), + TuttiWeightComputingException.CatchType.BENTHOS, + thisIndex); + } return result; } Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/ValidateCruiseOperationsService.java 2013-04-16 14:43:22 UTC (rev 805) @@ -0,0 +1,55 @@ +package fr.ifremer.tutti.service.catches; + +import com.google.common.collect.Maps; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.*; +import fr.ifremer.tutti.service.catches.TuttiWeightComputingService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.validator.NuitonValidatorResult; +import org.nuiton.validator.NuitonValidatorScope; + +import java.util.List; +import java.util.Map; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class ValidateCruiseOperationsService extends AbstractTuttiService { + + private static final Log log = + LogFactory.getLog(TuttiWeightComputingService.class); + + protected PersistenceService persistenceService; + + protected ValidationService validationService; + + protected TuttiWeightComputingService tuttiWeightComputingService; + + @Override + public void setServiceContext(TuttiServiceContext context) { + super.setServiceContext(context); + persistenceService = getService(PersistenceService.class); + validationService = getService(ValidationService.class); + tuttiWeightComputingService = getService(TuttiWeightComputingService.class); + } + + public Map<FishingOperation, NuitonValidatorResult> validateCruiseOperations() { + Map<FishingOperation, NuitonValidatorResult> result = Maps.newHashMap(); + + TuttiDataContext dataContext = context.getDataContext(); + List<FishingOperation> operations = persistenceService.getAllFishingOperation(dataContext.getCruiseId()); + for (FishingOperation operation : operations) { + NuitonValidatorResult validator = validationService.validateFishingOperation(operation, ValidationService.VALIDATION_CONTEXT_VALIDATE); + + List<String> errors = tuttiWeightComputingService.checkOperation(operation); + Map<String, List<String>> errorMap = Maps.newHashMap(); + errorMap.put("cacthes", errors); + validator.addMessagesForScope(NuitonValidatorScope.ERROR, errorMap); + result.put(operation, validator); + } + + return result; + } +} Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml =================================================================== --- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/BenthosBatch-error-validation.xml 2013-04-16 14:43:22 UTC (rev 805) @@ -40,7 +40,7 @@ <param name="expression"> <![CDATA[ weight == null || sampleCategoryWeight == null || weight <= sampleCategoryWeight ]]> </param> - <message>tutti.service.catches.computeWeights.error.incoherentSampleWeight</message> + <message>tutti.service.catches.computeWeights.benthos.error.incoherentSampleWeight</message> </field-validator> </field> Modified: trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml =================================================================== --- trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-service/src/main/resources/fr/ifremer/tutti/persistence/entities/data/SpeciesBatch-error-validation.xml 2013-04-16 14:43:22 UTC (rev 805) @@ -40,7 +40,7 @@ <param name="expression"> <![CDATA[ weight == null || sampleCategoryWeight == null || weight <= sampleCategoryWeight ]]> </param> - <message>tutti.service.catches.computeWeights.error.incoherentSampleWeight</message> + <message>tutti.service.catches.computeWeights.species.error.incoherentSampleWeight</message> </field-validator> </field> Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-04-16 14:43:22 UTC (rev 805) @@ -48,6 +48,7 @@ tutti.propety.no.vessel.name= tutti.propety.no.zone= tutti.propety.vessel.nation.registrationCode= +tutti.service.catches.computeWeights.benthos.error.incoherentSampleWeight= tutti.service.catches.computeWeights.error.incoherentBenthosTotalSorted= tutti.service.catches.computeWeights.error.incoherentCategoryWeight= tutti.service.catches.computeWeights.error.incoherentMarineLitterTotal= @@ -57,8 +58,28 @@ tutti.service.catches.computeWeights.error.incoherentSampleWeight= tutti.service.catches.computeWeights.error.incoherentSpeciesTotalSorted= tutti.service.catches.computeWeights.error.incoherentTotal= +tutti.service.catches.computeWeights.species.error.incoherentSampleWeight= tutti.service.export.invalid.cruise= tutti.service.export.invalid.fishingOperation= +tutti.service.operations.computeWeights.benthos.error.incoherentCategoryWeight= +tutti.service.operations.computeWeights.benthos.error.incoherentParentCategoryWeight= +tutti.service.operations.computeWeights.benthos.error.incoherentRowWeightFrequency= +tutti.service.operations.computeWeights.benthos.error.incoherentTotalSorted= +tutti.service.operations.computeWeights.benthos.error.noWeight= +tutti.service.operations.computeWeights.error.incoherentBenthosTotalSorted= +tutti.service.operations.computeWeights.error.incoherentCategoryWeight= +tutti.service.operations.computeWeights.error.incoherentMarineLitterTotal= +tutti.service.operations.computeWeights.error.incoherentParentCategoryWeight= +tutti.service.operations.computeWeights.error.incoherentRowWeightCategory= +tutti.service.operations.computeWeights.error.incoherentRowWeightFrequency= +tutti.service.operations.computeWeights.error.incoherentSpeciesTotalSorted= +tutti.service.operations.computeWeights.error.incoherentTotal= +tutti.service.operations.computeWeights.marineLitter.error.incoherentTotal= +tutti.service.operations.computeWeights.species.error.incoherentCategoryWeight= +tutti.service.operations.computeWeights.species.error.incoherentParentCategoryWeight= +tutti.service.operations.computeWeights.species.error.incoherentRowWeightFrequency= +tutti.service.operations.computeWeights.species.error.incoherentTotalSorted= +tutti.service.operations.computeWeights.species.error.noWeight= tutti.validator.error.comment.too.long= tutti.validator.error.cruise.beginDate.required= tutti.validator.error.cruise.dates.endBeforeStart= Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-04-16 14:43:22 UTC (rev 805) @@ -44,17 +44,26 @@ tutti.propety.no.vessel.name=Nom inconnu tutti.propety.no.zone=Pas de zone tutti.propety.vessel.nation.registrationCode=%s (nat.) -tutti.service.catches.computeWeights.error.incoherentBenthosTotalSorted=Le poids total Vrac du benthos est inférieur à la somme des poids Vrac triés, inerte trié et vivant non détaillé trié -tutti.service.catches.computeWeights.error.incoherentCategoryWeight=Le poids total des mensurations est supérieur au poids de la catégorie -tutti.service.catches.computeWeights.error.incoherentMarineLitterTotal=Le poids total des macro-déchets est inférieur à la somme des poids des macro-déchets saisis -tutti.service.catches.computeWeights.error.incoherentParentCategoryWeight=Le poids de la catégorie est différent de la somme des poids de ses sous-catégories -tutti.service.catches.computeWeights.error.incoherentRowWeightCategory=Le poids de la catégorie ne peut pas être nul si le poids de sous-échantillonage est renseigné -tutti.service.catches.computeWeights.error.incoherentRowWeightFrequency=Le poids total des mensurations est différent du poids du sous-échantillon -tutti.service.catches.computeWeights.error.incoherentSampleWeight=Le poids de sous-échantillonage est supérieur au poids de la catégorie -tutti.service.catches.computeWeights.error.incoherentSpeciesTotalSorted=Le poids total Vrac des espèces est inférieur à la somme des poids Vrac triés, inerte trié et vivant non détaillé trié -tutti.service.catches.computeWeights.error.incoherentTotal=Le poids total de la capture ne correspond pas à la somme des poids totaux Vrac, Hors Vrac et non triés +tutti.service.catches.computeWeights.benthos.error.incoherentSampleWeight= +tutti.service.catches.computeWeights.error.incoherentRowWeightCategory= +tutti.service.catches.computeWeights.species.error.incoherentSampleWeight= tutti.service.export.invalid.cruise=L'export de la campagne %s ne peut pas être réalisé suite aux erreurs rencontrées sur ses traits lors de l'élévation des poids \:\n%s tutti.service.export.invalid.fishingOperation=L'élévation des poids ne peut pas être réalisé sur le trait %s, pour la raison suivante %s +tutti.service.operations.computeWeights.benthos.error.incoherentCategoryWeight=Le poids total des mensurations d'un lot du benthos est supérieur au poids de la catégorie +tutti.service.operations.computeWeights.benthos.error.incoherentParentCategoryWeight=Le poids de la catégorie d'un lot du benthos est différent de la somme des poids de ses sous-catégories +tutti.service.operations.computeWeights.benthos.error.incoherentRowWeightFrequency=Le poids total des mensurations d'un lot du benthos est différent du poids du sous-échantillon +tutti.service.operations.computeWeights.benthos.error.incoherentSampleWeight=Le poids de sous-échantillonage d'un lot du benthos est supérieur au poids de la catégorie +tutti.service.operations.computeWeights.benthos.error.incoherentTotalSorted=Le poids total Vrac du benthos est inférieur à la somme des poids Vrac triés, inerte trié et vivant non détaillé trié +tutti.service.operations.computeWeights.benthos.error.noWeight=Un lot du benthos n'a pas de poids +tutti.service.operations.computeWeights.error.incoherentRowWeightCategory= +tutti.service.operations.computeWeights.error.incoherentTotal=Le poids total de la capture ne correspond pas à la somme des poids totaux Vrac, Hors Vrac et non triés +tutti.service.operations.computeWeights.marineLitter.error.incoherentTotal=Le poids total des macro-déchets est inférieur à la somme des poids des macro-déchets saisis +tutti.service.operations.computeWeights.species.error.incoherentCategoryWeight=Le poids total des mensurations d'un lot des espèces est supérieur au poids de la catégorie +tutti.service.operations.computeWeights.species.error.incoherentParentCategoryWeight=Le poids de la catégorie d'un lot des espèces est différent de la somme des poids de ses sous-catégories +tutti.service.operations.computeWeights.species.error.incoherentRowWeightFrequency=Le poids total des mensurations d'un lot des espèces est différent du poids du sous-échantillon +tutti.service.operations.computeWeights.species.error.incoherentSampleWeight=Le poids de sous-échantillonage d'un lot des espèces est supérieur au poids de la catégorie +tutti.service.operations.computeWeights.species.error.incoherentTotalSorted=Le poids total Vrac des espèces est inférieur à la somme des poids Vrac triés, inerte trié et vivant non détaillé trié +tutti.service.operations.computeWeights.species.error.noWeight=Un lot des espèces n'a pas de poids tutti.validator.error.comment.too.long=Taille de commentaire trop longue (limitée à %s caractères) tutti.validator.error.cruise.beginDate.required=La date de début est obligatoire tutti.validator.error.cruise.dates.endBeforeStart=La date de fin doit être après la date de début Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-04-16 14:43:22 UTC (rev 805) @@ -22,7 +22,7 @@ # #L% ### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Thu Apr 11 16:29:39 CEST 2013 +#Fri Apr 12 10:46:52 CEST 2013 tutti.createAccidentalBatch.action.cancel.help= tutti.createAccidentalBatch.action.save.help= tutti.createAccidentalBatch.field.accidentalDeadOrAlive.help= @@ -271,6 +271,7 @@ tutti.selectCruise.action.newProgram.help=selectCruise.html\#actions tutti.selectCruise.action.newProtocol.help=selectCruise.html\#actions tutti.selectCruise.action.validateCatches.help=selectCruise.html\#actions +tutti.selectCruise.action.validateCruise.help= tutti.selectCruise.field.cruise.help=selectCruise.html\#fields tutti.selectCruise.field.program.help=selectCruise.html\#fields tutti.selectCruise.field.protocol.help=selectCruise.html\#fields Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-04-16 14:43:22 UTC (rev 805) @@ -22,7 +22,7 @@ # #L% ### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Thu Apr 11 16:29:39 CEST 2013 +#Fri Apr 12 10:46:52 CEST 2013 tutti.createAccidentalBatch.action.cancel.help= tutti.createAccidentalBatch.action.save.help= tutti.createAccidentalBatch.field.accidentalDeadOrAlive.help= @@ -280,6 +280,7 @@ tutti.selectCruise.action.newProgram.help=selectCruise.html\#actions tutti.selectCruise.action.newProtocol.help=selectCruise.html\#actions tutti.selectCruise.action.validateCatches.help=selectCruise.html\#actions +tutti.selectCruise.action.validateCruise.help= tutti.selectCruise.field.cruise.help=selectCruise.html\#fields tutti.selectCruise.field.program.help=selectCruise.html\#fields tutti.selectCruise.field.protocol.help=selectCruise.html\#fields Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiScreen.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiScreen.java 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiScreen.java 2013-04-16 14:43:22 UTC (rev 805) @@ -80,9 +80,16 @@ */ IMPORT_TEMPORARY_REFERENTIAL, /** - * To fill catches. + * To fill operations. * * @since 0.1 */ - EDIT_FISHING_OPERATION + EDIT_FISHING_OPERATION, + + /** + * To validate the cruise. + * + * @since 1.4 + */ + VALIDATE_CRUISE } 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-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-04-16 14:43:22 UTC (rev 805) @@ -30,12 +30,9 @@ import fr.ifremer.tutti.TuttiIOUtil; import fr.ifremer.tutti.TuttiTechnicalException; import fr.ifremer.tutti.persistence.RessourceClassLoader; -import fr.ifremer.tutti.service.ClosedPersistenceService; -import fr.ifremer.tutti.service.DecoratorService; -import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.TuttiDataContext; -import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.service.*; import fr.ifremer.tutti.service.catches.TuttiWeightComputingService; +import fr.ifremer.tutti.service.catches.ValidateCruiseOperationsService; import fr.ifremer.tutti.service.protocol.TuttiProtocolImportExportService; import fr.ifremer.tutti.service.pupitri.TuttiPupitriImportExportService; import fr.ifremer.tutti.service.referential.TuttiReferentialImportExportService; @@ -522,6 +519,14 @@ return serviceContext.getService(TuttiWeightComputingService.class); } + public ValidateCruiseOperationsService getValidateCruiseOperationsService() { + return serviceContext.getService(ValidateCruiseOperationsService.class); + } + + public ValidationService getValidationService() { + return serviceContext.getService(ValidationService.class); + } + public boolean useRealPersistenceService() { return isDbExist() && isDbLoaded(); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/EditSelectedCruiseCatchesAction.java 2013-04-16 14:43:22 UTC (rev 805) @@ -31,7 +31,7 @@ import org.apache.commons.logging.LogFactory; /** - * Opens the catches edition screen to edit the selected catches. + * Opens the operations edition screen to edit the selected operations. * * @author tchemit <chemit@codelutin.com> * @since 1.0 @@ -50,7 +50,7 @@ protected void doAction() throws Exception { Preconditions.checkState(getContext().isCruiseFilled()); if (log.isInfoEnabled()) { - log.info("Edit catches of cruise: " + getContext().getCruiseId()); + log.info("Edit operations of cruise: " + getContext().getCruiseId()); } getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_EDIT); super.doAction(); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css 2013-04-16 14:43:22 UTC (rev 805) @@ -157,10 +157,7 @@ text: "tutti.main.action.editCatches"; toolTipText: "tutti.main.action.editCatches.tip"; i18nMnemonic: "tutti.main.action.editCatches.mnemonic"; - enabled: {( - !TuttiUIContext.VALIDATION_CONTEXT_EDIT.equals(model.getValidationContext()) - || model.getScreen() != TuttiScreen.EDIT_FISHING_OPERATION - ) && model.isCruiseFilled()}; + enabled: {model.getScreen() != TuttiScreen.EDIT_FISHING_OPERATION && model.isCruiseFilled()}; _tuttiAction: {EditSelectedCruiseCatchesAction.class}; _help: {"tutti.main.menu.action.editCatches.help"}; } @@ -170,10 +167,7 @@ text: "tutti.main.action.validateCatches"; toolTipText: "tutti.main.action.validateCatches.tip"; i18nMnemonic: "tutti.main.action.validateCatches.mnemonic"; - enabled: {( - !TuttiUIContext.VALIDATION_CONTEXT_VALIDATE.equals(model.getValidationContext()) - || model.getScreen() != TuttiScreen.EDIT_FISHING_OPERATION - ) && model.isCruiseFilled()}; + enabled: {model.getScreen() != TuttiScreen.VALIDATE_CRUISE && model.isCruiseFilled()}; _tuttiAction: {ValidateSelectedCruiseCatchesAction.class}; _help: {"tutti.main.menu.action.validateCatches.help"}; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-04-16 14:43:22 UTC (rev 805) @@ -36,6 +36,7 @@ import fr.ifremer.tutti.ui.swing.content.config.TuttiConfigUI; import fr.ifremer.tutti.ui.swing.content.cruise.EditCruiseUI; import fr.ifremer.tutti.ui.swing.content.cruise.EditCruiseUIHandler; +import fr.ifremer.tutti.ui.swing.content.cruise.ValidateCruiseUI; import fr.ifremer.tutti.ui.swing.content.db.DbManagerUI; import fr.ifremer.tutti.ui.swing.content.db.OpenDbAction; import fr.ifremer.tutti.ui.swing.content.home.SelectCruiseUI; @@ -447,12 +448,12 @@ if (TuttiUIContext.VALIDATION_CONTEXT_EDIT.equals(validationContext)) { - // edit catches + // edit operations screenTitle = _("tutti.fishingOperations.title.edit.operations", getSelectedCruiseTitle()); icon = ui.getMenuActionEditCatches().getIcon(); } else { - // validate catches + // validate operations screenTitle = _("tutti.fishingOperations.title.validate.operations", getSelectedCruiseTitle()); icon = ui.getMenuActionValidateCatches().getIcon(); } @@ -465,6 +466,15 @@ screenUI = new ManageTemporaryReferentialUI(ui); icon = ui.getMenuImportTemporaryReferential().getIcon(); break; + + case VALIDATE_CRUISE: + screenTitle = EditCruiseUIHandler.getTitle( + context.isCruiseFilled()); + + screenUI = new ValidateCruiseUI(ui); +// rightDecoration = ((ValidateCruiseUI) screenUI).getTopToolBar(); + icon = ui.getMenuActionEditCruise().getIcon(); + break; } JButton showHelp = ui.getShowHelp(); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/ValidateSelectedCruiseCatchesAction.java 2013-04-16 14:43:22 UTC (rev 805) @@ -31,7 +31,7 @@ import org.apache.commons.logging.LogFactory; /** - * Opens the catches validation screen to edit the selected catches. + * Opens the operations validation screen to edit the selected operations. * * @author tchemit <chemit@codelutin.com> * @since 1.0 @@ -43,7 +43,7 @@ LogFactory.getLog(ValidateSelectedCruiseCatchesAction.class); public ValidateSelectedCruiseCatchesAction(MainUIHandler handler) { - super(handler, true, TuttiScreen.EDIT_FISHING_OPERATION); + super(handler, true, TuttiScreen.VALIDATE_CRUISE); } @Override @@ -52,7 +52,7 @@ getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_VALIDATE); // getContext().setScreen(null); if (log.isInfoEnabled()) { - log.info("Validate catches of cruise: " + getContext().getCruiseId()); + log.info("Validate operations of cruise: " + getContext().getCruiseId()); } super.doAction(); } Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseFishingOperationAction.java (from rev 771, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationAction.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseFishingOperationAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseFishingOperationAction.java 2013-04-16 14:43:22 UTC (rev 805) @@ -0,0 +1,76 @@ +package fr.ifremer.tutti.ui.swing.content.cruise; + +import com.google.common.collect.Lists; +import fr.ifremer.tutti.persistence.InvalidBatchModelException; +import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.Attachment; +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.ui.swing.content.operation.*; +import fr.ifremer.tutti.ui.swing.content.operation.catches.ComputeWeightsAction; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.SaveCatchBatchAction; +import fr.ifremer.tutti.ui.swing.content.operation.fishing.GearUseFeatureTabUI; +import fr.ifremer.tutti.ui.swing.content.operation.fishing.VesselUseFeatureTabUI; +import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.decorator.Decorator; + +import javax.swing.*; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Collections; +import java.util.List; + +import static org.nuiton.i18n.I18n._; + +/** + * To edit the given fishing operation. + * + * @author kmorin <morin@codelutin.com> + * @since 1.4 + */ +public class EditCruiseFishingOperationAction extends AbstractTuttiAction<ValidateCruiseUIModel, ValidateCruiseUI, ValidateCruiseUIHandler> { + + /** Logger. */ + private static final Log log = + LogFactory.getLog(EditCruiseFishingOperationAction.class); + + /** + * The incoming fishing operation to edit. + * <p/> + * Can be null (means do not edit any fishing operation), or with no id + * (means create a ne fishing operation), or with an id (means edit an + * existing fishing operation). + */ + protected FishingOperation fishingOperation; + + public EditCruiseFishingOperationAction(ValidateCruiseUIHandler handler) { + super(handler, true); + setActionDescription(_("tutti.editFishingOperation.action.editFishingOperation.tip")); + } + + public void setFishingOperation(FishingOperation fishingOperation) { + this.fishingOperation = fishingOperation; + } + + @Override + protected void doAction() throws Exception { + getUI().getOperationPanel().getModel().setSelectedFishingOperation(fishingOperation); + } + + @Override + protected void releaseAction() { + super.releaseAction(); + fishingOperation = null; + } +} Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseFishingOperationAction.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUI.jaxx 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUI.jaxx 2013-04-16 14:43:22 UTC (rev 805) @@ -62,7 +62,7 @@ ]]></script> <EditCruiseUIHandler id='handler' - initializer='getContextValue(EditCruiseUIHandler.class)'/> + initializer='getContextValue(EditCruiseUIHandler.class)'/> <EditCruiseUIModel id='model' initializer='getContextValue(EditCruiseUIModel.class)'/> Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUI.css (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUI.css 2013-04-16 14:43:22 UTC (rev 805) @@ -0,0 +1,3 @@ +#navigation { + rootVisible: false; +} \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUI.jaxx (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUI.jaxx 2013-04-16 14:43:22 UTC (rev 805) @@ -0,0 +1,42 @@ +<JSplitPane id='splitPane' decorator='help' + implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<ValidateCruiseUIModel, ValidateCruiseUIHandler>'> + + <import> + + fr.ifremer.tutti.ui.swing.TuttiHelpBroker + fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI + fr.ifremer.tutti.ui.swing.util.TuttiUI + + </import> + <script><![CDATA[ + + public ValidateCruiseUI(TuttiUI parentUI) { + JAXXUtil.initContext(this, parentUI); + ValidateCruiseUIHandler handler = new ValidateCruiseUIHandler(parentUI, this); + setContextValue(handler); + handler.beforeInitUI(); + } + + protected void $afterCompleteSetup() { + handler.afterInitUI(); + } + ]]></script> + + <ValidateCruiseUIHandler id='handler' + initializer='getContextValue(ValidateCruiseUIHandler.class)'/> + + <ValidateCruiseUIModel id='model' + initializer='getContextValue(ValidateCruiseUIModel.class)'/> + + <TuttiHelpBroker id='broker' + constructorParams='"tutti.validateCruise.help"'/> + + <JScrollPane id='navigationPanel'> + <JTree id='navigation'/> + </JScrollPane> + + <FishingOperationsUI id='operationPanel' + constructorParams='this'> + </FishingOperationsUI> + +</JSplitPane> \ No newline at end of file Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIHandler.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIHandler.java 2013-04-16 14:43:22 UTC (rev 805) @@ -0,0 +1,197 @@ +package fr.ifremer.tutti.ui.swing.content.cruise; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.LinkedListMultimap; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.ValidationService; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; +import fr.ifremer.tutti.ui.swing.util.CloseableUI; +import fr.ifremer.tutti.ui.swing.util.TuttiUI; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.tree.TreeUtilities; +import org.nuiton.validator.NuitonValidatorResult; +import org.nuiton.validator.NuitonValidatorScope; + +import javax.swing.*; +import javax.swing.tree.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.*; +import java.util.List; + +import static org.nuiton.i18n.I18n._; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class ValidateCruiseUIHandler extends AbstractTuttiUIHandler<ValidateCruiseUIModel, ValidateCruiseUI> implements CloseableUI { + + private final static Log log = LogFactory.getLog(ValidateCruiseUIHandler.class); + + /** + * Persistence service. + */ + private final PersistenceService persistenceService; + + /** + * Validation service. + */ + private final ValidationService validationService; + + protected EditCruiseFishingOperationAction editFishingOperationAction; + + protected Map<FishingOperation, NuitonValidatorResult> validator; + + public ValidateCruiseUIHandler(TuttiUI parentUi, ValidateCruiseUI ui) { + super(parentUi.getHandler().getContext(), ui); + persistenceService = context.getPersistenceService(); + validationService = context.getValidationService(); + } + + @Override + public void beforeInitUI() { + validator = context.getValidateCruiseOperationsService().validateCruiseOperations(); + + ValidateCruiseUIModel model = new ValidateCruiseUIModel(); + ui.setContextValue(model); + + } + + @Override + public void afterInitUI() { + initUI(ui); + + editFishingOperationAction = TuttiActionHelper.createLogicAction(this, EditCruiseFishingOperationAction.class); + + ui.getOperationPanel().getModel().setSelectedFishingOperation(null); + + DefaultMutableTreeNode root = new DefaultMutableTreeNode(); + for (FishingOperation operation : validator.keySet()) { + operation = persistenceService.getFishingOperation(operation.getId()); + NuitonValidatorResult result = validator.get(operation); + + Multimap<NuitonValidatorScope, String> messages = LinkedListMultimap.create(); + messages.putAll(NuitonValidatorScope.ERROR, result.getMessagesForScope(NuitonValidatorScope.ERROR)); + messages.putAll(NuitonValidatorScope.WARNING, result.getMessagesForScope(NuitonValidatorScope.WARNING)); + + OperationTreeNode node = new OperationTreeNode(operation, messages); + root.add(node); + } + TreeModel model = new DefaultTreeModel(root); + + final JTree navigation = ui.getNavigation(); + navigation.setModel(model); + navigation.setCellRenderer(new ValidationTreeCellRenderer()); + navigation.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + Object[] paths = navigation.getSelectionPath().getPath(); + FishingOperation operation = null; + for (Object o : paths) { + if (o != null && OperationTreeNode.class.isAssignableFrom(o.getClass())) { + operation = (FishingOperation) ((OperationTreeNode) o).getUserObject(); + break; + } + } + editFishingOperationAction.setFishingOperation(operation); + AbstractTuttiAction.runAction(editFishingOperationAction); + } + } + }); + + FishingOperationsUI operationPanel = ui.getOperationPanel(); + operationPanel.getTopPanel().setVisible(false); + } + + @Override + public void onCloseUI() { + if (log.isDebugEnabled()) { + log.debug("closing: " + ui); + } + clearValidators(); + } + + @Override + public SwingValidator<ValidateCruiseUIModel> getValidator() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + protected JComponent getComponentToFocus() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean quitUI() { + return true; + } + + protected class ValidationTreeCellRenderer extends DefaultTreeCellRenderer { + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + + if (value != null) { + if (value instanceof OperationTreeNode) { + OperationTreeNode node = (OperationTreeNode) value; + label.setText(getDecorator(FishingOperation.class, null).toString(node.getUserObject())); + + } else if (value instanceof MessageTreeNode) { + MessageTreeNode node = (MessageTreeNode) value; + label.setText(_(String.valueOf(node.getUserObject()))); + String iconName = node.getScope().toString().toLowerCase(); + label.setIcon(SwingUtil.createImageIcon(iconName + ".png")); + } + } + return label; + } + } + + protected class OperationTreeNode extends DefaultMutableTreeNode { + + public OperationTreeNode(FishingOperation operation, + Multimap<NuitonValidatorScope, String> messages) { + super(operation); + setAllowsChildren(messages != null); + createChildren(messages); + } + + public void createChildren(Multimap<NuitonValidatorScope, String> messages) { + for (NuitonValidatorScope scope: messages.keySet()) { + for (String message : messages.get(scope)) { + MessageTreeNode child = new MessageTreeNode(scope, message); + this.add(child); + } + } + } + } + + protected class MessageTreeNode extends DefaultMutableTreeNode { + + protected NuitonValidatorScope scope; + + public MessageTreeNode(NuitonValidatorScope scope, String message) { + super(message); + this.scope = scope; + } + + public NuitonValidatorScope getScope() { + return scope; + } + + } +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIModel.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/ValidateCruiseUIModel.java 2013-04-16 14:43:22 UTC (rev 805) @@ -0,0 +1,368 @@ +package fr.ifremer.tutti.ui.swing.content.cruise; + +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; +import fr.ifremer.tutti.persistence.entities.data.*; +import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.Person; +import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; +import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; +import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentModelAware; +import org.nuiton.util.beans.Binder; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 1.4 + */ +public class ValidateCruiseUIModel extends AbstractTuttiBeanUIModel<FishingOperation, ValidateCruiseUIModel> + implements AttachmentModelAware, FishingOperation { + + protected ValidateCruiseUIModel() { + super(FishingOperation.class, null, null); + } + + /** + * Delegate edit object. + * + * @since 1.4 + */ + protected FishingOperation editObject = null; + + public FishingOperation getEditFishingOperation() { + return editObject; + } + + public void setEditFishingOperation(FishingOperation editObject) { + this.editObject = editObject; + } + + @Override + protected FishingOperation newEntity() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public AttachementObjectTypeEnum getObjectType() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public String getObjectId() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public List<Attachment> getAttachment() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void addAllAttachment(Collection<Attachment> attachments) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void addAttachment(Attachment attachment) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void removeAllAttachment(Collection<Attachment> attachments) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void removeAttachment(Attachment attachment) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public String getStationNumber() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setStationNumber(String stationNumber) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Integer getFishingOperationNumber() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setFishingOperationNumber(Integer fishingOperationNumber) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Float getGearShootingStartLatitude() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setGearShootingStartLatitude(Float gearShootingStartLatitude) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Float getGearShootingStartLongitude() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setGearShootingStartLongitude(Float gearShootingStartLongitude) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Date getGearShootingStartDate() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setGearShootingStartDate(Date gearShootingStartDate) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Float getGearShootingEndLatitude() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setGearShootingEndLatitude(Float gearShootingEndLatitude) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Float getGearShootingEndLongitude() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setGearShootingEndLongitude(Float gearShootingEndLongitude) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Date getGearShootingEndDate() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setGearShootingEndDate(Date gearShootingEndDate) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean isFishingOperationRectiligne() { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setFishingOperationRectiligne(boolean fishingOperationRectiligne) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Float getTrawlDistance() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setTrawlDistance(Float trawlDistance) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Boolean getFishingOperationValid() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setFishingOperationValid(Boolean fishingOperationValid) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean isPlanktonObserved() { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setPlanktonObserved(boolean planktonObserved) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public CaracteristicMap getVesselUseFeatures() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setVesselUseFeatures(CaracteristicMap vesselUseFeatures) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public CaracteristicMap getGearUseFeatures() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setGearUseFeatures(CaracteristicMap gearUseFeatures) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean isAccidentalObserved() { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setAccidentalObserved(boolean accidentalObserved) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public String getMultirigAggregation() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setMultirigAggregation(String multirigAggregation) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public String getComment() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setComment(String comment) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Cruise getCruise() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setCruise(Cruise cruise) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Person getRecorderPerson(int index) { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean isRecorderPersonEmpty() { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public int sizeRecorderPerson() { + return 0; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void addRecorderPerson(Person recorderPerson) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void addAllRecorderPerson(Collection<Person> recorderPerson) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean removeRecorderPerson(Person recorderPerson) { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean removeAllRecorderPerson(Collection<Person> recorderPerson) { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean containsRecorderPerson(Person recorderPerson) { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public boolean containsAllRecorderPerson(Collection<Person> recorderPerson) { + return false; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public List<Person> getRecorderPerson() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setRecorderPerson(List<Person> recorderPerson) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Gear getGear() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setGear(Gear gear) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public Vessel getVessel() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setVessel(Vessel vessel) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public TuttiLocation getStrata() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setStrata(TuttiLocation strata) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public TuttiLocation getSubStrata() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setSubStrata(TuttiLocation subStrata) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public TuttiLocation getLocation() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void setLocation(TuttiLocation location) { + //To change body of implemented methods use File | Settings | File Templates. + } +} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/EditCatchesAction.java 2013-04-16 14:43:22 UTC (rev 805) @@ -33,7 +33,7 @@ import org.apache.commons.logging.LogFactory; /** - * Opens the catches edition screen. + * Opens the operations edition screen. * * @author tchemit <chemit@codelutin.com> * @since 1.0 @@ -52,7 +52,7 @@ Preconditions.checkState(getContext().isProgramFilled()); Preconditions.checkState(getContext().isCruiseFilled()); if (log.isInfoEnabled()) { - log.info("Edit catches of cruise: " + getContext().getCruiseId()); + log.info("Edit operations of cruise: " + getContext().getCruiseId()); } getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_EDIT); super.doAction(); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.css 2013-04-16 14:43:22 UTC (rev 805) @@ -210,4 +210,4 @@ _tuttiAction: {ValidateCatchesAction.class}; enabled: {model.isValid() && uiContext.isCruiseFilled()}; _help: {"tutti.selectCruise.action.validateCatches.help"}; -} +} \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/ValidateCatchesAction.java 2013-04-16 14:43:22 UTC (rev 805) @@ -33,7 +33,7 @@ import org.apache.commons.logging.LogFactory; /** - * Opens the catches validation screen. + * Opens the operations validation screen. * * @author tchemit <chemit@codelutin.com> * @since 1.0 @@ -45,7 +45,7 @@ LogFactory.getLog(ValidateCatchesAction.class); public ValidateCatchesAction(MainUIHandler handler) { - super(handler, true, TuttiScreen.EDIT_FISHING_OPERATION); + super(handler, true, TuttiScreen.VALIDATE_CRUISE); } @Override @@ -54,7 +54,7 @@ Preconditions.checkState(getContext().isCruiseFilled()); getContext().setValidationContext(TuttiUIContext.VALIDATION_CONTEXT_VALIDATE); if (log.isInfoEnabled()) { - log.info("Validate catches of cruise: " + getContext().getCruiseId()); + log.info("Validate operations of cruise: " + getContext().getCruiseId()); } super.doAction(); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-04-16 14:11:38 UTC (rev 804) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/SaveFishingOperationAction.java 2013-04-16 14:43:22 UTC (rev 805) @@ -31,6 +31,7 @@ import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.fishing.AbstractCaracteristicTabUIModel; import fr.ifremer.tutti.ui.swing.content.operation.fishing.GearUseFeatureTabUIModel; import fr.ifremer.tutti.ui.swing.content.operation.fishing.VesselUseFeatureTabUIModel; @@ -128,8 +129,10 @@ saveFishingOperation(toSave); - handler.getParentUi().getTabPane().setSelectedIndex(1); - handler.getParentUi().getCatchesTabContent().getTabPane().setSelectedIndex(1); + if (TuttiUIContext.VALIDATION_CONTEXT_EDIT.equals(getContext().getValidationContext())) { + handler.getParentUi().getTabPane().setSelectedIndex(1); + handler.getParentUi().getCatchesTabContent().getTabPane().setSelectedIndex(1); + } } } Added: trunk/tutti-ui-swing/src/main/resources/icons/error.png =================================================================== (Binary files differ) Property changes on: trunk/tutti-ui-swing/src/main/resources/icons/error.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/tutti-ui-swing/src/main/resources/icons/fatal.png =================================================================== (Binary files differ) Property changes on: trunk/tutti-ui-swing/src/main/resources/icons/fatal.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/tutti-ui-swing/src/main/resources/icons/info.png =================================================================== (Binary files differ) Property changes on: trunk/tutti-ui-swing/src/main/resources/icons/info.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/tutti-ui-swing/src/main/resources/icons/warning.png =================================================================== (Binary files differ) Property changes on: trunk/tutti-ui-swing/src/main/resources/icons/warning.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream
participants (1)
-
kmorin@users.forge.codelutin.com