r362 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/content/operation java/fr/ifremer/tutti/ui/swing/content/operation/catches/species java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split java/fr/ifremer/tutti/ui/swing/util java/fr/ifremer/tutti/ui/swing/util/editor resources/fr/ifremer/tutti/ui/swing/content/operation resources/fr/ifremer/tutti/ui/s
Author: kmorin Date: 2013-02-07 23:31:52 +0100 (Thu, 07 Feb 2013) New Revision: 362 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/362 Log: - move validator widget and component resizer and mover into jaxx - start weight computing in the catches Removed: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentMover.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentResizer.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-warning-validation.xml trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-warning-validation.xml trunk/tutti-ui-swing/src/main/resources/icons/action-alert-error.png trunk/tutti-ui-swing/src/main/resources/icons/action-alert-info.png trunk/tutti-ui-swing/src/main/resources/icons/action-alert-none.png trunk/tutti-ui-swing/src/main/resources/icons/action-alert-warning.png Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.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/SampleCategoryComponent.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequencyCellComponent.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-02-07 22:31:52 UTC (rev 362) @@ -297,7 +297,7 @@ if (italicStyle != null && italicStyle) { text = "<em>" + text + "</em>"; } - jLabel.setText("<html>" + text + "</strong>"); + jLabel.setText("<html>" + text + "</html>"); } } else if (component instanceof AbstractButton) { AbstractButton abstractButton = (AbstractButton) component; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx 2013-02-07 22:31:52 UTC (rev 362) @@ -30,7 +30,7 @@ javax.swing.JFrame org.jdesktop.swingx.JXTitledPanel jaxx.runtime.validator.swing.SwingValidator - fr.ifremer.tutti.ui.swing.util.SwingValidatorMessageWidget + jaxx.runtime.validator.swing.SwingValidatorMessageWidget fr.ifremer.tutti.ui.swing.TuttiUIContext </import> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-02-07 22:31:52 UTC (rev 362) @@ -97,12 +97,47 @@ //check if the user changed the date and not only the time) Date oldDate = (Date) evt.getOldValue(); Date newDate = (Date) evt.getNewValue(); - if (!DateUtils.isSameDay(oldDate, newDate)) { + if (oldDate == null || !DateUtils.isSameDay(oldDate, newDate)) { getModel().setGearShootingEndDate(newDate); } } + }; + + private final PropertyChangeListener coordinatePropertiesListener = new PropertyChangeListener() { + private List<String> properties = Lists.newArrayList( + EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DECIMAL_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DEGREE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_SECOND, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DECIMAL_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DEGREE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_SECOND, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DECIMAL_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DEGREE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_SECOND, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DECIMAL_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DEGREE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_SECOND + ); + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (properties.contains(evt.getPropertyName())) { + EditFishingOperationUIModel source = (EditFishingOperationUIModel) evt.getSource(); + if (source.isFishingOperationRectiligne()) { + source.computeDictance(); + } + } + } }; /** @@ -182,43 +217,6 @@ } }); - model.addPropertyChangeListener(new PropertyChangeListener() { - - List<String> properties = Lists.newArrayList( - EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DECIMAL_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DEGREE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_SECOND, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DECIMAL_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DEGREE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_SECOND, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DECIMAL_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DEGREE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_SECOND, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DECIMAL_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DEGREE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_SECOND - ); - - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (properties.contains(evt.getPropertyName())) { - EditFishingOperationUIModel source = (EditFishingOperationUIModel) evt.getSource(); - if (source.isFishingOperationRectiligne()) { - source.computeDictance(); - } - } - } - }); - model.addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID, new PropertyChangeListener() { @Override @@ -456,6 +454,7 @@ EditFishingOperationUIModel model = getModel(); model.removePropertyChangeListener(EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE, startDateListener); + model.removePropertyChangeListener(coordinatePropertiesListener); if (empty || !bean.equals(model.getFishingOperation()) || isAModelModified()) { if (empty) { @@ -524,6 +523,7 @@ fishingOperationMonitor.clearModified(); model.addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE, startDateListener); + model.addPropertyChangeListener(coordinatePropertiesListener); } } 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-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java 2013-02-07 22:31:52 UTC (rev 362) @@ -58,6 +58,13 @@ * @since 0.3 */ protected Float categoryWeight; + + /** + * Sample computed weight. + * + * @since 1.0 + */ + protected Float computedWeight; public static <C extends Serializable> SampleCategory<C> newSample(SampleCategoryType categoryType) { SampleCategory<C> result = new SampleCategory<C>(); @@ -92,12 +99,22 @@ this.categoryWeight = categoryWeight; } + public Float getComputedWeight() { + return computedWeight; + } + + public void setComputedWeight(Float computedWeight) { + this.computedWeight = computedWeight; + } + public boolean isValid() { return categoryValue != null; } public boolean isEmpty() { - return categoryValue == null && categoryWeight == null; + return categoryValue == null + && categoryWeight == null + && computedWeight == null; } public boolean isEmptyOrValid() { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryComponent.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryComponent.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryComponent.java 2013-02-07 22:31:52 UTC (rev 362) @@ -217,14 +217,19 @@ text = ""; } else { Float number = sampleCategory.getCategoryWeight(); + Float computedNumber = sampleCategory.getComputedWeight(); + + text = "<html>" + categoryDecorator.toString(categoryValue) + " / "; - text = categoryDecorator.toString(categoryValue) + " / "; - - if (number == null) { + if (number != null) { + text += number; + } else if (computedNumber != null) { + text += "<em style='color: blue'>" + computedNumber + "</em>"; + } else { text += "-"; - } else { - text += number; } + + text += "</html>"; } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java 2013-02-07 22:31:52 UTC (rev 362) @@ -59,6 +59,8 @@ public static final String PROPERTY_SORTED_UNSORTED_CATEGORY_VALUE = "sortedUnsortedCategoryValue"; public static final String PROPERTY_SORTED_UNSORTED_CATEGORY_WEIGHT = "sortedUnsortedCategoryWeight"; + + public static final String PROPERTY_SORTED_UNSORTED_COMPUTED_WEIGHT = "sortedUnsortedComputedWeight"; public static final String PROPERTY_SIZE_CATEGORY = "sizeCategory"; 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-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java 2013-02-07 22:31:52 UTC (rev 362) @@ -134,11 +134,6 @@ n_("tutti.table.species.batch.header.computedNumber"), n_("tutti.table.species.batch.header.computedNumber")); - public static final ColumnIdentifier<SpeciesBatchRowModel> NUMBER = ColumnIdentifier.newId( - SpeciesBatchRowModel.PROPERTY_NUMBER, - n_("tutti.table.species.batch.header.number"), - n_("tutti.table.species.batch.header.number")); - public static final ColumnIdentifier<SpeciesBatchRowModel> COMMENT = ColumnIdentifier.newId( SpeciesBatchRowModel.PROPERTY_COMMENT, n_("tutti.table.species.batch.header.comment"), Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css 2013-02-07 22:31:52 UTC (rev 362) @@ -57,9 +57,9 @@ } #speciesTotalSampleSortedWeightField { - property: speciesTotalSampleSortedWeight; - model: {model.getSpeciesTotalSampleSortedWeight()}; - numberPattern: {INT_6_DIGITS_PATTERN}; + text: {getStringValue(model.getSpeciesTotalUnsortedWeight())}; + editable: false; + enabled: false; } #speciesTotalUnsortedWeightLabel { @@ -138,6 +138,12 @@ enabled: {model.isCreateSpeciesBatchEnabled()}; } +#computeSpeciesBatchButton { + actionIcon: generate; + mnemonic: E; + text: "tutti.action.computeSpeciesBatch"; +} + #filterTablePane { border: {new TitledBorder(null, "")}; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx 2013-02-07 22:31:52 UTC (rev 362) @@ -113,8 +113,7 @@ <JLabel id='speciesTotalSampleSortedWeightLabel'/> </cell> <cell> - <NumberEditor id='speciesTotalSampleSortedWeightField' - constructorParams='this'/> + <JTextField id='speciesTotalSampleSortedWeightField'/> </cell> <cell> <JLabel id='speciesTotalUnsortedWeightLabel'/> @@ -157,6 +156,8 @@ <JRadioButton id='filterSpeciesBatchRootButton' onActionPerformed='model.setTableViewMode(TableViewMode.ROOT)'/> </JPanel> + <JButton id='computeSpeciesBatchButton' constraints='BorderLayout.EAST' + onActionPerformed='handler.computeSpeciesBatch()'/> </JPanel> </cell> </row> 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-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-02-07 22:31:52 UTC (rev 362) @@ -838,15 +838,112 @@ totalWeight += w; } } + } else { + totalNumber = row.getNumber(); } row.setComputedNumber(totalNumber); + + SampleCategory finestCategory; + if (row.getAgeCategory().isValid()) { + finestCategory = row.getAgeCategory(); + + } else if (row.getMaturityCategory().isValid()) { + finestCategory = row.getMaturityCategory(); + + } else if (row.getSexCategory().isValid()) { + finestCategory = row.getSexCategory(); + + } else if (row.getSizeCategory().isValid()) { + finestCategory = row.getSizeCategory(); + + } else { + finestCategory = row.getSortedUnsortedCategory(); + } + if (finestCategory.getCategoryWeight() == null) { + finestCategory.setComputedWeight(totalWeight); + } + } + + public void computeSpeciesBatch() { + Float totalSortedWeight = 0f; + Float totalUnsortedWeight = 0f; + List<SpeciesBatchRowModel> roots = getModel().getRows(); + for (SpeciesBatchRowModel row : roots) { + if (row.isBatchRoot()) { + Float weight = computeSpeciesBatch(row); + if (weight == null) { + JOptionPane.showMessageDialog( + ui, + _("tutti.dialog.catches.species.computeWeight.error.message"), + _("tutti.dialog.catches.species.computeWeight.error.title"), + JOptionPane.ERROR_MESSAGE); + totalSortedWeight = null; + totalUnsortedWeight = null; + break; + } + if (persistenceService.isSortedQualitativeValue(row.getSortedUnsortedCategory().getCategoryValue())) { + totalSortedWeight += weight; + } else { + totalUnsortedWeight += weight; + } + } + } + ui.getSpeciesTotalSampleSortedWeightField() + .setText(totalSortedWeight != null ? totalSortedWeight.toString() : ""); + ui.getSpeciesTotalUnsortedWeightField() + .setText(totalUnsortedWeight != null ? totalUnsortedWeight.toString() : ""); + } //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// + protected Float computeSpeciesBatch(SpeciesBatchRowModel row) { + Float sum = null; + List<SpeciesBatchRowModel> children = row.getBatchChild(); + if (!row.isBatchLeaf()) { + for (SpeciesBatchRowModel child : children) { + Float weight = computeSpeciesBatch(child); + if (weight == null) { + return null; + } + sum += weight; + } + } + + SampleCategory finestCategory; + if (row.getAgeCategory().isValid()) { + finestCategory = row.getAgeCategory(); + + } else if (row.getMaturityCategory().isValid()) { + finestCategory = row.getMaturityCategory(); + + } else if (row.getSexCategory().isValid()) { + finestCategory = row.getSexCategory(); + + } else if (row.getSizeCategory().isValid()) { + finestCategory = row.getSizeCategory(); + + } else { + finestCategory = row.getSortedUnsortedCategory(); + } + Float weight = finestCategory.getCategoryWeight(); + if (weight == null) { + weight = finestCategory.getComputedWeight(); + } + Float result; + if (sum != null && weight == null) { + finestCategory.setComputedWeight(sum); + result = sum; + + } else { + result = weight; + } + return result; + } + protected void saveRows(Iterable<SpeciesBatchRowModel> rows) { for (SpeciesBatchRowModel row : rows) { saveRow(row); @@ -984,7 +1081,8 @@ if (enableSplit) { // can split if selected batch is a leaf - enableSplit = row.isBatchLeaf(); + enableSplit = row.isBatchLeaf() + && row.getComputedNumber() == null; } if (enableRename) { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequencyCellComponent.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequencyCellComponent.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequencyCellComponent.java 2013-02-07 22:31:52 UTC (rev 362) @@ -150,15 +150,13 @@ // at close, synch back frequencies - // transfer rows to editor - List<SpeciesFrequencyRowModel> frequency = Lists.newArrayList(); - if (frequencyModel.isSimpleCountingMode()) { - SpeciesFrequencyRowModel row = new SpeciesFrequencyRowModel(); - row.setNumber(frequencyModel.getSimpleCount()); - frequency.add(row); + editRow.setNumber(frequencyModel.getSimpleCount()); } else { + // transfer rows to editor + List<SpeciesFrequencyRowModel> frequency = Lists.newArrayList(); + for (SpeciesFrequencyRowModel row : frequencyModel.getRows()) { if (row.isValid()) { @@ -166,18 +164,20 @@ frequency.add(row); } } - } + if (log.isInfoEnabled()) { + log.info("Push back " + frequency.size() + + " frequency to batch " + frequencyModel.getBatch()); + } - if (log.isInfoEnabled()) { - log.info("Push back " + frequency.size() + - " frequency to batch " + frequencyModel.getBatch()); + // push back to batch + editRow.setFrequency(frequency); + editRow.setNumber(null); + } - - // push back to batch - editRow.setFrequency(frequency); - + // update frequencies total ui.getHandler().updateTotalFromFrequencies(editRow); + } int r = rowIndex; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java 2013-02-07 22:31:52 UTC (rev 362) @@ -54,7 +54,7 @@ * @since 0.3 */ protected final SampleCategory<Serializable> category = SampleCategory.newSample(null); - + protected static final Binder<SplitSpeciesBatchRowModel, SplitSpeciesBatchRowModel> fromBeanBinder = BinderFactory.newBinder(SplitSpeciesBatchRowModel.class, SplitSpeciesBatchRowModel.class); @@ -106,5 +106,5 @@ category.setCategoryWeight(weight); firePropertyChange(PROPERTY_WEIGHT, oldValue, weight); } - + } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css 2013-02-07 22:31:52 UTC (rev 362) @@ -48,12 +48,6 @@ selectedItem: {model.getSelectedCategory()}; } -#sampleCheckBox { - text: "tutti.label.sampleCategoryConfiguration.sample"; - selected: {model.isSample()}; - enabled: {model.getBatchWeight() != null}; -} - #speciesLabel { text: "tutti.label.sampleCategoryConfiguration.species"; labelFor: {speciesField}; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.jaxx 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.jaxx 2013-02-07 22:31:52 UTC (rev 362) @@ -69,7 +69,6 @@ <BeanValidator id='validator' bean='model' errorTableModel='errorTableModel' uiClass='jaxx.runtime.validator.swing.ui.ImageValidationUI'> <field name='selectedCategory' component='categoryComboBox'/> - <field name='sample' component='sampleCheckBox'/> <field name='sampleWeight' component='sampleWeightField'/> </BeanValidator> @@ -86,15 +85,7 @@ </cell> </row> - <!-- Split as a sample or not ? --> <row> - <cell columns='2'> - <JCheckBox id='sampleCheckBox' - onItemStateChanged='handler.setBoolean(event, "sample")'/> - </cell> - </row> - - <row> <cell columns="2"> <JSeparator/> </cell> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java 2013-02-07 22:31:52 UTC (rev 362) @@ -46,8 +46,6 @@ public static final String PROPERTY_SPECIES = "species"; - public static final String PROPERTY_SAMPLE = "sample"; - public static final String PROPERTY_SELECTED_CATEGORY = "selectedCategory"; public static final String PROPERTY_BATCH_WEIGHT = "batchWeight"; @@ -76,13 +74,6 @@ protected SampleCategoryType selectedCategory; /** - * Flag when the batch to split is a sample. - * - * @since 0.3 - */ - protected boolean sample; - - /** * Sample weight of split batches. * * @since 0.3 @@ -130,16 +121,6 @@ firePropertyChange(PROPERTY_SELECTED_CATEGORY, oldValue, selectedCategory); } - public boolean isSample() { - return sample; - } - - public void setSample(boolean sample) { - Object oldValue = isSample(); - this.sample = sample; - firePropertyChange(PROPERTY_SAMPLE, oldValue, sample); - } - public Float getBatchWeight() { return batch == null ? null : batch.getSampleCategory().getCategoryWeight(); } Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentMover.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentMover.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentMover.java 2013-02-07 22:31:52 UTC (rev 362) @@ -1,380 +0,0 @@ -package fr.ifremer.tutti.ui.swing.util; - -/* - * #%L - * Tutti :: UI - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2012 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - - -import javax.swing.JComponent; -import javax.swing.SwingUtilities; -import java.awt.Component; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.GraphicsEnvironment; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Window; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -/** - * This class allows you to move a Component by using a mouse. The Component - * moved can be a high level Window (ie. Window, Frame, Dialog) in which case - * the Window is moved within the desktop. Or the Component can belong to a - * Container in which case the Component is moved within the Container. - * <p/> - * When moving a Window, the listener can be added to a child Component of - * the Window. In this case attempting to move the child will result in the - * Window moving. For example, you might create a custom "Title Bar" for an - * undecorated Window and moving of the Window is accomplished by moving the - * title bar only. Multiple components can be registered as "window movers". - * <p/> - * Components can be registered when the class is created. Additional - * components can be added at any time using the registerComponent() method. - */ -public class ComponentMover extends MouseAdapter { - private Insets dragInsets = new Insets(0, 0, 0, 0); - - private Dimension snapSize = new Dimension(1, 1); - - private Insets edgeInsets = new Insets(0, 0, 0, 0); - - private boolean changeCursor = true; - - private boolean autoLayout = false; - - private Class destinationClass; - - private Component destinationComponent; - - private Component destination; - - private Component source; - - private Point pressed; - - private Point location; - - private Cursor originalCursor; - - private boolean autoscrolls; - - private boolean potentialDrag; - - - /** - * Constructor for moving individual components. The components must be - * regisetered using the registerComponent() method. - */ - public ComponentMover() { - } - - /** - * Constructor to specify a Class of Component that will be moved when - * drag events are generated on a registered child component. The events - * will be passed to the first ancestor of this specified class. - * - * @param destinationClass the Class of the ancestor component - * @param components the Components to be registered for forwarding - * drag events to the ancestor Component. - */ - public ComponentMover(Class destinationClass, Component... components) { - this.destinationClass = destinationClass; - registerComponent(components); - } - - /** - * Constructor to specify a parent component that will be moved when drag - * events are generated on a registered child component. - * - * @param destinationComponent the component drage events should be forwareded to - * @param components the Components to be registered for forwarding drag - * events to the parent component to be moved - */ - public ComponentMover(Component destinationComponent, Component... components) { - this.destinationComponent = destinationComponent; - registerComponent(components); - } - - /** - * Get the auto layout property - * - * @return the auto layout property - */ - public boolean isAutoLayout() { - return autoLayout; - } - - /** - * Set the auto layout property - * - * @param autoLayout when true layout will be invoked on the parent container - */ - public void setAutoLayout(boolean autoLayout) { - this.autoLayout = autoLayout; - } - - /** - * Get the change cursor property - * - * @return the change cursor property - */ - public boolean isChangeCursor() { - return changeCursor; - } - - /** - * Set the change cursor property - * - * @param changeCursor when true the cursor will be changed to the - * Cursor.MOVE_CURSOR while the mouse is pressed - */ - public void setChangeCursor(boolean changeCursor) { - this.changeCursor = changeCursor; - } - - /** - * Get the drag insets - * - * @return the drag insets - */ - public Insets getDragInsets() { - return dragInsets; - } - - /** - * Set the drag insets. The insets specify an area where mouseDragged - * events should be ignored and therefore the component will not be moved. - * This will prevent these events from being confused with a - * MouseMotionListener that supports component resizing. - * - * @param dragInsets - */ - public void setDragInsets(Insets dragInsets) { - this.dragInsets = dragInsets; - } - - /** - * Get the bounds insets - * - * @return the bounds insets - */ - public Insets getEdgeInsets() { - return edgeInsets; - } - - /** - * Set the edge insets. The insets specify how close to each edge of the parent - * component that the child component can be moved. Positive values means the - * component must be contained within the parent. Negative values means the - * component can be moved outside the parent. - * - * @param edgeInsets - */ - public void setEdgeInsets(Insets edgeInsets) { - this.edgeInsets = edgeInsets; - } - - /** - * Remove listeners from the specified component - * - * @param components the component the listeners are removed from - */ - public void deregisterComponent(Component... components) { - for (Component component : components) - component.removeMouseListener(this); - } - - /** - * Add the required listeners to the specified component - * - * @param components the component the listeners are added to - */ - public void registerComponent(Component... components) { - for (Component component : components) - component.addMouseListener(this); - } - - /** - * Get the snap size - * - * @return the snap size - */ - public Dimension getSnapSize() { - return snapSize; - } - - /** - * Set the snap size. Forces the component to be snapped to - * the closest grid position. Snapping will occur when the mouse is - * dragged half way. - */ - public void setSnapSize(Dimension snapSize) { - if (snapSize.width < 1 - || snapSize.height < 1) - throw new IllegalArgumentException("Snap sizes must be greater than 0"); - - this.snapSize = snapSize; - } - - /** - * Setup the variables used to control the moving of the component: - * <p/> - * source - the source component of the mouse event - * destination - the component that will ultimately be moved - * pressed - the Point where the mouse was pressed in the destination - * component coordinates. - */ - @Override - public void mousePressed(MouseEvent e) { - source = e.getComponent(); - int width = source.getSize().width - dragInsets.left - dragInsets.right; - int height = source.getSize().height - dragInsets.top - dragInsets.bottom; - Rectangle r = new Rectangle(dragInsets.left, dragInsets.top, width, height); - - if (r.contains(e.getPoint())) - setupForDragging(e); - } - - private void setupForDragging(MouseEvent e) { - source.addMouseMotionListener(this); - potentialDrag = true; - - // Determine the component that will ultimately be moved - - if (destinationComponent != null) { - destination = destinationComponent; - } else if (destinationClass == null) { - destination = source; - } else // forward events to destination component - { - destination = SwingUtilities.getAncestorOfClass(destinationClass, source); - } - - pressed = e.getLocationOnScreen(); - location = destination.getLocation(); - - if (changeCursor) { - originalCursor = source.getCursor(); - source.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); - } - - // Making sure autoscrolls is false will allow for smoother dragging of - // individual components - - if (destination instanceof JComponent) { - JComponent jc = (JComponent) destination; - autoscrolls = jc.getAutoscrolls(); - jc.setAutoscrolls(false); - } - } - - /** - * Move the component to its new location. The dragged Point must be in - * the destination coordinates. - */ - @Override - public void mouseDragged(MouseEvent e) { - Point dragged = e.getLocationOnScreen(); - int dragX = getDragDistance(dragged.x, pressed.x, snapSize.width); - int dragY = getDragDistance(dragged.y, pressed.y, snapSize.height); - - int locationX = location.x + dragX; - int locationY = location.y + dragY; - - // Mouse dragged events are not generated for every pixel the mouse - // is moved. Adjust the location to make sure we are still on a - // snap value. - - while (locationX < edgeInsets.left) - locationX += snapSize.width; - - while (locationY < edgeInsets.top) - locationY += snapSize.height; - - Dimension d = getBoundingSize(destination); - - while (locationX + destination.getSize().width + edgeInsets.right > d.width) - locationX -= snapSize.width; - - while (locationY + destination.getSize().height + edgeInsets.bottom > d.height) - locationY -= snapSize.height; - - // Adjustments are finished, move the component - - destination.setLocation(locationX, locationY); - } - - /* - * Determine how far the mouse has moved from where dragging started - * (Assume drag direction is down and right for positive drag distance) - */ - private int getDragDistance(int larger, int smaller, int snapSize) { - int halfway = snapSize / 2; - int drag = larger - smaller; - drag += (drag < 0) ? -halfway : halfway; - drag = (drag / snapSize) * snapSize; - - return drag; - } - - /* - * Get the bounds of the parent of the dragged component. - */ - private Dimension getBoundingSize(Component source) { - if (source instanceof Window) { - GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); - Rectangle bounds = env.getMaximumWindowBounds(); - return new Dimension(bounds.width, bounds.height); - } else { - return source.getParent().getSize(); - } - } - - /** Restore the original state of the Component */ - @Override - public void mouseReleased(MouseEvent e) { - if (!potentialDrag) return; - - source.removeMouseMotionListener(this); - potentialDrag = false; - - if (changeCursor) - source.setCursor(originalCursor); - - if (destination instanceof JComponent) { - ((JComponent) destination).setAutoscrolls(autoscrolls); - } - - // Layout the components on the parent container - - if (autoLayout) { - if (destination instanceof JComponent) { - ((JComponent) destination).revalidate(); - } else { - destination.validate(); - } - } - } -} \ No newline at end of file Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentResizer.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentResizer.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentResizer.java 2013-02-07 22:31:52 UTC (rev 362) @@ -1,460 +0,0 @@ -package fr.ifremer.tutti.ui.swing.util; - -/* - * #%L - * Tutti :: UI - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2012 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - - -import javax.swing.JComponent; -import javax.swing.SwingUtilities; -import java.awt.Component; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.GraphicsEnvironment; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Window; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.HashMap; -import java.util.Map; - -/** - * The ComponentResizer allows you to resize a component by dragging a border - * of the component. - */ -public class ComponentResizer extends MouseAdapter { - private final static Dimension MINIMUM_SIZE = new Dimension(10, 10); - - private final static Dimension MAXIMUM_SIZE = - new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); - - private static Map<Integer, Integer> cursors = new HashMap<Integer, Integer>(); - - { - cursors.put(1, Cursor.N_RESIZE_CURSOR); - cursors.put(2, Cursor.W_RESIZE_CURSOR); - cursors.put(4, Cursor.S_RESIZE_CURSOR); - cursors.put(8, Cursor.E_RESIZE_CURSOR); - cursors.put(3, Cursor.NW_RESIZE_CURSOR); - cursors.put(9, Cursor.NE_RESIZE_CURSOR); - cursors.put(6, Cursor.SW_RESIZE_CURSOR); - cursors.put(12, Cursor.SE_RESIZE_CURSOR); - } - - private Insets dragInsets; - - private Dimension snapSize; - - private int direction; - - protected static final int NORTH = 1; - - protected static final int WEST = 2; - - protected static final int SOUTH = 4; - - protected static final int EAST = 8; - - private Cursor sourceCursor; - - private boolean resizing; - - private Rectangle bounds; - - private Point pressed; - - private boolean autoscrolls; - - private Dimension minimumSize = MINIMUM_SIZE; - - private Dimension maximumSize = MAXIMUM_SIZE; - - /** - * Convenience contructor. All borders are resizable in increments of - * a single pixel. Components must be registered separately. - */ - public ComponentResizer() { - this(new Insets(5, 5, 5, 5), new Dimension(1, 1)); - } - - /** - * Convenience contructor. All borders are resizable in increments of - * a single pixel. Components can be registered when the class is created - * or they can be registered separately afterwards. - * - * @param components components to be automatically registered - */ - public ComponentResizer(Component... components) { - this(new Insets(5, 5, 5, 5), new Dimension(1, 1), components); - } - - /** - * Convenience contructor. Eligible borders are resisable in increments of - * a single pixel. Components can be registered when the class is created - * or they can be registered separately afterwards. - * - * @param dragInsets Insets specifying which borders are eligible to be - * resized. - * @param components components to be automatically registered - */ - public ComponentResizer(Insets dragInsets, Component... components) { - this(dragInsets, new Dimension(1, 1), components); - } - - /** - * Create a ComponentResizer. - * - * @param dragInsets Insets specifying which borders are eligible to be - * resized. - * @param snapSize Specify the dimension to which the border will snap to - * when being dragged. Snapping occurs at the halfway mark. - * @param components components to be automatically registered - */ - public ComponentResizer(Insets dragInsets, Dimension snapSize, Component... components) { - setDragInsets(dragInsets); - setSnapSize(snapSize); - registerComponent(components); - } - - /** - * Get the drag insets - * - * @return the drag insets - */ - public Insets getDragInsets() { - return dragInsets; - } - - /** - * Set the drag dragInsets. The insets specify an area where mouseDragged - * events are recognized from the edge of the border inwards. A value of - * 0 for any size will imply that the border is not resizable. Otherwise - * the appropriate drag cursor will appear when the mouse is inside the - * resizable border area. - * - * @param dragInsets Insets to control which borders are resizeable. - */ - public void setDragInsets(Insets dragInsets) { - validateMinimumAndInsets(minimumSize, dragInsets); - - this.dragInsets = dragInsets; - } - - /** - * Get the components maximum size. - * - * @return the maximum size - */ - public Dimension getMaximumSize() { - return maximumSize; - } - - /** - * Specify the maximum size for the component. The component will still - * be constrained by the size of its parent. - * - * @param maximumSize the maximum size for a component. - */ - public void setMaximumSize(Dimension maximumSize) { - this.maximumSize = maximumSize; - } - - /** - * Get the components minimum size. - * - * @return the minimum size - */ - public Dimension getMinimumSize() { - return minimumSize; - } - - /** - * Specify the minimum size for the component. The minimum size is - * constrained by the drag insets. - * - * @param minimumSize the minimum size for a component. - */ - public void setMinimumSize(Dimension minimumSize) { - validateMinimumAndInsets(minimumSize, dragInsets); - - this.minimumSize = minimumSize; - } - - /** - * Remove listeners from the specified component - * - * @param components the component the listeners are removed from - */ - public void deregisterComponent(Component... components) { - for (Component component : components) { - component.removeMouseListener(this); - component.removeMouseMotionListener(this); - } - } - - /** - * Add the required listeners to the specified component - * - * @param components the component the listeners are added to - */ - public void registerComponent(Component... components) { - for (Component component : components) { - component.addMouseListener(this); - component.addMouseMotionListener(this); - } - } - - /** - * Get the snap size. - * - * @return the snap size. - */ - public Dimension getSnapSize() { - return snapSize; - } - - /** - * Control how many pixels a border must be dragged before the size of - * the component is changed. The border will snap to the size once - * dragging has passed the halfway mark. - * - * @param snapSize Dimension object allows you to separately spcify a - * horizontal and vertical snap size. - */ - public void setSnapSize(Dimension snapSize) { - this.snapSize = snapSize; - } - - /** - * When the components minimum size is less than the drag insets then - * we can't determine which border should be resized so we need to - * prevent this from happening. - */ - private void validateMinimumAndInsets(Dimension minimum, Insets drag) { - int minimumWidth = drag.left + drag.right; - int minimumHeight = drag.top + drag.bottom; - - if (minimum.width < minimumWidth - || minimum.height < minimumHeight) { - String message = "Minimum size cannot be less than drag insets"; - throw new IllegalArgumentException(message); - } - } - - /** - */ - @Override - public void mouseMoved(MouseEvent e) { - Component source = e.getComponent(); - Point location = e.getPoint(); - direction = 0; - - if (location.x < dragInsets.left) - direction += WEST; - - if (location.x > source.getWidth() - dragInsets.right - 1) - direction += EAST; - - if (location.y < dragInsets.top) - direction += NORTH; - - if (location.y > source.getHeight() - dragInsets.bottom - 1) - direction += SOUTH; - - // Mouse is no longer over a resizable border - - if (direction == 0) { - source.setCursor(sourceCursor); - } else // use the appropriate resizable cursor - { - int cursorType = cursors.get(direction); - Cursor cursor = Cursor.getPredefinedCursor(cursorType); - source.setCursor(cursor); - } - } - - @Override - public void mouseEntered(MouseEvent e) { - if (!resizing) { - Component source = e.getComponent(); - sourceCursor = source.getCursor(); - } - } - - @Override - public void mouseExited(MouseEvent e) { - if (!resizing) { - Component source = e.getComponent(); - source.setCursor(sourceCursor); - } - } - - @Override - public void mousePressed(MouseEvent e) { - // The mouseMoved event continually updates this variable - - if (direction == 0) return; - - // Setup for resizing. All future dragging calculations are done based - // on the original bounds of the component and mouse pressed location. - - resizing = true; - - Component source = e.getComponent(); - pressed = e.getPoint(); - SwingUtilities.convertPointToScreen(pressed, source); - bounds = source.getBounds(); - - // Making sure autoscrolls is false will allow for smoother resizing - // of components - - if (source instanceof JComponent) { - JComponent jc = (JComponent) source; - autoscrolls = jc.getAutoscrolls(); - jc.setAutoscrolls(false); - } - } - - /** Restore the original state of the Component */ - @Override - public void mouseReleased(MouseEvent e) { - resizing = false; - - Component source = e.getComponent(); - source.setCursor(sourceCursor); - - if (source instanceof JComponent) { - ((JComponent) source).setAutoscrolls(autoscrolls); - } - } - - /** - * Resize the component ensuring location and size is within the bounds - * of the parent container and that the size is within the minimum and - * maximum constraints. - * <p/> - * All calculations are done using the bounds of the component when the - * resizing started. - */ - @Override - public void mouseDragged(MouseEvent e) { - if (resizing == false) return; - - Component source = e.getComponent(); - Point dragged = e.getPoint(); - SwingUtilities.convertPointToScreen(dragged, source); - - changeBounds(source, direction, bounds, pressed, dragged); - } - - protected void changeBounds(Component source, int direction, Rectangle bounds, Point pressed, Point current) { - // Start with original locaton and size - - int x = bounds.x; - int y = bounds.y; - int width = bounds.width; - int height = bounds.height; - - // Resizing the West or North border affects the size and location - - if (WEST == (direction & WEST)) { - int drag = getDragDistance(pressed.x, current.x, snapSize.width); - int maximum = Math.min(width + x, maximumSize.width); - drag = getDragBounded(drag, snapSize.width, width, minimumSize.width, maximum); - - x -= drag; - width += drag; - } - - if (NORTH == (direction & NORTH)) { - int drag = getDragDistance(pressed.y, current.y, snapSize.height); - int maximum = Math.min(height + y, maximumSize.height); - drag = getDragBounded(drag, snapSize.height, height, minimumSize.height, maximum); - - y -= drag; - height += drag; - } - - // Resizing the East or South border only affects the size - - if (EAST == (direction & EAST)) { - int drag = getDragDistance(current.x, pressed.x, snapSize.width); - Dimension boundingSize = getBoundingSize(source); - int maximum = Math.min(boundingSize.width - x, maximumSize.width); - drag = getDragBounded(drag, snapSize.width, width, minimumSize.width, maximum); - width += drag; - } - - if (SOUTH == (direction & SOUTH)) { - int drag = getDragDistance(current.y, pressed.y, snapSize.height); - Dimension boundingSize = getBoundingSize(source); - int maximum = Math.min(boundingSize.height - y, maximumSize.height); - drag = getDragBounded(drag, snapSize.height, height, minimumSize.height, maximum); - height += drag; - } - - source.setBounds(x, y, width, height); - source.validate(); - } - - /* - * Determine how far the mouse has moved from where dragging started - */ - private int getDragDistance(int larger, int smaller, int snapSize) { - int halfway = snapSize / 2; - int drag = larger - smaller; - drag += (drag < 0) ? -halfway : halfway; - drag = (drag / snapSize) * snapSize; - - return drag; - } - - /* - * Adjust the drag value to be within the minimum and maximum range. - */ - private int getDragBounded(int drag, int snapSize, int dimension, int minimum, int maximum) { - while (dimension + drag < minimum) - drag += snapSize; - - while (dimension + drag > maximum) - drag -= snapSize; - - - return drag; - } - - /* - * Keep the size of the component within the bounds of its parent. - */ - private Dimension getBoundingSize(Component source) { - if (source instanceof Window) { - GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); - Rectangle bounds = env.getMaximumWindowBounds(); - return new Dimension(bounds.width, bounds.height); - } else { - return source.getParent().getSize(); - } - } -} \ No newline at end of file Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java 2013-02-07 22:31:52 UTC (rev 362) @@ -1,245 +0,0 @@ - -package fr.ifremer.tutti.ui.swing.util; - -/* - * #%L - * Tutti :: UI - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2012 - 2013 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import jaxx.runtime.SwingUtil; -import jaxx.runtime.validator.swing.SwingValidator; -import jaxx.runtime.validator.swing.SwingValidatorMessageTableModel; -import jaxx.runtime.validator.swing.SwingValidatorMessageTableRenderer; -import jaxx.runtime.validator.swing.SwingValidatorUtil; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.jdesktop.swingx.JXTitledPanel; -import org.nuiton.validator.NuitonValidatorScope; - -import javax.swing.AbstractAction; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JRootPane; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.JToggleButton; -import javax.swing.KeyStroke; -import javax.swing.ListSelectionModel; -import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; -import java.awt.Component; -import java.awt.Point; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.HierarchyBoundsAdapter; -import java.awt.event.HierarchyEvent; -import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -import static org.nuiton.i18n.I18n._; -import static org.nuiton.i18n.I18n.n_; - -/** - * Button which opens a popup containing a table with the errors found - * by registered validators. - * - * @author kmorin <kmorin@codelutin.com> - * @since 2.5.10 - */ -public class SwingValidatorMessageWidget extends JToggleButton { - - private static final Log log = - LogFactory.getLog(SwingValidatorMessageWidget.class); - - private static final long serialVersionUID = 1L; - - protected SwingValidatorMessageTableModel errorTableModel = new SwingValidatorMessageTableModel(); - - protected JDialog popup = new JDialog(); - - protected JTable errorTable = new JTable(); - - protected Point popupPosition = null; - - public SwingValidatorMessageWidget() { - super(SwingUtil.createActionIcon("alert-none")); - setToolTipText(_("tutti.validator.alert.none")); - - errorTableModel.addTableModelListener(new TableModelListener() { - - public void tableChanged(TableModelEvent e) { - int alerts = errorTableModel.getRowCount(); - String label; - switch (alerts) { - case 0: - label = n_("tutti.validator.alert.none"); - break; - case 1: - label = n_("tutti.validator.alert.one"); - break; - default: - label = n_("tutti.validator.alert.several"); - } - - NuitonValidatorScope maxScope; - String icon; - if (alerts == 0) { - icon = "alert-none"; - - } else { - maxScope = NuitonValidatorScope.INFO; - for (int i = 0; i < alerts; i++) { - NuitonValidatorScope scope = errorTableModel.getRow(i).getScope(); - int diff = scope.compareTo(maxScope); - if (diff < 0) { - maxScope = scope; - } - } - switch (maxScope) { - case INFO: - icon = "alert-info"; - break; - case WARNING: - icon = "alert-warning"; - break; - default: - icon = "alert-error"; - - } - } - - setToolTipText(_(label, alerts)); - setIcon(SwingUtil.createActionIcon(icon)); - } - }); - - errorTable.setModel(errorTableModel); - errorTable.setRowSelectionAllowed(true); - errorTable.setAutoCreateRowSorter(true); - errorTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); - errorTable.setCellSelectionEnabled(false); - errorTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - errorTable.setFillsViewportHeight(true); - - SwingValidatorUtil.installUI(errorTable, - new SwingValidatorMessageTableRenderer()); - - JScrollPane scrollPanel = new JScrollPane(errorTable); - scrollPanel.setColumnHeaderView(errorTable.getTableHeader()); - - JXTitledPanel titledPanel = new JXTitledPanel(_("tutti.errorTable.title"), scrollPanel); - popup.add(titledPanel); - popup.setTitle(_("tutti.errorTable.title")); - popup.setSize(800, 300); - popup.setAlwaysOnTop(true); - popup.setUndecorated(true); - - ComponentResizer cr = new ComponentResizer(); - cr.registerComponent(popup); - ComponentMover cm = new ComponentMover(); - cm.setDragInsets(cr.getDragInsets()); - cm.registerComponent(popup); - - popup.addWindowListener(new WindowAdapter() { - - @Override - public void windowClosing(WindowEvent e) { - setSelected(false); - } - - }); - - popup.addComponentListener(new ComponentAdapter() { - - @Override - public void componentMoved(ComponentEvent e) { - Component component = e.getComponent(); - if (component.isShowing()) { - popupPosition = component.getLocationOnScreen(); - } - } - - }); - - addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - if (isSelected()) { - popup.setVisible(true); - } else { - popup.dispose(); - } - } - }); - - addHierarchyBoundsListener(new HierarchyBoundsAdapter() { - - @Override - public void ancestorMoved(HierarchyEvent e) { - if (popupPosition == null && isShowing()) { - Point point = new Point(getLocationOnScreen()); - point.translate(-popup.getWidth() + getWidth(), -popup.getHeight()); - popup.setLocation(point); - } - } - }); - - // add a auto-close action - JRootPane rootPane = popup.getRootPane(); - - KeyStroke shortcutClosePopup = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); - - rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( - shortcutClosePopup, "close"); - rootPane.getActionMap().put("close", new AbstractAction() { - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - popup.dispose(); - setSelected(false); - } - }); - - } - - /** - * Registers a validator. - * - * @param validator - */ - public void registerValidator(SwingValidator validator) { - errorTableModel.registerValidator(validator); - validator.reloadBean(); - } - - /** Clears all the validators. */ - public void clearValidators() { - errorTableModel.clearValidators(); - errorTableModel.clear(); - } - -} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java 2013-02-07 22:31:52 UTC (rev 362) @@ -27,26 +27,10 @@ import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.entities.data.Attachment; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; -import fr.ifremer.tutti.ui.swing.util.ComponentMover; -import fr.ifremer.tutti.ui.swing.util.ComponentResizer; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.table.AbstractSelectTableAction; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; -import jaxx.runtime.JAXXUtil; -import jaxx.runtime.SwingUtil; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.util.decorator.Decorator; - -import javax.swing.AbstractCellEditor; -import javax.swing.BorderFactory; -import javax.swing.JDialog; -import javax.swing.JTable; -import javax.swing.border.LineBorder; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableCellEditor; -import javax.swing.table.TableCellRenderer; import java.awt.Color; import java.awt.Component; import java.awt.Frame; @@ -57,6 +41,21 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Collection; +import javax.swing.AbstractCellEditor; +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JTable; +import javax.swing.border.LineBorder; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; +import jaxx.runtime.JAXXUtil; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.ComponentMover; +import jaxx.runtime.swing.ComponentResizer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.decorator.Decorator; import static org.nuiton.i18n.I18n._; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java 2013-02-07 22:31:52 UTC (rev 362) @@ -26,14 +26,14 @@ import com.google.common.base.Preconditions; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; -import fr.ifremer.tutti.ui.swing.util.ComponentMover; -import fr.ifremer.tutti.ui.swing.util.ComponentResizer; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.table.AbstractSelectTableAction; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; import jaxx.runtime.JAXXUtil; import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.ComponentMover; +import jaxx.runtime.swing.ComponentResizer; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; Deleted: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-warning-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-warning-validation.xml 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-warning-validation.xml 2013-02-07 22:31:52 UTC (rev 362) @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - #%L - Tutti :: UI - $Id$ - $HeadURL$ - %% - Copyright (C) 2012 - 2013 Ifremer - %% - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with this program. If not, see - <http://www.gnu.org/licenses/gpl-3.0.html>. - #L% - --> - - -<!DOCTYPE validators PUBLIC - "-//Apache Struts//XWork Validator 1.0.3//EN" - "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> - -<validators> - - - <field name="comment"> - - <field-validator type="required"> - - <!-- No comment (just to test...) --> - <message></message> - - </field-validator> - - </field> - -</validators> Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml 2013-02-07 22:31:52 UTC (rev 362) @@ -45,19 +45,11 @@ <field-validator type="fieldexpression" short-circuit="true"> <param name="expression"> - <![CDATA[ sampleWeight == null || sampleWeight <= batchWeight]]></param> + <![CDATA[ sampleWeight == null || batchWeight == null || sampleWeight <= batchWeight]]></param> <message> tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatchWeight </message> </field-validator> - <field-validator type="fieldexpression" short-circuit="true"> - <param name="expression"> - <![CDATA[ ( sampleWeight == null || sample || batchWeight == sampleWeight ) ]]></param> - <message> - tutti.validator.error.splitSpeciesBatch.sampleWeight.mismatchBatchWeight - </message> - </field-validator> - </field> </validators> \ No newline at end of file Deleted: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-warning-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-warning-validation.xml 2013-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-warning-validation.xml 2013-02-07 22:31:52 UTC (rev 362) @@ -1,40 +0,0 @@ -<!-- - #%L - Tutti :: UI - $Id$ - $HeadURL$ - %% - Copyright (C) 2012 - 2013 Ifremer - %% - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with this program. If not, see - <http://www.gnu.org/licenses/gpl-3.0.html>. - #L% - --> -<!DOCTYPE validators PUBLIC - "-//Apache Struts//XWork Validator 1.0.3//EN" - "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> -<validators> - - <field name="sample"> - - <field-validator type="fieldexpression" short-circuit="true"> - <param name="expression"> - <![CDATA[ !sample ]]></param> - <message> - tutti.validator.warning.splitSpeciesBatch.sampleBatch - </message> - </field-validator> - - </field> -</validators> \ No newline at end of file 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-02-07 18:51:36 UTC (rev 361) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-02-07 22:31:52 UTC (rev 362) @@ -25,6 +25,7 @@ tutti.action.cloneProtocol=Cloner tutti.action.cloneProtocol.tip=Dupliquer le protocole sélectionné tutti.action.close=Fermer +tutti.action.computeSpeciesBatch=Elever les poids tutti.action.configuration=Configuration tutti.action.configuration.tip=Configurer Tutti tutti.action.createSpeciesBatch=Créer un lot pour une espèce @@ -140,10 +141,11 @@ tutti.config.category.ui.description=Options de l'interface utilisateur tutti.dialog.askSaveBeforeLeaving.message=Vous avez fait des modifications qu vous n'avez pas enregistrées. Voulez-vous les enregistrer ? tutti.dialog.askSaveBeforeLeaving.title=Modifications non enregistrées +tutti.dialog.catches.species.computeWeight.error.message=Erreur lors de l'élévation des poids +tutti.dialog.catches.species.computeWeight.error.title=Erreur tutti.dialog.catches.species.split.weightNotNull.message=Pour catégoriser un lot, il ne doit pas avoir de poids sous-échantillonné. Catégoriser le lot mettra le poids sous-échantillonné à nul. tutti.dialog.catches.species.split.weightNotNull.title=Poids sous-échantillonné non nul tutti.duration.format=dj Hh m'm' -tutti.errorTable.title=Rapport de contrôles tutti.file.csv=Extension d'un fichier csv tutti.file.protocol=Extension d'un fichier de protocole Tutti tutti.information.import.temporary.referential=Vous pouvez ici importer des référentiels temporaires @@ -396,7 +398,7 @@ tutti.table.species.frequency.header.number=Nombre tutti.table.species.frequency.header.weight=Poids observé (kg) tutti.table.species.sampleCategory.header.category=Catégorie -tutti.table.species.sampleCategory.header.selected= +tutti.table.species.sampleCategory.header.selected=Sélection tutti.table.species.sampleCategory.header.weight=Poids (kg) tutti.timeeditor.H=H tutti.title.about=À propos de Tutti @@ -436,9 +438,6 @@ tutti.to.be.done=< A FAIRE > tutti.tooltip.attachment.none=Pas de pièce-jointes tutti.tooltip.comment.none=Pas de commentaire -tutti.validator.alert.none=Aucune alerte -tutti.validator.alert.one=1 alerte -tutti.validator.alert.several=%s alertes tutti.validator.error.comment.too.long=Taille de commentaire trop longue (limitée à %s caractères) 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 Deleted: trunk/tutti-ui-swing/src/main/resources/icons/action-alert-error.png =================================================================== (Binary files differ) Deleted: trunk/tutti-ui-swing/src/main/resources/icons/action-alert-info.png =================================================================== (Binary files differ) Deleted: trunk/tutti-ui-swing/src/main/resources/icons/action-alert-none.png =================================================================== (Binary files differ) Deleted: trunk/tutti-ui-swing/src/main/resources/icons/action-alert-warning.png =================================================================== (Binary files differ)
participants (1)
-
kmorin@users.forge.codelutin.com